Merge PR #131: New plugin: generic interfaces
This commit is contained in:
commit
7424f5be5c
16
debian/control
vendored
16
debian/control
vendored
@ -260,6 +260,21 @@ Description: nymea.io plugin for genericelements
|
||||
This package will install the nymea.io plugin for genericelements
|
||||
|
||||
|
||||
Package: nymea-plugin-genericinterfaces
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends},
|
||||
${misc:Depends},
|
||||
nymea-plugins-translations,
|
||||
Description: nymea.io plugin for generic interfaces
|
||||
The nymea daemon is a plugin based IoT (Internet of Things) server. The
|
||||
server works like a translator for devices, things and services and
|
||||
allows them to interact.
|
||||
With the powerful rule engine you are able to connect any device available
|
||||
in the system and create individual scenes and behaviors for your environment.
|
||||
.
|
||||
This package will install the nymea.io plugin for generic interfaces
|
||||
|
||||
|
||||
Package: nymea-plugin-gpio
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends},
|
||||
@ -795,6 +810,7 @@ Depends: nymea-plugin-boblight,
|
||||
nymea-plugin-tcpcommander,
|
||||
nymea-plugin-httpcommander,
|
||||
nymea-plugin-genericelements,
|
||||
nymea-plugin-genericinterfaces,
|
||||
nymea-plugin-avahimonitor,
|
||||
nymea-plugin-anel,
|
||||
nymea-plugin-gpio,
|
||||
|
||||
1
debian/nymea-plugin-genericinterfaces.install.in
vendored
Normal file
1
debian/nymea-plugin-genericinterfaces.install.in
vendored
Normal file
@ -0,0 +1 @@
|
||||
usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_deviceplugingenericinterfaces.so
|
||||
176
genericinterfaces/deviceplugingenericinterfaces.cpp
Normal file
176
genericinterfaces/deviceplugingenericinterfaces.cpp
Normal file
@ -0,0 +1,176 @@
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* *
|
||||
* Copyright (C) 2019 Bernhard Trinnes <bernhard.trinnes@nymea.io *
|
||||
* *
|
||||
* This file is part of nymea. *
|
||||
* *
|
||||
* This library is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU Lesser General Public *
|
||||
* License as published by the Free Software Foundation; either *
|
||||
* version 2.1 of the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This library is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* Lesser General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU Lesser General Public *
|
||||
* License along with this library; If not, see *
|
||||
* <http://www.gnu.org/licenses/>. *
|
||||
* *
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
/*!
|
||||
\page genericinterfaces.html
|
||||
\title Generic interfaces
|
||||
\brief Common interfaces to test the rule engine.
|
||||
|
||||
\ingroup plugins
|
||||
\ingroup nymea-tests
|
||||
|
||||
The generic interfaces plugin allows you create virtual buttons, which can be connected with a rule. This gives you
|
||||
the possibility to execute multiple \l{Action}{Actions} with one signal. Without a rule this generic interfaces are
|
||||
useless.
|
||||
|
||||
\chapter Plugin properties
|
||||
Following JSON file contains the definition and the description of all available \l{DeviceClass}{DeviceClasses}
|
||||
and \l{Vendor}{Vendors} of this \l{DevicePlugin}.
|
||||
|
||||
For more details how to read this JSON file please check out the documentation for \l{The plugin JSON File}.
|
||||
|
||||
\quotefile plugins/deviceplugins/genericinterfaces/deviceplugingenericinterfaces.json
|
||||
*/
|
||||
|
||||
|
||||
#include "deviceplugingenericinterfaces.h"
|
||||
#include "devices/devicemanager.h"
|
||||
#include "plugininfo.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
DevicePluginGenericInterfaces::DevicePluginGenericInterfaces()
|
||||
{
|
||||
}
|
||||
|
||||
Device::DeviceSetupStatus DevicePluginGenericInterfaces::setupDevice(Device *device)
|
||||
{
|
||||
if (device->deviceClassId() == awningDeviceClassId) {
|
||||
return Device::DeviceSetupStatusSuccess;
|
||||
}
|
||||
|
||||
if (device->deviceClassId() == blindDeviceClassId) {
|
||||
return Device::DeviceSetupStatusSuccess;
|
||||
}
|
||||
|
||||
if (device->deviceClassId() == shutterDeviceClassId) {
|
||||
return Device::DeviceSetupStatusSuccess;
|
||||
}
|
||||
|
||||
if (device->deviceClassId() == socketDeviceClassId) {
|
||||
return Device::DeviceSetupStatusSuccess;
|
||||
}
|
||||
|
||||
if (device->deviceClassId() == lightDeviceClassId) {
|
||||
return Device::DeviceSetupStatusSuccess;
|
||||
}
|
||||
|
||||
if (device->deviceClassId() == heatingDeviceClassId) {
|
||||
return Device::DeviceSetupStatusSuccess;
|
||||
}
|
||||
return Device::DeviceSetupStatusFailure;
|
||||
}
|
||||
|
||||
Device::DeviceError DevicePluginGenericInterfaces::executeAction(Device *device, const Action &action)
|
||||
{
|
||||
if (device->deviceClassId() == awningDeviceClassId) {
|
||||
if (action.actionTypeId() == awningOpenActionTypeId) {
|
||||
device->setStateValue(awningStatusStateTypeId, "Opening");
|
||||
device->setStateValue(awningClosingOutputStateTypeId, false);
|
||||
device->setStateValue(awningOpeningOutputStateTypeId, true);
|
||||
return Device::DeviceErrorNoError;
|
||||
}
|
||||
if (action.actionTypeId() == awningStopActionTypeId) {
|
||||
device->setStateValue(awningStatusStateTypeId, "Stopped");
|
||||
device->setStateValue(awningOpeningOutputStateTypeId, false);
|
||||
device->setStateValue(awningClosingOutputStateTypeId, false);
|
||||
return Device::DeviceErrorNoError;
|
||||
}
|
||||
if (action.actionTypeId() == awningCloseActionTypeId) {
|
||||
device->setStateValue(awningStatusStateTypeId, "Closing");
|
||||
device->setStateValue(awningOpeningOutputStateTypeId, false);
|
||||
device->setStateValue(awningClosingOutputStateTypeId, true);
|
||||
return Device::DeviceErrorNoError;
|
||||
}
|
||||
return Device::DeviceErrorActionTypeNotFound;
|
||||
}
|
||||
|
||||
if (device->deviceClassId() == blindDeviceClassId ) {
|
||||
if (action.actionTypeId() == blindOpenActionTypeId) {
|
||||
device->setStateValue(blindStatusStateTypeId, "Opening");
|
||||
device->setStateValue(blindClosingOutputStateTypeId, false);
|
||||
device->setStateValue(blindOpeningOutputStateTypeId, true);
|
||||
return Device::DeviceErrorNoError;
|
||||
}
|
||||
if (action.actionTypeId() == blindStopActionTypeId) {
|
||||
device->setStateValue(blindStatusStateTypeId, "Stopped");
|
||||
device->setStateValue(blindOpeningOutputStateTypeId, false);
|
||||
device->setStateValue(blindClosingOutputStateTypeId, false);
|
||||
return Device::DeviceErrorNoError;
|
||||
}
|
||||
if (action.actionTypeId() == blindCloseActionTypeId) {
|
||||
device->setStateValue(blindStatusStateTypeId, "Closing");
|
||||
device->setStateValue(blindOpeningOutputStateTypeId, false);
|
||||
device->setStateValue(blindClosingOutputStateTypeId, true);
|
||||
return Device::DeviceErrorNoError;
|
||||
}
|
||||
return Device::DeviceErrorActionTypeNotFound;
|
||||
}
|
||||
|
||||
if (device->deviceClassId() == shutterDeviceClassId) {
|
||||
if (action.actionTypeId() == shutterOpenActionTypeId) {
|
||||
device->setStateValue(shutterStatusStateTypeId, "Opening");
|
||||
device->setStateValue(shutterClosingOutputStateTypeId, false);
|
||||
device->setStateValue(shutterOpeningOutputStateTypeId, true);
|
||||
return Device::DeviceErrorNoError;
|
||||
}
|
||||
if (action.actionTypeId() == shutterStopActionTypeId) {
|
||||
device->setStateValue(shutterStatusStateTypeId, "Stopped");
|
||||
device->setStateValue(shutterOpeningOutputStateTypeId, false);
|
||||
device->setStateValue(shutterClosingOutputStateTypeId, false);
|
||||
return Device::DeviceErrorNoError;
|
||||
}
|
||||
if (action.actionTypeId() == shutterCloseActionTypeId) {
|
||||
device->setStateValue(shutterStatusStateTypeId, "Closing");
|
||||
device->setStateValue(shutterOpeningOutputStateTypeId, false);
|
||||
device->setStateValue(shutterClosingOutputStateTypeId, true);
|
||||
return Device::DeviceErrorNoError;
|
||||
}
|
||||
return Device::DeviceErrorActionTypeNotFound;
|
||||
}
|
||||
|
||||
if (device->deviceClassId() == socketDeviceClassId) {
|
||||
if (action.actionTypeId() == socketPowerActionTypeId) {
|
||||
device->setStateValue(socketPowerStateTypeId, action.param(socketPowerActionPowerParamTypeId).value());
|
||||
return Device::DeviceErrorNoError;
|
||||
}
|
||||
return Device::DeviceErrorActionTypeNotFound;
|
||||
}
|
||||
|
||||
if (device->deviceClassId() == lightDeviceClassId) {
|
||||
if (action.actionTypeId() == lightPowerActionTypeId) {
|
||||
device->setStateValue(lightPowerStateTypeId, action.param(lightPowerActionPowerParamTypeId).value());
|
||||
return Device::DeviceErrorNoError;
|
||||
}
|
||||
return Device::DeviceErrorActionTypeNotFound;
|
||||
}
|
||||
|
||||
if (device->deviceClassId() == heatingDeviceClassId) {
|
||||
if (action.actionTypeId() == heatingPowerActionTypeId) {
|
||||
device->setStateValue(heatingPowerStateTypeId, action.param(heatingPowerActionPowerParamTypeId).value());
|
||||
return Device::DeviceErrorNoError;
|
||||
}
|
||||
return Device::DeviceErrorActionTypeNotFound;
|
||||
}
|
||||
return Device::DeviceErrorDeviceClassNotFound;
|
||||
}
|
||||
44
genericinterfaces/deviceplugingenericinterfaces.h
Normal file
44
genericinterfaces/deviceplugingenericinterfaces.h
Normal file
@ -0,0 +1,44 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* *
|
||||
* Copyright (C) 2019 Bernhard Trinnes <bernhard.trinnes@nymea.io *
|
||||
* *
|
||||
* This file is part of nymea. *
|
||||
* *
|
||||
* This library is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU Lesser General Public *
|
||||
* License as published by the Free Software Foundation; either *
|
||||
* version 2.1 of the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This library is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* Lesser General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU Lesser General Public *
|
||||
* License along with this library; If not, see *
|
||||
* <http://www.gnu.org/licenses/>. *
|
||||
* *
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
#ifndef DEVICEPLUGINGENERICINTERFACES_H
|
||||
#define DEVICEPLUGINGENERICINTERFACES_H
|
||||
|
||||
#include "devices/deviceplugin.h"
|
||||
|
||||
class DevicePluginGenericInterfaces : public DevicePlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_PLUGIN_METADATA(IID "io.nymea.DevicePlugin" FILE "deviceplugingenericinterfaces.json")
|
||||
Q_INTERFACES(DevicePlugin)
|
||||
|
||||
public:
|
||||
explicit DevicePluginGenericInterfaces();
|
||||
Device::DeviceSetupStatus setupDevice(Device *device) override;
|
||||
|
||||
public slots:
|
||||
Device::DeviceError executeAction(Device *device, const Action &action) override;
|
||||
|
||||
};
|
||||
|
||||
#endif // DEVICEPLUGINGENERICINTERFACES_H
|
||||
236
genericinterfaces/deviceplugingenericinterfaces.json
Normal file
236
genericinterfaces/deviceplugingenericinterfaces.json
Normal file
@ -0,0 +1,236 @@
|
||||
{
|
||||
"name": "GenericInterfaces",
|
||||
"displayName": "Generic Interfaces",
|
||||
"id": "b3188696-2585-4806-bf98-30ab576ce5c8",
|
||||
"vendors": [
|
||||
{
|
||||
"name": "nymea",
|
||||
"displayName": "nymea",
|
||||
"id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6",
|
||||
"deviceClasses": [
|
||||
{
|
||||
"id": "9e69585f-90ba-44e4-ad90-5b4bffbe345a",
|
||||
"name": "awning",
|
||||
"displayName": "Awning interface",
|
||||
"createMethods": ["user"],
|
||||
"interfaces": ["awning"],
|
||||
"stateTypes": [
|
||||
{
|
||||
"id": "4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4",
|
||||
"name": "openingOutput",
|
||||
"displayName": "Opening output",
|
||||
"displayNameEvent": "Opening output changed",
|
||||
"type": "bool",
|
||||
"defaultValue": false
|
||||
},
|
||||
{
|
||||
"id": "59bfd575-709f-4e43-9726-de26e6d4ca8b",
|
||||
"name": "closingOutput",
|
||||
"displayName": "Closing output",
|
||||
"displayNameEvent": "Closing output changed",
|
||||
"type": "bool",
|
||||
"defaultValue": false
|
||||
},
|
||||
{
|
||||
"id": "ff6f2565-2a2e-4d34-b10f-d3f73b676399",
|
||||
"name": "status",
|
||||
"displayName": "Status",
|
||||
"displayNameEvent": "Status changed",
|
||||
"type": "QString",
|
||||
"possibleValues": [
|
||||
"Opening",
|
||||
"Stopped",
|
||||
"Closing"
|
||||
],
|
||||
"defaultValue": "Stopped"
|
||||
}
|
||||
],
|
||||
"actionTypes": [
|
||||
{
|
||||
"id": "979e9c51-5a93-4635-85e3-01874306b229",
|
||||
"name": "open",
|
||||
"displayName": "Open"
|
||||
},
|
||||
{
|
||||
"id": "555cafe4-bd12-42c6-bab1-8cd59af6468e",
|
||||
"name": "stop",
|
||||
"displayName": "Stop"
|
||||
},
|
||||
{
|
||||
"id": "53b5ba77-9a34-4cd6-ad24-fb01fc465f98",
|
||||
"name": "close",
|
||||
"displayName": "Close"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "17ee3657-6ad8-4ae2-8959-3cf66cec8d13",
|
||||
"name": "blind",
|
||||
"displayName": "Blind interface",
|
||||
"createMethods": ["user"],
|
||||
"interfaces": ["blind"],
|
||||
"stateTypes": [
|
||||
{
|
||||
"id": "b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b",
|
||||
"name": "openingOutput",
|
||||
"displayName": "Opening output",
|
||||
"displayNameEvent": "Opening output changed",
|
||||
"type": "bool",
|
||||
"defaultValue": false
|
||||
},
|
||||
{
|
||||
"id": "9b673430-572d-4a9c-85d3-dafadbe541cd",
|
||||
"name": "closingOutput",
|
||||
"displayName": "Closing output",
|
||||
"displayNameEvent": "Closing output changed",
|
||||
"type": "bool",
|
||||
"defaultValue": false
|
||||
},
|
||||
{
|
||||
"id": "5fdec1e0-51f6-48b9-b743-ba572504b2c1",
|
||||
"name": "status",
|
||||
"displayName": "Status",
|
||||
"displayNameEvent": "Status changed",
|
||||
"type": "QString",
|
||||
"possibleValues": [
|
||||
"Opening",
|
||||
"Stopped",
|
||||
"Closing"
|
||||
],
|
||||
"defaultValue": "Stopped"
|
||||
}
|
||||
],
|
||||
"actionTypes": [
|
||||
{
|
||||
"id": "120dc265-dbbb-4f19-9d31-c372c23479c0",
|
||||
"name": "open",
|
||||
"displayName": "Open"
|
||||
},
|
||||
{
|
||||
"id": "1a924c9a-5dcb-4b1c-8fd6-ab101098e007",
|
||||
"name": "stop",
|
||||
"displayName": "Stop"
|
||||
},
|
||||
{
|
||||
"id": "86e9cf21-7487-47c4-b4be-4a940d7235fb",
|
||||
"name": "close",
|
||||
"displayName": "Close"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "7917c2e7-d7d2-4c47-a38d-41f7dd7693d9",
|
||||
"name": "shutter",
|
||||
"displayName": "Shutter interface",
|
||||
"createMethods": ["user"],
|
||||
"interfaces": ["shutter"],
|
||||
"stateTypes": [
|
||||
{
|
||||
"id": "cc547728-b309-4695-b355-49748ef2521c",
|
||||
"name": "openingOutput",
|
||||
"displayName": "Opening output",
|
||||
"displayNameEvent": "Opening output changed",
|
||||
"type": "bool",
|
||||
"defaultValue": false
|
||||
},
|
||||
{
|
||||
"id": "1c35df0e-4c41-455f-893a-0145377952a0",
|
||||
"name": "closingOutput",
|
||||
"displayName": "Closing output",
|
||||
"displayNameEvent": "Closing output changed",
|
||||
"type": "bool",
|
||||
"defaultValue": false
|
||||
},
|
||||
{
|
||||
"id": "6d6e72dc-4d2b-4ec1-82c2-54405a682711",
|
||||
"name": "status",
|
||||
"displayName": "Status",
|
||||
"displayNameEvent": "Status changed",
|
||||
"type": "QString",
|
||||
"possibleValues": [
|
||||
"Opening",
|
||||
"Stopped",
|
||||
"Closing"
|
||||
],
|
||||
"defaultValue": "Stopped"
|
||||
}
|
||||
],
|
||||
"actionTypes": [
|
||||
{
|
||||
"id": "9deb662d-2378-4345-a898-8742d41e43c1",
|
||||
"name": "open",
|
||||
"displayName": "Open"
|
||||
},
|
||||
{
|
||||
"id": "db5f3332-1f4e-4f9e-84d2-93c5d7de315c",
|
||||
"name": "stop",
|
||||
"displayName": "Stop"
|
||||
},
|
||||
{
|
||||
"id": "cf5303f1-67c7-4cef-b11c-eb9de6fc8a87",
|
||||
"name": "close",
|
||||
"displayName": "Close"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "4e7261af-a27b-4446-8346-914ea59f7547",
|
||||
"name": "socket",
|
||||
"displayName": "Socket interface",
|
||||
"createMethods": ["user"],
|
||||
"interfaces": ["powersocket"],
|
||||
"stateTypes": [
|
||||
{
|
||||
"id": "018038d7-1d02-4b17-8fe3-babca044b087",
|
||||
"name": "power",
|
||||
"displayName": "Power",
|
||||
"displayNameEvent": "Power changed",
|
||||
"displayNameAction": "Set power",
|
||||
"type": "bool",
|
||||
"defaultValue": false,
|
||||
"writable": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "c50d3216-f307-4f9f-8190-4391510c385c",
|
||||
"name": "light",
|
||||
"displayName": "Light interface",
|
||||
"createMethods": ["user"],
|
||||
"interfaces": ["light"],
|
||||
"stateTypes": [
|
||||
{
|
||||
"id": "8b6e4a67-6522-408b-b676-8d2f09ed2d54",
|
||||
"name": "power",
|
||||
"displayName": "Power",
|
||||
"displayNameEvent": "Power changed",
|
||||
"displayNameAction": "Set power",
|
||||
"type": "bool",
|
||||
"defaultValue": false,
|
||||
"writable": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "392854c4-3d14-4cf8-96cd-d933526bd197",
|
||||
"name": "heating",
|
||||
"displayName": "Heating interface",
|
||||
"createMethods": ["user"],
|
||||
"interfaces": ["heating"],
|
||||
"stateTypes": [
|
||||
{
|
||||
"id": "409b635e-a754-4b5c-b3f0-d1c5a0fb3f03",
|
||||
"name": "power",
|
||||
"displayName": "Power",
|
||||
"displayNameEvent": "Power changed",
|
||||
"displayNameAction": "Set power",
|
||||
"type": "bool",
|
||||
"defaultValue": false,
|
||||
"writable": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
12
genericinterfaces/genericinterfaces.pro
Normal file
12
genericinterfaces/genericinterfaces.pro
Normal file
@ -0,0 +1,12 @@
|
||||
include(../plugins.pri)
|
||||
|
||||
TARGET = $$qtLibraryTarget(nymea_deviceplugingenericinterfaces)
|
||||
|
||||
SOURCES += \
|
||||
deviceplugingenericinterfaces.cpp
|
||||
|
||||
HEADERS += \
|
||||
deviceplugingenericinterfaces.h
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1">
|
||||
</TS>
|
||||
@ -17,6 +17,7 @@ PLUGIN_DIRS = \
|
||||
eq-3 \
|
||||
flowercare \
|
||||
genericelements \
|
||||
genericinterfaces \
|
||||
gpio \
|
||||
httpcommander \
|
||||
intertechno \
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user