Philips Hue - add support for Dimmer Switch v2
add support for new Dimmer Switch v2, short and long pressesmaster
parent
f297c5f7e8
commit
af1d0b67ba
|
|
@ -483,6 +483,24 @@ void IntegrationPluginPhilipsHue::setupThing(ThingSetupInfo *info)
|
|||
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
|
||||
if (thing->thingClassId() == tapThingClassId) {
|
||||
HueRemote *hueTap = new HueRemote(bridge, this);
|
||||
|
|
@ -626,7 +644,7 @@ void IntegrationPluginPhilipsHue::thingRemoved(Thing *thing)
|
|||
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);
|
||||
m_remotes.remove(remote);
|
||||
remote->deleteLater();
|
||||
|
|
@ -1136,6 +1154,10 @@ void IntegrationPluginPhilipsHue::remoteStateChanged()
|
|||
thing->setStateValue(remoteConnectedStateTypeId, remote->reachable());
|
||||
thing->setStateValue(remoteBatteryLevelStateTypeId, remote->battery());
|
||||
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) {
|
||||
thing->setStateValue(tapConnectedStateTypeId, remote->reachable());
|
||||
} else if (thing->thingClassId() == smartButtonThingClassId) {
|
||||
|
|
@ -1195,6 +1217,49 @@ void IntegrationPluginPhilipsHue::onRemoteButtonEvent(int buttonCode)
|
|||
qCDebug(dcPhilipsHue()) << "Unhandled button code received from Hue Remote:" << buttonCode;
|
||||
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) {
|
||||
switch (buttonCode) {
|
||||
case 34:
|
||||
|
|
@ -1559,6 +1624,18 @@ void IntegrationPluginPhilipsHue::processBridgeSensorDiscoveryResponse(Thing *th
|
|||
emit autoThingsAppeared({descriptor});
|
||||
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
|
||||
} else if (model == "ROM001") {
|
||||
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);
|
||||
if (m_remotes.value(remote)->thingClassId() == remoteThingClassId) {
|
||||
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) {
|
||||
m_remotes.value(remote)->setStateValue(tapConnectedStateTypeId, false);
|
||||
} 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
|
||||
if (thing->thingClassId() == tapThingClassId) {
|
||||
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",
|
||||
"name": "smartButton",
|
||||
|
|
|
|||
Loading…
Reference in New Issue