From 8901ca9be8d1800ed613ff97931719f2d8f46576 Mon Sep 17 00:00:00 2001 From: Jonas Enge Date: Fri, 9 Feb 2024 22:17:40 +0100 Subject: [PATCH 1/2] Adds support for _TZE200_3towulqd using Tuya Cluster --- .../assets/icon.svg | 49 ++++++++++++ .../assets/images/large.png | Bin 0 -> 39662 bytes .../assets/images/small.png | Bin 0 -> 4615 bytes .../motion_sensor_2_tuya_cluster/device.js | 71 ++++++++++++++++++ .../driver.compose.json | 38 ++++++++++ .../driver.settings.compose.json | 18 +++++ 6 files changed, 176 insertions(+) create mode 100644 drivers/motion_sensor_2_tuya_cluster/assets/icon.svg create mode 100644 drivers/motion_sensor_2_tuya_cluster/assets/images/large.png create mode 100644 drivers/motion_sensor_2_tuya_cluster/assets/images/small.png create mode 100644 drivers/motion_sensor_2_tuya_cluster/device.js create mode 100644 drivers/motion_sensor_2_tuya_cluster/driver.compose.json create mode 100644 drivers/motion_sensor_2_tuya_cluster/driver.settings.compose.json diff --git a/drivers/motion_sensor_2_tuya_cluster/assets/icon.svg b/drivers/motion_sensor_2_tuya_cluster/assets/icon.svg new file mode 100644 index 00000000..96dcb8bd --- /dev/null +++ b/drivers/motion_sensor_2_tuya_cluster/assets/icon.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/drivers/motion_sensor_2_tuya_cluster/assets/images/large.png b/drivers/motion_sensor_2_tuya_cluster/assets/images/large.png new file mode 100644 index 0000000000000000000000000000000000000000..0e7085e6d04151f30f0da3f3367cfae07c1beb27 GIT binary patch literal 39662 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 UJ+-ER3UHmWaj-5v_Vexk17`Ga@&Et; literal 0 HcmV?d00001 diff --git a/drivers/motion_sensor_2_tuya_cluster/assets/images/small.png b/drivers/motion_sensor_2_tuya_cluster/assets/images/small.png new file mode 100644 index 0000000000000000000000000000000000000000..582ec9f83e00d8cc7234cc8986365d0deb1f90d5 GIT binary patch literal 4615 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 V=QMdm7cTv(adq+_lx_{#|4-Cb;-LTl literal 0 HcmV?d00001 diff --git a/drivers/motion_sensor_2_tuya_cluster/device.js b/drivers/motion_sensor_2_tuya_cluster/device.js new file mode 100644 index 00000000..1ed90d02 --- /dev/null +++ b/drivers/motion_sensor_2_tuya_cluster/device.js @@ -0,0 +1,71 @@ +const { ZigBeeDevice } = require('homey-zigbeedriver'); +const TuyaSpecificCluster = require('../../lib/TuyaSpecificCluster'); +const { Cluster } = require('zigbee-clusters'); + +Cluster.addCluster(TuyaSpecificCluster); + +const dataPoints = { + pir_state: 1, + battery_percentage: 4, + interval_time: 102, + pir_sensitivity: 9, + pir_time: 10, + illuminance_value: 12 +} + +const dataTypes = { + value: 2, // [ 4 byte value ] + enum: 4, // [ 0-255 ] +}; + +const getDataValue = (dpValue) => { + switch (dpValue.datatype) { + case dataTypes.value: + return parseInt(dpValue.data.toString('hex'), 16); + case dataTypes.enum: + return dpValue.data[0]; + } +} + +class motion_sensor_2 extends ZigBeeDevice { + async onNodeInit({ zclNode }) { + this.enableDebug(); + this.printNode(); + + zclNode.endpoints[1].clusters[TuyaSpecificCluster.NAME] + .on('response', this.updateData.bind(this)) + } + + updateData(data) { + const value = getDataValue(data); + this.log(`DP: ${data.dp} - Value: ${value}`) + switch (data.dp) { + case dataPoints.pir_state: + const motion = value === 0 + this.log(`Motion status: ${motion}`); + this.setCapabilityValue('alarm_motion', motion).catch(this.error); + break; + case dataPoints.illuminance_value: + this.log(`Illuminance: ${value}`); + this.setCapabilityValue('measure_luminance', value).catch(this.error); + break; + case dataPoints.battery_percentage: + const batteryThreshold = this.getSetting('batteryThreshold') || 20; + const batteryAlarm = value < batteryThreshold + this.log(`Battery: ${value}`); + this.setCapabilityValue('measure_battery', value).catch(this.error); + this.setCapabilityValue('alarm_battery', batteryAlarm).catch(this.error); + break; + case dataPoints.pir_sensitivity: + this.log(`PIR Sensitivity: ${value}`); + break; + case dataPoints.pir_time: + this.log(`PIR Time: ${value}`); + break; + default: + this.log(`Unrecognized DP: ${data.dp}`); + } + } +} + +module.exports = motion_sensor_2; diff --git a/drivers/motion_sensor_2_tuya_cluster/driver.compose.json b/drivers/motion_sensor_2_tuya_cluster/driver.compose.json new file mode 100644 index 00000000..cc056479 --- /dev/null +++ b/drivers/motion_sensor_2_tuya_cluster/driver.compose.json @@ -0,0 +1,38 @@ +{ + "id": "motion_sensor_2_tuya_cluster", + "name": { + "en": "Motion Sensor (Tuya Cluster)" + }, + "class": "sensor", + "platforms": ["local"], + "connectivity": ["zigbee"], + "capabilities": [ + "measure_battery", + "measure_luminance", + "alarm_motion", + "alarm_battery" + ], + "energy": { + "batteries": ["CR2450"] + }, + "images": { + "large": "{{driverAssetsPath}}/images/large.png", + "small": "{{driverAssetsPath}}/images/small.png" + }, + "zigbee": { + "manufacturerName": ["_TZE200_3towulqd"], + "productId": ["TS0601"], + "endpoints": { + "1": { + "clusters": [61184], + "bindings": [61184] + } + }, + "learnmode": { + "image": "{{driverAssetsPath}}/icon.svg", + "instruction": { + "en": "Use a pin to press the reset button for aprox 5 seconds until the LED blinks." + } + } + } + } diff --git a/drivers/motion_sensor_2_tuya_cluster/driver.settings.compose.json b/drivers/motion_sensor_2_tuya_cluster/driver.settings.compose.json new file mode 100644 index 00000000..07d28b9b --- /dev/null +++ b/drivers/motion_sensor_2_tuya_cluster/driver.settings.compose.json @@ -0,0 +1,18 @@ +[ + { + "id": "batteryThreshold", + "type": "number", + "label": { + "en": "Battery Low Alarm Voltage Threshold (%)" + }, + "hint": { + "en": "This setting determines the threshold before a battery alarm is given." + }, + "value": 20, + "attr": { + "step": 1, + "min": 1, + "max": 99 + } + } +] \ No newline at end of file From 68669d547814b360c6df2a81fdfe9a5327bf84ae Mon Sep 17 00:00:00 2001 From: Jonas Enge Date: Sat, 10 Feb 2024 17:56:21 +0100 Subject: [PATCH 2/2] Adds settings --- app.json | 173 ++++++++++++++++++ .../motion_sensor_2_tuya_cluster/device.js | 47 ++++- .../driver.compose.json | 4 +- .../driver.settings.compose.json | 131 +++++++++++-- lib/TuyaSpecificClusterDevice.js | 2 +- 5 files changed, 336 insertions(+), 21 deletions(-) diff --git a/app.json b/app.json index b7c35c5b..59b41707 100644 --- a/app.json +++ b/app.json @@ -3075,6 +3075,179 @@ } ] }, + { + "id": "motion_sensor_2_tuya_cluster", + "name": { + "en": "Motion Sensor (Tuya Cluster)" + }, + "class": "sensor", + "platforms": [ + "local" + ], + "connectivity": [ + "zigbee" + ], + "capabilities": [ + "measure_battery", + "measure_luminance", + "alarm_motion", + "alarm_battery" + ], + "energy": { + "batteries": [ + "CR2450" + ] + }, + "images": { + "large": "/drivers/motion_sensor_2_tuya_cluster/assets/images/large.png", + "small": "/drivers/motion_sensor_2_tuya_cluster/assets/images/small.png" + }, + "zigbee": { + "manufacturerName": [ + "_TZE200_3towulqd" + ], + "productId": [ + "TS0601" + ], + "endpoints": { + "1": { + "clusters": [ + 0, + 61184 + ], + "bindings": [ + 25, + 10 + ] + } + }, + "learnmode": { + "image": "/drivers/motion_sensor_2_tuya_cluster/assets/icon.svg", + "instruction": { + "en": "Use a pin to press the reset button for aprox 5 seconds until the LED blinks." + } + } + }, + "settings": [ + { + "id": "batteryThreshold", + "type": "number", + "label": { + "en": "Battery Low Alarm Voltage Threshold (%)" + }, + "hint": { + "en": "This setting determines the threshold before a battery alarm is given." + }, + "value": 20, + "attr": { + "step": 1, + "min": 1, + "max": 99 + } + }, + { + "type": "group", + "label": { + "en": "Device settings (confirm with quickly inserting pin into device)" + }, + "children": [ + { + "id": "pirSensitivity", + "type": "dropdown", + "value": "2", + "label": { + "en": "Pir Sensitivity" + }, + "values": [ + { + "id": "0", + "label": { + "en": "Low" + } + }, + { + "id": "1", + "label": { + "en": "Middle" + } + }, + { + "id": "2", + "label": { + "en": "High" + } + } + ] + }, + { + "id": "intervalTime", + "type": "dropdown", + "value": "2", + "hint": { + "en": "Version 2.0.1 and above" + }, + "label": { + "en": "Light Sense Interval Time" + }, + "values": [ + { + "id": "0", + "label": { + "en": "Low" + } + }, + { + "id": "1", + "label": { + "en": "Middle" + } + }, + { + "id": "2", + "label": { + "en": "High" + } + } + ] + }, + { + "id": "keepTime", + "type": "dropdown", + "value": "0", + "label": { + "en": "Keep time" + }, + "values": [ + { + "id": "0", + "label": { + "en": "10S" + } + }, + { + "id": "1", + "label": { + "en": "30S" + } + }, + { + "id": "2", + "label": { + "en": "60S" + } + }, + { + "id": "3", + "label": { + "en": "120S" + } + } + ] + } + ] + } + ] + }, { "id": "outdoor_2_socket", "name": { diff --git a/drivers/motion_sensor_2_tuya_cluster/device.js b/drivers/motion_sensor_2_tuya_cluster/device.js index 1ed90d02..eb3c5cf5 100644 --- a/drivers/motion_sensor_2_tuya_cluster/device.js +++ b/drivers/motion_sensor_2_tuya_cluster/device.js @@ -1,5 +1,5 @@ -const { ZigBeeDevice } = require('homey-zigbeedriver'); const TuyaSpecificCluster = require('../../lib/TuyaSpecificCluster'); +const TuyaSpecificClusterDevice = require('../../lib/TuyaSpecificClusterDevice'); const { Cluster } = require('zigbee-clusters'); Cluster.addCluster(TuyaSpecificCluster); @@ -27,7 +27,7 @@ const getDataValue = (dpValue) => { } } -class motion_sensor_2 extends ZigBeeDevice { +class motion_sensor_2_tuya_cluster extends TuyaSpecificClusterDevice { async onNodeInit({ zclNode }) { this.enableDebug(); this.printNode(); @@ -66,6 +66,47 @@ class motion_sensor_2 extends ZigBeeDevice { this.log(`Unrecognized DP: ${data.dp}`); } } + + async onSettings({ newSettings, changedKeys }) { + if (changedKeys.includes('batteryThreshold')) { + const batteryThreshold = newSettings.batteryThreshold; + this.setBatteryThreshold(batteryThreshold); + } + if (changedKeys.includes('pirSensitivity')) { + const pirSensitivity = newSettings.pirSensitivity; + this.setPIRSensitivity(pirSensitivity); + } + if (changedKeys.includes('keepTime')) { + const keepTime = newSettings.keepTime; + this.setKeepTime(keepTime); + } + if (changedKeys.includes('intervalTime')) { + const intervalTime = newSettings.intervalTime; + this.setIntervalTime(intervalTime); + } + } + + async setBatteryThreshold(batteryThreshold) { + this.log(`Setting Battery Threshold: ${batteryThreshold}`); + const battery = this.getCapabilityValue('measure_battery'); + const batteryAlarm = battery < batteryThreshold; + this.setCapabilityValue('alarm_battery', batteryAlarm).catch(this.error); + } + + async setPIRSensitivity(pirSensitivity) { + this.log(`Setting PIR Sensitivity: ${pirSensitivity}`); + this.writeEnum(dataPoints.pir_sensitivity, pirSensitivity).catch(this.error); + } + + async setKeepTime(keepTime) { + this.log(`Setting Keep Time: ${keepTime}`); + this.writeEnum(dataPoints.pir_time, keepTime).catch(this.error); + } + + async setIntervalTime(intervalTime) { + this.log(`Setting Interval Time: ${intervalTime}`); + this.writeEnum(dataPoints.interval_time, intervalTime).catch(this.error); + } } -module.exports = motion_sensor_2; +module.exports = motion_sensor_2_tuya_cluster; diff --git a/drivers/motion_sensor_2_tuya_cluster/driver.compose.json b/drivers/motion_sensor_2_tuya_cluster/driver.compose.json index cc056479..247c198b 100644 --- a/drivers/motion_sensor_2_tuya_cluster/driver.compose.json +++ b/drivers/motion_sensor_2_tuya_cluster/driver.compose.json @@ -24,8 +24,8 @@ "productId": ["TS0601"], "endpoints": { "1": { - "clusters": [61184], - "bindings": [61184] + "clusters": [0, 61184], + "bindings": [25, 10] } }, "learnmode": { diff --git a/drivers/motion_sensor_2_tuya_cluster/driver.settings.compose.json b/drivers/motion_sensor_2_tuya_cluster/driver.settings.compose.json index 07d28b9b..2465326c 100644 --- a/drivers/motion_sensor_2_tuya_cluster/driver.settings.compose.json +++ b/drivers/motion_sensor_2_tuya_cluster/driver.settings.compose.json @@ -1,18 +1,119 @@ [ - { - "id": "batteryThreshold", - "type": "number", - "label": { - "en": "Battery Low Alarm Voltage Threshold (%)" + { + "id": "batteryThreshold", + "type": "number", + "label": { + "en": "Battery Low Alarm Voltage Threshold (%)" + }, + "hint": { + "en": "This setting determines the threshold before a battery alarm is given." + }, + "value": 20, + "attr": { + "step": 1, + "min": 1, + "max": 99 + } }, - "hint": { - "en": "This setting determines the threshold before a battery alarm is given." - }, - "value": 20, - "attr": { - "step": 1, - "min": 1, - "max": 99 + { + "type": "group", + "label": { + "en": "Device settings (confirm with quickly inserting pin into device)" + }, + "children": [ + { + "id": "pirSensitivity", + "type": "dropdown", + "value": "2", + "label": { + "en": "Pir Sensitivity" + }, + "values": [ + { + "id": "0", + "label": { + "en": "Low" + } + }, + { + "id": "1", + "label": { + "en": "Middle" + } + }, + { + "id": "2", + "label": { + "en": "High" + } + } + ] + }, + { + "id": "intervalTime", + "type": "dropdown", + "value": "2", + "hint": { + "en": "Version 2.0.1 and above" + }, + "label": { + "en": "Light Sense Interval Time" + }, + "values": [ + { + "id": "0", + "label": { + "en": "Low" + } + }, + { + "id": "1", + "label": { + "en": "Middle" + } + }, + { + "id": "2", + "label": { + "en": "High" + } + } + ] + }, + { + "id": "keepTime", + "type": "dropdown", + "value": "0", + "label": { + "en": "Keep time" + }, + "values": [ + { + "id": "0", + "label": { + "en": "10S" + } + }, + { + "id": "1", + "label": { + "en": "30S" + } + }, + { + "id": "2", + "label": { + "en": "60S" + } + }, + { + "id": "3", + "label": { + "en": "120S" + } + } + ] + } + ] } - } -] \ No newline at end of file +] diff --git a/lib/TuyaSpecificClusterDevice.js b/lib/TuyaSpecificClusterDevice.js index b95a784b..4d889af1 100644 --- a/lib/TuyaSpecificClusterDevice.js +++ b/lib/TuyaSpecificClusterDevice.js @@ -99,4 +99,4 @@ class TuyaSpecificClusterDevice extends ZigBeeDevice { } -module.exports = TuyaSpecificClusterDevice; \ No newline at end of file +module.exports = TuyaSpecificClusterDevice;