From a9afd4a501de3aeef09e3ee5aa654051242a72d1 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Thu, 14 Oct 2021 21:13:53 +0200 Subject: [PATCH 1/2] Zigbee generic: Add support for IAS based motion sensors --- zigbeegeneric/README.md | 4 + .../integrationpluginzigbeegeneric.cpp | 109 +++++++++++++++--- .../integrationpluginzigbeegeneric.h | 4 +- .../integrationpluginzigbeegeneric.json | 101 ++++++++++++++++ 4 files changed, 200 insertions(+), 18 deletions(-) diff --git a/zigbeegeneric/README.md b/zigbeegeneric/README.md index 3f3fab6c..53dd7dff 100644 --- a/zigbeegeneric/README.md +++ b/zigbeegeneric/README.md @@ -26,6 +26,10 @@ Radiator thermostats that follow the ZigBee specification. Door/window that follow the ZigBee IAS Zone specification. +### Motion sensors + +Door/window that follow the ZigBee IAS Zone specification. + ## Requirements * A compatible ZigBee controller and a running ZigBee network in nymea. You can find more information about supported controllers and ZigBee network configurations [here](https://nymea.io/documentation/users/usage/configuration#zigbee). diff --git a/zigbeegeneric/integrationpluginzigbeegeneric.cpp b/zigbeegeneric/integrationpluginzigbeegeneric.cpp index 0947d148..5aa6c83c 100644 --- a/zigbeegeneric/integrationpluginzigbeegeneric.cpp +++ b/zigbeegeneric/integrationpluginzigbeegeneric.cpp @@ -40,62 +40,71 @@ static QHash batteryLevelStateTypeIds = { {thermostatThingClassId, thermostatBatteryLevelStateTypeId}, {doorLockThingClassId, doorLockBatteryLevelStateTypeId}, - {doorSensorThingClassId, doorSensorBatteryLevelStateTypeId} + {doorSensorThingClassId, doorSensorBatteryLevelStateTypeId}, + {motionSensorThingClassId, motionSensorBatteryLevelStateTypeId} }; static QHash batteryCriticalStateTypeIds = { {thermostatThingClassId, thermostatBatteryCriticalStateTypeId}, {doorLockThingClassId, doorLockBatteryCriticalStateTypeId}, - {doorSensorThingClassId, doorSensorBatteryCriticalStateTypeId} + {doorSensorThingClassId, doorSensorBatteryCriticalStateTypeId}, + {motionSensorThingClassId, motionSensorBatteryCriticalStateTypeId} }; static QHash ieeeAddressParamTypeIds = { {thermostatThingClassId, thermostatThingIeeeAddressParamTypeId}, {powerSocketThingClassId, powerSocketThingIeeeAddressParamTypeId}, {doorLockThingClassId, doorLockThingIeeeAddressParamTypeId}, - {doorSensorThingClassId, doorSensorThingIeeeAddressParamTypeId} + {doorSensorThingClassId, doorSensorThingIeeeAddressParamTypeId}, + {motionSensorThingClassId, motionSensorThingIeeeAddressParamTypeId} }; static QHash networkUuidParamTypeIds = { {thermostatThingClassId, thermostatThingNetworkUuidParamTypeId}, {powerSocketThingClassId, powerSocketThingNetworkUuidParamTypeId}, {doorLockThingClassId, doorLockThingNetworkUuidParamTypeId}, - {doorSensorThingClassId, doorSensorThingNetworkUuidParamTypeId} + {doorSensorThingClassId, doorSensorThingNetworkUuidParamTypeId}, + {motionSensorThingClassId, motionSensorThingNetworkUuidParamTypeId} }; static QHash endpointIdParamTypeIds = { {thermostatThingClassId, thermostatThingEndpointIdParamTypeId}, {powerSocketThingClassId, powerSocketThingEndpointIdParamTypeId}, {doorLockThingClassId, doorLockThingEndpointIdParamTypeId}, - {doorSensorThingClassId, doorSensorThingEndpointIdParamTypeId} + {doorSensorThingClassId, doorSensorThingEndpointIdParamTypeId}, + {motionSensorThingClassId, motionSensorThingEndpointIdParamTypeId} }; static QHash modelIdParamTypeIds = { {thermostatThingClassId, thermostatThingManufacturerParamTypeId}, {powerSocketThingClassId, powerSocketThingManufacturerParamTypeId}, {doorLockThingClassId, doorLockThingManufacturerParamTypeId}, - {doorSensorThingClassId, doorSensorThingManufacturerParamTypeId} + {doorSensorThingClassId, doorSensorThingManufacturerParamTypeId}, + {motionSensorThingClassId, motionSensorThingManufacturerParamTypeId} }; static QHash manufacturerIdParamTypeIds = { {thermostatThingClassId, thermostatThingModelParamTypeId}, {powerSocketThingClassId, powerSocketThingModelParamTypeId}, {doorLockThingClassId, doorLockThingModelParamTypeId}, - {doorSensorThingClassId, doorSensorThingModelParamTypeId} + {doorSensorThingClassId, doorSensorThingModelParamTypeId}, + {motionSensorThingClassId, motionSensorThingModelParamTypeId} }; static QHash connectedStateTypeIds = { {thermostatThingClassId, thermostatConnectedStateTypeId}, {powerSocketThingClassId, powerSocketConnectedStateTypeId}, {doorLockThingClassId, doorLockConnectedStateTypeId}, - {doorSensorThingClassId, doorSensorConnectedStateTypeId} + {doorSensorThingClassId, doorSensorConnectedStateTypeId}, + {motionSensorThingClassId, motionSensorConnectedStateTypeId} }; static QHash signalStrengthStateTypeIds = { {thermostatThingClassId, thermostatSignalStrengthStateTypeId}, {powerSocketThingClassId, powerSocketSignalStrengthStateTypeId}, {doorLockThingClassId, doorLockSignalStrengthStateTypeId}, - {doorSensorThingClassId, doorSensorSignalStrengthStateTypeId} + {doorSensorThingClassId, doorSensorSignalStrengthStateTypeId}, + {motionSensorThingClassId, motionSensorSignalStrengthStateTypeId} }; static QHash versionStateTypeIds = { @@ -160,8 +169,8 @@ bool IntegrationPluginZigbeeGeneric::handleNode(ZigbeeNode *node, const QUuid &n } // Security sensors - if (endpoint->profile() == Zigbee::ZigbeeProfile::ZigbeeProfileHomeAutomation && endpoint->deviceId() == Zigbee::HomeAutomationDeviceIsaZone) { - qCInfo(dcZigbeeGeneric()) << "ISA Zone device found!"; + if (endpoint->profile() == Zigbee::ZigbeeProfile::ZigbeeProfileHomeAutomation && endpoint->deviceId() == Zigbee::HomeAutomationDeviceIasZone) { + qCInfo(dcZigbeeGeneric()) << "IAS Zone device found!"; // We need to read the Type cluster to determine what this actually is... ZigbeeClusterIasZone *iasZoneCluster = endpoint->inputCluster(ZigbeeClusterLibrary::ClusterIdIasZone); ZigbeeClusterReply *reply = iasZoneCluster->readAttributes({ZigbeeClusterIasZone::AttributeZoneType}); @@ -176,13 +185,19 @@ bool IntegrationPluginZigbeeGeneric::handleNode(ZigbeeNode *node, const QUuid &n qCWarning(dcZigbeeGeneric()) << "Unexpected reply in reading IAS Zone device type:" << attributeStatusRecords; return; } + + initIASSensor(node, endpoint); + ZigbeeClusterLibrary::ReadAttributeStatusRecord iasZoneTypeRecord = attributeStatusRecords.first(); qCDebug(dcZigbeeGeneric()) << "IAS Zone device type:" << iasZoneTypeRecord.dataType.toUInt16(); switch (iasZoneTypeRecord.dataType.toUInt16()) { case ZigbeeClusterIasZone::ZoneTypeContactSwitch: qCInfo(dcZigbeeGeneric()) << "Creating contact switch thing"; createThing(doorSensorThingClassId, networkUuid, node, endpoint); - initDoorSensor(node, endpoint); + break; + case ZigbeeClusterIasZone::ZoneTypeMotionSensor: + qCInfo(dcZigbeeGeneric()) << "Creating motion sensor thing"; + createThing(motionSensorThingClassId, networkUuid, node, endpoint); break; default: qCWarning(dcZigbeeGeneric()) << "Unhandled IAS Zone device type:" << "0x" + QString::number(iasZoneTypeRecord.dataType.toUInt16(), 16); @@ -220,7 +235,7 @@ void IntegrationPluginZigbeeGeneric::setupThing(ThingSetupInfo *info) { Thing *thing = info->thing(); QUuid networkUuid = thing->paramValue(networkUuidParamTypeIds.value(thing->thingClassId())).toUuid(); - qCDebug(dcZigbeeGeneric()) << "Nework uuid:" << networkUuid; + qCDebug(dcZigbeeGeneric()) << "Setting up generic zigbee thing"; ZigbeeAddress zigbeeAddress = ZigbeeAddress(thing->paramValue(ieeeAddressParamTypeIds.value(thing->thingClassId())).toString()); ZigbeeNode *node = m_thingNodes.value(thing); if (!node) { @@ -381,6 +396,29 @@ void IntegrationPluginZigbeeGeneric::setupThing(ThingSetupInfo *info) } } + if (thing->thingClassId() == motionSensorThingClassId) { + qCDebug(dcZigbeeGeneric()) << "Setting up motion sensor" << endpoint->endpointId();; + ZigbeeClusterIasZone *iasZoneCluster = endpoint->inputCluster(ZigbeeClusterLibrary::ClusterIdIasZone); + if (!iasZoneCluster) { + qCWarning(dcZigbeeGeneric()) << "Could not find IAS zone cluster on" << thing << endpoint; + } else { + qCDebug(dcZigbeeGeneric()) << "Cluster attributes:" << iasZoneCluster->attributes(); + qCDebug(dcZigbeeGeneric()) << "Zone state:" << thing->name() << iasZoneCluster->zoneState(); + qCDebug(dcZigbeeGeneric()) << "Zone type:" << thing->name() << iasZoneCluster->zoneType(); + qCDebug(dcZigbeeGeneric()) << "Zone status:" << thing->name() << iasZoneCluster->zoneStatus(); + if (iasZoneCluster->hasAttribute(ZigbeeClusterIasZone::AttributeZoneStatus)) { + ZigbeeClusterIasZone::ZoneStatusFlags zoneStatus = iasZoneCluster->zoneStatus(); + thing->setStateValue(motionSensorIsPresentStateTypeId, zoneStatus.testFlag(ZigbeeClusterIasZone::ZoneStatusAlarm1) || zoneStatus.testFlag(ZigbeeClusterIasZone::ZoneStatusAlarm2)); + thing->setStateValue(motionSensorTamperedStateTypeId, zoneStatus.testFlag(ZigbeeClusterIasZone::ZoneStatusTamper)); + } + connect(iasZoneCluster, &ZigbeeClusterIasZone::zoneStatusChanged, thing, [=](ZigbeeClusterIasZone::ZoneStatusFlags zoneStatus, quint8 extendedStatus, quint8 zoneId, quint16 delays) { + qCDebug(dcZigbeeGeneric()) << "Zone status changed to:" << zoneStatus << extendedStatus << zoneId << delays; + thing->setStateValue(motionSensorIsPresentStateTypeId, zoneStatus.testFlag(ZigbeeClusterIasZone::ZoneStatusAlarm1) || zoneStatus.testFlag(ZigbeeClusterIasZone::ZoneStatusAlarm2)); + thing->setStateValue(motionSensorTamperedStateTypeId, zoneStatus.testFlag(ZigbeeClusterIasZone::ZoneStatusTamper)); + }); + } + } + info->finish(Thing::ThingErrorNoError); } @@ -655,11 +693,12 @@ void IntegrationPluginZigbeeGeneric::initThermostat(ZigbeeNode *node, ZigbeeNode }); } -void IntegrationPluginZigbeeGeneric::initDoorSensor(ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint) +void IntegrationPluginZigbeeGeneric::initIASSensor(ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint) { bindPowerConfigurationCluster(node, endpoint); - qCDebug(dcZigbeeGeneric()) << "Binding IAS custer"; + // First, bind the IAS cluster in a regular manner, for devices that don't fully implement the enrollment process: + qCDebug(dcZigbeeGeneric()) << "Binding IAS Zone cluster"; ZigbeeDeviceObjectReply *bindIasClusterReply = node->deviceObject()->requestBindIeeeAddress(endpoint->endpointId(), ZigbeeClusterLibrary::ClusterIdIasZone, hardwareManager()->zigbeeResource()->coordinatorAddress(node->networkUuid()), 0x01); connect(bindIasClusterReply, &ZigbeeDeviceObjectReply::finished, node, [=](){ @@ -671,12 +710,12 @@ void IntegrationPluginZigbeeGeneric::initDoorSensor(ZigbeeNode *node, ZigbeeNode ZigbeeClusterLibrary::AttributeReportingConfiguration reportingStatusConfig; reportingStatusConfig.attributeId = ZigbeeClusterIasZone::AttributeZoneStatus; - reportingStatusConfig.dataType = Zigbee::Int16; + reportingStatusConfig.dataType = Zigbee::BitMap16; reportingStatusConfig.minReportingInterval = 300; reportingStatusConfig.maxReportingInterval = 2700; reportingStatusConfig.reportableChange = ZigbeeDataType(static_cast(1)).data(); - qCDebug(dcZigbeeGeneric()) << "Configuring attribute reporting for thermostat cluster"; + qCDebug(dcZigbeeGeneric()) << "Configuring attribute reporting for IAS Zone cluster"; ZigbeeClusterReply *reportingReply = endpoint->getInputCluster(ZigbeeClusterLibrary::ClusterIdIasZone)->configureReporting({reportingStatusConfig}); connect(reportingReply, &ZigbeeClusterReply::finished, this, [=](){ if (reportingReply->error() != ZigbeeClusterReply::ErrorNoError) { @@ -684,6 +723,42 @@ void IntegrationPluginZigbeeGeneric::initDoorSensor(ZigbeeNode *node, ZigbeeNode } else { qCDebug(dcZigbeeGeneric()) << "Attribute reporting configuration finished for IAS Zone cluster" << ZigbeeClusterLibrary::parseAttributeReportingStatusRecords(reportingReply->responseFrame().payload); } + + + // OK, now we've bound regularly, devices that require zone enrollment may still not send us anything, so let's try to enroll a zone + // For that we need to write our own IEEE address as the CIE (security zone master) + ZigbeeDataType dataType(hardwareManager()->zigbeeResource()->coordinatorAddress(node->networkUuid()).toUInt64()); + ZigbeeClusterLibrary::WriteAttributeRecord record; + record.attributeId = ZigbeeClusterIasZone::AttributeCieAddress; + record.dataType = Zigbee::IeeeAddress; + record.data = dataType.data(); + qCDebug(dcZigbeeGeneric()) << "Setting CIE address" << hardwareManager()->zigbeeResource()->coordinatorAddress(node->networkUuid()) << record.data; + ZigbeeClusterIasZone *iasZoneCluster = dynamic_cast(endpoint->getInputCluster(ZigbeeClusterLibrary::ClusterIdIasZone)); + ZigbeeClusterReply *writeCIEreply = iasZoneCluster->writeAttributes({record}); + connect(writeCIEreply, &ZigbeeClusterReply::finished, this, [=](){ + if (writeCIEreply->error() != ZigbeeClusterReply::ErrorNoError) { + qCWarning(dcZigbeeGeneric()) << "Failed to write CIE address to IAS server:" << writeCIEreply->error(); + return; + } + + qCDebug(dcZigbeeGeneric()) << "Wrote CIE address to IAS server:" << ZigbeeClusterLibrary::parseAttributeReportingStatusRecords(writeCIEreply->responseFrame().payload); + + // Auto-Enroll-Response mechanism: We'll be sending an enroll response right away (without request) to try and enroll a zone + qCDebug(dcZigbeeGeneric()) << "Enrolling zone 0x42 to IAS server."; + ZigbeeClusterReply *enrollReply = iasZoneCluster->sendZoneEnrollResponse(0x42); + connect(enrollReply, &ZigbeeClusterReply::finished, this, [=](){ + // Interestingly some devices stop regular conversation as soon as a zone is enrolled, so we might never get this reply... + qCDebug(dcZigbeeGeneric()) << "Zone enrollment reply:" << enrollReply->error() << enrollReply->responseData() << enrollReply->responseFrame(); + }); + + // According to the spec, if Auto-Enroll-Response is implemented, also Trip-to-Pair is to be handled + connect(iasZoneCluster, &ZigbeeClusterIasZone::zoneEnrollRequest, this, [=](ZigbeeClusterIasZone::ZoneType zoneType, quint16 manufacturerCode){ + // Accepting any zoneZype/manufacturercode + Q_UNUSED(zoneType) + Q_UNUSED(manufacturerCode) + iasZoneCluster->sendZoneEnrollResponse(0x42); + }); + }); }); }); } diff --git a/zigbeegeneric/integrationpluginzigbeegeneric.h b/zigbeegeneric/integrationpluginzigbeegeneric.h index 05f179a5..a894be0f 100644 --- a/zigbeegeneric/integrationpluginzigbeegeneric.h +++ b/zigbeegeneric/integrationpluginzigbeegeneric.h @@ -37,6 +37,8 @@ #include +#include "extern-plugininfo.h" + class IntegrationPluginZigbeeGeneric: public IntegrationPlugin, public ZigbeeHandler { Q_OBJECT @@ -66,7 +68,7 @@ private: void initSimplePowerSocket(ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint); void initDoorLock(ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint); void initThermostat(ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint); - void initDoorSensor(ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint); + void initIASSensor(ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint); void bindPowerConfigurationCluster(ZigbeeNode *node, ZigbeeNodeEndpoint *endpoint); diff --git a/zigbeegeneric/integrationpluginzigbeegeneric.json b/zigbeegeneric/integrationpluginzigbeegeneric.json index c69c137a..6be7305b 100644 --- a/zigbeegeneric/integrationpluginzigbeegeneric.json +++ b/zigbeegeneric/integrationpluginzigbeegeneric.json @@ -436,6 +436,107 @@ "defaultValue": 0 } ] + }, + { + "id": "500a8b65-ad34-4bf0-a35d-c167510999f2", + "name": "motionSensor", + "displayName": "Motion sensor", + "interfaces": ["presencesensor"], + "paramTypes": [ + { + "id": "e1048378-8d3d-40ae-a2d4-070e291b9db8", + "name": "ieeeAddress", + "displayName": "IEEE adress", + "type": "QString", + "defaultValue": "00:00:00:00:00:00:00:00" + }, + { + "id": "85e46994-e9d6-4c20-99e4-feb609ef25b1", + "name": "networkUuid", + "displayName": "Zigbee network UUID", + "type": "QString", + "defaultValue": "" + }, + { + "id": "22a362b6-3cbe-421a-a20d-0f491a4150cf", + "name": "endpointId", + "displayName": "Endpoint ID", + "type": "uint", + "defaultValue": 1 + }, + { + "id": "27a158b8-5a29-4d80-8661-4027652c55c7", + "name": "manufacturer", + "displayName": "Manufacturer", + "type": "QString", + "defaultValue": "" + }, + { + "id": "63910764-55d4-4b67-a1d7-a568c269abd9", + "name": "model", + "displayName": "Model", + "type": "QString", + "defaultValue": "" + } + ], + "stateTypes": [ + { + "id": "73523dee-93c1-4143-abff-7685b2d1bb1c", + "name": "isPresent", + "displayName": "Presence detected", + "displayNameEvent": "Presence detected changed", + "type": "bool", + "defaultValue": "false", + "cached": false + }, + { + "id": "c9c0343a-e396-4a21-ab7f-5f3d88cc55c5", + "name": "tampered", + "displayName": "Tampered", + "displayNameEvent": "Tampered changed", + "type": "bool", + "defaultValue": false + }, + { + "id": "4ed91f61-298f-411a-a1b8-403d77eecf34", + "name": "batteryLevel", + "displayName": "Battery level", + "displayNameEvent": "Battery level changed", + "type": "int", + "minValue": 0, + "maxValue": 100, + "unit": "Percentage", + "defaultValue": 0 + }, + { + "id": "ca81d872-dcf0-430d-8b00-98e6e4e4ccf4", + "name": "batteryCritical", + "displayName": "Battery critical", + "displayNameEvent": "Battery critical changed", + "type": "bool", + "defaultValue": false + }, + { + "id": "5d12e9da-2f5c-4d40-a20a-b5d378fd0387", + "name": "connected", + "displayName": "Connected", + "displayNameEvent": "Connected or disconnected", + "type": "bool", + "defaultValue": false, + "cached": false + }, + { + "id": "5062aac1-aa2d-4a35-9435-482ff45a4d02", + "name": "signalStrength", + "displayName": "Signal strength", + "displayNameEvent": "Signal strength changed", + "type": "uint", + "minValue": 0, + "maxValue": 100, + "unit": "Percentage", + "defaultValue": 0 + } + ] } ] } From 010d7f24c3d2c78798d5aeceefb48e57bb9b3cd9 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Tue, 7 Dec 2021 17:15:35 +0100 Subject: [PATCH 2/2] Update translations --- ...343be-9fd6-4015-9ff5-38542651c534-en_US.ts | 317 +++++++++++------- 1 file changed, 202 insertions(+), 115 deletions(-) diff --git a/zigbeegeneric/translations/6a4343be-9fd6-4015-9ff5-38542651c534-en_US.ts b/zigbeegeneric/translations/6a4343be-9fd6-4015-9ff5-38542651c534-en_US.ts index 799a029c..d08848f4 100644 --- a/zigbeegeneric/translations/6a4343be-9fd6-4015-9ff5-38542651c534-en_US.ts +++ b/zigbeegeneric/translations/6a4343be-9fd6-4015-9ff5-38542651c534-en_US.ts @@ -4,10 +4,10 @@ ZigbeeGeneric - - - - + + + + Battery The name of the ParamType (ThingClass: doorLock, EventType: batteryLevel, ID: {568e5bdd-47f3-4ccb-a1d8-ff3a5ea87ad8}) ---------- @@ -19,8 +19,8 @@ The name of the StateType ({3a733e99-850b-4c56-b058-d39850ef2fee}) of ThingClass - - + + Battery changed The name of the EventType ({568e5bdd-47f3-4ccb-a1d8-ff3a5ea87ad8}) of ThingClass doorLock ---------- @@ -28,14 +28,20 @@ The name of the EventType ({3a733e99-850b-4c56-b058-d39850ef2fee}) of ThingClass - - - - - - + + + + + + + + Battery critical - The name of the ParamType (ThingClass: doorSensor, EventType: batteryCritical, ID: {9628450e-5580-4f30-8af7-f1c3093dcfb7}) + The name of the ParamType (ThingClass: motionSensor, EventType: batteryCritical, ID: {ca81d872-dcf0-430d-8b00-98e6e4e4ccf4}) +---------- +The name of the StateType ({ca81d872-dcf0-430d-8b00-98e6e4e4ccf4}) of ThingClass motionSensor +---------- +The name of the ParamType (ThingClass: doorSensor, EventType: batteryCritical, ID: {9628450e-5580-4f30-8af7-f1c3093dcfb7}) ---------- The name of the StateType ({9628450e-5580-4f30-8af7-f1c3093dcfb7}) of ThingClass doorSensor ---------- @@ -49,11 +55,14 @@ The name of the StateType ({5cec4399-ba7c-4c78-8c30-c91040ad99cf}) of ThingClass - - - + + + + Battery critical changed - The name of the EventType ({9628450e-5580-4f30-8af7-f1c3093dcfb7}) of ThingClass doorSensor + The name of the EventType ({ca81d872-dcf0-430d-8b00-98e6e4e4ccf4}) of ThingClass motionSensor +---------- +The name of the EventType ({9628450e-5580-4f30-8af7-f1c3093dcfb7}) of ThingClass doorSensor ---------- The name of the EventType ({89abea26-b772-4258-9b56-e026b80c2028}) of ThingClass doorLock ---------- @@ -61,23 +70,32 @@ The name of the EventType ({5cec4399-ba7c-4c78-8c30-c91040ad99cf}) of ThingClass - - + + + + Battery level - The name of the ParamType (ThingClass: doorSensor, EventType: batteryLevel, ID: {3c120c1c-0093-4c5e-8d7e-8892e4ce21b3}) + The name of the ParamType (ThingClass: motionSensor, EventType: batteryLevel, ID: {4ed91f61-298f-411a-a1b8-403d77eecf34}) +---------- +The name of the StateType ({4ed91f61-298f-411a-a1b8-403d77eecf34}) of ThingClass motionSensor +---------- +The name of the ParamType (ThingClass: doorSensor, EventType: batteryLevel, ID: {3c120c1c-0093-4c5e-8d7e-8892e4ce21b3}) ---------- The name of the StateType ({3c120c1c-0093-4c5e-8d7e-8892e4ce21b3}) of ThingClass doorSensor - + + Battery level changed - The name of the EventType ({3c120c1c-0093-4c5e-8d7e-8892e4ce21b3}) of ThingClass doorSensor + The name of the EventType ({4ed91f61-298f-411a-a1b8-403d77eecf34}) of ThingClass motionSensor +---------- +The name of the EventType ({3c120c1c-0093-4c5e-8d7e-8892e4ce21b3}) of ThingClass doorSensor - - + + Closed The name of the ParamType (ThingClass: doorSensor, EventType: closed, ID: {2fb8e0a0-52f2-4c1d-b1c9-c7a295a83b44}) ---------- @@ -85,16 +103,22 @@ The name of the StateType ({2fb8e0a0-52f2-4c1d-b1c9-c7a295a83b44}) of ThingClass - - - - - - - - + + + + + + + + + + Connected - The name of the ParamType (ThingClass: doorSensor, EventType: connected, ID: {4fae59a7-fe89-4bc7-bc04-fc18e94b5c3e}) + The name of the ParamType (ThingClass: motionSensor, EventType: connected, ID: {5d12e9da-2f5c-4d40-a20a-b5d378fd0387}) +---------- +The name of the StateType ({5d12e9da-2f5c-4d40-a20a-b5d378fd0387}) of ThingClass motionSensor +---------- +The name of the ParamType (ThingClass: doorSensor, EventType: connected, ID: {4fae59a7-fe89-4bc7-bc04-fc18e94b5c3e}) ---------- The name of the StateType ({4fae59a7-fe89-4bc7-bc04-fc18e94b5c3e}) of ThingClass doorSensor ---------- @@ -112,8 +136,8 @@ The name of the StateType ({e9fb2b10-96da-4b70-afda-46e948399af8}) of ThingClass - - + + Connected changed The name of the EventType ({206b0508-b477-4aa2-b420-aba2259fb6e6}) of ThingClass doorLock ---------- @@ -121,20 +145,23 @@ The name of the EventType ({b5abd47e-95f1-4e35-94fa-be87c396073a}) of ThingClass - + + Connected or disconnected - The name of the EventType ({4fae59a7-fe89-4bc7-bc04-fc18e94b5c3e}) of ThingClass doorSensor + The name of the EventType ({5d12e9da-2f5c-4d40-a20a-b5d378fd0387}) of ThingClass motionSensor +---------- +The name of the EventType ({4fae59a7-fe89-4bc7-bc04-fc18e94b5c3e}) of ThingClass doorSensor - + Connected/disconnected The name of the EventType ({e9fb2b10-96da-4b70-afda-46e948399af8}) of ThingClass thermostat - - + + Cooling on The name of the ParamType (ThingClass: thermostat, EventType: coolingOn, ID: {c77a3d3f-46c7-4026-b9ab-02ab88077cc4}) ---------- @@ -142,14 +169,14 @@ The name of the StateType ({c77a3d3f-46c7-4026-b9ab-02ab88077cc4}) of ThingClass - + Cooling turned on The name of the EventType ({c77a3d3f-46c7-4026-b9ab-02ab88077cc4}) of ThingClass thermostat - - + + Current temperature The name of the ParamType (ThingClass: thermostat, EventType: temperature, ID: {497af03a-a893-438c-aba2-1bf3ecfc66c5}) ---------- @@ -157,30 +184,33 @@ The name of the StateType ({497af03a-a893-438c-aba2-1bf3ecfc66c5}) of ThingClass - + Current temperature changed The name of the EventType ({497af03a-a893-438c-aba2-1bf3ecfc66c5}) of ThingClass thermostat - + Door lock The name of the ThingClass ({34cb3d09-dd9f-4b95-95d0-30a1cd94adac}) - + Door sensor The name of the ThingClass ({fd43b442-1764-4005-acaf-9075e6d11e3a}) - - - - + + + + + Endpoint ID - The name of the ParamType (ThingClass: doorSensor, Type: thing, ID: {e265b17c-e4f4-4bea-b299-a6a3d94a6e7a}) + The name of the ParamType (ThingClass: motionSensor, Type: thing, ID: {22a362b6-3cbe-421a-a20d-0f491a4150cf}) +---------- +The name of the ParamType (ThingClass: doorSensor, Type: thing, ID: {e265b17c-e4f4-4bea-b299-a6a3d94a6e7a}) ---------- The name of the ParamType (ThingClass: doorLock, Type: thing, ID: {ebf17460-4a37-461f-aa24-e0a9a4238c63}) ---------- @@ -190,8 +220,8 @@ The name of the ParamType (ThingClass: thermostat, Type: thing, ID: {138a529d-1d - - + + Heating on The name of the ParamType (ThingClass: thermostat, EventType: heatingOn, ID: {88d5dda1-b8f6-49f1-a55a-20415f9157b3}) ---------- @@ -199,18 +229,21 @@ The name of the StateType ({88d5dda1-b8f6-49f1-a55a-20415f9157b3}) of ThingClass - + Heating turned on The name of the EventType ({88d5dda1-b8f6-49f1-a55a-20415f9157b3}) of ThingClass thermostat - - - - + + + + + IEEE adress - The name of the ParamType (ThingClass: doorSensor, Type: thing, ID: {98d4265d-99b7-4849-97ec-a7eae3b275ff}) + The name of the ParamType (ThingClass: motionSensor, Type: thing, ID: {e1048378-8d3d-40ae-a2d4-070e291b9db8}) +---------- +The name of the ParamType (ThingClass: doorSensor, Type: thing, ID: {98d4265d-99b7-4849-97ec-a7eae3b275ff}) ---------- The name of the ParamType (ThingClass: doorLock, Type: thing, ID: {484bf80f-5d20-4029-b05e-6b4c9fbefd69}) ---------- @@ -220,24 +253,27 @@ The name of the ParamType (ThingClass: thermostat, Type: thing, ID: {f38746d8-00 - + Identify The name of the ActionType ({4e3b1430-d98e-4f05-bae6-301dac34bd4b}) of ThingClass powerSocket - + Lock door The name of the ActionType ({c26e1908-25d0-4475-8f82-5aaf034640f1}) of ThingClass doorLock - - - - + + + + + Manufacturer - The name of the ParamType (ThingClass: doorSensor, Type: thing, ID: {193922e4-2c74-4748-a319-9e5b2f2607b4}) + The name of the ParamType (ThingClass: motionSensor, Type: thing, ID: {27a158b8-5a29-4d80-8661-4027652c55c7}) +---------- +The name of the ParamType (ThingClass: doorSensor, Type: thing, ID: {193922e4-2c74-4748-a319-9e5b2f2607b4}) ---------- The name of the ParamType (ThingClass: doorLock, Type: thing, ID: {1b177eb8-a13f-4975-92a7-a6bf54670c8f}) ---------- @@ -247,12 +283,15 @@ The name of the ParamType (ThingClass: thermostat, Type: thing, ID: {ae76acb0-40 - - - - + + + + + Model - The name of the ParamType (ThingClass: doorSensor, Type: thing, ID: {74ddad9e-6849-4b7a-a356-971e77e5195b}) + The name of the ParamType (ThingClass: motionSensor, Type: thing, ID: {63910764-55d4-4b67-a1d7-a568c269abd9}) +---------- +The name of the ParamType (ThingClass: doorSensor, Type: thing, ID: {74ddad9e-6849-4b7a-a356-971e77e5195b}) ---------- The name of the ParamType (ThingClass: doorLock, Type: thing, ID: {b13f86a7-dc65-4ed6-860c-cdb099f90916}) ---------- @@ -262,15 +301,21 @@ The name of the ParamType (ThingClass: thermostat, Type: thing, ID: {4262cfc6-4b - + + Motion sensor + The name of the ThingClass ({500a8b65-ad34-4bf0-a35d-c167510999f2}) + + + + Opened or closed The name of the EventType ({2fb8e0a0-52f2-4c1d-b1c9-c7a295a83b44}) of ThingClass doorSensor - - - + + + Power The name of the ParamType (ThingClass: powerSocket, ActionType: power, ID: {2c8268b9-d76b-415a-b2e9-6bfeabd98a76}) ---------- @@ -280,40 +325,61 @@ The name of the StateType ({2c8268b9-d76b-415a-b2e9-6bfeabd98a76}) of ThingClass - + Power changed The name of the EventType ({2c8268b9-d76b-415a-b2e9-6bfeabd98a76}) of ThingClass powerSocket - + Power socket The name of the ThingClass ({800a8df8-06cb-4d93-8334-944fcce9651a}) - + + + Presence detected + The name of the ParamType (ThingClass: motionSensor, EventType: isPresent, ID: {73523dee-93c1-4143-abff-7685b2d1bb1c}) +---------- +The name of the StateType ({73523dee-93c1-4143-abff-7685b2d1bb1c}) of ThingClass motionSensor + + + + + Presence detected changed + The name of the EventType ({73523dee-93c1-4143-abff-7685b2d1bb1c}) of ThingClass motionSensor + + + + Set power The name of the ActionType ({2c8268b9-d76b-415a-b2e9-6bfeabd98a76}) of ThingClass powerSocket - + Set target temperature The name of the ActionType ({88ad3957-2912-4de1-b53d-b360565dd361}) of ThingClass thermostat - - - - - - - - + + + + + + + + + + Signal strength - The name of the ParamType (ThingClass: doorSensor, EventType: signalStrength, ID: {a1bf9c90-6e12-4513-a82a-a1d15351f140}) + The name of the ParamType (ThingClass: motionSensor, EventType: signalStrength, ID: {5062aac1-aa2d-4a35-9435-482ff45a4d02}) +---------- +The name of the StateType ({5062aac1-aa2d-4a35-9435-482ff45a4d02}) of ThingClass motionSensor +---------- +The name of the ParamType (ThingClass: doorSensor, EventType: signalStrength, ID: {a1bf9c90-6e12-4513-a82a-a1d15351f140}) ---------- The name of the StateType ({a1bf9c90-6e12-4513-a82a-a1d15351f140}) of ThingClass doorSensor ---------- @@ -331,12 +397,15 @@ The name of the StateType ({8f0512ab-ced2-4dcb-90fe-aaa532efd0dd}) of ThingClass - - - - + + + + + Signal strength changed - The name of the EventType ({a1bf9c90-6e12-4513-a82a-a1d15351f140}) of ThingClass doorSensor + The name of the EventType ({5062aac1-aa2d-4a35-9435-482ff45a4d02}) of ThingClass motionSensor +---------- +The name of the EventType ({a1bf9c90-6e12-4513-a82a-a1d15351f140}) of ThingClass doorSensor ---------- The name of the EventType ({6c8f8db5-464c-408a-9c65-4e8096663019}) of ThingClass doorLock ---------- @@ -346,9 +415,24 @@ The name of the EventType ({8f0512ab-ced2-4dcb-90fe-aaa532efd0dd}) of ThingClass - - - + + + Tampered + The name of the ParamType (ThingClass: motionSensor, EventType: tampered, ID: {c9c0343a-e396-4a21-ab7f-5f3d88cc55c5}) +---------- +The name of the StateType ({c9c0343a-e396-4a21-ab7f-5f3d88cc55c5}) of ThingClass motionSensor + + + + + Tampered changed + The name of the EventType ({c9c0343a-e396-4a21-ab7f-5f3d88cc55c5}) of ThingClass motionSensor + + + + + + Target temperature The name of the ParamType (ThingClass: thermostat, ActionType: targetTemperature, ID: {88ad3957-2912-4de1-b53d-b360565dd361}) ---------- @@ -358,24 +442,24 @@ The name of the StateType ({88ad3957-2912-4de1-b53d-b360565dd361}) of ThingClass - + Target temperature changed The name of the EventType ({88ad3957-2912-4de1-b53d-b360565dd361}) of ThingClass thermostat - + Unlock door The name of the ActionType ({6e112e3b-080f-47e4-8e2b-453029f0eacb}) of ThingClass doorLock - - - - - - + + + + + + Version The name of the ParamType (ThingClass: doorLock, EventType: version, ID: {9e27850b-99d8-40df-9bc7-4b3c7c01faf8}) ---------- @@ -391,9 +475,9 @@ The name of the StateType ({c8bd12d2-b425-4422-9e0e-a65542a47b70}) of ThingClass - - - + + + Version changed The name of the EventType ({9e27850b-99d8-40df-9bc7-4b3c7c01faf8}) of ThingClass doorLock ---------- @@ -403,24 +487,27 @@ The name of the EventType ({c8bd12d2-b425-4422-9e0e-a65542a47b70}) of ThingClass - + Zigbee Generic The name of the plugin ZigbeeGeneric ({6a4343be-9fd6-4015-9ff5-38542651c534}) - + Zigbee Thermostat The name of the ThingClass ({ca9af6cf-2d15-4d54-ba07-3d2ce03445b8}) - - - - + + + + + Zigbee network UUID - The name of the ParamType (ThingClass: doorSensor, Type: thing, ID: {260cb70b-7cb9-46b9-b6f3-0d4810a016b7}) + The name of the ParamType (ThingClass: motionSensor, Type: thing, ID: {85e46994-e9d6-4c20-99e4-feb609ef25b1}) +---------- +The name of the ParamType (ThingClass: doorSensor, Type: thing, ID: {260cb70b-7cb9-46b9-b6f3-0d4810a016b7}) ---------- The name of the ParamType (ThingClass: doorLock, Type: thing, ID: {4d50cbd3-f297-421c-9938-65ec0bb4bd34}) ---------- @@ -430,7 +517,7 @@ The name of the ParamType (ThingClass: thermostat, Type: thing, ID: {4a92b536-de - + nymea The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6})