Add lumi remote

This commit is contained in:
Simon Stürz 2020-11-26 11:59:29 +01:00
parent c7ffbfda15
commit 3d365d2c57
3 changed files with 136 additions and 1 deletions

View File

@ -66,7 +66,7 @@ IntegrationPluginZigbeeGenericLights::IntegrationPluginZigbeeGenericLights()
m_modelIdParamTypeIds[colorLightThingClassId] = colorLightThingModelParamTypeId;
// Common sates map
// Common states map
m_connectedStateTypeIds[onOffLightThingClassId] = onOffLightConnectedStateTypeId;
m_connectedStateTypeIds[dimmableLightThingClassId] = dimmableLightConnectedStateTypeId;
m_connectedStateTypeIds[colorTemperatureLightThingClassId] = colorTemperatureLightConnectedStateTypeId;

View File

@ -717,6 +717,94 @@
],
"eventTypes": [
]
},
{
"name": "lumiRemote",
"displayName": "Switch",
"id": "f8aa2ba1-ce74-4691-b97d-85427f4cf8bd",
"setupMethod": "JustAdd",
"createMethods": [ "Auto" ],
"interfaces": [ "longpressmultibutton", "wirelessconnectable" ],
"paramTypes": [
{
"id": "cce8b39c-ac8a-4a8f-b66e-b6100a209fb8",
"name": "ieeeAddress",
"displayName": "IEEE adress",
"type": "QString",
"defaultValue": "00:00:00:00:00:00:00:00"
},
{
"id": "8eec3cae-8f3b-4c32-b26a-f7c49844841e",
"name": "networkUuid",
"displayName": "Zigbee network UUID",
"type": "QString",
"defaultValue": ""
}
],
"stateTypes": [
{
"id": "d1afa3ba-f3bd-47e5-90fa-9d80dcce91d8",
"name": "connected",
"displayName": "Connected",
"displayNameEvent": "Connected changed",
"type": "bool",
"cached": false,
"defaultValue": false
},
{
"id": "a764dbfb-7b86-439b-94ea-aec742dcb13e",
"name": "signalStrength",
"displayName": "Signal strength",
"displayNameEvent": "Signal strength changed",
"defaultValue": 0,
"maxValue": 100,
"minValue": 0,
"type": "uint",
"unit": "Percentage"
},
{
"id": "8164c1d0-657e-4347-99fb-f3fdc07af6de",
"name": "version",
"displayName": "Version",
"displayNameEvent": "Version changed",
"type": "QString",
"cached": true,
"defaultValue": ""
}
],
"actionTypes": [
],
"eventTypes": [
{
"id": "9a0c5f37-e346-41d9-93a4-4877c012b805",
"name": "pressed",
"displayName": "Button pressed",
"paramTypes": [
{
"id": "72df572a-77d2-42b4-8ffa-cde70ccca37c",
"name": "buttonName",
"displayName": "Button name",
"type": "QString",
"allowedValues": ["1", "2", "1+2"]
}
]
},
{
"id": "9a7a3d9e-faa3-471f-8c82-0bb98d9a788a",
"name": "longPressed",
"displayName": "Button longpressed",
"paramTypes": [
{
"id": "0a8d4da6-be6e-4b7d-92d7-5cf35d74042f",
"name": "buttonName",
"displayName": "Button name",
"type": "QString",
"allowedValues": ["1", "2", "1+2"]
}
]
}
]
}
]

View File

