From f17ce499650aadba2e9120fdb7ea3a9a790f21c5 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Fri, 4 Mar 2022 23:57:53 +0100 Subject: [PATCH] Add generic lights --- debian/control | 13 ++ debian/nymea-plugin-generic-lights.install.in | 2 + .../integrationplugingenericenergy.cpp | 7 - .../integrationplugingenericenergy.json | 20 --- genericlights/README.md | 11 ++ genericlights/genericlights.pro | 10 ++ .../integrationplugingenericlights.cpp | 105 +++++++++++ .../integrationplugingenericlights.h | 53 ++++++ .../integrationplugingenericlights.json | 167 ++++++++++++++++++ ...03622-0e48-4987-970e-927d92ad18d5-en_US.ts | 157 ++++++++++++++++ nymea-plugins-genericthings.pro | 1 + 11 files changed, 519 insertions(+), 27 deletions(-) create mode 100644 debian/nymea-plugin-generic-lights.install.in create mode 100644 genericlights/README.md create mode 100644 genericlights/genericlights.pro create mode 100644 genericlights/integrationplugingenericlights.cpp create mode 100644 genericlights/integrationplugingenericlights.h create mode 100644 genericlights/integrationplugingenericlights.json create mode 100644 genericlights/translations/8b803622-0e48-4987-970e-927d92ad18d5-en_US.ts diff --git a/debian/control b/debian/control index a408178..0560e40 100644 --- a/debian/control +++ b/debian/control @@ -86,6 +86,18 @@ Description: nymea integration plugin for generic irrigation systems means, like GPIOs or other types of relays. +Package: nymea-plugin-generic-lights +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends}, +Conflicts: nymea-plugin-genericthings +Description: nymea integration plugin for generic lights + This package contains the nymea integration plugin for generic lights. + They can be used to represent lights in nymea which are controlled via + some on/off switches like smart plugs, GPIOs, relays or more complex systems + like MQTT. + + Package: nymea-plugin-generic-sensors Architecture: any Depends: ${shlibs:Depends}, @@ -131,6 +143,7 @@ Depends: ${shlibs:Depends}, nymea-plugin-generic-garages, nymea-plugin-generic-heatingcooling, nymea-plugin-generic-irrigation, + nymea-plugin-generic-lights, nymea-plugin-generic-sensors, nymea-plugin-generic-shading, nymea-plugin-generic-thing, diff --git a/debian/nymea-plugin-generic-lights.install.in b/debian/nymea-plugin-generic-lights.install.in new file mode 100644 index 0000000..c19fdc2 --- /dev/null +++ b/debian/nymea-plugin-generic-lights.install.in @@ -0,0 +1,2 @@ +usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingenericlights.so +genericlights/translations/*qm usr/share/nymea/translations/ diff --git a/genericenergy/integrationplugingenericenergy.cpp b/genericenergy/integrationplugingenericenergy.cpp index 5e5cf3e..a1c497a 100644 --- a/genericenergy/integrationplugingenericenergy.cpp +++ b/genericenergy/integrationplugingenericenergy.cpp @@ -89,13 +89,6 @@ void IntegrationPluginGenericEnergy::executeAction(ThingActionInfo *info) } else { Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); } - } else if (thing->thingClassId() == lightThingClassId) { - if (action.actionTypeId() == lightPowerActionTypeId) { - thing->setStateValue(lightPowerStateTypeId, action.param(lightPowerActionPowerParamTypeId).value()); - return info->finish(Thing::ThingErrorNoError); - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } } else if (thing->thingClassId() == impulseSmartMeterThingClassId) { if (action.actionTypeId() == impulseSmartMeterImpulseInputActionTypeId) { bool value = info->action().param(impulseSmartMeterImpulseInputActionImpulseInputParamTypeId).value().toBool(); diff --git a/genericenergy/integrationplugingenericenergy.json b/genericenergy/integrationplugingenericenergy.json index 946ad98..3767668 100644 --- a/genericenergy/integrationplugingenericenergy.json +++ b/genericenergy/integrationplugingenericenergy.json @@ -28,26 +28,6 @@ } ] }, - { - "id": "c50d3216-f307-4f9f-8190-4391510c385c", - "name": "light", - "displayName": "Generic light", - "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, - "ioType": "digitalInput" - } - ] - }, { "id": "c3123967-f741-4fe1-a0d4-9a3e405d7e52", "name": "impulseSmartMeter", diff --git a/genericlights/README.md b/genericlights/README.md new file mode 100644 index 0000000..f610ead --- /dev/null +++ b/genericlights/README.md @@ -0,0 +1,11 @@ +# Generic lights + +This plugin allows to create generic lights in nymea. Such lights don't have any +functionality on their own, but allow to create a light things which are controlled +using general purpose input and outputs, such as GPIOs, smart plugs or MQTT. + +## Set-up + +First, set up a thing with generic inputs or outputs. For instance from the GPIO or MQTT plugins. +When done, set up the desired generic light and use the things settings to connect +the inputs and/or outputs or nymea scripts to fill in the thing states accordingly. diff --git a/genericlights/genericlights.pro b/genericlights/genericlights.pro new file mode 100644 index 0000000..a38696a --- /dev/null +++ b/genericlights/genericlights.pro @@ -0,0 +1,10 @@ +include(../plugins.pri) + +SOURCES += \ + integrationplugingenericlights.cpp + +HEADERS += \ + integrationplugingenericlights.h + + + diff --git a/genericlights/integrationplugingenericlights.cpp b/genericlights/integrationplugingenericlights.cpp new file mode 100644 index 0000000..0a30de8 --- /dev/null +++ b/genericlights/integrationplugingenericlights.cpp @@ -0,0 +1,105 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io + +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project 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 project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "integrationplugingenericlights.h" +#include "plugininfo.h" + +#include +#include + +IntegrationPluginGenericLights::IntegrationPluginGenericLights() +{ + +} + +void IntegrationPluginGenericLights::setupThing(ThingSetupInfo *info) +{ + info->finish(Thing::ThingErrorNoError); +} + +void IntegrationPluginGenericLights::executeAction(ThingActionInfo *info) +{ + Thing *thing = info->thing(); + Action action = info->action(); + + if (thing->thingClassId() == lightThingClassId) { + if (action.actionTypeId() == lightPowerActionTypeId) { + thing->setStateValue(lightPowerStateTypeId, action.param(lightPowerActionPowerParamTypeId).value()); + return info->finish(Thing::ThingErrorNoError); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == dimmableLightThingClassId) { + if (action.actionTypeId() == dimmableLightPowerActionTypeId) { + thing->setStateValue(dimmableLightPowerStateTypeId, action.param(dimmableLightPowerActionPowerParamTypeId).value()); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == dimmableLightBrightnessActionTypeId) { + thing->setStateValue(dimmableLightBrightnessStateTypeId, action.param(dimmableLightBrightnessActionBrightnessParamTypeId).value()); + return info->finish(Thing::ThingErrorNoError); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + + } else if (thing->thingClassId() == colorTemperatureLightThingClassId) { + if (action.actionTypeId() == colorTemperatureLightPowerActionTypeId) { + thing->setStateValue(colorTemperatureLightPowerStateTypeId, action.param(colorTemperatureLightPowerActionPowerParamTypeId).value()); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == colorTemperatureLightBrightnessActionTypeId) { + thing->setStateValue(colorTemperatureLightBrightnessStateTypeId, action.param(colorTemperatureLightBrightnessActionBrightnessParamTypeId).value()); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == colorTemperatureLightColorTemperatureActionTypeId) { + thing->setStateValue(colorTemperatureLightColorTemperatureStateTypeId, action.param(colorTemperatureLightColorTemperatureActionColorTemperatureParamTypeId).value()); + return info->finish(Thing::ThingErrorNoError); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + + } else if (thing->thingClassId() == colorLightThingClassId) { + if (action.actionTypeId() == colorLightPowerActionTypeId) { + thing->setStateValue(colorLightPowerStateTypeId, action.param(colorLightPowerActionPowerParamTypeId).value()); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == colorLightBrightnessActionTypeId) { + thing->setStateValue(colorLightBrightnessStateTypeId, action.param(colorLightBrightnessActionBrightnessParamTypeId).value()); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == colorLightColorTemperatureActionTypeId) { + thing->setStateValue(colorLightColorTemperatureStateTypeId, action.param(colorLightColorTemperatureActionColorTemperatureParamTypeId).value()); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == colorLightColorActionTypeId) { + thing->setStateValue(colorLightColorStateTypeId, action.param(colorLightColorActionColorParamTypeId).value()); + return info->finish(Thing::ThingErrorNoError); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); + } +} diff --git a/genericlights/integrationplugingenericlights.h b/genericlights/integrationplugingenericlights.h new file mode 100644 index 0000000..67bcff0 --- /dev/null +++ b/genericlights/integrationplugingenericlights.h @@ -0,0 +1,53 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io +* +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project 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 project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef INTEGRATIONPLUGINGENERICLIGHTS_H +#define INTEGRATIONPLUGINGENERICLIGHTS_H + +#include "integrations/integrationplugin.h" +#include "plugintimer.h" +#include "extern-plugininfo.h" + +#include + +class IntegrationPluginGenericLights: public IntegrationPlugin +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationplugingenericlights.json") + Q_INTERFACES(IntegrationPlugin) + +public: + explicit IntegrationPluginGenericLights(); + void setupThing(ThingSetupInfo *info) override; + void executeAction(ThingActionInfo *info) override; +}; + +#endif // INTEGRATIONPLUGINGENERIClights_H diff --git a/genericlights/integrationplugingenericlights.json b/genericlights/integrationplugingenericlights.json new file mode 100644 index 0000000..518fe3f --- /dev/null +++ b/genericlights/integrationplugingenericlights.json @@ -0,0 +1,167 @@ +{ + "name": "genericLights", + "displayName": "Generic lights", + "id": "8b803622-0e48-4987-970e-927d92ad18d5", + "vendors": [ + { + "name": "nymea", + "displayName": "nymea", + "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6", + "thingClasses": [ + { + "id": "c50d3216-f307-4f9f-8190-4391510c385c", + "name": "light", + "displayName": "Generic light", + "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, + "ioType": "digitalInput" + } + ] + }, + { + "id": "fdfbd11f-bd99-4876-8254-7f91f96ca4fc", + "name": "dimmableLight", + "displayName": "Generic dimmable light", + "createMethods": ["user"], + "interfaces": ["dimmablelight"], + "stateTypes": [ + { + "id": "74535080-b6d9-41db-8e35-ef90e9042b75", + "name": "power", + "displayName": "Power", + "displayNameEvent": "Power changed", + "displayNameAction": "Set power", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + }, + { + "id": "88786787-8025-4967-b7a6-f3b670216ac0", + "name": "brightness", + "displayName": "Brightness", + "displayNameEvent": "Brightness changed", + "displayNameAction": "Set brightness", + "type": "int", + "minValue": 0, + "maxValue": 100, + "defaultValue": 100, + "writable": true, + "ioType": "analogInput" + } + ] + }, + { + "id": "34ee15f7-8e94-4927-bfd2-7123aac0b1be", + "name": "colorTemperatureLight", + "displayName": "Generic color temperature light", + "createMethods": ["user"], + "interfaces": ["colortemperaturelight"], + "stateTypes": [ + { + "id": "316c8852-6e53-4404-891a-83c1f0fa0c84", + "name": "power", + "displayName": "Power", + "displayNameEvent": "Power changed", + "displayNameAction": "Set power", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + }, + { + "id": "76b54a6d-fae9-4cb6-8603-a3a615e153f9", + "name": "brightness", + "displayName": "Brightness", + "displayNameEvent": "Brightness changed", + "displayNameAction": "Set brightness", + "type": "int", + "minValue": 0, + "maxValue": 100, + "defaultValue": 100, + "writable": true, + "ioType": "analogInput" + }, + { + "id": "3a2459ed-af20-4ea0-8bd7-97b59be594f7", + "name": "colorTemperature", + "displayName": "Color temperature", + "displayNameEvent": "Color temperature changed", + "displayNameAction": "Set color temperature", + "type": "int", + "writable": true, + "minValue": 0, + "maxValue": 100, + "defaultValue": 50 + } + ] + }, + { + "id": "886a856d-1373-4fff-ac34-dbdfa5531c2a", + "name": "colorLight", + "displayName": "Generic color light", + "createMethods": ["user"], + "interfaces": ["colorlight"], + "stateTypes": [ + { + "id": "1a366728-e67c-4767-b125-bec5dd6515f5", + "name": "power", + "displayName": "Power", + "displayNameEvent": "Power changed", + "displayNameAction": "Set power", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + }, + { + "id": "392e418c-d1e0-45ae-ba90-0fbc53227d70", + "name": "brightness", + "displayName": "Brightness", + "displayNameEvent": "Brightness changed", + "displayNameAction": "Set brightness", + "type": "int", + "minValue": 0, + "maxValue": 100, + "defaultValue": 100, + "writable": true, + "ioType": "analogInput" + }, + { + "id": "4db6a6d9-f7f4-4dca-85c4-4f5f8e57c897", + "name": "colorTemperature", + "displayName": "Color temperature", + "displayNameEvent": "Color temperature changed", + "displayNameAction": "Set color temperature", + "type": "int", + "writable": true, + "minValue": 0, + "maxValue": 100, + "defaultValue": 50 + }, + { + "id": "ecce80e5-c992-49cd-bd67-7721d2efad2b", + "name": "color", + "displayName": "color", + "displayNameEvent": "Color changed", + "displayNameAction": "Set color", + "type": "QColor", + "writable": true, + "defaultValue": "#FFFFFF" + } + ] + } + ] + } + ] +} diff --git a/genericlights/translations/8b803622-0e48-4987-970e-927d92ad18d5-en_US.ts b/genericlights/translations/8b803622-0e48-4987-970e-927d92ad18d5-en_US.ts new file mode 100644 index 0000000..c430c36 --- /dev/null +++ b/genericlights/translations/8b803622-0e48-4987-970e-927d92ad18d5-en_US.ts @@ -0,0 +1,157 @@ + + + + + genericLights + + + + + + + + Brightness + The name of the ParamType (ThingClass: colorLight, ActionType: brightness, ID: {392e418c-d1e0-45ae-ba90-0fbc53227d70}) +---------- +The name of the StateType ({392e418c-d1e0-45ae-ba90-0fbc53227d70}) of ThingClass colorLight +---------- +The name of the ParamType (ThingClass: colorTemperatureLight, ActionType: brightness, ID: {76b54a6d-fae9-4cb6-8603-a3a615e153f9}) +---------- +The name of the StateType ({76b54a6d-fae9-4cb6-8603-a3a615e153f9}) of ThingClass colorTemperatureLight +---------- +The name of the ParamType (ThingClass: dimmableLight, ActionType: brightness, ID: {88786787-8025-4967-b7a6-f3b670216ac0}) +---------- +The name of the StateType ({88786787-8025-4967-b7a6-f3b670216ac0}) of ThingClass dimmableLight + + + + + + + + Color temperature + The name of the ParamType (ThingClass: colorLight, ActionType: colorTemperature, ID: {4db6a6d9-f7f4-4dca-85c4-4f5f8e57c897}) +---------- +The name of the StateType ({4db6a6d9-f7f4-4dca-85c4-4f5f8e57c897}) of ThingClass colorLight +---------- +The name of the ParamType (ThingClass: colorTemperatureLight, ActionType: colorTemperature, ID: {3a2459ed-af20-4ea0-8bd7-97b59be594f7}) +---------- +The name of the StateType ({3a2459ed-af20-4ea0-8bd7-97b59be594f7}) of ThingClass colorTemperatureLight + + + + + Generic color light + The name of the ThingClass ({886a856d-1373-4fff-ac34-dbdfa5531c2a}) + + + + + Generic color temperature light + The name of the ThingClass ({34ee15f7-8e94-4927-bfd2-7123aac0b1be}) + + + + + Generic dimmable light + The name of the ThingClass ({fdfbd11f-bd99-4876-8254-7f91f96ca4fc}) + + + + + Generic light + The name of the ThingClass ({c50d3216-f307-4f9f-8190-4391510c385c}) + + + + + Generic lights + The name of the plugin genericLights ({8b803622-0e48-4987-970e-927d92ad18d5}) + + + + + + + + + + + + Power + The name of the ParamType (ThingClass: colorLight, ActionType: power, ID: {1a366728-e67c-4767-b125-bec5dd6515f5}) +---------- +The name of the StateType ({1a366728-e67c-4767-b125-bec5dd6515f5}) of ThingClass colorLight +---------- +The name of the ParamType (ThingClass: colorTemperatureLight, ActionType: power, ID: {316c8852-6e53-4404-891a-83c1f0fa0c84}) +---------- +The name of the StateType ({316c8852-6e53-4404-891a-83c1f0fa0c84}) of ThingClass colorTemperatureLight +---------- +The name of the ParamType (ThingClass: dimmableLight, ActionType: power, ID: {74535080-b6d9-41db-8e35-ef90e9042b75}) +---------- +The name of the StateType ({74535080-b6d9-41db-8e35-ef90e9042b75}) of ThingClass dimmableLight +---------- +The name of the ParamType (ThingClass: light, ActionType: power, ID: {8b6e4a67-6522-408b-b676-8d2f09ed2d54}) +---------- +The name of the StateType ({8b6e4a67-6522-408b-b676-8d2f09ed2d54}) of ThingClass light + + + + + + + Set brightness + The name of the ActionType ({392e418c-d1e0-45ae-ba90-0fbc53227d70}) of ThingClass colorLight +---------- +The name of the ActionType ({76b54a6d-fae9-4cb6-8603-a3a615e153f9}) of ThingClass colorTemperatureLight +---------- +The name of the ActionType ({88786787-8025-4967-b7a6-f3b670216ac0}) of ThingClass dimmableLight + + + + + Set color + The name of the ActionType ({ecce80e5-c992-49cd-bd67-7721d2efad2b}) of ThingClass colorLight + + + + + + Set color temperature + The name of the ActionType ({4db6a6d9-f7f4-4dca-85c4-4f5f8e57c897}) of ThingClass colorLight +---------- +The name of the ActionType ({3a2459ed-af20-4ea0-8bd7-97b59be594f7}) of ThingClass colorTemperatureLight + + + + + + + + Set power + The name of the ActionType ({1a366728-e67c-4767-b125-bec5dd6515f5}) of ThingClass colorLight +---------- +The name of the ActionType ({316c8852-6e53-4404-891a-83c1f0fa0c84}) of ThingClass colorTemperatureLight +---------- +The name of the ActionType ({74535080-b6d9-41db-8e35-ef90e9042b75}) of ThingClass dimmableLight +---------- +The name of the ActionType ({8b6e4a67-6522-408b-b676-8d2f09ed2d54}) of ThingClass light + + + + + + color + The name of the ParamType (ThingClass: colorLight, ActionType: color, ID: {ecce80e5-c992-49cd-bd67-7721d2efad2b}) +---------- +The name of the StateType ({ecce80e5-c992-49cd-bd67-7721d2efad2b}) of ThingClass colorLight + + + + + nymea + The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) + + + + diff --git a/nymea-plugins-genericthings.pro b/nymea-plugins-genericthings.pro index 65bda2c..35eef61 100644 --- a/nymea-plugins-genericthings.pro +++ b/nymea-plugins-genericthings.pro @@ -7,6 +7,7 @@ PLUGIN_DIRS = \ genericgarages \ genericheatingcooling \ genericirrigation \ + genericlights \ genericsensors \ genericshading \ genericthing \