Philips Hue - add support for Dimmer Switch v2
add support for new Dimmer Switch v2, short and long presses
This commit is contained in:
parent
f297c5f7e8
commit
af1d0b67ba
@ -483,6 +483,24 @@ void IntegrationPluginPhilipsHue::setupThing(ThingSetupInfo *info)
|
|||||||
return info->finish(Thing::ThingErrorNoError);
|
return info->finish(Thing::ThingErrorNoError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hue Dimmer Switch V2
|
||||||
|
if (thing->thingClassId() == dimmerSwitch2ThingClassId) {
|
||||||
|
qCDebug(dcPhilipsHue) << "Setup Hue Dimmer Switch V2" << thing->params() << thing->thingClassId();
|
||||||
|
|
||||||
|
HueRemote *hueDimmerSwitch2 = new HueRemote(bridge, this);
|
||||||
|
|
||||||
|
hueDimmerSwitch2->setId(thing->paramValue(dimmerSwitch2ThingSensorIdParamTypeId).toInt());
|
||||||
|
hueDimmerSwitch2->setModelId(thing->paramValue(dimmerSwitch2ThingModelIdParamTypeId).toString());
|
||||||
|
hueDimmerSwitch2->setType(thing->paramValue(dimmerSwitch2ThingTypeParamTypeId).toString());
|
||||||
|
hueDimmerSwitch2->setUuid(thing->paramValue(dimmerSwitch2ThingUuidParamTypeId).toString());
|
||||||
|
|
||||||
|
connect(hueDimmerSwitch2, &HueRemote::stateChanged, this, &IntegrationPluginPhilipsHue::remoteStateChanged);
|
||||||
|
connect(hueDimmerSwitch2, &HueRemote::buttonPressed, this, &IntegrationPluginPhilipsHue::onRemoteButtonEvent);
|
||||||
|
|
||||||
|
m_remotes.insert(hueDimmerSwitch2, thing);
|
||||||
|
return info->finish(Thing::ThingErrorNoError);
|
||||||
|
}
|
||||||
|
|
||||||
// Hue tap
|
// Hue tap
|
||||||
if (thing->thingClassId() == tapThingClassId) {
|
if (thing->thingClassId() == tapThingClassId) {
|
||||||
HueRemote *hueTap = new HueRemote(bridge, this);
|
HueRemote *hueTap = new HueRemote(bridge, this);
|
||||||
@ -626,7 +644,7 @@ void IntegrationPluginPhilipsHue::thingRemoved(Thing *thing)
|
|||||||
light->deleteLater();
|
light->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (thing->thingClassId() == remoteThingClassId || thing->thingClassId() == tapThingClassId || thing->thingClassId() == smartButtonThingClassId) {
|
if (thing->thingClassId() == remoteThingClassId || thing->thingClassId() == dimmerSwitch2ThingClassId|| thing->thingClassId() == tapThingClassId || thing->thingClassId() == smartButtonThingClassId) {
|
||||||
HueRemote *remote = m_remotes.key(thing);
|
HueRemote *remote = m_remotes.key(thing);
|
||||||
m_remotes.remove(remote);
|
m_remotes.remove(remote);
|
||||||
remote->deleteLater();
|
remote->deleteLater();
|
||||||
@ -1136,6 +1154,10 @@ void IntegrationPluginPhilipsHue::remoteStateChanged()
|
|||||||
thing->setStateValue(remoteConnectedStateTypeId, remote->reachable());
|
thing->setStateValue(remoteConnectedStateTypeId, remote->reachable());
|
||||||
thing->setStateValue(remoteBatteryLevelStateTypeId, remote->battery());
|
thing->setStateValue(remoteBatteryLevelStateTypeId, remote->battery());
|
||||||
thing->setStateValue(remoteBatteryCriticalStateTypeId, remote->battery() < 5);
|
thing->setStateValue(remoteBatteryCriticalStateTypeId, remote->battery() < 5);
|
||||||
|
} else if (thing->thingClassId() == dimmerSwitch2ThingClassId) {
|
||||||
|
thing->setStateValue(dimmerSwitch2ConnectedStateTypeId, remote->reachable());
|
||||||
|
thing->setStateValue(dimmerSwitch2BatteryLevelStateTypeId, remote->battery());
|
||||||
|
thing->setStateValue(dimmerSwitch2BatteryCriticalStateTypeId, remote->battery() < 5);
|
||||||
} else if (thing->thingClassId() == tapThingClassId) {
|
} else if (thing->thingClassId() == tapThingClassId) {
|
||||||
thing->setStateValue(tapConnectedStateTypeId, remote->reachable());
|
thing->setStateValue(tapConnectedStateTypeId, remote->reachable());
|
||||||
} else if (thing->thingClassId() == smartButtonThingClassId) {
|
} else if (thing->thingClassId() == smartButtonThingClassId) {
|
||||||
@ -1195,6 +1217,49 @@ void IntegrationPluginPhilipsHue::onRemoteButtonEvent(int buttonCode)
|
|||||||
qCDebug(dcPhilipsHue()) << "Unhandled button code received from Hue Remote:" << buttonCode;
|
qCDebug(dcPhilipsHue()) << "Unhandled button code received from Hue Remote:" << buttonCode;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
} else if (thing->thingClassId() == dimmerSwitch2ThingClassId) {
|
||||||
|
switch (buttonCode) {
|
||||||
|
case 1002:
|
||||||
|
param = Param(dimmerSwitch2PressedEventButtonNameParamTypeId, "POWER");
|
||||||
|
id = dimmerSwitch2PressedEventTypeId;
|
||||||
|
break;
|
||||||
|
case 1000:
|
||||||
|
param = Param(dimmerSwitch2LongPressedEventButtonNameParamTypeId, "POWER");
|
||||||
|
id = dimmerSwitch2LongPressedEventTypeId;
|
||||||
|
break;
|
||||||
|
case 2002:
|
||||||
|
param = Param(dimmerSwitch2PressedEventButtonNameParamTypeId, "DIM UP");
|
||||||
|
id = dimmerSwitch2PressedEventTypeId;
|
||||||
|
break;
|
||||||
|
case 2000:
|
||||||
|
param = Param(dimmerSwitch2LongPressedEventButtonNameParamTypeId, "DIM UP");
|
||||||
|
id = dimmerSwitch2LongPressedEventTypeId;
|
||||||
|
break;
|
||||||
|
case 3002:
|
||||||
|
param = Param(dimmerSwitch2PressedEventButtonNameParamTypeId, "DIM DOWN");
|
||||||
|
id = dimmerSwitch2PressedEventTypeId;
|
||||||
|
break;
|
||||||
|
case 3000:
|
||||||
|
param = Param(dimmerSwitch2LongPressedEventButtonNameParamTypeId, "DIM DOWN");
|
||||||
|
id = dimmerSwitch2LongPressedEventTypeId;
|
||||||
|
break;
|
||||||
|
case 4002:
|
||||||
|
param = Param(dimmerSwitch2PressedEventButtonNameParamTypeId, "HUE");
|
||||||
|
id = dimmerSwitch2PressedEventTypeId;
|
||||||
|
break;
|
||||||
|
case 4000:
|
||||||
|
param = Param(dimmerSwitch2LongPressedEventButtonNameParamTypeId, "HUE");
|
||||||
|
id = dimmerSwitch2LongPressedEventTypeId;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qCDebug(dcPhilipsHue()) << "Unhandled button code received from Hue Dimmer Switch V2:" << buttonCode;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// codes ending in 2 (e.g. 1002) are short presses;
|
||||||
|
// for long presses the Dimmer Switch V2 sends 3 codes:
|
||||||
|
// * codes ending in 0 (e.g. 1000) indicate start of long press
|
||||||
|
// * codes ending in 3 (e.g. 1003) indicate end of long press --> not yet supported by this plugin, but e.g. LongPressEnded action could be added
|
||||||
|
// * codes ending in 1 (e.g. 1001) are sent during the long press --> probably for backwards compatibility with earlier version, and therefore not added to this plugin
|
||||||
} else if (thing->thingClassId() == tapThingClassId) {
|
} else if (thing->thingClassId() == tapThingClassId) {
|
||||||
switch (buttonCode) {
|
switch (buttonCode) {
|
||||||
case 34:
|
case 34:
|
||||||
@ -1559,6 +1624,18 @@ void IntegrationPluginPhilipsHue::processBridgeSensorDiscoveryResponse(Thing *th
|
|||||||
emit autoThingsAppeared({descriptor});
|
emit autoThingsAppeared({descriptor});
|
||||||
qCDebug(dcPhilipsHue) << "Found new remote" << sensorMap.value("name").toString() << model;
|
qCDebug(dcPhilipsHue) << "Found new remote" << sensorMap.value("name").toString() << model;
|
||||||
|
|
||||||
|
// Dimmer Switch V2
|
||||||
|
} else if (model == "RWL022") {
|
||||||
|
ThingDescriptor descriptor(dimmerSwitch2ThingClassId, sensorMap.value("name").toString(), "Philips Hue Dimmer Switch V2", thing->id());
|
||||||
|
ParamList params;
|
||||||
|
params.append(Param(dimmerSwitch2ThingModelIdParamTypeId, model));
|
||||||
|
params.append(Param(dimmerSwitch2ThingTypeParamTypeId, sensorMap.value("type").toString()));
|
||||||
|
params.append(Param(dimmerSwitch2ThingUuidParamTypeId, uuid));
|
||||||
|
params.append(Param(dimmerSwitch2ThingSensorIdParamTypeId, sensorId));
|
||||||
|
descriptor.setParams(params);
|
||||||
|
emit autoThingsAppeared({descriptor});
|
||||||
|
qCDebug(dcPhilipsHue) << "Found new dimmer switch v2" << sensorMap.value("name").toString() << model;
|
||||||
|
|
||||||
// Smart Button
|
// Smart Button
|
||||||
} else if (model == "ROM001") {
|
} else if (model == "ROM001") {
|
||||||
ThingDescriptor descriptor(smartButtonThingClassId, sensorMap.value("name").toString(), "Philips Hue Smart Button", thing->id());
|
ThingDescriptor descriptor(smartButtonThingClassId, sensorMap.value("name").toString(), "Philips Hue Smart Button", thing->id());
|
||||||
@ -1934,6 +2011,8 @@ void IntegrationPluginPhilipsHue::bridgeReachableChanged(Thing *thing, bool reac
|
|||||||
remote->setReachable(false);
|
remote->setReachable(false);
|
||||||
if (m_remotes.value(remote)->thingClassId() == remoteThingClassId) {
|
if (m_remotes.value(remote)->thingClassId() == remoteThingClassId) {
|
||||||
m_remotes.value(remote)->setStateValue(remoteConnectedStateTypeId, false);
|
m_remotes.value(remote)->setStateValue(remoteConnectedStateTypeId, false);
|
||||||
|
} else if (m_remotes.value(remote)->thingClassId() == dimmerSwitch2ThingClassId) {
|
||||||
|
m_remotes.value(remote)->setStateValue(dimmerSwitch2ConnectedStateTypeId, false);
|
||||||
} else if (m_remotes.value(remote)->thingClassId() == tapThingClassId) {
|
} else if (m_remotes.value(remote)->thingClassId() == tapThingClassId) {
|
||||||
m_remotes.value(remote)->setStateValue(tapConnectedStateTypeId, false);
|
m_remotes.value(remote)->setStateValue(tapConnectedStateTypeId, false);
|
||||||
} else if (m_remotes.value(remote)->thingClassId() == smartButtonThingClassId) {
|
} else if (m_remotes.value(remote)->thingClassId() == smartButtonThingClassId) {
|
||||||
@ -2004,6 +2083,13 @@ bool IntegrationPluginPhilipsHue::sensorAlreadyAdded(const QString &uuid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hue dimmer switch V2
|
||||||
|
if (thing->thingClassId() == dimmerSwitch2ThingClassId) {
|
||||||
|
if (thing->paramValue(dimmerSwitch2ThingUuidParamTypeId).toString() == uuid) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Hue tap
|
// Hue tap
|
||||||
if (thing->thingClassId() == tapThingClassId) {
|
if (thing->thingClassId() == tapThingClassId) {
|
||||||
if (thing->paramValue(tapThingUuidParamTypeId).toString() == uuid) {
|
if (thing->paramValue(tapThingUuidParamTypeId).toString() == uuid) {
|
||||||
|
|||||||
@ -575,6 +575,103 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "2b40aea0-e0f3-4cde-b034-3ae8a69a5d9d",
|
||||||
|
"name": "dimmerSwitch2",
|
||||||
|
"displayName": "Hue Dimmer Switch V2",
|
||||||
|
"interfaces": ["longpressmultibutton", "wirelessconnectable"],
|
||||||
|
"createMethods": ["auto"],
|
||||||
|
"paramTypes": [
|
||||||
|
{
|
||||||
|
"id": "985fdf8a-e4a5-4a6e-bf2c-47559b32f395",
|
||||||
|
"name": "modelId",
|
||||||
|
"displayName": "model id",
|
||||||
|
"type" : "QString",
|
||||||
|
"readOnly": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "a821e27e-216e-4fd4-9105-15cd822ab6b2",
|
||||||
|
"name": "type",
|
||||||
|
"displayName": "type",
|
||||||
|
"type" : "QString",
|
||||||
|
"readOnly": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "200b5daa-1023-49cb-a933-bdd1ac7df4bd",
|
||||||
|
"name": "uuid",
|
||||||
|
"displayName": "uuid",
|
||||||
|
"type" : "QString",
|
||||||
|
"readOnly": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "b8121363-321a-4569-bb34-a02f846aa9c5",
|
||||||
|
"name": "sensorId",
|
||||||
|
"displayName": "sensor id",
|
||||||
|
"type" : "int",
|
||||||
|
"readOnly": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateTypes": [
|
||||||
|
{
|
||||||
|
"id": "45f75511-7d72-410e-aed0-5720cc497bf8",
|
||||||
|
"name": "connected",
|
||||||
|
"displayName": "reachable",
|
||||||
|
"displayNameEvent": "reachable changed",
|
||||||
|
"defaultValue": false,
|
||||||
|
"type": "bool",
|
||||||
|
"cached": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cb6e045c-e305-4950-9cd4-fb3989912156",
|
||||||
|
"name": "batteryLevel",
|
||||||
|
"displayName": "battery",
|
||||||
|
"displayNameEvent": "battery changed",
|
||||||
|
"type": "int",
|
||||||
|
"unit": "Percentage",
|
||||||
|
"defaultValue": 0,
|
||||||
|
"minValue": 0,
|
||||||
|
"maxValue": 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "88cc3794-3e83-47d4-8889-0b3246336bf7",
|
||||||
|
"name": "batteryCritical",
|
||||||
|
"displayName": "battery critical",
|
||||||
|
"displayNameEvent": "battery critical changed",
|
||||||
|
"type": "bool",
|
||||||
|
"defaultValue": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"eventTypes": [
|
||||||
|
{
|
||||||
|
"id": "b7a5b3df-2c60-4b97-bf99-b97e6012a194",
|
||||||
|
"name": "pressed",
|
||||||
|
"displayName": "Button pressed",
|
||||||
|
"paramTypes": [
|
||||||
|
{
|
||||||
|
"id": "562f2d4d-351e-4c2c-98bf-187b948587e4",
|
||||||
|
"name": "buttonName",
|
||||||
|
"displayName": "Button name",
|
||||||
|
"type": "QString",
|
||||||
|
"allowedValues": ["POWER", "HUE", "DIM UP", "DIM DOWN"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "d5052592-044d-42e8-b98a-d3fe9f2f53ae",
|
||||||
|
"name": "longPressed",
|
||||||
|
"displayName": "Button longpress",
|
||||||
|
"paramTypes": [
|
||||||
|
{
|
||||||
|
"id": "c03bb1ad-f8c9-4993-9d25-557ade2d2c13",
|
||||||
|
"name": "buttonName",
|
||||||
|
"displayName": "Button name",
|
||||||
|
"type": "QString",
|
||||||
|
"allowedValues": ["POWER", "HUE", "DIM UP", "DIM DOWN"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "1e34a056-9f37-4741-b249-a5eca7a4ab4e",
|
"id": "1e34a056-9f37-4741-b249-a5eca7a4ab4e",
|
||||||
"name": "smartButton",
|
"name": "smartButton",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user