@ -48,6 +48,7 @@ IntegrationPluginZigbeeLumi::IntegrationPluginZigbeeLumi()
m_networkUuidParamTypeIds[lumiVibrationSensorThingClassId] = lumiVibrationSensorThingNetworkUuidParamTypeId;
m_networkUuidParamTypeIds[lumiPowerSocketThingClassId] = lumiPowerSocketThingNetworkUuidParamTypeId;
m_networkUuidParamTypeIds[lumiRelayThingClassId] = lumiRelayThingNetworkUuidParamTypeId;
m_networkUuidParamTypeIds[lumiRemoteThingClassId] = lumiRemoteThingNetworkUuidParamTypeId;
m_zigbeeAddressParamTypeIds[lumiHTSensorThingClassId] = lumiHTSensorThingIeeeAddressParamTypeId;
m_zigbeeAddressParamTypeIds[lumiButtonSensorThingClassId] = lumiButtonSensorThingIeeeAddressParamTypeId;
@ -58,6 +59,7 @@ IntegrationPluginZigbeeLumi::IntegrationPluginZigbeeLumi()
m_zigbeeAddressParamTypeIds[lumiVibrationSensorThingClassId] = lumiVibrationSensorThingIeeeAddressParamTypeId;
m_zigbeeAddressParamTypeIds[lumiPowerSocketThingClassId] = lumiPowerSocketThingIeeeAddressParamTypeId;
m_zigbeeAddressParamTypeIds[lumiRelayThingClassId] = lumiRelayThingIeeeAddressParamTypeId;
m_zigbeeAddressParamTypeIds[lumiRemoteThingClassId] = lumiRemoteThingIeeeAddressParamTypeId;
m_connectedStateTypeIds[lumiHTSensorThingClassId] = lumiHTSensorConnectedStateTypeId;
m_connectedStateTypeIds[lumiButtonSensorThingClassId] = lumiButtonSensorConnectedStateTypeId;
@ -68,6 +70,7 @@ IntegrationPluginZigbeeLumi::IntegrationPluginZigbeeLumi()
m_connectedStateTypeIds[lumiVibrationSensorThingClassId] = lumiVibrationSensorConnectedStateTypeId;
m_connectedStateTypeIds[lumiPowerSocketThingClassId] = lumiPowerSocketConnectedStateTypeId;
m_connectedStateTypeIds[lumiRelayThingClassId] = lumiRelayConnectedStateTypeId;
m_connectedStateTypeIds[lumiRemoteThingClassId] = lumiRemoteConnectedStateTypeId;
m_versionStateTypeIds[lumiHTSensorThingClassId] = lumiHTSensorVersionStateTypeId;
m_versionStateTypeIds[lumiButtonSensorThingClassId] = lumiButtonSensorVersionStateTypeId;
@ -78,6 +81,7 @@ IntegrationPluginZigbeeLumi::IntegrationPluginZigbeeLumi()
m_versionStateTypeIds[lumiVibrationSensorThingClassId] = lumiVibrationSensorVersionStateTypeId;
m_versionStateTypeIds[lumiPowerSocketThingClassId] = lumiPowerSocketVersionStateTypeId;
m_versionStateTypeIds[lumiRelayThingClassId] = lumiRelayVersionStateTypeId;
m_versionStateTypeIds[lumiRemoteThingClassId] = lumiRemoteVersionStateTypeId;
m_signalStrengthStateTypeIds[lumiHTSensorThingClassId] = lumiHTSensorSignalStrengthStateTypeId;
m_signalStrengthStateTypeIds[lumiButtonSensorThingClassId] = lumiButtonSensorSignalStrengthStateTypeId;
@ -88,6 +92,7 @@ IntegrationPluginZigbeeLumi::IntegrationPluginZigbeeLumi()
m_signalStrengthStateTypeIds[lumiVibrationSensorThingClassId] = lumiVibrationSensorSignalStrengthStateTypeId;
m_signalStrengthStateTypeIds[lumiPowerSocketThingClassId] = lumiPowerSocketSignalStrengthStateTypeId;
m_signalStrengthStateTypeIds[lumiRelayThingClassId] = lumiRelaySignalStrengthStateTypeId;
m_signalStrengthStateTypeIds[lumiRemoteThingClassId] = lumiRemoteSignalStrengthStateTypeId;
// Known model identifier
m_knownLumiDevices.insert("lumi.sensor_ht", lumiHTSensorThingClassId);
@ -99,6 +104,7 @@ IntegrationPluginZigbeeLumi::IntegrationPluginZigbeeLumi()
m_knownLumiDevices.insert("lumi.vibration", lumiVibrationSensorThingClassId);
m_knownLumiDevices.insert("lumi.plug", lumiPowerSocketThingClassId);
m_knownLumiDevices.insert("lumi.relay", lumiRelayThingClassId);
m_knownLumiDevices.insert("lumi.remote", lumiRemoteThingClassId);
}
QString IntegrationPluginZigbeeLumi::name() const
@ -442,6 +448,47 @@ void IntegrationPluginZigbeeLumi::setupThing(ThingSetupInfo *info)
}
}
if (thing->thingClassId() == lumiRemoteThingClassId) {
// Since we are here again out of spec, we just can react on cluster and endpoint signals
connect(node, &ZigbeeNode::endpointClusterAttributeChanged, thing, [this, thing](ZigbeeNodeEndpoint *endpoint, ZigbeeCluster *cluster, const ZigbeeClusterAttribute &attribute){
switch (endpoint->endpointId()) {
case 0x01:
if (cluster->clusterId() == ZigbeeClusterLibrary::ClusterIdMultistateInput && attribute.id() == ZigbeeClusterMultistateInput::AttributePresentValue) {
quint16 value = attribute.dataType().toUInt16();
if (value == 1) {
emit emitEvent(Event(lumiRemotePressedEventTypeId, thing->id(), ParamList() << Param(lumiRemotePressedEventButtonNameParamTypeId, "1")));
} else {
emit emitEvent(Event(lumiRemoteLongPressedEventTypeId, thing->id(), ParamList() << Param(lumiRemoteLongPressedEventButtonNameParamTypeId, "1")));
}
}
break;
case 0x02:
if (cluster->clusterId() == ZigbeeClusterLibrary::ClusterIdMultistateInput && attribute.id() == ZigbeeClusterMultistateInput::AttributePresentValue) {
quint16 value = attribute.dataType().toUInt16();
if (value == 1) {
emit emitEvent(Event(lumiRemotePressedEventTypeId, thing->id(), ParamList() << Param(lumiRemotePressedEventButtonNameParamTypeId, "2")));
} else {
emit emitEvent(Event(lumiRemoteLongPressedEventTypeId, thing->id(), ParamList() << Param(lumiRemoteLongPressedEventButtonNameParamTypeId, "2")));
}
}
break;
case 0x03:
if (cluster->clusterId() == ZigbeeClusterLibrary::ClusterIdMultistateInput && attribute.id() == ZigbeeClusterMultistateInput::AttributePresentValue) {
quint16 value = attribute.dataType().toUInt16();
if (value == 1) {
emit emitEvent(Event(lumiRemotePressedEventTypeId, thing->id(), ParamList() << Param(lumiRemotePressedEventButtonNameParamTypeId, "1+2")));
} else {
emit emitEvent(Event(lumiRemoteLongPressedEventTypeId, thing->id(), ParamList() << Param(lumiRemoteLongPressedEventButtonNameParamTypeId, "1+2")));
}
}
break;
default:
qCWarning(dcZigbeeLumi()) << "Received attribute changed signal from unhandled endpoint" << thing << endpoint << cluster << attribute;
break;
}
});
}
if (thing->thingClassId() == lumiRelayThingClassId) {
// Get the 2 endpoints
ZigbeeNodeEndpoint *endpoint1 = node->getEndpoint(0x01);