From 0d6cc953136a0e10a319ba3be318d0426cee0ed6 Mon Sep 17 00:00:00 2001 From: Christian Fetzer Date: Sun, 27 Sep 2020 13:38:02 +0200 Subject: [PATCH] somfytahoma: Add support for garage doors --- somfytahoma/README.md | 6 +- somfytahoma/integrationpluginsomfytahoma.cpp | 63 ++++- somfytahoma/integrationpluginsomfytahoma.json | 83 ++++++- ...be1c1-daa8-4e21-9e85-b2372ab1a450-en_US.ts | 221 ++++++++++++------ 4 files changed, 294 insertions(+), 79 deletions(-) diff --git a/somfytahoma/README.md b/somfytahoma/README.md index 72627713..d78154bd 100644 --- a/somfytahoma/README.md +++ b/somfytahoma/README.md @@ -17,6 +17,6 @@ entering your personal username + password for the Somfy TaHoma API. ## Supported devices -Currently this plugin supports all roller shutters and blinds that are -connectable to the TaHoma gateway. These are Somfy iO devices as well as RTS -devices. +Currently this plugin supports all roller shutters, blinds and garage +door drives that are connectable to the TaHoma gateway. These are Somfy iO +devices as well as RTS devices. diff --git a/somfytahoma/integrationpluginsomfytahoma.cpp b/somfytahoma/integrationpluginsomfytahoma.cpp index ff1fd700..fc7f89ca 100644 --- a/somfytahoma/integrationpluginsomfytahoma.cpp +++ b/somfytahoma/integrationpluginsomfytahoma.cpp @@ -109,6 +109,16 @@ void IntegrationPluginSomfyTahoma::setupThing(ThingSetupInfo *info) descriptor.setParams(ParamList() << Param(venetianblindThingDeviceUrlParamTypeId, deviceUrl)); unknownDevices.append(descriptor); } + } else if (type == QStringLiteral("GarageDoor")) { + Thing *thing = myThings().findByParams(ParamList() << Param(garagedoorThingDeviceUrlParamTypeId, deviceUrl)); + if (thing) { + qCDebug(dcSomfyTahoma()) << "Found existing garage door:" << label << deviceUrl; + } else { + qCInfo(dcSomfyTahoma()) << "Found new garage door:" << label << deviceUrl; + ThingDescriptor descriptor(garagedoorThingClassId, label, QString(), accountId); + descriptor.setParams(ParamList() << Param(garagedoorThingDeviceUrlParamTypeId, deviceUrl)); + unknownDevices.append(descriptor); + } } else { qCInfo(dcSomfyTahoma()) << "Found unsupperted Somfy device:" << label << type << deviceUrl; } @@ -123,7 +133,8 @@ void IntegrationPluginSomfyTahoma::setupThing(ThingSetupInfo *info) else if (info->thing()->thingClassId() == gatewayThingClassId || info->thing()->thingClassId() == rollershutterThingClassId || - info->thing()->thingClassId() == venetianblindThingClassId) { + info->thing()->thingClassId() == venetianblindThingClassId || + info->thing()->thingClassId() == garagedoorThingClassId) { info->finish(Thing::ThingErrorNoError); } } @@ -146,6 +157,9 @@ void IntegrationPluginSomfyTahoma::postSetupThing(Thing *thing) } else if (thing->thingClassId() == venetianblindThingClassId) { deviceUrl = QUrl(thing->paramValue(venetianblindThingDeviceUrlParamTypeId).toString()); } + else if (thing->thingClassId() == garagedoorThingClassId) { + deviceUrl = QUrl(thing->paramValue(garagedoorThingDeviceUrlParamTypeId).toString()); + } if (!deviceUrl.isEmpty()) { Thing *gateway = myThings().findByParams(ParamList() << Param(gatewayThingGatewayIdParamTypeId, deviceUrl.host())); if (gateway) { @@ -255,6 +269,11 @@ void IntegrationPluginSomfyTahoma::handleEvents(const QVariantList &eventList) thing->setStateValue(venetianblindMovingStateTypeId, true); things.append(thing); } + thing = myThings().findByParams(ParamList() << Param(garagedoorThingDeviceUrlParamTypeId, action.toMap()["deviceURL"])); + if (thing) { + thing->setStateValue(garagedoorMovingStateTypeId, true); + things.append(thing); + } } qCDebug(dcSomfyTahoma()) << "ExecutionRegisteredEvent" << eventMap["execId"]; m_currentExecutions.insert(eventMap["execId"].toString(), things); @@ -266,6 +285,8 @@ void IntegrationPluginSomfyTahoma::handleEvents(const QVariantList &eventList) thing->setStateValue(rollershutterMovingStateTypeId, false); } else if (thing->thingClassId() == venetianblindThingClassId) { thing->setStateValue(venetianblindMovingStateTypeId, false); + } else if (thing->thingClassId() == garagedoorThingClassId) { + thing->setStateValue(garagedoorMovingStateTypeId, false); } } @@ -350,6 +371,30 @@ void IntegrationPluginSomfyTahoma::updateThingStates(const QString &deviceUrl, c } return; } + thing = myThings().findByParams(ParamList() << Param(garagedoorThingDeviceUrlParamTypeId, deviceUrl)); + if (thing) { + foreach (const QVariant &stateVariant, stateList) { + QVariantMap stateMap = stateVariant.toMap(); + if (stateMap["name"] == "core:ClosureState") { + thing->setStateValue(garagedoorPercentageStateTypeId, stateMap["value"]); + if (stateMap["value"] == 100) { + thing->setStateValue(garagedoorStateStateTypeId, "closed"); + } else if (stateMap["value"] == 0) { + thing->setStateValue(garagedoorStateStateTypeId, "open"); + } else { + thing->setStateValue(garagedoorStateStateTypeId, "intermediate"); + } + } else if (stateMap["name"] == "core:StatusState") { + thing->setStateValue(garagedoorConnectedStateTypeId, stateMap["value"] == "available"); + pluginStorage()->beginGroup(thing->id().toString()); + pluginStorage()->setValue("connected", stateMap["value"] == "available"); + pluginStorage()->endGroup(); + } else if (stateMap["name"] == "core:RSSILevelState") { + thing->setStateValue(garagedoorSignalStrengthStateTypeId, stateMap["value"]); + } + } + return; + } } void IntegrationPluginSomfyTahoma::executeAction(ThingActionInfo *info) @@ -391,6 +436,18 @@ void IntegrationPluginSomfyTahoma::executeAction(ThingActionInfo *info) } else if (info->action().actionTypeId() == venetianblindStopActionTypeId) { actionName = "stop"; } + } else if (info->thing()->thingClassId() == garagedoorThingClassId) { + deviceUrl = info->thing()->paramValue(garagedoorThingDeviceUrlParamTypeId).toString(); + if (info->action().actionTypeId() == garagedoorPercentageActionTypeId) { + actionName = "setClosure"; + actionParameters = { info->action().param(garagedoorPercentageActionPercentageParamTypeId).value().toInt() }; + } else if (info->action().actionTypeId() == garagedoorOpenActionTypeId) { + actionName = "open"; + } else if (info->action().actionTypeId() == garagedoorCloseActionTypeId) { + actionName = "close"; + } else if (info->action().actionTypeId() == garagedoorStopActionTypeId) { + actionName = "stop"; + } } if (!actionName.isEmpty()) { @@ -433,6 +490,8 @@ void IntegrationPluginSomfyTahoma::markDisconnected(Thing *thing) thing->setStateValue(rollershutterConnectedStateTypeId, false); } else if (thing->thingClassId() == venetianblindThingClassId) { thing->setStateValue(venetianblindConnectedStateTypeId, false); + } else if (thing->thingClassId() == garagedoorThingClassId) { + thing->setStateValue(garagedoorConnectedStateTypeId, false); } foreach (Thing *child, myThings().filterByParentId(thing->id())) { markDisconnected(child); @@ -449,6 +508,8 @@ void IntegrationPluginSomfyTahoma::restoreChildConnectedState(Thing *thing) thing->setStateValue(rollershutterConnectedStateTypeId, pluginStorage()->value("connected").toBool()); } else if (thing->thingClassId() == venetianblindThingClassId) { thing->setStateValue(venetianblindConnectedStateTypeId, pluginStorage()->value("connected").toBool()); + } else if (thing->thingClassId() == garagedoorThingClassId) { + thing->setStateValue(garagedoorConnectedStateTypeId, pluginStorage()->value("connected").toBool()); } } pluginStorage()->endGroup(); diff --git a/somfytahoma/integrationpluginsomfytahoma.json b/somfytahoma/integrationpluginsomfytahoma.json index c2bb55ba..5aeb7886 100644 --- a/somfytahoma/integrationpluginsomfytahoma.json +++ b/somfytahoma/integrationpluginsomfytahoma.json @@ -223,9 +223,88 @@ "displayName": "Close" } ] + }, + { + "id": "cb206d74-b13c-4466-98c6-070b19ebd23a", + "name": "garagedoor", + "displayName": "Garage Door", + "createMethods": ["auto"], + "interfaces": ["extendedstatefulgaragedoor", "wirelessconnectable"], + "paramTypes": [ + { + "id": "974710eb-5da4-4b3e-8c4f-ba60e8af31b3", + "displayName": "Device URL", + "name": "deviceUrl", + "type": "QString" + } + ], + "stateTypes": [ + { + "id": "284816aa-842b-4a86-bb4e-ef5353b76762", + "name": "percentage", + "displayName": "Percentage", + "type": "int", + "unit": "Percentage", + "displayNameEvent": "Percentage changed", + "writable": true, + "displayNameAction": "Set percentage", + "defaultValue": 0 + }, + { + "id": "07175175-f95d-4cd9-a398-9aab8232c2a9", + "name": "moving", + "type": "bool", + "defaultValue": false, + "displayName": "Moving", + "displayNameEvent": "Moving changed" + }, + { + "id": "0a194091-3073-4912-9d84-f1d52c8534bd", + "name": "signalStrength", + "displayName": "Signal strength", + "type": "uint", + "unit": "Percentage", + "displayNameEvent": "Signal strength changed", + "minValue": 0, + "maxValue": 100, + "defaultValue": 0 + }, + { + "id": "5a32cbd3-bc1c-4724-ae53-9f36cb75bf84", + "name": "connected", + "displayName": "Connected", + "type": "bool", + "displayNameEvent": "Connetion state changed", + "defaultValue": false + }, + { + "id": "12af28f1-475e-4d05-9bbb-adbb86dcd69c", + "name": "state", + "displayName": "State", + "type": "QString", + "possibleValues": ["open", "closed", "opening", "closing", "intermediate"], + "displayNameEvent": "State changed", + "defaultValue": "closed" + } + ], + "actionTypes": [ + { + "id": "5738edd9-a1d1-4031-8505-85a919afe6f7", + "name": "open", + "displayName": "Open" + }, + { + "id": "75e345b8-0a25-4ba6-ba83-f2611252f87f", + "name": "stop", + "displayName": "Stop" + }, + { + "id": "1e6552e3-8eb0-4070-b9cf-13fd13671eef", + "name": "close", + "displayName": "Close" + } + ] } - - ] } ] diff --git a/somfytahoma/translations/4e8be1c1-daa8-4e21-9e85-b2372ab1a450-en_US.ts b/somfytahoma/translations/4e8be1c1-daa8-4e21-9e85-b2372ab1a450-en_US.ts index a4e4a46b..782040dc 100644 --- a/somfytahoma/translations/4e8be1c1-daa8-4e21-9e85-b2372ab1a450-en_US.ts +++ b/somfytahoma/translations/4e8be1c1-daa8-4e21-9e85-b2372ab1a450-en_US.ts @@ -18,9 +18,9 @@ SomfyTahoma - - - + + + Angle The name of the ParamType (ThingClass: venetianblind, ActionType: angle, ID: {079c7a80-8a1c-4fd7-b40c-6800120c70fb}) ---------- @@ -30,31 +30,40 @@ The name of the StateType ({079c7a80-8a1c-4fd7-b40c-6800120c70fb}) of ThingClass - + Angle changed The name of the EventType ({079c7a80-8a1c-4fd7-b40c-6800120c70fb}) of ThingClass venetianblind - - + + + Close - The name of the ActionType ({1a9707e7-9d64-4237-b150-234edcfed12a}) of ThingClass venetianblind + The name of the ActionType ({1e6552e3-8eb0-4070-b9cf-13fd13671eef}) of ThingClass garagedoor +---------- +The name of the ActionType ({1a9707e7-9d64-4237-b150-234edcfed12a}) of ThingClass venetianblind ---------- The name of the ActionType ({baf377c6-9fba-44cf-9f14-af0101f874b5}) of ThingClass rollershutter - - - - - - - - + + + + + + + + + + Connected - The name of the ParamType (ThingClass: venetianblind, EventType: connected, ID: {57361115-edbe-49fb-9847-408b571d3108}) + The name of the ParamType (ThingClass: garagedoor, EventType: connected, ID: {5a32cbd3-bc1c-4724-ae53-9f36cb75bf84}) +---------- +The name of the StateType ({5a32cbd3-bc1c-4724-ae53-9f36cb75bf84}) of ThingClass garagedoor +---------- +The name of the ParamType (ThingClass: venetianblind, EventType: connected, ID: {57361115-edbe-49fb-9847-408b571d3108}) ---------- The name of the StateType ({57361115-edbe-49fb-9847-408b571d3108}) of ThingClass venetianblind ---------- @@ -72,12 +81,15 @@ The name of the StateType ({10ebf650-a93a-4ee3-945b-fba10d4e35a5}) of ThingClass - - - - + + + + + Connetion state changed - The name of the EventType ({57361115-edbe-49fb-9847-408b571d3108}) of ThingClass venetianblind + The name of the EventType ({5a32cbd3-bc1c-4724-ae53-9f36cb75bf84}) of ThingClass garagedoor +---------- +The name of the EventType ({57361115-edbe-49fb-9847-408b571d3108}) of ThingClass venetianblind ---------- The name of the EventType ({7a49865d-5ea5-43be-b61f-4e454c48e87e}) of ThingClass rollershutter ---------- @@ -87,23 +99,32 @@ The name of the EventType ({10ebf650-a93a-4ee3-945b-fba10d4e35a5}) of ThingClass - - + + + Device URL - The name of the ParamType (ThingClass: venetianblind, Type: thing, ID: {e2541b7b-fbfa-4659-87b1-35d8993714c9}) + The name of the ParamType (ThingClass: garagedoor, Type: thing, ID: {974710eb-5da4-4b3e-8c4f-ba60e8af31b3}) +---------- +The name of the ParamType (ThingClass: venetianblind, Type: thing, ID: {e2541b7b-fbfa-4659-87b1-35d8993714c9}) ---------- The name of the ParamType (ThingClass: rollershutter, Type: thing, ID: {b3d20d6a-f4e1-4959-ab06-3d271ba5c3dc}) - + + Garage Door + The name of the ThingClass ({cb206d74-b13c-4466-98c6-070b19ebd23a}) + + + + Gateway Id The name of the ParamType (ThingClass: gateway, Type: thing, ID: {e321a7d6-6dcb-4a37-baf1-c7008f2d5bdb}) - - + + Logged in The name of the ParamType (ThingClass: tahoma, EventType: loggedIn, ID: {97fefa85-db79-4efd-8d83-4a15d72996e1}) ---------- @@ -111,18 +132,24 @@ The name of the StateType ({97fefa85-db79-4efd-8d83-4a15d72996e1}) of ThingClass - + Login state changed The name of the EventType ({97fefa85-db79-4efd-8d83-4a15d72996e1}) of ThingClass tahoma - - - - + + + + + + Moving - The name of the ParamType (ThingClass: venetianblind, EventType: moving, ID: {48d5de0a-11ab-4801-94e4-a1dd458c341d}) + The name of the ParamType (ThingClass: garagedoor, EventType: moving, ID: {07175175-f95d-4cd9-a398-9aab8232c2a9}) +---------- +The name of the StateType ({07175175-f95d-4cd9-a398-9aab8232c2a9}) of ThingClass garagedoor +---------- +The name of the ParamType (ThingClass: venetianblind, EventType: moving, ID: {48d5de0a-11ab-4801-94e4-a1dd458c341d}) ---------- The name of the StateType ({48d5de0a-11ab-4801-94e4-a1dd458c341d}) of ThingClass venetianblind ---------- @@ -132,32 +159,47 @@ The name of the StateType ({fa9446ba-da30-4d49-8fb6-f410ecc7dba0}) of ThingClass - - + + + Moving changed - The name of the EventType ({48d5de0a-11ab-4801-94e4-a1dd458c341d}) of ThingClass venetianblind + The name of the EventType ({07175175-f95d-4cd9-a398-9aab8232c2a9}) of ThingClass garagedoor +---------- +The name of the EventType ({48d5de0a-11ab-4801-94e4-a1dd458c341d}) of ThingClass venetianblind ---------- The name of the EventType ({fa9446ba-da30-4d49-8fb6-f410ecc7dba0}) of ThingClass rollershutter - - + + + Open - The name of the ActionType ({004e7294-59e6-498b-a0aa-e58eaeefdf2b}) of ThingClass venetianblind + The name of the ActionType ({5738edd9-a1d1-4031-8505-85a919afe6f7}) of ThingClass garagedoor +---------- +The name of the ActionType ({004e7294-59e6-498b-a0aa-e58eaeefdf2b}) of ThingClass venetianblind ---------- The name of the ActionType ({a0460180-e799-4bc6-83ba-11731ef124a3}) of ThingClass rollershutter - - - - - - + + + + + + + + + Percentage - The name of the ParamType (ThingClass: venetianblind, ActionType: percentage, ID: {77ca50db-42a7-4434-83e2-8b5fc4438924}) + The name of the ParamType (ThingClass: garagedoor, ActionType: percentage, ID: {284816aa-842b-4a86-bb4e-ef5353b76762}) +---------- +The name of the ParamType (ThingClass: garagedoor, EventType: percentage, ID: {284816aa-842b-4a86-bb4e-ef5353b76762}) +---------- +The name of the StateType ({284816aa-842b-4a86-bb4e-ef5353b76762}) of ThingClass garagedoor +---------- +The name of the ParamType (ThingClass: venetianblind, ActionType: percentage, ID: {77ca50db-42a7-4434-83e2-8b5fc4438924}) ---------- The name of the ParamType (ThingClass: venetianblind, EventType: percentage, ID: {77ca50db-42a7-4434-83e2-8b5fc4438924}) ---------- @@ -171,42 +213,54 @@ The name of the StateType ({f954ffc7-a6aa-4d30-aee0-0484631c3344}) of ThingClass - - + + + Percentage changed - The name of the EventType ({77ca50db-42a7-4434-83e2-8b5fc4438924}) of ThingClass venetianblind + The name of the EventType ({284816aa-842b-4a86-bb4e-ef5353b76762}) of ThingClass garagedoor +---------- +The name of the EventType ({77ca50db-42a7-4434-83e2-8b5fc4438924}) of ThingClass venetianblind ---------- The name of the EventType ({f954ffc7-a6aa-4d30-aee0-0484631c3344}) of ThingClass rollershutter - + Roller Shutter The name of the ThingClass ({6b187fe0-a987-462d-90ac-c48efc0d0fc0}) - + Set angle The name of the ActionType ({079c7a80-8a1c-4fd7-b40c-6800120c70fb}) of ThingClass venetianblind - - + + + Set percentage - The name of the ActionType ({77ca50db-42a7-4434-83e2-8b5fc4438924}) of ThingClass venetianblind + The name of the ActionType ({284816aa-842b-4a86-bb4e-ef5353b76762}) of ThingClass garagedoor +---------- +The name of the ActionType ({77ca50db-42a7-4434-83e2-8b5fc4438924}) of ThingClass venetianblind ---------- The name of the ActionType ({f954ffc7-a6aa-4d30-aee0-0484631c3344}) of ThingClass rollershutter - - - - + + + + + + Signal strength - The name of the ParamType (ThingClass: venetianblind, EventType: signalStrength, ID: {aee4f4e3-3445-441d-bdbb-631b0c5db942}) + The name of the ParamType (ThingClass: garagedoor, EventType: signalStrength, ID: {0a194091-3073-4912-9d84-f1d52c8534bd}) +---------- +The name of the StateType ({0a194091-3073-4912-9d84-f1d52c8534bd}) of ThingClass garagedoor +---------- +The name of the ParamType (ThingClass: venetianblind, EventType: signalStrength, ID: {aee4f4e3-3445-441d-bdbb-631b0c5db942}) ---------- The name of the StateType ({aee4f4e3-3445-441d-bdbb-631b0c5db942}) of ThingClass venetianblind ---------- @@ -216,50 +270,71 @@ The name of the StateType ({67594d96-47a2-4360-a1b8-79e4f22f9ed0}) of ThingClass - - + + + Signal strength changed - The name of the EventType ({aee4f4e3-3445-441d-bdbb-631b0c5db942}) of ThingClass venetianblind + The name of the EventType ({0a194091-3073-4912-9d84-f1d52c8534bd}) of ThingClass garagedoor +---------- +The name of the EventType ({aee4f4e3-3445-441d-bdbb-631b0c5db942}) of ThingClass venetianblind ---------- The name of the EventType ({67594d96-47a2-4360-a1b8-79e4f22f9ed0}) of ThingClass rollershutter - + Somfy The name of the vendor ({4e42a22a-ccfb-4677-89e3-f7fa16bf6be0}) - + Somfy Tahoma The name of the plugin SomfyTahoma ({4e8be1c1-daa8-4e21-9e85-b2372ab1a450}) - - + + + State + The name of the ParamType (ThingClass: garagedoor, EventType: state, ID: {12af28f1-475e-4d05-9bbb-adbb86dcd69c}) +---------- +The name of the StateType ({12af28f1-475e-4d05-9bbb-adbb86dcd69c}) of ThingClass garagedoor + + + + + State changed + The name of the EventType ({12af28f1-475e-4d05-9bbb-adbb86dcd69c}) of ThingClass garagedoor + + + + + + Stop - The name of the ActionType ({31b07407-65ef-4fd1-880b-b5d9f69a9d07}) of ThingClass venetianblind + The name of the ActionType ({75e345b8-0a25-4ba6-ba83-f2611252f87f}) of ThingClass garagedoor +---------- +The name of the ActionType ({31b07407-65ef-4fd1-880b-b5d9f69a9d07}) of ThingClass venetianblind ---------- The name of the ActionType ({cbccf714-1188-4ac9-9c91-17fe2c99acb3}) of ThingClass rollershutter - + Tahoma Account The name of the ThingClass ({fedd72b8-547d-4e4f-b73e-71344a8ba0c1}) - + Tahoma Gateway The name of the ThingClass ({6c09e0b9-f0cc-4dea-9994-9e039eff78f1}) - - + + User display name The name of the ParamType (ThingClass: tahoma, EventType: userDisplayName, ID: {75609987-be60-4932-94f6-ead791b5fa58}) ---------- @@ -267,13 +342,13 @@ The name of the StateType ({75609987-be60-4932-94f6-ead791b5fa58}) of ThingClass - + User display name changed The name of the EventType ({75609987-be60-4932-94f6-ead791b5fa58}) of ThingClass tahoma - + Venetian Blind The name of the ThingClass ({c7160205-d864-4194-b418-060fff60f0cb})