diff --git a/.homeycompose/capabilities/alarm_breathe_presence.json b/.homeycompose/capabilities/alarm_breathe_presence.json new file mode 100644 index 00000000..d3b8c8ec --- /dev/null +++ b/.homeycompose/capabilities/alarm_breathe_presence.json @@ -0,0 +1,50 @@ +{ + "title": { + "en": "Breath presence", + "nl": "Adem aanwezigheid", + "de": "Atempräsenz", + "fr": "Présence respiratoire", + "it": "Presenza del respiro", + "sv": "Andningsnärvaro", + "no": "Åndedrettsnærvær", + "es": "Presencia de la respiración", + "da": "Åndedræt nærvær", + "ru": "Присутствие дыхания", + "pl": "Obecność oddechu" + }, + "type": "boolean", + "getable": true, + "setable": false, + "uiComponent": "sensor", + "icon": "/drivers/radar_sensor_2/assets/images/breathe_motion.svg", + "insights": true, + "options": { + "zoneActivity": true + }, + "insightsTitleTrue": { + "en": "Breath alarm turned on", + "nl": "Ademalarm ging af", + "de": "Atem-Alarm ist angegangen", + "fr": "Alarme respiratoire s'est déclenchée", + "it": "Allarme di respiro attivato", + "sv": "Andningslarm aktiverat", + "no": "Åndedrettsalarm aktivert", + "es": "Alarma de respiración activada", + "da": "Åndedrætsalarm blev aktiveret", + "ru": "Сигнал дыхания включен", + "pl": "Czujnik oddechu włączony" + }, + "insightsTitleFalse": { + "en": "Breath alarm turned off", + "nl": "Ademalarm ging uit", + "de": "Atem-Alarm ist ausgegangen", + "fr": "Alarme respiratoire s'est désactivée", + "it": "Allarme di respiro disattivato", + "sv": "Andningslarm inaktiverat", + "no": "Åndedrettsalarm deaktivert", + "es": "Alarma de respiración desactivada", + "da": "Åndedrætsalarm blev deaktiveret", + "ru": "Сигнал дыхания выключен", + "pl": "Czujnik oddechu wyłączony" + } +} diff --git a/.homeycompose/capabilities/alarm_large_presence.json b/.homeycompose/capabilities/alarm_large_presence.json new file mode 100644 index 00000000..52e366ba --- /dev/null +++ b/.homeycompose/capabilities/alarm_large_presence.json @@ -0,0 +1,50 @@ +{ + "title": { + "en": "Large Presence", + "nl": "Grote Aanwezigheid", + "de": "Große Präsenz", + "fr": "Grande Présence", + "it": "Presenza Ampia", + "sv": "Stor Närvaro", + "no": "Stor Nærvær", + "es": "Presencia Grande", + "da": "Stor Nærvær", + "ru": "Большое Присутствие", + "pl": "Duża Obecność" + }, + "type": "boolean", + "getable": true, + "setable": false, + "uiComponent": "sensor", + "icon": "/drivers/radar_sensor_2/assets/images/large_motion.svg", + "insights": true, + "options": { + "zoneActivity": true + }, + "insightsTitleTrue": { + "en": "Large Presence alarm turned on", + "nl": "Grote Aanwezigheid alarm ging af", + "de": "Große Präsenz Alarm ist angegangen", + "fr": "Alarme Grande Présence s'est déclenchée", + "it": "Allarme Presenza Ampia attivato", + "sv": "Stor Närvaro larm aktiverat", + "no": "Stor Nærvær alarm aktivert", + "es": "Alarma de Presencia Grande activada", + "da": "Stor Nærvær alarm blev aktiveret", + "ru": "Большой сигнал Присутствие включен", + "pl": "Duży czujnik Obecność włączony" + }, + "insightsTitleFalse": { + "en": "Large Presence alarm turned off", + "nl": "Grote Aanwezigheid alarm ging uit", + "de": "Große Präsenz Alarm ist ausgegangen", + "fr": "Alarme Grande Présence s'est désactivée", + "it": "Allarme Presenza Ampia disattivato", + "sv": "Stor Närvaro larm inaktiverat", + "no": "Stor Nærvær alarm deaktivert", + "es": "Alarma de Presencia Grande desactivada", + "da": "Stor Nærvær alarm blev deaktiveret", + "ru": "Большой сигнал Присутствие выключен", + "pl": "Duży czujnik Obecność wyłączony" + } +} diff --git a/.homeycompose/capabilities/alarm_small_presence.json b/.homeycompose/capabilities/alarm_small_presence.json new file mode 100644 index 00000000..1406f88e --- /dev/null +++ b/.homeycompose/capabilities/alarm_small_presence.json @@ -0,0 +1,50 @@ +{ + "title": { + "en": "Small Presence", + "nl": "Kleine Aanwezigheid", + "de": "Kleine Präsenz", + "fr": "Petite Présence", + "it": "Presenza Piccola", + "sv": "Liten Närvaro", + "no": "Liten Nærvær", + "es": "Pequeña Presencia", + "da": "Lille Nærvær", + "ru": "Маленькое Присутствие", + "pl": "Mała Obecność" + }, + "type": "boolean", + "getable": true, + "setable": false, + "uiComponent": "sensor", + "icon": "/drivers/radar_sensor_2/assets/images/small_motion.svg", + "insights": true, + "options": { + "zoneActivity": true + }, + "insightsTitleTrue": { + "en": "Small Presence alarm turned on", + "nl": "Kleine Aanwezigheid alarm ging af", + "de": "Kleine Präsenz Alarm ist angegangen", + "fr": "Alarme Petite Présence s'est déclenchée", + "it": "Allarme Presenza Piccola attivato", + "sv": "Liten Närvaro larm aktiverat", + "no": "Liten Nærvær alarm aktivert", + "es": "La alarma de Pequeña Presencia activada", + "da": "Lille Nærvær alarm blev aktiveret", + "ru": "Маленький сигнал Присутствие включен", + "pl": "Mały czujnik Obecność włączony" + }, + "insightsTitleFalse": { + "en": "Small Presence alarm turned off", + "nl": "Kleine Aanwezigheid alarm ging uit", + "de": "Kleine Präsenz Alarm ist ausgegangen", + "fr": "Alarme Petite Présence s'est désactivée", + "it": "Allarme Presenza Piccola disattivato", + "sv": "Liten Närvaro larm inaktiverat", + "no": "Liten Nærvær alarm deaktivert", + "es": "La alarma de Pequeña Presencia se ha desactivado", + "da": "Lille Nærvær alarm blev deaktiveret", + "ru": "Маленький сигнал Присутствие выключен", + "pl": "Mały czujnik Obecność wyłączony" + } +} diff --git a/.homeycompose/capabilities/last_watering_time.json b/.homeycompose/capabilities/last_watering_time.json new file mode 100644 index 00000000..0bd51816 --- /dev/null +++ b/.homeycompose/capabilities/last_watering_time.json @@ -0,0 +1,14 @@ +{ + "type": "number", + "title": { "en": "Last Watering Time", "nl": "Laatste tijd bewatering" }, + "uiComponent": "sensor", + "getable": true, + "setable": false, + "insights": true, + "options": { + "zoneActivity": true + }, + "min": 0, + "icon": "/drivers/smart_water_timer/assets/images/pressure-gauge.svg", + "units": { "en": "sec", "nl": "sec" } +} diff --git a/.homeycompose/capabilities/measure_water_flow.json b/.homeycompose/capabilities/measure_water_flow.json new file mode 100644 index 00000000..97a35ac9 --- /dev/null +++ b/.homeycompose/capabilities/measure_water_flow.json @@ -0,0 +1,112 @@ +{ + "type": "number", + "title": { + "en": "Valve Water Flow", + "nl": "Kraan Water Flow" + }, + "desc": { + "en": "Set the position of Water Valve. 0% is closed, 100% is open" + }, + "icon": "/drivers/smart_water_timer/assets/images/sprinklers.svg", + "units": "%", + "getable": true, + "setable": true, + "chartType": "stepLine", + "uiComponent": "slider", + "min": 0, + "max": 1, + "step": 0.05, + "value": 0.5, + "decimals": 2, + "$flow": { + "triggers": [ + { + "id": "water_flow_changed", + "title": { + "en": "water_flow-level changed", + "nl": "water_flow-niveau veranderd", + "de": "water_flowm-Niveau geändert", + "fr": "Intensité lumineuse a été modifiée", + "it": "Intensità luminosa modificata", + "sv": "water_flowningsnivå ändrades", + "no": "Dempingsnivå ble endret", + "es": "La intensidad de la luz ha cambiado", + "da": "Lysniveau ændret", + "ru": "Уровень яркости изменен", + "pl": "Zmiana poziomu przygaszenia" + }, + "tokens": [ + { + "name": "water_flow", + "type": "number", + "title": { + "en": "Level", + "nl": "Niveau", + "de": "Niveau", + "fr": "Niveau", + "it": "Livello", + "sv": "Nivå", + "no": "Nivå", + "es": "Nivel", + "da": "Niveau", + "ru": "Уровень", + "pl": "Poziom" + }, + "example": 0.5 + } + ] + } + ], + "actions": [ + { + "id": "water_flow", + "highlight": true, + "title": { + "en": "waterflow to", + "nl": "waterflow naar", + "de": "waterflow auf" + }, + "args": [ + { + "name": "water_flow", + "type": "range", + "min": 0, + "max": 1, + "step": 0.01, + "value": 0.5, + "label": "%", + "labelMultiplier": 100, + "labelDecimals": 0 + } + ] + }, + { + "id": "water_flow_relative", + "title": { + "en": "Set relative water flow-level", + "nl": "Zet relatief water flow-niveau", + "de": "Relatives waterflow Niveau setzen" + }, + "hint": { + "en": "decrease or increase with respect to the device's current waterflow level.", + "nl": "Verhoog of verlaag de waterflow ten opzichte van het huidige waterflow niveau van het apparaat.", + "ru": "Уменьшите или увеличьте яркость относительно текущего уровня яркости устройства.", + "pl": "Przygaś lub rozjaśnij względem obecnego poziomu przygaszenia urządzenia." + }, + "args": [ + { + "name": "water_flow", + "type": "range", + "min": 0, + "max": 1, + "step": 0.01, + "value": 0.5, + "label": "%", + "labelMultiplier": 100, + "labelDecimals": 0 + } + ] + } + ] + } +} diff --git a/.homeycompose/capabilities/meter_valve_state.json b/.homeycompose/capabilities/meter_valve_state.json new file mode 100644 index 00000000..4fb92722 --- /dev/null +++ b/.homeycompose/capabilities/meter_valve_state.json @@ -0,0 +1,30 @@ +{ + "type": "number", + "title": { + "en": "Valve State", + "nl": "Kraanstatus" + }, + "units": { + "en": "%", + "nl": "%" + }, + "icon": "/drivers/smart_water_timer/assets/images/sprinklers.svg", + "getable": true, + "setable": false, + "chartType": "area", + "uiComponent": "sensor", + "min": 0, + "max": 100, + "steps": 5, + "decimals": 0, + "capabilitiesOptions": { + "titleTrue": { + "en": "Open", + "nl": "Open" + }, + "titleFalse": { + "en": "Closed", + "nl": "Gesloten" + } + } +} diff --git a/.homeycompose/capabilities/remaining_watering_time.json b/.homeycompose/capabilities/remaining_watering_time.json new file mode 100644 index 00000000..53dc94a3 --- /dev/null +++ b/.homeycompose/capabilities/remaining_watering_time.json @@ -0,0 +1,18 @@ +{ + "type": "number", + "title": { + "en": "Remaining Watering Time", + "nl": "Resterende tijd bewatering" + }, + "uiComponent": "sensor", + "getable": true, + "setable": false, + "insights": true, + "options": { + "zoneActivity": true + }, + "icon": "/drivers/smart_water_timer/assets/images/pressure-gauge.svg", + "units": { "en": "sec", "nl": "sec" }, + "min": 0, + "decimals": 0 +} diff --git a/.homeycompose/capabilities/shutdown_timer.json b/.homeycompose/capabilities/shutdown_timer.json new file mode 100644 index 00000000..98017bb6 --- /dev/null +++ b/.homeycompose/capabilities/shutdown_timer.json @@ -0,0 +1,16 @@ +{ + "type": "number", + "title": { "en": "Auto Shutdown % Valve", "nl": "Auto Stop % Waarde" }, + "uiComponent": "sensor", + "getable": true, + "setable": false, + "insights": true, + "options": { + "zoneActivity": true + }, + "icon": "/drivers/smart_water_timer/assets/images/nighttime.svg", + "units": { "en": "sec", "nl": "sec" }, + "min": 0, + "max": 1440, + "decimals": 0 +} diff --git a/.homeycompose/capabilities/target_distance.json b/.homeycompose/capabilities/target_distance.json index fdd9b422..3e3dc8fd 100644 --- a/.homeycompose/capabilities/target_distance.json +++ b/.homeycompose/capabilities/target_distance.json @@ -1,9 +1,13 @@ { - "type": "number", - "title": { "en": "Target distance" }, - "uiComponent": "sensor", - "getable": true, - "setable": false, - "units": { "en": "m" }, - "icon": "/drivers/radar_sensor/assets/distance.svg" + "type": "number", + "title": { "en": "Target distance", "nl": "Afstand doel" }, + "icon": "/drivers/radar_sensor/assets/images/measure.svg", + "units": { "en": "m", "nl": "m" }, + "uiComponent": "sensor", + "getable": true, + "setable": false, + "insights": true, + "options": { + "zoneActivity": true + } } diff --git a/.homeycompose/capabilities/valve_state_auto_shutdown.json b/.homeycompose/capabilities/valve_state_auto_shutdown.json new file mode 100644 index 00000000..c7d260b4 --- /dev/null +++ b/.homeycompose/capabilities/valve_state_auto_shutdown.json @@ -0,0 +1,20 @@ +{ + "type": "number", + "title": { + "en": "Valve State @ autoshutdown", + "nl": "Kraanstatus @ auto stop" + }, + "units": { + "en": "%", + "nl": "%" + }, + "icon": "/drivers/smart_water_timer/assets/images/nighttime.svg", + "getable": true, + "setable": false, + "chartType": "area", + "uiComponent": "sensor", + "min": 0, + "max": 100, + "steps": 5, + "decimals": 0 +} diff --git a/.homeycompose/flow/conditions/the-breath-alarm-is-onoff.json b/.homeycompose/flow/conditions/the-breath-alarm-is-onoff.json new file mode 100644 index 00000000..7726abb1 --- /dev/null +++ b/.homeycompose/flow/conditions/the-breath-alarm-is-onoff.json @@ -0,0 +1,15 @@ +{ + "title": { + "en": "The breath alarm is !{{on|off}}", + "nl": "Het adem alarm is !{{aan|uit}}", + "de": "Der Atem-Alarm ist !{{an|aus}}", + "fr": "L'alarme respiratoire est !{{en marche|arrêtée}}", + "it": "L'allarme di respiro è !{{acceso|spento}}", + "sv": "Andningslarmet är !{{på|av}}", + "no": "Åndedrettsalarmen er !{{på|av}}", + "es": "La alarma de respiración está !{{activada|desactivada}}", + "da": "Åndedrætsalarmen er !{{tændt|slukket}}", + "ru": "Сигнал дыхания !{{вкл.|выкл.}}", + "pl": "Czujnik oddechu !{{włączony|wyłączony}}" + } +} \ No newline at end of file diff --git a/.homeycompose/flow/conditions/the-large-presence-alarm-is-onoff.json b/.homeycompose/flow/conditions/the-large-presence-alarm-is-onoff.json new file mode 100644 index 00000000..61164387 --- /dev/null +++ b/.homeycompose/flow/conditions/the-large-presence-alarm-is-onoff.json @@ -0,0 +1,15 @@ +{ + "title": { + "en": "The Large Presence alarm is !{{on|off}}", + "nl": "De grote Aanwezigheid alarm is !{{aan|uit}}", + "de": "Der große Präsenz Alarm ist !{{an|aus}}", + "fr": "L'alarme Grande Présence est !{{en marche|arrêtée}}", + "it": "L'allarme Presenza Ampia è !{{acceso|spento}}", + "sv": "Stor Närvaro larm är !{{på|av}}", + "no": "Stor Nærvær alarm er !{{på|av}}", + "es": "La alarma de Presencia Grande está !{{activada|desactivada}}", + "da": "Stor Nærvær alarm er !{{tændt|slukket}}", + "ru": "Большой сигнал Присутствие !{{вкл.|выкл.}}", + "pl": "Duży czujnik Obecność !{{włączony|wyłączony}}" + } +} \ No newline at end of file diff --git a/.homeycompose/flow/conditions/the-small-presence-alarm-is-onoff.json b/.homeycompose/flow/conditions/the-small-presence-alarm-is-onoff.json new file mode 100644 index 00000000..4151aadf --- /dev/null +++ b/.homeycompose/flow/conditions/the-small-presence-alarm-is-onoff.json @@ -0,0 +1,15 @@ +{ + "title": { + "en": "The Small Presence alarm is !{{on|off}}", + "nl": "De kleine Aanwezigheid alarm is !{{aan|uit}}", + "de": "Der kleine Präsenz Alarm ist !{{an|aus}}", + "fr": "L'alarme Petite Présence est !{{en marche|arrêtée}}", + "it": "L'allarme Presenza Piccola è !{{acceso|spento}}", + "sv": "Liten Närvaro larm är !{{på|av}}", + "no": "Liten Nærvær alarm er !{{på|av}}", + "es": "La alarma de Pequeña Presencia está !{{activada|desactivada}}", + "da": "Lille Nærvær alarm er !{{tændt|slukket}}", + "ru": "Маленький сигнал Присутствие !{{вкл.|выкл.}}", + "pl": "Mały czujnik Obecność !{{włączony|wyłączony}}" + } +} \ No newline at end of file diff --git a/.homeycompose/flow/triggers/the-breath-alarm-turned-off.json b/.homeycompose/flow/triggers/the-breath-alarm-turned-off.json new file mode 100644 index 00000000..48dab87d --- /dev/null +++ b/.homeycompose/flow/triggers/the-breath-alarm-turned-off.json @@ -0,0 +1,15 @@ +{ + "title": { + "en": "The breath alarm turned off", + "nl": "Het adem alarm gaat uit", + "de": "Der Atem-Alarm ist ausgegangen", + "fr": "L'alarme respiratoire s'est désactivée", + "it": "L'allarme di respiro è stato disattivato", + "sv": "Andningslarmet inaktiverat", + "no": "Åndedrettsalarmen deaktivert", + "es": "La alarma de respiración se ha desactivado", + "da": "Åndedrætsalarmen blev deaktiveret", + "ru": "Сигнал дыхания выключен", + "pl": "Czujnik oddechu wyłączony" + } +} \ No newline at end of file diff --git a/.homeycompose/flow/triggers/the-breath-alarm-turned-on.json b/.homeycompose/flow/triggers/the-breath-alarm-turned-on.json new file mode 100644 index 00000000..6b86cbea --- /dev/null +++ b/.homeycompose/flow/triggers/the-breath-alarm-turned-on.json @@ -0,0 +1,15 @@ +{ + "title": { + "en": "The breath alarm turned on", + "nl": "Het adem alarm gaat aan", + "de": "Der Atem-Alarm ist angegangen", + "fr": "L'alarme respiratoire s'est activée", + "it": "L'allarme di respiro è stato attivato", + "sv": "Andningslarmet aktiverat", + "no": "Åndedrettsalarmen aktivert", + "es": "La alarma de respiración se ha activado", + "da": "Åndedrætsalarmen blev aktiveret", + "ru": "Сигнал дыхания включен", + "pl": "Czujnik oddechu włączony" + } +} \ No newline at end of file diff --git a/.homeycompose/flow/triggers/the-large-presence-alarm-turned-off.json b/.homeycompose/flow/triggers/the-large-presence-alarm-turned-off.json new file mode 100644 index 00000000..0b842eea --- /dev/null +++ b/.homeycompose/flow/triggers/the-large-presence-alarm-turned-off.json @@ -0,0 +1,15 @@ +{ + "title": { + "en": "The Large Presence alarm turned off", + "nl": "De grote Aanwezigheid alarm gaat uit", + "de": "Der große Präsenz Alarm ist ausgegangen", + "fr": "L'alarme Grande Présence s'est désactivée", + "it": "L'allarme Presenza Ampia è stato disattivato", + "sv": "Stor Närvaro larm inaktiverat", + "no": "Stor Nærvær alarm deaktivert", + "es": "La alarma de Presencia Grande se ha desactivado", + "da": "Stor Nærvær alarm blev deaktiveret", + "ru": "Большой сигнал Присутствие выключен", + "pl": "Duży czujnik Obecność wyłączony" + } +} \ No newline at end of file diff --git a/.homeycompose/flow/triggers/the-large-presence-alarm-turned-on.json b/.homeycompose/flow/triggers/the-large-presence-alarm-turned-on.json new file mode 100644 index 00000000..6b772347 --- /dev/null +++ b/.homeycompose/flow/triggers/the-large-presence-alarm-turned-on.json @@ -0,0 +1,15 @@ +{ + "title": { + "en": "The Large Presence alarm turned on", + "nl": "Grote Aanwezigheid alarm ging af", + "de": "Große Präsenz Alarm ist angegangen", + "fr": "Alarme Grande Présence s'est déclenchée", + "it": "Allarme Presenza Ampia attivato", + "sv": "Stor Närvaro larm aktiverat", + "no": "Stor Nærvær alarm aktivert", + "es": "Alarma de Presencia Grande activada", + "da": "Stor Nærvær alarm blev aktiveret", + "ru": "Большой сигнал Присутствие включен", + "pl": "Duży czujnik Obecność włączony" + } +} \ No newline at end of file diff --git a/.homeycompose/flow/triggers/the-small-presence-alarm-turned-off.json b/.homeycompose/flow/triggers/the-small-presence-alarm-turned-off.json new file mode 100644 index 00000000..9b233375 --- /dev/null +++ b/.homeycompose/flow/triggers/the-small-presence-alarm-turned-off.json @@ -0,0 +1,15 @@ +{ + "title": { + "en": "The Small Presence alarm turned off", + "nl": "De kleine Aanwezigheid alarm gaat uit", + "de": "Der kleine Präsenz Alarm ist ausgegangen", + "fr": "L'alarme Petite Présence s'est désactivée", + "it": "L'allarme Presenza Piccola è stato disattivato", + "sv": "Liten Närvaro larm inaktiverat", + "no": "Liten Nærvær alarm deaktivert", + "es": "La alarma de Pequeña Presencia se ha desactivado", + "da": "Lille Nærvær alarm blev deaktiveret", + "ru": "Маленький сигнал Присутствие выключен", + "pl": "Mały czujnik Obecność wyłączony" + } +} \ No newline at end of file diff --git a/.homeycompose/flow/triggers/the-small-presence-alarm-turned-on.json b/.homeycompose/flow/triggers/the-small-presence-alarm-turned-on.json new file mode 100644 index 00000000..4523a67b --- /dev/null +++ b/.homeycompose/flow/triggers/the-small-presence-alarm-turned-on.json @@ -0,0 +1,15 @@ +{ + "title": { + "en": "The Small Presence alarm turned on", + "nl": "De kleine Aanwezigheid alarm gaat aan", + "de": "Der kleine Präsenz Alarm ist angegangen", + "fr": "L'alarme Petite Présence s'est activée", + "it": "L'allarme Presenza Piccola è stato attivato", + "sv": "Liten Närvaro larm aktiverat", + "no": "Liten Nærvær alarm aktivert", + "es": "La alarma de Pequeña Presencia se ha activado", + "da": "Lille Nærvær alarm blev aktiveret", + "ru": "Маленький сигнал Присутствие включен", + "pl": "Mały czujnik Obecność włączony" + } +} \ No newline at end of file diff --git a/README.md b/README.md index ab4c9a24..2f763dc9 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,14 @@ Supported devices: _TZ3000_lf56vpxj / TS0202 TUYATEC-dxnohkpd / RH3040 +- Radar Sensor + _TZE200_ztc6ggyl / TS0601 + _TZE201_ztc6ggyl / TS0601 + _TZE202_ztc6ggyl / TS0601 + _TZE203_ztc6ggyl / TS0601 + _TZE204_ztc6ggyl / TS0601 + _TZE200_2aaelwxk / TS0225 + . Motion Sensor TUYATEC-bd5faf9p / RH3040 (Nedis) _TZ1800_fcdjzz3s / TY0202 (Silvercrest / Lidl) @@ -534,6 +542,10 @@ Supported devices: - Smart Garden Irrigation Controller _TZ3210_eymunffl / TS0101 (Woox) +- Smart Garden Irrigation With Timer + _TZE200_arge1ptm / TS0601 (QOTO QT-05M) + _TZE200_xlppj4f5 / TS0601 (Immax Neo QT-05M) + - Zigbee Repeater _TZ3000_m0vaazab / TS0207 _TZ3000_5k5vh43t / TS0207 diff --git a/app.json b/app.json index aac85dc8..8ffc05e4 100644 --- a/app.json +++ b/app.json @@ -108,378 +108,395 @@ ] }, "flow": { - "actions": [ + "triggers": [ { - "id": "resetEnergyMeter", "title": { - "en": "Reset Energy Meter", - "sv": "Återställ energimätaren" - }, - "args": [], - "callback": "resetEnergyMeter" + "en": "The breath alarm turned off", + "nl": "Het adem alarm gaat uit", + "de": "Der Atem-Alarm ist ausgegangen", + "fr": "L'alarme respiratoire s'est désactivée", + "it": "L'allarme di respiro è stato disattivato", + "sv": "Andningslarmet inaktiverat", + "no": "Åndedrettsalarmen deaktivert", + "es": "La alarma de respiración se ha desactivado", + "da": "Åndedrætsalarmen blev deaktiveret", + "ru": "Сигнал дыхания выключен", + "pl": "Czujnik oddechu wyłączony" + }, + "id": "the-breath-alarm-turned-off" }, { "title": { - "en": "Start effect" + "en": "The breath alarm turned on", + "nl": "Het adem alarm gaat aan", + "de": "Der Atem-Alarm ist angegangen", + "fr": "L'alarme respiratoire s'est activée", + "it": "L'allarme di respiro è stato attivato", + "sv": "Andningslarmet aktiverat", + "no": "Åndedrettsalarmen aktivert", + "es": "La alarma de respiración se ha activado", + "da": "Åndedrætsalarmen blev aktiveret", + "ru": "Сигнал дыхания включен", + "pl": "Czujnik oddechu włączony" + }, + "id": "the-breath-alarm-turned-on" + }, + { + "title": { + "en": "The Large Presence alarm turned off", + "nl": "De grote Aanwezigheid alarm gaat uit", + "de": "Der große Präsenz Alarm ist ausgegangen", + "fr": "L'alarme Grande Présence s'est désactivée", + "it": "L'allarme Presenza Ampia è stato disattivato", + "sv": "Stor Närvaro larm inaktiverat", + "no": "Stor Nærvær alarm deaktivert", + "es": "La alarma de Presencia Grande se ha desactivado", + "da": "Stor Nærvær alarm blev deaktiveret", + "ru": "Большой сигнал Присутствие выключен", + "pl": "Duży czujnik Obecność wyłączony" + }, + "id": "the-large-presence-alarm-turned-off" + }, + { + "title": { + "en": "The Large Presence alarm turned on", + "nl": "Grote Aanwezigheid alarm ging af", + "de": "Große Präsenz Alarm ist angegangen", + "fr": "Alarme Grande Présence s'est déclenchée", + "it": "Allarme Presenza Ampia attivato", + "sv": "Stor Närvaro larm aktiverat", + "no": "Stor Nærvær alarm aktivert", + "es": "Alarma de Presencia Grande activada", + "da": "Stor Nærvær alarm blev aktiveret", + "ru": "Большой сигнал Присутствие включен", + "pl": "Duży czujnik Obecność włączony" + }, + "id": "the-large-presence-alarm-turned-on" + }, + { + "title": { + "en": "The Small Presence alarm turned off", + "nl": "De kleine Aanwezigheid alarm gaat uit", + "de": "Der kleine Präsenz Alarm ist ausgegangen", + "fr": "L'alarme Petite Présence s'est désactivée", + "it": "L'allarme Presenza Piccola è stato disattivato", + "sv": "Liten Närvaro larm inaktiverat", + "no": "Liten Nærvær alarm deaktivert", + "es": "La alarma de Pequeña Presencia se ha desactivado", + "da": "Lille Nærvær alarm blev deaktiveret", + "ru": "Маленький сигнал Присутствие выключен", + "pl": "Mały czujnik Obecność wyłączony" + }, + "id": "the-small-presence-alarm-turned-off" + }, + { + "title": { + "en": "The Small Presence alarm turned on", + "nl": "De kleine Aanwezigheid alarm gaat aan", + "de": "Der kleine Präsenz Alarm ist angegangen", + "fr": "L'alarme Petite Présence s'est activée", + "it": "L'allarme Presenza Piccola è stato attivato", + "sv": "Liten Närvaro larm aktiverat", + "no": "Liten Nærvær alarm aktivert", + "es": "La alarma de Pequeña Presencia se ha activado", + "da": "Lille Nærvær alarm blev aktiveret", + "ru": "Маленький сигнал Присутствие включен", + "pl": "Mały czujnik Obecność włączony" + }, + "id": "the-small-presence-alarm-turned-on" + }, + { + "id": "handheld_remote_4_buttons", + "title": { + "en": "Button was pressed" }, "titleFormatted": { - "en": "Effect is [[effect_name]] with speed [[effect_speed]] and color(s) [[effect_color_0]], [[effect_color_1]], [[effect_color_2]], [[effect_color_3]], [[effect_color_4]], [[effect_color_5]], [[effect_color_6]], [[effect_color_7]], [[effect_color_8]]" - }, - "hint": { - "en": "Choose a light pattern and a speed for it. You can also choose what colors the pattern should have, this is not mandatory." + "en": "[[button]] button was pressed [[action]]" }, "args": [ { - "name": "christmas_lights_device", "type": "device", - "filter": "driver_id=christmas_lights" + "name": "device", + "filter": "driver_id=handheld_remote_4_buttons" }, { + "name": "button", "type": "dropdown", - "name": "effect_name", "title": { - "en": "Effect" + "en": "Button" }, "values": [ { - "id": "steady", - "label": { - "en": "Steady" - } - }, - { - "id": "snow", - "label": { - "en": "Snow" - } - }, - { - "id": "rainbow", - "label": { - "en": "Rainbow" - } - }, - { - "id": "snake", - "label": { - "en": "Snake" - } - }, - { - "id": "twinkle", - "label": { - "en": "Twinkle" - } - }, - { - "id": "firework", - "label": { - "en": "Firework" - } - }, - { - "id": "horizontal_flag", - "label": { - "en": "Horizontal Flag" - } - }, - { - "id": "waves", - "label": { - "en": "Waves" - } - }, - { - "id": "updown", - "label": { - "en": "Up and Down" - } - }, - { - "id": "vintage", + "id": "button1", "label": { - "en": "Vintage" + "en": "Button 1" } }, { - "id": "fading", + "id": "button2", "label": { - "en": "Fading" + "en": "Button 2" } }, { - "id": "collide", + "id": "button3", "label": { - "en": "Collide" + "en": "Button 3" } }, { - "id": "strobe", + "id": "button4", "label": { - "en": "Strobe" + "en": "Button 4" } - }, + } + ] + }, + { + "name": "action", + "type": "dropdown", + "title": { + "en": "Action" + }, + "values": [ { - "id": "sparkles", + "id": "single", "label": { - "en": "Sparkles" + "en": "once" } }, { - "id": "carnaval", + "id": "double", "label": { - "en": "Carnaval" + "en": "twice" } }, { - "id": "glow", + "id": "long", "label": { - "en": "Glow" + "en": "long" } } ] - }, - { - "type": "range", - "name": "effect_speed", - "title": { - "en": "Speed" - }, - "label": "/64", - "min": 0, - "max": 64, - "step": 1 - }, - { - "type": "color", - "name": "effect_color_0", - "title": { - "en": "color 0" - } - }, - { - "type": "color", - "name": "effect_color_1", - "title": { - "en": "color 1" - } - }, - { - "type": "color", - "name": "effect_color_2", - "title": { - "en": "color 2" - } - }, - { - "type": "color", - "name": "effect_color_3", - "title": { - "en": "color 3" - } - }, - { - "type": "color", - "name": "effect_color_4", - "title": { - "en": "color 4" - } - }, - { - "type": "color", - "name": "effect_color_5", - "title": { - "en": "color 5" - } - }, - { - "type": "color", - "name": "effect_color_6", - "title": { - "en": "color 6" - } - }, - { - "type": "color", - "name": "effect_color_7", - "title": { - "en": "color 7" - } - }, - { - "type": "color", - "name": "effect_color_8", - "title": { - "en": "color 8" - } } - ], - "id": "start_effect" + ] }, { - "id": "move_open", + "id": "alarm_breathe_presence", "title": { - "en": "Open", - "de": "Öffnen" + "en": "Breath presence", + "nl": "Adem aanwezigheid", + "de": "Atempräsenz", + "fr": "Présence respiratoire", + "it": "Presenza del respiro", + "sv": "Andningsnärvaro", + "no": "Åndedrettsnærvær", + "es": "Presencia de la respiración", + "da": "Åndedræt nærvær", + "ru": "Присутствие дыхания", + "pl": "Obecność oddechu" + }, + "titleFormatted": { + "en": "Breath presence", + "nl": "Adem aanwezigheid", + "de": "Atempräsenz", + "fr": "Présence respiratoire", + "it": "Presenza del respiro", + "sv": "Andningsnärvaro", + "no": "Åndedrettsnærvær", + "es": "Presencia de la respiración", + "da": "Åndedræt nærvær", + "ru": "Присутствие дыхания", + "pl": "Obecność oddechu" + }, + "hint": { + "en": "This card will trigger when Breath Presence is activated.", + "nl": "Deze kaart wordt alleen geactiveerd wanneer de Adem aanwezigheid actief is.", + "de": "Diese Karte wird ausgelöst, wenn die Atempräsenz aktiviert wird." }, "args": [ { "type": "device", "name": "device", - "filter": "driver_id=curtain_module" + "filter": "driver_id=radar_sensor_2" } ] }, { - "id": "move_close", + "id": "alarm_small_presence", "title": { - "en": "Close", - "de": "Schließen" + "en": "Small Presence", + "nl": "Kleine Aanwezigheid", + "de": "Kleine Präsenz", + "fr": "Petite Présence", + "it": "Presenza Piccola", + "sv": "Liten Närvaro", + "no": "Liten Nærvær", + "es": "Pequeña Presencia", + "da": "Lille Nærvær", + "ru": "Маленькое Присутствие", + "pl": "Mała Obecność" + }, + "titleFormatted": { + "en": "Small Presence", + "nl": "Kleine Aanwezigheid", + "de": "Kleine Präsenz", + "fr": "Petite Présence", + "it": "Presenza Piccola", + "sv": "Liten Närvaro", + "no": "Liten Nærvær", + "es": "Pequeña Presencia", + "da": "Lille Nærvær", + "ru": "Маленькое Присутствие", + "pl": "Mała Obecność" + }, + "hint": { + "en": "This card will trigger when Small Presence is activated.", + "nl": "Deze kaart wordt alleen geactiveerd wanneer de Kleine aanwezigheid actief is.", + "de": "Diese Karte wird ausgelöst, wenn die Kleine Präsenz aktiviert wird." }, "args": [ { "type": "device", "name": "device", - "filter": "driver_id=curtain_module" + "filter": "driver_id=radar_sensor_2" } ] }, { - "id": "alarm_state", + "id": "large_small_presence", "title": { - "en": "Change the alarm state", - "nl": "Verander de alarm toestand", - "de": "Ändern des Alarmstatus" + "en": "Large Presence", + "nl": "Grote Aanwezigheid", + "de": "Große Präsenz", + "fr": "Grande Présence", + "it": "Presenza Ampia", + "sv": "Stor Närvaro", + "no": "Stor Nærvær", + "es": "Presencia Grande", + "da": "Stor Nærvær", + "ru": "Большое Присутствие", + "pl": "Duża Obecność" }, "titleFormatted": { - "en": "Change the alarm state to [[alarm_state]]", - "nl": "Verander de alarm toestand naar [[alarm_state]]", - "de": "Ändern des Alarmstatus zu [[alarm_state]]" + "en": "Large Presence", + "nl": "Grote Aanwezigheid", + "de": "Große Präsenz", + "fr": "Grande Présence", + "it": "Presenza Ampia", + "sv": "Stor Närvaro", + "no": "Stor Nærvær", + "es": "Presencia Grande", + "da": "Stor Nærvær", + "ru": "Большое Присутствие", + "pl": "Duża Obecność" }, "hint": { - "en": "Change the alarm state; sound or silence the alarm", - "nl": "Verander de alarm toestand; luiden of uitschakelen van het alarm", - "de": "Ändern des Alarmstatus; Ein- oder ausschalten des Alarmtons." + "en": "This card will trigger when Large Presence is activated.", + "nl": "Deze kaart wordt alleen geactiveerd wanneer de Grote aanwezigheid actief is.", + "de": "Diese Karte wird ausgelöst, wenn die Große Präsenz aktiviert wird." }, "args": [ { "type": "device", "name": "device", - "filter": "driver_id=sirentemphumidsensor" - }, - { - "name": "alarm_state", - "type": "dropdown", - "values": [ - { - "id": "off/disable", - "label": { - "en": "Silence alarm", - "nl": "Alarm stil", - "de": "Stiller Alarm" - } - }, - { - "id": "on/enable", - "label": { - "en": "Sound alarm", - "nl": "Alarm luiden", - "de": "Akustischer Alarm" - } - } - ] + "filter": "driver_id=radar_sensor_2" } ] }, { - "id": "alarm_duration", + "id": "alarm_siren", "title": { - "en": "Switch on siren for X Seconds", - "de": "Sirene für X Sekunden einschalten", - "nl": "Zet sirene aan voor X seconden" + "en": "Siren Alarm", + "nl": "Sirene Alarm", + "de": "Sirenenalarm" }, "titleFormatted": { - "en": "Switch on siren for [[duration]] Seconds", - "de": "Sirene für [[duration]] Sekunden einschalten", - "nl": "Zet sirene aan voor [[duration]] seconden" + "en": "Siren Alarm", + "nl": "Sirene Alarm", + "de": "Sirenenalarm" + }, + "hint": { + "en": "This card will trigger when siren is activated.", + "nl": "Deze kaart wordt alleen geactiveerd wanneer de sirene actief is.", + "de": "Diese Karte wird ausgelöst, wenn die Sirene aktiviert wird." }, "args": [ { "type": "device", "name": "device", "filter": "driver_id=sirentemphumidsensor" - }, - { - "type": "number", - "name": "duration", - "min": 0, - "max": 65535, - "step": 1, - "label": { - "en": "Seconds", - "de": "Sekunden", - "nl": "Seconden" - }, - "placeholder": { - "en": "120" - }, - "title": { - "en": "Duration of alarm in seconds", - "de": "Dauer des Alarms in Sekunden", - "nl": "Duur van het alarm in seconden" - } } ] }, { - "id": "siren_volume", + "id": "smart_remote_1_button", "title": { - "en": "Set volume of siren", - "nl": "Zet het volume van de sirene", - "de": "Einstellen der Lautstärke der Sirene" + "en": "Button Action" }, "titleFormatted": { - "en": "Set volume of siren to [[siren_volume]]", - "nl": "Zet het volume van de sirene naar [[siren_volume]]", - "de": "Einstellen der Lautstärke der Sirene auf [[siren_volume]]" - }, - "hint": { - "en": "Set volume of siren.", - "nl": "Zet het volume van de sirene.", - "de": "Einstellen der Lautstärke der Sirene" + "en": "Button had [[action]]" }, "args": [ { "type": "device", "name": "device", - "filter": "driver_id=sirentemphumidsensor" + "filter": "driver_id=smart_remote_1_button" }, { - "name": "siren_volume", + "name": "action", "type": "dropdown", + "title": { + "en": "Button Action" + }, "values": [ { - "id": "2", + "id": "oneClick", "label": { - "en": "Low", - "nl": "Laag", - "de": "Niedrig" + "en": "1 Click" } }, { - "id": "1", + "id": "twoClicks", "label": { - "en": "Midle", - "nl": "Middelmatig", - "de": "Mittel" + "en": "2 Clicks" + } + } + ] + } + ] + }, + { + "id": "smart_remote_1_button_2", + "title": { + "en": "Button Action" + }, + "titleFormatted": { + "en": "Button had [[action]]" + }, + "args": [ + { + "type": "device", + "name": "device", + "filter": "driver_id=smart_remote_1_button_2" + }, + { + "name": "action", + "type": "dropdown", + "title": { + "en": "Button Action" + }, + "values": [ + { + "id": "oneClick", + "label": { + "en": "1 Click" } }, { - "id": "0", + "id": "twoClicks", "label": { - "en": "High (default)", - "nl": "Hoog (standaard)", - "de": "Hoch (Standard)" + "en": "2 Clicks" } } ] @@ -487,174 +504,238 @@ ] }, { - "id": "alarm_tune", + "id": "smart_remote_4_buttons", "title": { - "en": "Set the alarm tune", - "nl": "Stel de alarm melodie in", - "de": "Einstellen des Alarmtons" + "en": "Button Action" }, "titleFormatted": { - "en": "Set the alarm tune to [[alarm_tune]]", - "nl": "Stel de alarm melodie in op [[alarm_tune]]", - "de": "Einstellen des Alarmtons zu [[alarm_tune]]" - }, - "hint": { - "en": "Choose the tune of the alarm sound", - "nl": "Kies de melodie die gebruikt wordt bij alarm", - "de": "Wähle die Melodie des Alarmtons aus." + "en": "The [[action]]" }, "args": [ { "type": "device", "name": "device", - "filter": "driver_id=sirentemphumidsensor" + "filter": "driver_id=smart_remote_4_buttons" }, { - "name": "alarm_tune", + "name": "action", "type": "dropdown", + "title": { + "en": "Button Action" + }, "values": [ { - "id": "0", + "id": "leftUp", "label": { - "en": "Doorbell 1", - "nl": "Doorbell 1", - "de": "Doorbell 1" + "en": "Upper Left Button Pressed" } }, { - "id": "1", + "id": "rightUp", "label": { - "en": "For Elise (default)", - "nl": "Fur Elise (standaard)", - "de": "Fur Elise (Standard)" + "en": "Upper Right Button Pressed" } }, { - "id": "2", + "id": "leftDown", "label": { - "en": "Westminster", - "nl": "Westminster", - "de": "Westminster" + "en": "Lower Left Button Pressed" } }, { - "id": "3", + "id": "rightDown", "label": { - "en": "4 Key Chime", - "nl": "4 Key Chime", - "de": "4 Key Chime" + "en": "Lower Right Button Pressed" } - }, + } + ] + } + ] + }, + { + "id": "water_flow_changed", + "title": { + "en": "water_flow-level changed", + "nl": "water_flow-niveau veranderd", + "de": "water_flowm-Niveau geändert", + "fr": "Intensité lumineuse a été modifiée", + "it": "Intensità luminosa modificata", + "sv": "water_flowningsnivå ändrades", + "no": "Dempingsnivå ble endret", + "es": "La intensidad de la luz ha cambiado", + "da": "Lysniveau ændret", + "ru": "Уровень яркости изменен", + "pl": "Zmiana poziomu przygaszenia" + }, + "tokens": [ + { + "name": "water_flow", + "type": "number", + "title": { + "en": "Level", + "nl": "Niveau", + "de": "Niveau", + "fr": "Niveau", + "it": "Livello", + "sv": "Nivå", + "no": "Nivå", + "es": "Nivel", + "da": "Niveau", + "ru": "Уровень", + "pl": "Poziom" + }, + "example": 0.5 + } + ], + "args": [ + { + "type": "device", + "name": "device", + "filter": "driver_id=smart_water_timer" + } + ] + }, + { + "id": "wall_remote_1_gang_buttons", + "title": { + "en": "Button Action" + }, + "titleFormatted": { + "en": "Button had [[action]]" + }, + "args": [ + { + "type": "device", + "name": "device", + "filter": "driver_id=wall_remote_1_gang" + }, + { + "name": "action", + "type": "dropdown", + "title": { + "en": "Button Action" + }, + "values": [ { - "id": "4", + "id": "oneClick", "label": { - "en": "William Tell", - "nl": "William Tell", - "de": "William Tell" + "en": "1 Click" } }, { - "id": "5", + "id": "twoClicks", "label": { - "en": "Mozart Piano", - "nl": "Mozart Piano", - "de": "Mozart Piano" + "en": "2 Clicks" } - }, + } + ] + } + ] + }, + { + "id": "wall_remote_2_gang_buttons", + "title": { + "en": "Button Action" + }, + "titleFormatted": { + "en": "The [[action]]" + }, + "args": [ + { + "type": "device", + "name": "device", + "filter": "driver_id=wall_remote_2_gang" + }, + { + "name": "action", + "type": "dropdown", + "title": { + "en": "Button Action" + }, + "values": [ { - "id": "6", + "id": "left-oneClick", "label": { - "en": "Space Alarm", - "nl": "Space Alarm", - "de": "Space Alarm" + "en": "Left Button: 1 Click" } }, { - "id": "7", + "id": "left-twoClicks", "label": { - "en": "Klaxon", - "nl": "Klaxon", - "de": "Klaxon" + "en": "Left Button: 2 Clicks" } }, { - "id": "8", + "id": "right-oneClick", "label": { - "en": "Meep meep", - "nl": "Meep meep", - "de": "Meep meep" - } - }, - { - "id": "9", - "label": { - "en": "Wheep", - "nl": "Wheep", - "de": "Wheep" - } - }, - { - "id": "10", - "label": { - "en": "Barking dog", - "nl": "Barking dog", - "de": "Barking dog" + "en": "Right Button: 1 Click" } }, { - "id": "11", + "id": "right-twoClicks", "label": { - "en": "Alarm Siren", - "nl": "Alarm Siren", - "de": "Alarm Siren" + "en": "Right Button: 2 Clicks" } - }, + } + ] + } + ] + }, + { + "id": "wall_remote_3_gang_buttons", + "title": { + "en": "Button Action" + }, + "titleFormatted": { + "en": "The [[action]]" + }, + "args": [ + { + "type": "device", + "name": "device", + "filter": "driver_id=wall_remote_3_gang" + }, + { + "name": "action", + "type": "dropdown", + "title": { + "en": "Button Action" + }, + "values": [ { - "id": "12", + "id": "left-oneClick", "label": { - "en": "Doorbell 2", - "nl": "Doorbell 2", - "de": "Doorbell 2" + "en": "Left Button: 1 Click" } }, { - "id": "13", + "id": "left-twoClicks", "label": { - "en": "Old Phone", - "nl": "Old Phone", - "de": "Old Phone" + "en": "Left Button: 2 Clicks" } }, { - "id": "14", + "id": "right-oneClick", "label": { - "en": "Police Siren", - "nl": "Police Siren", - "de": "Police Siren" + "en": "Right Button: 1 Click" } }, { - "id": "15", + "id": "right-twoClicks", "label": { - "en": "Evacuation bell", - "nl": "Evacuation bell", - "de": "Evacuation bell" + "en": "Right Button: 2 Clicks" } }, { - "id": "16", + "id": "center-oneClick", "label": { - "en": "Clock alarm", - "nl": "Clock alarm", - "de": "Clock alarm" + "en": "Center Button: 1 Click" } }, { - "id": "17", + "id": "center-twoClicks", "label": { - "en": "Fire alarm", - "nl": "Fire alarm", - "de": "Fire alarm" + "en": "Center Button: 2 Clicks" } } ] @@ -662,100 +743,72 @@ ] }, { - "id": "window_open_status_set", - "title": { - "en": "Set window open status" - }, - "titleFormatted": { - "en": "Set window open status to [[window_open_status]]" - }, - "args": [ - { - "type": "device", - "name": "device", - "filter": "driver_id=thermostatic_radiator_valve" - }, - { - "type": "checkbox", - "name": "window_open_status", - "title": { - "en": "Open" - } - } - ] - } - ], - "triggers": [ - { - "id": "handheld_remote_4_buttons", + "id": "wall_remote_4_gang_buttons", "title": { - "en": "Button was pressed" + "en": "Button Action" }, "titleFormatted": { - "en": "[[button]] button was pressed [[action]]" + "en": "The [[action]]" }, "args": [ { "type": "device", "name": "device", - "filter": "driver_id=handheld_remote_4_buttons" + "filter": "driver_id=wall_remote_4_gang" }, { - "name": "button", + "name": "action", "type": "dropdown", "title": { - "en": "Button" + "en": "Button Action" }, "values": [ { - "id": "button1", + "id": "leftUp-oneClick", "label": { - "en": "Button 1" + "en": "Upper Left Button: 1 Click" } }, { - "id": "button2", + "id": "leftUp-twoClicks", "label": { - "en": "Button 2" + "en": "Upper Left Button: 2 Clicks" } }, { - "id": "button3", + "id": "rightUp-oneClick", "label": { - "en": "Button 3" + "en": "Upper Right Button: 1 Click" } }, { - "id": "button4", + "id": "rightUp-twoClicks", "label": { - "en": "Button 4" + "en": "Upper Right Button: 2 Clicks" } - } - ] - }, - { - "name": "action", - "type": "dropdown", - "title": { - "en": "Action" - }, - "values": [ + }, { - "id": "single", + "id": "leftDown-oneClick", "label": { - "en": "once" + "en": "Lower Left Button: 1 Click" } }, { - "id": "double", + "id": "leftDown-twoClicks", "label": { - "en": "twice" + "en": "Lower Left Button: 2 Clicks" } }, { - "id": "long", + "id": "rightDown-oneClick", "label": { - "en": "long" + "en": "Lower Right Button: 1 Click" + } + }, + { + "id": "rightDown-twoClicks", + "label": { + "en": "Lower Right Button: 2 Clicks" } } ] @@ -763,98 +816,48 @@ ] }, { - "id": "alarm_siren", - "title": { - "en": "Siren Alarm", - "nl": "Sirene Alarm", - "de": "Sirenenalarm" - }, - "titleFormatted": { - "en": "Siren Alarm", - "nl": "Sirene Alarm", - "de": "Sirenenalarm" - }, - "hint": { - "en": "This card will trigger when siren is activated.", - "nl": "Deze kaart wordt alleen geactiveerd wanneer de sirene actief is.", - "de": "Diese Karte wird ausgelöst, wenn die Sirene aktiviert wird." - }, - "args": [ - { - "type": "device", - "name": "device", - "filter": "driver_id=sirentemphumidsensor" - } - ] - }, - { - "id": "smart_remote_1_button", + "id": "wall_remote_4_gang_buttons_2", "title": { - "en": "Button Action" + "en": "Button" }, "titleFormatted": { - "en": "Button had [[action]]" + "en": "The [[button]]" }, "args": [ { "type": "device", "name": "device", - "filter": "driver_id=smart_remote_1_button" + "filter": "driver_id=wall_remote_4_gang_2" }, { - "name": "action", + "name": "button", "type": "dropdown", "title": { - "en": "Button Action" + "en": "Button Pressed" }, "values": [ { - "id": "oneClick", + "id": "leftUp", "label": { - "en": "1 Click" + "en": "Upper Left Button Pressed" } }, { - "id": "twoClicks", + "id": "rightUp", "label": { - "en": "2 Clicks" + "en": "Upper Right Button Pressed" } - } - ] - } - ] - }, - { - "id": "smart_remote_1_button_2", - "title": { - "en": "Button Action" - }, - "titleFormatted": { - "en": "Button had [[action]]" - }, - "args": [ - { - "type": "device", - "name": "device", - "filter": "driver_id=smart_remote_1_button_2" - }, - { - "name": "action", - "type": "dropdown", - "title": { - "en": "Button Action" - }, - "values": [ + }, { - "id": "oneClick", + "id": "leftDown", "label": { - "en": "1 Click" + "en": "Lower Left Button Pressed" } }, { - "id": "twoClicks", + "id": "rightDown", "label": { - "en": "2 Clicks" + "en": "Lower Right Button Pressed" } } ] @@ -862,7 +865,7 @@ ] }, { - "id": "smart_remote_4_buttons", + "id": "wall_remote_4_gang_buttons_3", "title": { "en": "Button Action" }, @@ -873,7 +876,7 @@ { "type": "device", "name": "device", - "filter": "driver_id=smart_remote_4_buttons" + "filter": "driver_id=wall_remote_4_gang_3" }, { "name": "action", @@ -883,113 +886,440 @@ }, "values": [ { - "id": "leftUp", + "id": "leftUp-oneClick", "label": { - "en": "Upper Left Button Pressed" + "en": "Upper Left Button: 1 Click" } }, { - "id": "rightUp", + "id": "leftUp-twoClicks", "label": { - "en": "Upper Right Button Pressed" + "en": "Upper Left Button: 2 Clicks" } }, { - "id": "leftDown", + "id": "rightUp-oneClick", "label": { - "en": "Lower Left Button Pressed" + "en": "Upper Right Button: 1 Click" } }, { - "id": "rightDown", + "id": "rightUp-twoClicks", "label": { - "en": "Lower Right Button Pressed" + "en": "Upper Right Button: 2 Clicks" + } + }, + { + "id": "leftDown-oneClick", + "label": { + "en": "Lower Left Button: 1 Click" + } + }, + { + "id": "leftDown-twoClicks", + "label": { + "en": "Lower Left Button: 2 Clicks" + } + }, + { + "id": "rightDown-oneClick", + "label": { + "en": "Lower Right Button: 1 Click" + } + }, + { + "id": "rightDown-twoClicks", + "label": { + "en": "Lower Right Button: 2 Clicks" } } ] } ] + } + ], + "conditions": [ + { + "title": { + "en": "The breath alarm is !{{on|off}}", + "nl": "Het adem alarm is !{{aan|uit}}", + "de": "Der Atem-Alarm ist !{{an|aus}}", + "fr": "L'alarme respiratoire est !{{en marche|arrêtée}}", + "it": "L'allarme di respiro è !{{acceso|spento}}", + "sv": "Andningslarmet är !{{på|av}}", + "no": "Åndedrettsalarmen er !{{på|av}}", + "es": "La alarma de respiración está !{{activada|desactivada}}", + "da": "Åndedrætsalarmen er !{{tændt|slukket}}", + "ru": "Сигнал дыхания !{{вкл.|выкл.}}", + "pl": "Czujnik oddechu !{{włączony|wyłączony}}" + }, + "id": "the-breath-alarm-is-onoff" }, { - "id": "wall_remote_1_gang_buttons", "title": { - "en": "Button Action" + "en": "The Large Presence alarm is !{{on|off}}", + "nl": "De grote Aanwezigheid alarm is !{{aan|uit}}", + "de": "Der große Präsenz Alarm ist !{{an|aus}}", + "fr": "L'alarme Grande Présence est !{{en marche|arrêtée}}", + "it": "L'allarme Presenza Ampia è !{{acceso|spento}}", + "sv": "Stor Närvaro larm är !{{på|av}}", + "no": "Stor Nærvær alarm er !{{på|av}}", + "es": "La alarma de Presencia Grande está !{{activada|desactivada}}", + "da": "Stor Nærvær alarm er !{{tændt|slukket}}", + "ru": "Большой сигнал Присутствие !{{вкл.|выкл.}}", + "pl": "Duży czujnik Obecność !{{włączony|wyłączony}}" + }, + "id": "the-large-presence-alarm-is-onoff" + }, + { + "title": { + "en": "The Small Presence alarm is !{{on|off}}", + "nl": "De kleine Aanwezigheid alarm is !{{aan|uit}}", + "de": "Der kleine Präsenz Alarm ist !{{an|aus}}", + "fr": "L'alarme Petite Présence est !{{en marche|arrêtée}}", + "it": "L'allarme Presenza Piccola è !{{acceso|spento}}", + "sv": "Liten Närvaro larm är !{{på|av}}", + "no": "Liten Nærvær alarm er !{{på|av}}", + "es": "La alarma de Pequeña Presencia está !{{activada|desactivada}}", + "da": "Lille Nærvær alarm er !{{tændt|slukket}}", + "ru": "Маленький сигнал Присутствие !{{вкл.|выкл.}}", + "pl": "Mały czujnik Obecność !{{włączony|wyłączony}}" + }, + "id": "the-small-presence-alarm-is-onoff" + }, + { + "id": "alarm_breathe_presence", + "title": { + "en": "Breath Presence alarm !{{is|is not}} on", + "nl": "Adem aanwezigheidsalarm !{{is|is niet}} aan" }, - "titleFormatted": { - "en": "Button had [[action]]" + "args": [ + { + "type": "device", + "name": "device", + "filter": "driver_id=radar_sensor_2" + } + ] + }, + { + "id": "alarm_small_presence", + "title": { + "en": "Small Presence alarm !{{is|is not}} on", + "nl": "Kleine aanwezigheidsalarm !{{is|is niet}} aan" }, "args": [ { "type": "device", "name": "device", - "filter": "driver_id=wall_remote_1_gang" + "filter": "driver_id=radar_sensor_2" + } + ] + }, + { + "id": "alarm_large_presence", + "title": { + "en": "Large Presence alarm !{{is|is not}} on", + "nl": "Groot aanwezigheidsalarm !{{is|is niet}} aan" + }, + "args": [ + { + "type": "device", + "name": "device", + "filter": "driver_id=radar_sensor_2" + } + ] + }, + { + "id": "window_open_status_get", + "title": { + "en": "Window !{{is|is not}} open" + }, + "args": [ + { + "type": "device", + "name": "device", + "filter": "driver_id=thermostatic_radiator_valve" + } + ] + } + ], + "actions": [ + { + "id": "resetEnergyMeter", + "title": { + "en": "Reset Energy Meter", + "sv": "Återställ energimätaren" + }, + "args": [], + "callback": "resetEnergyMeter" + }, + { + "title": { + "en": "Start effect" + }, + "titleFormatted": { + "en": "Effect is [[effect_name]] with speed [[effect_speed]] and color(s) [[effect_color_0]], [[effect_color_1]], [[effect_color_2]], [[effect_color_3]], [[effect_color_4]], [[effect_color_5]], [[effect_color_6]], [[effect_color_7]], [[effect_color_8]]" + }, + "hint": { + "en": "Choose a light pattern and a speed for it. You can also choose what colors the pattern should have, this is not mandatory." + }, + "args": [ + { + "name": "christmas_lights_device", + "type": "device", + "filter": "driver_id=christmas_lights" }, { - "name": "action", "type": "dropdown", + "name": "effect_name", "title": { - "en": "Button Action" + "en": "Effect" }, "values": [ { - "id": "oneClick", + "id": "steady", "label": { - "en": "1 Click" + "en": "Steady" } }, { - "id": "twoClicks", + "id": "snow", "label": { - "en": "2 Clicks" + "en": "Snow" + } + }, + { + "id": "rainbow", + "label": { + "en": "Rainbow" + } + }, + { + "id": "snake", + "label": { + "en": "Snake" + } + }, + { + "id": "twinkle", + "label": { + "en": "Twinkle" + } + }, + { + "id": "firework", + "label": { + "en": "Firework" + } + }, + { + "id": "horizontal_flag", + "label": { + "en": "Horizontal Flag" + } + }, + { + "id": "waves", + "label": { + "en": "Waves" + } + }, + { + "id": "updown", + "label": { + "en": "Up and Down" + } + }, + { + "id": "vintage", + "label": { + "en": "Vintage" + } + }, + { + "id": "fading", + "label": { + "en": "Fading" + } + }, + { + "id": "collide", + "label": { + "en": "Collide" + } + }, + { + "id": "strobe", + "label": { + "en": "Strobe" + } + }, + { + "id": "sparkles", + "label": { + "en": "Sparkles" + } + }, + { + "id": "carnaval", + "label": { + "en": "Carnaval" + } + }, + { + "id": "glow", + "label": { + "en": "Glow" } } ] + }, + { + "type": "range", + "name": "effect_speed", + "title": { + "en": "Speed" + }, + "label": "/64", + "min": 0, + "max": 64, + "step": 1 + }, + { + "type": "color", + "name": "effect_color_0", + "title": { + "en": "color 0" + } + }, + { + "type": "color", + "name": "effect_color_1", + "title": { + "en": "color 1" + } + }, + { + "type": "color", + "name": "effect_color_2", + "title": { + "en": "color 2" + } + }, + { + "type": "color", + "name": "effect_color_3", + "title": { + "en": "color 3" + } + }, + { + "type": "color", + "name": "effect_color_4", + "title": { + "en": "color 4" + } + }, + { + "type": "color", + "name": "effect_color_5", + "title": { + "en": "color 5" + } + }, + { + "type": "color", + "name": "effect_color_6", + "title": { + "en": "color 6" + } + }, + { + "type": "color", + "name": "effect_color_7", + "title": { + "en": "color 7" + } + }, + { + "type": "color", + "name": "effect_color_8", + "title": { + "en": "color 8" + } + } + ], + "id": "start_effect" + }, + { + "id": "move_open", + "title": { + "en": "Open", + "de": "Öffnen" + }, + "args": [ + { + "type": "device", + "name": "device", + "filter": "driver_id=curtain_module" } ] }, { - "id": "wall_remote_2_gang_buttons", + "id": "move_close", "title": { - "en": "Button Action" + "en": "Close", + "de": "Schließen" + }, + "args": [ + { + "type": "device", + "name": "device", + "filter": "driver_id=curtain_module" + } + ] + }, + { + "id": "alarm_state", + "title": { + "en": "Change the alarm state", + "nl": "Verander de alarm toestand", + "de": "Ändern des Alarmstatus" }, "titleFormatted": { - "en": "The [[action]]" + "en": "Change the alarm state to [[alarm_state]]", + "nl": "Verander de alarm toestand naar [[alarm_state]]", + "de": "Ändern des Alarmstatus zu [[alarm_state]]" + }, + "hint": { + "en": "Change the alarm state; sound or silence the alarm", + "nl": "Verander de alarm toestand; luiden of uitschakelen van het alarm", + "de": "Ändern des Alarmstatus; Ein- oder ausschalten des Alarmtons." }, "args": [ { "type": "device", "name": "device", - "filter": "driver_id=wall_remote_2_gang" + "filter": "driver_id=sirentemphumidsensor" }, { - "name": "action", + "name": "alarm_state", "type": "dropdown", - "title": { - "en": "Button Action" - }, "values": [ { - "id": "left-oneClick", - "label": { - "en": "Left Button: 1 Click" - } - }, - { - "id": "left-twoClicks", - "label": { - "en": "Left Button: 2 Clicks" - } - }, - { - "id": "right-oneClick", + "id": "off/disable", "label": { - "en": "Right Button: 1 Click" + "en": "Silence alarm", + "nl": "Alarm stil", + "de": "Stiller Alarm" } }, { - "id": "right-twoClicks", + "id": "on/enable", "label": { - "en": "Right Button: 2 Clicks" + "en": "Sound alarm", + "nl": "Alarm luiden", + "de": "Akustischer Alarm" } } ] @@ -997,60 +1327,94 @@ ] }, { - "id": "wall_remote_3_gang_buttons", + "id": "alarm_duration", + "title": { + "en": "Switch on siren for X Seconds", + "de": "Sirene für X Sekunden einschalten", + "nl": "Zet sirene aan voor X seconden" + }, + "titleFormatted": { + "en": "Switch on siren for [[duration]] Seconds", + "de": "Sirene für [[duration]] Sekunden einschalten", + "nl": "Zet sirene aan voor [[duration]] seconden" + }, + "args": [ + { + "type": "device", + "name": "device", + "filter": "driver_id=sirentemphumidsensor" + }, + { + "type": "number", + "name": "duration", + "min": 0, + "max": 65535, + "step": 1, + "label": { + "en": "Seconds", + "de": "Sekunden", + "nl": "Seconden" + }, + "placeholder": { + "en": "120" + }, + "title": { + "en": "Duration of alarm in seconds", + "de": "Dauer des Alarms in Sekunden", + "nl": "Duur van het alarm in seconden" + } + } + ] + }, + { + "id": "siren_volume", "title": { - "en": "Button Action" + "en": "Set volume of siren", + "nl": "Zet het volume van de sirene", + "de": "Einstellen der Lautstärke der Sirene" }, "titleFormatted": { - "en": "The [[action]]" + "en": "Set volume of siren to [[siren_volume]]", + "nl": "Zet het volume van de sirene naar [[siren_volume]]", + "de": "Einstellen der Lautstärke der Sirene auf [[siren_volume]]" + }, + "hint": { + "en": "Set volume of siren.", + "nl": "Zet het volume van de sirene.", + "de": "Einstellen der Lautstärke der Sirene" }, "args": [ { "type": "device", "name": "device", - "filter": "driver_id=wall_remote_3_gang" + "filter": "driver_id=sirentemphumidsensor" }, { - "name": "action", + "name": "siren_volume", "type": "dropdown", - "title": { - "en": "Button Action" - }, "values": [ { - "id": "left-oneClick", - "label": { - "en": "Left Button: 1 Click" - } - }, - { - "id": "left-twoClicks", - "label": { - "en": "Left Button: 2 Clicks" - } - }, - { - "id": "right-oneClick", - "label": { - "en": "Right Button: 1 Click" - } - }, - { - "id": "right-twoClicks", + "id": "2", "label": { - "en": "Right Button: 2 Clicks" + "en": "Low", + "nl": "Laag", + "de": "Niedrig" } }, { - "id": "center-oneClick", + "id": "1", "label": { - "en": "Center Button: 1 Click" + "en": "Midle", + "nl": "Middelmatig", + "de": "Mittel" } }, { - "id": "center-twoClicks", + "id": "0", "label": { - "en": "Center Button: 2 Clicks" + "en": "High (default)", + "nl": "Hoog (standaard)", + "de": "Hoch (Standard)" } } ] @@ -1058,212 +1422,259 @@ ] }, { - "id": "wall_remote_4_gang_buttons", + "id": "alarm_tune", "title": { - "en": "Button Action" + "en": "Set the alarm tune", + "nl": "Stel de alarm melodie in", + "de": "Einstellen des Alarmtons" }, "titleFormatted": { - "en": "The [[action]]" + "en": "Set the alarm tune to [[alarm_tune]]", + "nl": "Stel de alarm melodie in op [[alarm_tune]]", + "de": "Einstellen des Alarmtons zu [[alarm_tune]]" + }, + "hint": { + "en": "Choose the tune of the alarm sound", + "nl": "Kies de melodie die gebruikt wordt bij alarm", + "de": "Wähle die Melodie des Alarmtons aus." }, "args": [ { "type": "device", "name": "device", - "filter": "driver_id=wall_remote_4_gang" + "filter": "driver_id=sirentemphumidsensor" }, { - "name": "action", + "name": "alarm_tune", "type": "dropdown", - "title": { - "en": "Button Action" - }, "values": [ { - "id": "leftUp-oneClick", + "id": "0", "label": { - "en": "Upper Left Button: 1 Click" + "en": "Doorbell 1", + "nl": "Doorbell 1", + "de": "Doorbell 1" } }, { - "id": "leftUp-twoClicks", + "id": "1", "label": { - "en": "Upper Left Button: 2 Clicks" + "en": "For Elise (default)", + "nl": "Fur Elise (standaard)", + "de": "Fur Elise (Standard)" } }, { - "id": "rightUp-oneClick", + "id": "2", "label": { - "en": "Upper Right Button: 1 Click" + "en": "Westminster", + "nl": "Westminster", + "de": "Westminster" } }, { - "id": "rightUp-twoClicks", + "id": "3", "label": { - "en": "Upper Right Button: 2 Clicks" + "en": "4 Key Chime", + "nl": "4 Key Chime", + "de": "4 Key Chime" } }, { - "id": "leftDown-oneClick", + "id": "4", "label": { - "en": "Lower Left Button: 1 Click" + "en": "William Tell", + "nl": "William Tell", + "de": "William Tell" } }, { - "id": "leftDown-twoClicks", + "id": "5", "label": { - "en": "Lower Left Button: 2 Clicks" + "en": "Mozart Piano", + "nl": "Mozart Piano", + "de": "Mozart Piano" } }, { - "id": "rightDown-oneClick", + "id": "6", "label": { - "en": "Lower Right Button: 1 Click" + "en": "Space Alarm", + "nl": "Space Alarm", + "de": "Space Alarm" } }, { - "id": "rightDown-twoClicks", - "label": { - "en": "Lower Right Button: 2 Clicks" - } - } - ] - } - ] - }, - { - "id": "wall_remote_4_gang_buttons_2", - "title": { - "en": "Button" - }, - "titleFormatted": { - "en": "The [[button]]" - }, - "args": [ - { - "type": "device", - "name": "device", - "filter": "driver_id=wall_remote_4_gang_2" - }, - { - "name": "button", - "type": "dropdown", - "title": { - "en": "Button Pressed" - }, - "values": [ - { - "id": "leftUp", + "id": "7", "label": { - "en": "Upper Left Button Pressed" + "en": "Klaxon", + "nl": "Klaxon", + "de": "Klaxon" } }, { - "id": "rightUp", + "id": "8", "label": { - "en": "Upper Right Button Pressed" + "en": "Meep meep", + "nl": "Meep meep", + "de": "Meep meep" } }, { - "id": "leftDown", + "id": "9", "label": { - "en": "Lower Left Button Pressed" + "en": "Wheep", + "nl": "Wheep", + "de": "Wheep" } }, { - "id": "rightDown", - "label": { - "en": "Lower Right Button Pressed" - } - } - ] - } - ] - }, - { - "id": "wall_remote_4_gang_buttons_3", - "title": { - "en": "Button Action" - }, - "titleFormatted": { - "en": "The [[action]]" - }, - "args": [ - { - "type": "device", - "name": "device", - "filter": "driver_id=wall_remote_4_gang_3" - }, - { - "name": "action", - "type": "dropdown", - "title": { - "en": "Button Action" - }, - "values": [ - { - "id": "leftUp-oneClick", + "id": "10", "label": { - "en": "Upper Left Button: 1 Click" + "en": "Barking dog", + "nl": "Barking dog", + "de": "Barking dog" } }, { - "id": "leftUp-twoClicks", + "id": "11", "label": { - "en": "Upper Left Button: 2 Clicks" + "en": "Alarm Siren", + "nl": "Alarm Siren", + "de": "Alarm Siren" } }, { - "id": "rightUp-oneClick", + "id": "12", "label": { - "en": "Upper Right Button: 1 Click" + "en": "Doorbell 2", + "nl": "Doorbell 2", + "de": "Doorbell 2" } }, { - "id": "rightUp-twoClicks", + "id": "13", "label": { - "en": "Upper Right Button: 2 Clicks" + "en": "Old Phone", + "nl": "Old Phone", + "de": "Old Phone" } }, { - "id": "leftDown-oneClick", + "id": "14", "label": { - "en": "Lower Left Button: 1 Click" + "en": "Police Siren", + "nl": "Police Siren", + "de": "Police Siren" } }, { - "id": "leftDown-twoClicks", + "id": "15", "label": { - "en": "Lower Left Button: 2 Clicks" + "en": "Evacuation bell", + "nl": "Evacuation bell", + "de": "Evacuation bell" } }, { - "id": "rightDown-oneClick", + "id": "16", "label": { - "en": "Lower Right Button: 1 Click" + "en": "Clock alarm", + "nl": "Clock alarm", + "de": "Clock alarm" } }, { - "id": "rightDown-twoClicks", + "id": "17", "label": { - "en": "Lower Right Button: 2 Clicks" + "en": "Fire alarm", + "nl": "Fire alarm", + "de": "Fire alarm" } } ] } ] - } - ], - "conditions": [ + }, { - "id": "window_open_status_get", + "id": "water_flow", + "highlight": true, "title": { - "en": "Window !{{is|is not}} open" + "en": "waterflow to", + "nl": "waterflow naar", + "de": "waterflow auf" + }, + "args": [ + { + "type": "device", + "name": "device", + "filter": "driver_id=smart_water_timer" + }, + { + "name": "water_flow", + "type": "range", + "min": 0, + "max": 1, + "step": 0.01, + "value": 0.5, + "label": "%", + "labelMultiplier": 100, + "labelDecimals": 0 + } + ] + }, + { + "id": "water_flow_relative", + "title": { + "en": "Set relative water flow-level", + "nl": "Zet relatief water flow-niveau", + "de": "Relatives waterflow Niveau setzen" + }, + "hint": { + "en": "decrease or increase with respect to the device's current waterflow level.", + "nl": "Verhoog of verlaag de waterflow ten opzichte van het huidige waterflow niveau van het apparaat.", + "ru": "Уменьшите или увеличьте яркость относительно текущего уровня яркости устройства.", + "pl": "Przygaś lub rozjaśnij względem obecnego poziomu przygaszenia urządzenia." + }, + "args": [ + { + "type": "device", + "name": "device", + "filter": "driver_id=smart_water_timer" + }, + { + "name": "water_flow", + "type": "range", + "min": 0, + "max": 1, + "step": 0.01, + "value": 0.5, + "label": "%", + "labelMultiplier": 100, + "labelDecimals": 0 + } + ] + }, + { + "id": "window_open_status_set", + "title": { + "en": "Set window open status" + }, + "titleFormatted": { + "en": "Set window open status to [[window_open_status]]" }, "args": [ { "type": "device", "name": "device", "filter": "driver_id=thermostatic_radiator_valve" + }, + { + "type": "checkbox", + "name": "window_open_status", + "title": { + "en": "Open" + } } ] } @@ -3536,6 +3947,7 @@ "_TZE202_ztc6ggyl", "_TZE203_ztc6ggyl", "_TZE204_ztc6ggyl", + "_TZE204_7gclukjs", "_TZE204_qasjif9e", "_TZE204_ijxvkhd0", "_TZE204_sxm7l9xa" @@ -3655,6 +4067,306 @@ } ] }, + { + "id": "radar_sensor_2", + "name": { + "en": "Radar Sensor ZG-205Z/W", + "nl": "Radar Sensor ZG-205Z/W" + }, + "class": "sensor", + "platforms": [ + "local" + ], + "connectivity": [ + "zigbee" + ], + "capabilities": [ + "measure_luminance", + "alarm_motion", + "alarm_small_presence", + "alarm_large_presence", + "alarm_breathe_presence" + ], + "images": { + "large": "/drivers/radar_sensor_2/assets/images/large.png", + "small": "/drivers/radar_sensor_2/assets/images/small.png" + }, + "energy": { + "approximation": { + "usageConstant": 2.5 + } + }, + "zigbee": { + "manufacturerName": [ + "_TZE200_2aaelwxk" + ], + "productId": [ + "TS0225" + ], + "endpoints": { + "1": { + "clusters": [ + 0, + 3, + 1280, + 57346, + 61184, + 60928, + 57344, + 1024 + ], + "bindings": [ + 258, + 61148 + ] + } + }, + "learnmode": { + "image": "/drivers/radar_sensor_2/assets/icon.svg", + "instruction": { + "en": "Press and hold the reset button for 6 seconds. When the indicator light flashes it is in pairing mode.", + "nl": "Druk 6 seconden op de reset knop. Wacht tot de led gaat knipperen." + } + } + }, + "settings": [ + { + "id": "motion_detection_sensitivity", + "type": "number", + "label": { + "en": "Radar sensitivity", + "nl": "Radar sensitiviteit" + }, + "value": 6, + "min": 0, + "max": 10, + "units": { + "en": "x", + "nl": "x" + } + }, + { + "id": "mov_minimum_distance", + "type": "number", + "label": { + "en": "Minimum range", + "nl": "Minimale bereik" + }, + "value": 0, + "min": 0, + "max": 10, + "step": 1, + "units": { + "en": "meters", + "nl": "meters" + } + }, + { + "id": "motion_detection_distance", + "type": "number", + "label": { + "en": "Motion detection distance", + "nl": "Bewegingsdetectie afstand" + }, + "value": 600, + "min": 0, + "max": 1000, + "step": 1, + "units": { + "en": "centimeter", + "nl": "centimeter" + } + }, + { + "id": "fading_time", + "type": "number", + "label": { + "en": "Fading time", + "nl": "Reset tijd" + }, + "value": 0, + "min": 0, + "max": 28800, + "units": { + "en": "seconds", + "nl": "seconden" + } + }, + { + "id": "motion_false_detection", + "type": "number", + "value": 1, + "min": 0, + "max": 10, + "units": { + "en": "x", + "nl": "x" + }, + "label": { + "en": "Breathe False detection", + "nl": "Onjuiste Adem detectie" + } + }, + { + "id": "small_motion_detection_distance", + "type": "number", + "label": { + "en": "Small Motion detection distance", + "nl": "Kleine bewegingsdetectie afstand" + }, + "value": 600, + "min": 0, + "max": 600, + "step": 1, + "units": { + "en": "centimeter", + "nl": "centimeter" + } + }, + { + "id": "small_motion_detection_sensitivity", + "type": "number", + "label": { + "en": "Small Movement sensitivity", + "nl": "Kleine Beweging sensitiviteit" + }, + "value": 8, + "min": 0, + "max": 10, + "units": { + "en": "x", + "nl": "x" + } + }, + { + "id": "indicator", + "type": "checkbox", + "value": true, + "label": { + "en": "LED indicator", + "nl": "LED indicatie" + } + }, + { + "id": "static_detection_distance", + "type": "number", + "label": { + "en": "Static detection distance", + "nl": "Statische detectie afstand" + }, + "value": 600, + "min": 0, + "max": 600, + "step": 1, + "units": { + "en": "centimeter", + "nl": "centimeter" + } + }, + { + "id": "static_detection_sensitivity", + "type": "number", + "label": { + "en": "Static detection sensitivity", + "nl": "Statische detectie sensitiviteit" + }, + "value": 8, + "min": 0, + "max": 10, + "units": { + "en": "x", + "nl": "x" + } + }, + { + "id": "breathe_false_detection", + "type": "checkbox", + "value": false, + "label": { + "en": "Breathe False detection", + "nl": "Onjuiste Adem detectie" + } + }, + { + "id": "alarm_volume", + "type": "dropdown", + "value": "high", + "label": { + "en": "Alarm volume", + "nl": "Alarm volume" + }, + "values": [ + { + "id": "mute", + "label": { + "en": "Mute", + "nl": "Gedempt" + } + }, + { + "id": "low", + "label": { + "en": "Low", + "nl": "Laag" + } + }, + { + "id": "medium", + "label": { + "en": "Medium", + "nl": "Middel" + } + }, + { + "id": "high", + "label": { + "en": "High", + "nl": "Hoog" + } + } + ] + }, + { + "id": "working_mode", + "type": "dropdown", + "value": "off", + "label": { + "en": "Working mode", + "nl": "Werk modus" + }, + "values": [ + { + "id": "off", + "label": { + "en": "Off", + "nl": "Uit" + } + }, + { + "id": "arm", + "label": { + "en": "Arm", + "nl": "Arm" + } + }, + { + "id": "alarm", + "label": { + "en": "Alarm", + "nl": "Alarm" + } + }, + { + "id": "doorbell", + "label": { + "en": "Doorbell", + "nl": "Deurbel" + } + } + ] + } + ] + }, { "id": "relay_board_4_channel", "name": { @@ -5196,6 +5908,142 @@ }, "settings": [] }, + { + "id": "smart_water_timer", + "name": { + "en": "QT-05M - Smart Water Timer" + }, + "class": "other", + "platforms": [ + "local" + ], + "connectivity": [ + "zigbee" + ], + "capabilities": [ + "onoff", + "alarm_battery", + "measure_battery", + "measure_water_flow", + "meter_valve_state", + "last_watering_time", + "remaining_watering_time", + "shutdown_timer", + "valve_state_auto_shutdown" + ], + "capabilitiesOptions": { + "onoff": { + "opts": { + "duration": true + } + }, + "measure_water_flow": { + "opts": { + "duration": true + }, + "preventInsights": true + } + }, + "energy": { + "batteries": [ + "AA", + "AA", + "AA", + "AA" + ] + }, + "images": { + "small": "/drivers/smart_water_timer/assets/images/small.jpg", + "large": "/drivers/smart_water_timer/assets/images/large.jpg" + }, + "zigbee": { + "manufacturerName": [ + "_TZE200_arge1ptm", + "_TZE200_xlppj4f5" + ], + "productId": [ + "TS0601" + ], + "endpoints": { + "1": { + "clusters": [ + 0, + 1, + 4, + 5, + 6, + 10, + 25, + 61184 + ], + "bindings": [ + 1, + 6, + 10, + 25 + ] + } + }, + "learnmode": { + "image": "/drivers/smart_water_timer/assets/icon.svg", + "instruction": { + "en": "Ensure the indicator light is flashing. If the indicatore light isn't flashing: press and hold the reset button for 5 seconds until the indicator light starts to flashing.", + "it": "Assicurarsi che l'indicatore lampeggi. Se l'indicatore non lampegga: tenere premuto il pulsante di reset per 5 secondi finchè l'indicatore non inizia a lampeggiare." + } + } + }, + "settings": [ + { + "id": "batteryThreshold", + "type": "number", + "label": { + "en": "Battery Low Alarm Voltage Threshold (%)", + "it": "Soglia dell'allarme di batteria scarica " + }, + "hint": { + "en": "This setting determines the threshold before a battery alarm is given.", + "it": "Quest'impostazione determina la soglia alla quale l'allarme di batteria scarica viene dato" + }, + "value": 20, + "attr": { + "step": 1, + "min": 1, + "max": 99 + } + }, + { + "id": "shutdown_timer", + "type": "number", + "label": { + "en": "Maximum open percentage", + "nl": "Maximale open percentage" + }, + "hint": { + "en": "Auto shutdown in seconds.", + "nl": "Automatische stop in seconden" + }, + "value": 120, + "min": 0, + "max": 14400 + }, + { + "id": "valve_state_auto_shutdown", + "type": "number", + "label": { + "en": "Valve open in % after auto shutdown.", + "nl": "Kraan open in % na automatische stop." + }, + "hint": { + "en": "Set valve to % with auto shutdown.", + "nl": "Zet kraan op % met automatische stop." + }, + "value": 100, + "min": 0, + "step": 5, + "max": 100 + } + ] + }, { "id": "smartplug", "name": { @@ -7807,12 +8655,14 @@ "_TYZB01_4tlksk8a", "_TZ3000_tvuarksa", "_TZ3000_j9568h44", - "_TZ3000_iedbgyxt" + "_TZ3000_iedbgyxt", + "_TZ3000_w0ypwa1f" ], "productId": [ "TS0111", "TS0001", - "TS011F" + "TS011F", + "TS0001" ], "endpoints": { "1": { @@ -8420,6 +9270,7 @@ "_TZ3000_oex7egmt", "_TZ3000_hafsqare", "_TZ3000_oaq83gqc", + "_TZ3000_hhiodade", "_TZ3000_6eyydfyg" ], "productId": [ @@ -8430,6 +9281,9 @@ "1": { "clusters": [ 0, + 3, + 4, + 5, 6 ], "bindings": [ @@ -8440,11 +9294,40 @@ "learnmode": { "image": "/drivers/wall_switch_1_gang/assets/icon.svg", "instruction": { - "en": "Press the button for 10 seconds (the LED should start blinking)." + "en": "Press the button for 7 seconds (until LED starts blinking)." } } }, - "settings": [] + "settings": [ + { + "id": "indicator_mode", + "type": "radio", + "label": { + "en": "Indicator mode" + }, + "value": "1", + "values": [ + { + "id": "0", + "label": { + "en": "Light Off" + } + }, + { + "id": "1", + "label": { + "en": "Light on when switch turned on." + } + }, + { + "id": "2", + "label": { + "en": "Light on when the switch is turned off." + } + } + ] + } + ] }, { "id": "wall_switch_1_gang_tuya", @@ -9051,6 +9934,106 @@ } ], "capabilities": { + "alarm_breathe_presence": { + "title": { + "en": "Breath presence", + "nl": "Adem aanwezigheid", + "de": "Atempräsenz", + "fr": "Présence respiratoire", + "it": "Presenza del respiro", + "sv": "Andningsnärvaro", + "no": "Åndedrettsnærvær", + "es": "Presencia de la respiración", + "da": "Åndedræt nærvær", + "ru": "Присутствие дыхания", + "pl": "Obecność oddechu" + }, + "type": "boolean", + "getable": true, + "setable": false, + "uiComponent": "sensor", + "icon": "/drivers/radar_sensor_2/assets/images/breathe_motion.svg", + "insights": true, + "options": { + "zoneActivity": true + }, + "insightsTitleTrue": { + "en": "Breath alarm turned on", + "nl": "Ademalarm ging af", + "de": "Atem-Alarm ist angegangen", + "fr": "Alarme respiratoire s'est déclenchée", + "it": "Allarme di respiro attivato", + "sv": "Andningslarm aktiverat", + "no": "Åndedrettsalarm aktivert", + "es": "Alarma de respiración activada", + "da": "Åndedrætsalarm blev aktiveret", + "ru": "Сигнал дыхания включен", + "pl": "Czujnik oddechu włączony" + }, + "insightsTitleFalse": { + "en": "Breath alarm turned off", + "nl": "Ademalarm ging uit", + "de": "Atem-Alarm ist ausgegangen", + "fr": "Alarme respiratoire s'est désactivée", + "it": "Allarme di respiro disattivato", + "sv": "Andningslarm inaktiverat", + "no": "Åndedrettsalarm deaktivert", + "es": "Alarma de respiración desactivada", + "da": "Åndedrætsalarm blev deaktiveret", + "ru": "Сигнал дыхания выключен", + "pl": "Czujnik oddechu wyłączony" + } + }, + "alarm_large_presence": { + "title": { + "en": "Large Presence", + "nl": "Grote Aanwezigheid", + "de": "Große Präsenz", + "fr": "Grande Présence", + "it": "Presenza Ampia", + "sv": "Stor Närvaro", + "no": "Stor Nærvær", + "es": "Presencia Grande", + "da": "Stor Nærvær", + "ru": "Большое Присутствие", + "pl": "Duża Obecność" + }, + "type": "boolean", + "getable": true, + "setable": false, + "uiComponent": "sensor", + "icon": "/drivers/radar_sensor_2/assets/images/large_motion.svg", + "insights": true, + "options": { + "zoneActivity": true + }, + "insightsTitleTrue": { + "en": "Large Presence alarm turned on", + "nl": "Grote Aanwezigheid alarm ging af", + "de": "Große Präsenz Alarm ist angegangen", + "fr": "Alarme Grande Présence s'est déclenchée", + "it": "Allarme Presenza Ampia attivato", + "sv": "Stor Närvaro larm aktiverat", + "no": "Stor Nærvær alarm aktivert", + "es": "Alarma de Presencia Grande activada", + "da": "Stor Nærvær alarm blev aktiveret", + "ru": "Большой сигнал Присутствие включен", + "pl": "Duży czujnik Obecność włączony" + }, + "insightsTitleFalse": { + "en": "Large Presence alarm turned off", + "nl": "Grote Aanwezigheid alarm ging uit", + "de": "Große Präsenz Alarm ist ausgegangen", + "fr": "Alarme Grande Présence s'est désactivée", + "it": "Allarme Presenza Ampia disattivato", + "sv": "Stor Närvaro larm inaktiverat", + "no": "Stor Nærvær alarm deaktivert", + "es": "Alarma de Presencia Grande desactivada", + "da": "Stor Nærvær alarm blev deaktiveret", + "ru": "Большой сигнал Присутствие выключен", + "pl": "Duży czujnik Obecność wyłączony" + } + }, "alarm_siren": { "type": "boolean", "title": { @@ -9067,6 +10050,56 @@ "getable": true, "setable": false }, + "alarm_small_presence": { + "title": { + "en": "Small Presence", + "nl": "Kleine Aanwezigheid", + "de": "Kleine Präsenz", + "fr": "Petite Présence", + "it": "Presenza Piccola", + "sv": "Liten Närvaro", + "no": "Liten Nærvær", + "es": "Pequeña Presencia", + "da": "Lille Nærvær", + "ru": "Маленькое Присутствие", + "pl": "Mała Obecność" + }, + "type": "boolean", + "getable": true, + "setable": false, + "uiComponent": "sensor", + "icon": "/drivers/radar_sensor_2/assets/images/small_motion.svg", + "insights": true, + "options": { + "zoneActivity": true + }, + "insightsTitleTrue": { + "en": "Small Presence alarm turned on", + "nl": "Kleine Aanwezigheid alarm ging af", + "de": "Kleine Präsenz Alarm ist angegangen", + "fr": "Alarme Petite Présence s'est déclenchée", + "it": "Allarme Presenza Piccola attivato", + "sv": "Liten Närvaro larm aktiverat", + "no": "Liten Nærvær alarm aktivert", + "es": "La alarma de Pequeña Presencia activada", + "da": "Lille Nærvær alarm blev aktiveret", + "ru": "Маленький сигнал Присутствие включен", + "pl": "Mały czujnik Obecność włączony" + }, + "insightsTitleFalse": { + "en": "Small Presence alarm turned off", + "nl": "Kleine Aanwezigheid alarm ging uit", + "de": "Kleine Präsenz Alarm ist ausgegangen", + "fr": "Alarme Petite Présence s'est désactivée", + "it": "Allarme Presenza Piccola disattivato", + "sv": "Liten Närvaro larm inaktiverat", + "no": "Liten Nærvær alarm deaktivert", + "es": "La alarma de Pequeña Presencia se ha desactivado", + "da": "Lille Nærvær alarm blev deaktiveret", + "ru": "Маленький сигнал Присутствие выключен", + "pl": "Mały czujnik Obecność wyłączony" + } + }, "away_mode": { "type": "boolean", "title": { @@ -9085,6 +10118,26 @@ "getable": true, "setable": true }, + "last_watering_time": { + "type": "number", + "title": { + "en": "Last Watering Time", + "nl": "Laatste tijd bewatering" + }, + "uiComponent": "sensor", + "getable": true, + "setable": false, + "insights": true, + "options": { + "zoneActivity": true + }, + "min": 0, + "icon": "/drivers/smart_water_timer/assets/images/pressure-gauge.svg", + "units": { + "en": "sec", + "nl": "sec" + } + }, "lidl_xmas_mode": { "title": { "en": "Mode" @@ -9117,6 +10170,100 @@ } ] }, + "measure_water_flow": { + "type": "number", + "title": { + "en": "Valve Water Flow", + "nl": "Kraan Water Flow" + }, + "desc": { + "en": "Set the position of Water Valve. 0% is closed, 100% is open" + }, + "icon": "/drivers/smart_water_timer/assets/images/sprinklers.svg", + "units": "%", + "getable": true, + "setable": true, + "chartType": "stepLine", + "uiComponent": "slider", + "min": 0, + "max": 1, + "step": 0.05, + "value": 0.5, + "decimals": 2 + }, + "meter_valve_state": { + "type": "number", + "title": { + "en": "Valve State", + "nl": "Kraanstatus" + }, + "units": { + "en": "%", + "nl": "%" + }, + "icon": "/drivers/smart_water_timer/assets/images/sprinklers.svg", + "getable": true, + "setable": false, + "chartType": "area", + "uiComponent": "sensor", + "min": 0, + "max": 100, + "steps": 5, + "decimals": 0, + "capabilitiesOptions": { + "titleTrue": { + "en": "Open", + "nl": "Open" + }, + "titleFalse": { + "en": "Closed", + "nl": "Gesloten" + } + } + }, + "remaining_watering_time": { + "type": "number", + "title": { + "en": "Remaining Watering Time", + "nl": "Resterende tijd bewatering" + }, + "uiComponent": "sensor", + "getable": true, + "setable": false, + "insights": true, + "options": { + "zoneActivity": true + }, + "icon": "/drivers/smart_water_timer/assets/images/pressure-gauge.svg", + "units": { + "en": "sec", + "nl": "sec" + }, + "min": 0, + "decimals": 0 + }, + "shutdown_timer": { + "type": "number", + "title": { + "en": "Auto Shutdown % Valve", + "nl": "Auto Stop % Waarde" + }, + "uiComponent": "sensor", + "getable": true, + "setable": false, + "insights": true, + "options": { + "zoneActivity": true + }, + "icon": "/drivers/smart_water_timer/assets/images/nighttime.svg", + "units": { + "en": "sec", + "nl": "sec" + }, + "min": 0, + "max": 1440, + "decimals": 0 + }, "soil_moisture": { "type": "number", "title": { @@ -9147,15 +10294,21 @@ "target_distance": { "type": "number", "title": { - "en": "Target distance" + "en": "Target distance", + "nl": "Afstand doel" + }, + "icon": "/drivers/radar_sensor/assets/images/measure.svg", + "units": { + "en": "m", + "nl": "m" }, "uiComponent": "sensor", "getable": true, "setable": false, - "units": { - "en": "m" - }, - "icon": "/drivers/radar_sensor/assets/distance.svg" + "insights": true, + "options": { + "zoneActivity": true + } }, "temp_calibration": { "type": "number", @@ -9230,6 +10383,26 @@ "setable": true, "uiComponent": "picker" }, + "valve_state_auto_shutdown": { + "type": "number", + "title": { + "en": "Valve State @ autoshutdown", + "nl": "Kraanstatus @ auto stop" + }, + "units": { + "en": "%", + "nl": "%" + }, + "icon": "/drivers/smart_water_timer/assets/images/nighttime.svg", + "getable": true, + "setable": false, + "chartType": "area", + "uiComponent": "sensor", + "min": 0, + "max": 100, + "steps": 5, + "decimals": 0 + }, "window_open": { "type": "boolean", "title": { diff --git a/drivers/radar_sensor/assets/images/measure.svg b/drivers/radar_sensor/assets/images/measure.svg new file mode 100644 index 00000000..fdb55e54 --- /dev/null +++ b/drivers/radar_sensor/assets/images/measure.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + diff --git a/drivers/radar_sensor/device.js b/drivers/radar_sensor/device.js index 300cd709..a8402600 100644 --- a/drivers/radar_sensor/device.js +++ b/drivers/radar_sensor/device.js @@ -1,21 +1,56 @@ -'use strict'; +"use strict"; -const {Cluster} = require('zigbee-clusters'); -const TuyaSpecificCluster = require('../../lib/TuyaSpecificCluster'); -const TuyaSpecificClusterDevice = require('../../lib/TuyaSpecificClusterDevice'); +const { Cluster } = require("zigbee-clusters"); +const TuyaSpecificCluster = require("../../lib/TuyaSpecificCluster"); +const TuyaSpecificClusterDevice = require("../../lib/TuyaSpecificClusterDevice"); Cluster.addCluster(TuyaSpecificCluster); -const dataPoints = { - tshpsPresenceState: 1, - tshpscSensitivity: 2, - tshpsMinimumRange: 3, - tshpsMaximumRange: 4, - tshpsTargetDistance: 9, - tshpsDetectionDelay: 101, - tshpsFadingTime: 102, - tshpsIlluminanceLux: 104, -} +const setDeviceDatapoints = (manufacturerName) => { + switch (manufacturerName) { + case "_TZE200_ztc6ggyl": + case "_TZE201_ztc6ggyl": + case "_TZE202_ztc6ggyl": + case "_TZE203_ztc6ggyl": + case "_TZE204_ztc6ggyl": + return { + tshpsPresenceState: 1, + tshpscSensitivity: 2, + tshpsMinimumRange: 3, + tshpsMaximumRange: 4, + tshpsTargetDistance: 9, + tshpsDetectionDelay: 101, + tshpsFadingTime: 102, + tshpsIlluminanceLux: 104, + }; + break; + + case "_TZE204_7gclukjs": + return { + tshpsPresenceState: 1, // {'none': 0, 'Presence': 1, 'Move and presence': 2} + tshpscSensitivity: 2, + tshpsMinimumRange: 3, + tshpsMaximumRange: 4, + tshpsTargetDistance: 9, + tshpsIlluminanceLux: 103, + tshpsPresence: 104, // true/false + tshpsDetectionDelay: 105, + }; + break; + + default: + return { + shpsPresenceState: 1, + tshpscSensitivity: 2, + tshpsMinimumRange: 3, + tshpsMaximumRange: 4, + tshpsTargetDistance: 9, + tshpsDetectionDelay: 101, + tshpsFadingTime: 102, + tshpsIlluminanceLux: 104, + }; + } +}; const dataTypes = { raw: 0, // [ bytes ] @@ -46,7 +81,7 @@ const getDataValue = (dpValue) => { case dataTypes.value: return convertMultiByteNumberPayloadToSingleDecimalNumber(dpValue.data); case dataTypes.string: - let dataString = ''; + let dataString = ""; for (let i = 0; i < dpValue.data.length; ++i) { dataString += String.fromCharCode(dpValue.data[i]); } @@ -56,83 +91,124 @@ const getDataValue = (dpValue) => { case dataTypes.bitmap: return convertMultiByteNumberPayloadToSingleDecimalNumber(dpValue.data); } -} +}; class radarSensor extends TuyaSpecificClusterDevice { - async onNodeInit({zclNode}) { - zclNode.endpoints[1].clusters.tuya.on("response", value => this.updatePosition(value)); + async onNodeInit({ zclNode }) { + this.manufacturerName = this.getSetting("zb_manufacturer_name"); + + this.dataPoints = setDeviceDatapoints(this.manufacturerName); + + zclNode.endpoints[1].clusters.tuya.on("response", (value) => + this.updatePosition(value) + ); } async updatePosition(data) { const dp = data.dp; const value = getDataValue(data); - const distanceUpdateInterval = this.getSetting('distance_update_interval') ?? 10; + + this.log("dp value", dp, value); switch (dp) { - case dataPoints.tshpsPresenceState: - this.log("presence state: "+ value) - this.setCapabilityValue('alarm_motion', Boolean(value)) + case this.dataPoints.tshpsPresenceState: + this.log("presence state: " + value); + this.setCapabilityValue("alarm_motion", Boolean(value)); break; - case dataPoints.tshpscSensitivity: - this.log("sensitivity state: "+ value) + case this.dataPoints.tshpscSensitivity: + this.log("sensitivity state: " + value); break; - case dataPoints.tshpsIlluminanceLux: - this.log("lux value: "+ value) - this.onIlluminanceMeasuredAttributeReport(value) + case this.dataPoints.tshpsIlluminanceLux: + this.log("lux value: " + value); + this.onIlluminanceMeasuredAttributeReport(value); break; - case dataPoints.tshpsTargetDistance: - if (new Date().getSeconds() % distanceUpdateInterval === 0) { - this.setCapabilityValue('target_distance', value/100); + case this.dataPoints.tshpsTargetDistance: + this.log("target distance: " + value) + switch (this.manufacturerName) { + case "_TZE204_7gclukjs": + this.setCapabilityValue("target_distance", value / 10); + break; + default: + if (new Date().getSeconds() % 10 === 0) { + this.setCapabilityValue("target_distance", value / 100); + } } break; default: - this.log('dp value', dp, value) + // this.log("dp value", dp, value); } } onDeleted() { - this.log("Radar sensor removed") + this.log("Radar sensor removed"); } - async onSettings({newSettings, changedKeys}) { - if (changedKeys.includes('radar_sensitivity')) { - this.writeData32(dataPoints.tshpscSensitivity, newSettings['radar_sensitivity']) + async onSettings({ newSettings, changedKeys }) { + if (changedKeys.includes("radar_sensitivity")) { + this.writeData32( + this.dataPoints.tshpscSensitivity, + newSettings["radar_sensitivity"] + ); } - if (changedKeys.includes('minimum_range')) { - this.writeData32(dataPoints.tshpsMinimumRange, newSettings['minimum_range']*100) + if (changedKeys.includes("minimum_range")) { + this.writeData32( + this.dataPoints.tshpsMinimumRange, + newSettings["minimum_range"] * 100 + ); } - if (changedKeys.includes('maximum_range')) { - this.writeData32(dataPoints.tshpsMaximumRange, newSettings['maximum_range']*100) + if (changedKeys.includes("maximum_range")) { + this.writeData32( + this.dataPoints.tshpsMaximumRange, + newSettings["maximum_range"] * 100 + ); } - if (changedKeys.includes('detection_delay')) { - this.writeData32(dataPoints.tshpsDetectionDelay, newSettings['detection_delay']) + if (changedKeys.includes("detection_delay")) { + this.writeData32( + this.dataPoints.tshpsDetectionDelay, + newSettings["detection_delay"] + ); } - if (changedKeys.includes('fading_time')) { - this.writeData32(dataPoints.tshpsFadingTime, newSettings['fading_time']) + if (changedKeys.includes("fading_time")) { + this.writeData32( + this.dataPoints.tshpsFadingTime, + newSettings["fading_time"] + ); } } onIlluminanceMeasuredAttributeReport(measuredValue) { - this.log('measure_luminance | Luminance - measuredValue (lux):', measuredValue); - this.setCapabilityValue('measure_luminance', measuredValue); + this.log( + "measure_luminance | Luminance - measuredValue (lux):", + measuredValue + ); + this.setCapabilityValue("measure_luminance", measuredValue); } - onIASZoneStatusChangeNotification({zoneStatus, extendedStatus, zoneId, delay,}) { - this.log('IASZoneStatusChangeNotification received:', zoneStatus, extendedStatus, zoneId, delay); - this.setCapabilityValue('alarm_motion', zoneStatus.alarm1); + onIASZoneStatusChangeNotification({ + zoneStatus, + extendedStatus, + zoneId, + delay, + }) { + this.log( + "IASZoneStatusChangeNotification received:", + zoneStatus, + extendedStatus, + zoneId, + delay + ); + this.setCapabilityValue("alarm_motion", zoneStatus.alarm1); } - } module.exports = radarSensor; - // "ids": { // "modelId": "TS0601", // "manufacturerName": "_TZE200_ztc6ggyl" diff --git a/drivers/radar_sensor/driver.compose.json b/drivers/radar_sensor/driver.compose.json index ff2d7e87..8207f25e 100644 --- a/drivers/radar_sensor/driver.compose.json +++ b/drivers/radar_sensor/driver.compose.json @@ -29,6 +29,7 @@ "_TZE202_ztc6ggyl", "_TZE203_ztc6ggyl", "_TZE204_ztc6ggyl", + "_TZE204_7gclukjs", "_TZE204_qasjif9e", "_TZE204_ijxvkhd0", "_TZE204_sxm7l9xa" diff --git a/drivers/radar_sensor_2/assets/icon.svg b/drivers/radar_sensor_2/assets/icon.svg new file mode 100644 index 00000000..6b782cde --- /dev/null +++ b/drivers/radar_sensor_2/assets/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/drivers/radar_sensor_2/assets/images/breathe_motion.svg b/drivers/radar_sensor_2/assets/images/breathe_motion.svg new file mode 100644 index 00000000..83c09ada --- /dev/null +++ b/drivers/radar_sensor_2/assets/images/breathe_motion.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + diff --git a/drivers/radar_sensor_2/assets/images/large.png b/drivers/radar_sensor_2/assets/images/large.png new file mode 100644 index 00000000..005c0fbf Binary files /dev/null and b/drivers/radar_sensor_2/assets/images/large.png differ diff --git a/drivers/radar_sensor_2/assets/images/large_motion.svg b/drivers/radar_sensor_2/assets/images/large_motion.svg new file mode 100644 index 00000000..2fe42893 --- /dev/null +++ b/drivers/radar_sensor_2/assets/images/large_motion.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + diff --git a/drivers/radar_sensor_2/assets/images/small.png b/drivers/radar_sensor_2/assets/images/small.png new file mode 100644 index 00000000..0cd1dea5 Binary files /dev/null and b/drivers/radar_sensor_2/assets/images/small.png differ diff --git a/drivers/radar_sensor_2/assets/images/small_motion.svg b/drivers/radar_sensor_2/assets/images/small_motion.svg new file mode 100644 index 00000000..e9d18da8 --- /dev/null +++ b/drivers/radar_sensor_2/assets/images/small_motion.svg @@ -0,0 +1,33 @@ + + + + + + + + + + diff --git a/drivers/radar_sensor_2/device.js b/drivers/radar_sensor_2/device.js new file mode 100644 index 00000000..b72635fd --- /dev/null +++ b/drivers/radar_sensor_2/device.js @@ -0,0 +1,875 @@ +"use strict"; + +const { Cluster, CLUSTER } = require("zigbee-clusters"); +const TuyaSpecificCluster = require("../../lib/TuyaSpecificCluster"); +const TuyaSpecificClusterDevice = require("../../lib/TuyaSpecificClusterDevice"); + +Cluster.addCluster(TuyaSpecificCluster); + +// (cluster: 61184) +// DP, DataType, Value; +// 1, 1, 1; +// 2, 2, 6; +// 3, 2, 0; +// 4, 2, 600; +// 101, 4, 1; +// 102, 2, 60; +// 103, 2, 1; +// 104, 2, 600; +// 105, 2, 8; +// 106, 2, 2287; (lux) +// 107, 1, true; (led indicator) +// 108, 2, 600; +// 109, 2, 8; +// 110, 2, 0; +// 111, 2, 0; +// 113, 1, false; +// 115, 2, 2; +// 116, 4, 2; +// 117, 4, 1; +// 118, 1, false; +// 119, 1, false; +// 120, 1, false; + +// e.enum('presence_state', ea.STATE, ['none', 'presence']).withDescription('Presence'), +// e.enum('human_motion_state', ea.STATE, ['none', 'large', 'small', 'breathe']).withDescription('Human Motion state'), +// e.numeric('illuminance_value', ea.STATE).withDescription('Illuminance').withUnit('lux'), +// e.numeric('fading_time', ea.STATE_SET).withValueMin(0).withValueMax(28800).withValueStep(1).withUnit('s') +// .withDescription('Presence keep time'), +// e.numeric('motion_detection_distance', ea.STATE_SET).withValueMin(0).withValueMax(10).withValueStep(0.01).withUnit('m') +// .withDescription('Motion detection distance'), +// e.numeric('motion_detection_sensitivity', ea.STATE_SET).withValueMin(0).withValueMax(10).withValueStep(1).withUnit('x') +// .withDescription('Motion detection sensitivity'), +// e.numeric('small_motion_detection_distance', ea.STATE_SET).withValueMin(0).withValueMax(6).withValueStep(0.01).withUnit('m') +// .withDescription('Small motion detection distance'), +// e.numeric('small_motion_detection_sensitivity', ea.STATE_SET).withValueMin(0).withValueMax(10).withValueStep(1).withUnit('x') +// .withDescription('Small motion detection sensitivity'), +// e.numeric('static_detection_distance', ea.STATE_SET).withValueMin(0).withValueMax(6).withValueStep(0.01).withUnit('m') +// .withDescription('Static detection distance'), +// e.numeric('static_detection_sensitivity', ea.STATE_SET).withValueMin(0).withValueMax(10).withValueStep(1).withUnit('x') +// .withDescription('Static detection sensitivity'), +// e.numeric('motion_false_detection', ea.STATE_SET).withValueMin(0).withValueMax(10).withValueStep(1).withUnit('x') +// .withDescription('Motion false detection'), +// //e.enum('working_mode', ea.STATE_SET, ['off', 'arm', 'alarm']).withDescription('Alarm mode'), +// //e.enum('alarm_volume', ea.STATE_SET, ['mute', 'low', 'medium', 'high']).withDescription('Alarm volume'), +// //e.numeric('alarm_time', ea.STATE_SET).withValueMin(1).withValueMax(60).withValueStep(1).withUnit('m').withDescription('Alarm time'), +// e.binary('indicator', ea.STATE_SET, 'ON', 'OFF').withDescription('LED Indicator'), +// e.binary('breathe_false_detection', ea.STATE_SET, 'ON', 'OFF').withDescription('Breathe False Detection'), + +// //[1, 'presence_state', tuya.valueConverterBasic.lookup({'none': tuya.enum(0), 'presence': tuya.enum(1)})], +// [1, 'presence', tuya.valueConverter.trueFalse1], +// [2, 'motion_detection_sensitivity', tuya.valueConverter.raw], +// [3, 'mov_minimum_distance', tuya.valueConverter.raw], +// [4, 'motion_detection_distance', tuya.valueConverter.divideBy100], +// [101, 'human_motion_state', tuya.valueConverterBasic.lookup({'none': tuya.enum(0), 'large': tuya.enum(1), 'small': tuya.enum(2), 'breathe': tuya.enum(3)})], +// [102, 'fading_time', tuya.valueConverter.raw], +// [103, 'motion_false_detection', tuya.valueConverter.raw], +// [104, 'small_motion_detection_distance', tuya.valueConverter.divideBy100], +// [105, 'small_motion_detection_sensitivity', tuya.valueConverter.raw], +// [106, 'illuminance_value', tuya.valueConverter.raw], +// [107, 'indicator', tuya.valueConverter.onOff], +// [108, 'static_detection_distance', tuya.valueConverter.divideBy100], +// [109, 'static_detection_sensitivity', tuya.valueConverter.raw], +// [110, 'micro_minimum_distance', tuya.valueConverter.raw], +// [111, 'motionless_minimum_distance', tuya.valueConverter.raw], +// [112, 'reset_setting', tuya.valueConverter.raw], +// [113, 'breathe_false_detection', tuya.valueConverter.raw], +// [114, 'time', tuya.valueConverter.raw], +// [115, 'alarm_time', tuya.valueConverter.raw], +// [116, 'alarm_volume', tuya.valueConverterBasic.lookup({'low': tuya.enum(0), 'medium': tuya.enum(1), 'high': tuya.enum(2), 'mute': tuya.enum(3)})], +// [117, 'working_mode', tuya.valueConverterBasic.lookup({'arm': tuya.enum(0), 'off': tuya.enum(1), 'alarm': tuya.enum(2), 'doorbell': tuya.enum(3)})], +// [118, 'auto1', tuya.valueConverter.raw], +// [119, 'auto2', tuya.valueConverter.raw], +// [120, 'auto3', tuya.valueConverter.raw], + +// (cluster: 1280) +// zigbee-clusters:cluster ep: 1, cl: iasZone (1280) unknown command received: ZCLStandardHeader { +// frameControl: Bitmap [ clusterSpecific, directionToClient ], +// trxSequenceNumber: 57, +// cmdId: 0, +// data: +// } {} +1ms +// zigbee-clusters:endpoint ep: 1, cl: iasZone (1280), error while handling frame unknown_command_received { +// meta: {}, +// frame: ZCLStandardHeader { +// frameControl: Bitmap [ clusterSpecific, directionToClient ], +// trxSequenceNumber: 57, +// cmdId: 0, +// data: +// } +// } + +const setDeviceDatapoints = (manufacturerName) => { + switch (manufacturerName) { + case "_TZE200_2aaelwxk": + return { + presence: 1, // [0/1] + motion_detection_sensitivity: 2, // [0-10, 1, x] + mov_minimum_distance: 3, // + motion_detection_distance: 4, // [0-10, 0.01, m] + human_motion_state: 101, // [enum(0,1,2,3) none, large, small, breathe] + fading_time: 102, // [0-28800, 1, s] + motion_false_detection: 103, // [0-10, 1, x] + small_motion_detection_distance: 104, // [0-6, 0.01, m] + small_motion_detection_sensitivity: 105, // [0-10, 1, x] + illuminance_value: 106, // (lux) + indicator: 107, // LED Indicator + static_detection_distance: 108, // [0-6, 0.01, m] + static_detection_sensitivity: 109, // [0-10, 1, x] + micro_minimum_distance: 110, + motionless_minimum_distance: 111, + reset_setting: 112, + breathe_false_detection: 113, // [0/1] + time: 114, + alarm_time: 115, // [1-60, 1, m] + alarm_volume: 116, // [enum(0: low, 1: medium, 2: high, 3: mute)] + working_mode: 117, // [enum(0: arm, 1: off, 2: alarm, 3: doorbell)] + auto1: 118, + auto2: 119, + auto3: 120, + }; + break; + + default: + // return { + // tshpsPresenceState: 1, + // tshpscSensitivity: 2, + // tshpsMinimumRange: 3, + // tshpsMaximumRange: 4, + // tshpsTargetDistance: 9, + // tshpsDetectionDelay: 101, + // tshpsFadingTime: 102, + // tshpsIlluminanceLux: 104, + // }; + } +}; + +const dataTypes = { + raw: 0, // [ bytes ] + bool: 1, // [0/1] + value: 2, // [ 4 byte value ] + string: 3, // [ N byte string ] + enum: 4, // [ 0-255 ] + bitmap: 5, // [ 1,2,4 bytes ] as bits +}; + +// const presenceTypes = { +// 0: "None", +// 1: "Large", +// 2: "Small", +// 3: "Breathe", +// }; + +const convertMultiByteNumberPayloadToSingleDecimalNumber = (chunks) => { + let value = 0; + + for (let i = 0; i < chunks.length; i++) { + value = value << 8; + value += chunks[i]; + } + + return value; +}; + +const convertDecimalValueTo4ByteHexArray = (value) => { + const hexValue = Number(value).toString(16).padStart(8, "0"); + const chunk1 = hexValue.substring(0, 2); + const chunk2 = hexValue.substring(2, 4); + const chunk3 = hexValue.substring(4, 6); + const chunk4 = hexValue.substring(6); + return [chunk1, chunk2, chunk3, chunk4].map((hexVal) => parseInt(hexVal, 16)); +}; + +const convertDecimalValueTo2ByteHexArray = (value) => { + const hexValue = Number(value).toString(16).padStart(4, "0"); + const chunk1 = hexValue.substring(0, 2); + const chunk2 = hexValue.substring(2); + return [chunk1, chunk2].map((hexVal) => parseInt(hexVal, 16)); +}; + +const decimalToBuffer = (decimalValue) => { + // Determine the byte length needed for the decimal value + let byteLength = 1; + while (decimalValue >> (8 * byteLength) > 0) { + byteLength++; + } + + // Create a new buffer with the determined byte length + const buffer = Buffer.alloc(byteLength); + + // Write the decimal value to the buffer based on the byte length + for (let i = 0; i < byteLength; i++) { + const byte = decimalValue & 0xff; // Get the lowest byte + buffer.writeUInt8(byte, i); + decimalValue >>= 8; // Shift right by 8 bits to get the next byte + } + + return buffer; +}; + +const getDataValue = (dpValue) => { + switch (dpValue.datatype) { + case dataTypes.raw: + return dpValue.data; + case dataTypes.bool: + return dpValue.data[0] === 1; + case dataTypes.value: + return convertMultiByteNumberPayloadToSingleDecimalNumber(dpValue.data); + case dataTypes.string: + let dataString = ""; + for (let i = 0; i < dpValue.data.length; ++i) { + dataString += String.fromCharCode(dpValue.data[i]); + } + return dataString; + case dataTypes.enum: + return dpValue.data[0]; + case dataTypes.bitmap: + return convertMultiByteNumberPayloadToSingleDecimalNumber(dpValue.data); + } +}; + +class radarSensor_2 extends TuyaSpecificClusterDevice { + async onNodeInit({ zclNode }) { + this.manufacturerName = this.getSetting("zb_manufacturer_name"); + + this.dataPoints = setDeviceDatapoints(this.manufacturerName); + + this.printNode(); + + this.breathAlarmOffTrigger = this.homey.flow.getTriggerCard( + "the-breath-alarm-turned-off" + ); + this.breathAlarmOnTrigger = this.homey.flow.getTriggerCard( + "the-breath-alarm-turned-on" + ); + this.smallAlarmOffTrigger = this.homey.flow.getTriggerCard( + "the-small-presence-alarm-turned-off" + ); + this.smallAlarmOnTrigger = this.homey.flow.getTriggerCard( + "the-small-presence-alarm-turned-on" + ); + this.largeAlarmOffTrigger = this.homey.flow.getTriggerCard( + "the-large-presence-alarm-turned-off" + ); + this.largeAlarmOnTrigger = this.homey.flow.getTriggerCard( + "the-large-presence-alarm-turned-on" + ); + + this.breathCondition = this.homey.flow.getConditionCard( + "the-breath-alarm-is-onoff" + ); + this.smallCondition = this.homey.flow.getConditionCard( + "the-small-presence-alarm-is-onoff" + ); + this.largeCondition = this.homey.flow.getConditionCard( + "the-small-presence-alarm-is-onoff" + ); + + this.breathCondition.registerRunListener(async (args, state) => { + return this.getCapabilityValue("alarm_breathe_presence"); + }); + this.smallCondition.registerRunListener(async (args, state) => { + return this.getCapabilityValue("alarm_small_presence"); + }); + this.largeCondition.registerRunListener(async (args, state) => { + return this.getCapabilityValue("alarm_large_presence"); + }); + + + await zclNode.endpoints[1].clusters.basic + .readAttributes( + "zclVersion", + "appVersion", + "stackVersion", + "hwVersion", + "manufacturerName", + "modelId", + "powerSource", + "deviceEnabled", + "swBuildId", + "attributeReportingStatus" + ) + .catch((err) => { + this.error("Error when reading device attributes ", err); + }); + + zclNode.endpoints[1].clusters.tuya.on("response", (value) => + this.updatePosition(value) + ); + + zclNode.endpoints[1].clusters.tuya.on("reporting", (value) => + this.processReporting(value) + ); + + zclNode.endpoints[1].clusters.tuya.on("datapoint", (value) => + this.processDatapoint(value) + ); + + // zclNode.endpoints[1].clusters[CLUSTER.ILLUMINANCE_MEASUREMENT.NAME].on( + // "attr.measuredValue", + // this.onIlluminanceMeasuredAttributeReport.bind(this) + // ); + + zclNode.endpoints[1].clusters[CLUSTER.IDENTIFY.NAME].on( + "attr.identifyTime", + + (e) => { + this.log("Identify Time: ", e); + } + ); + } + + processReporting(data) { + this.log("########### Reporting: ", data); + } + + processDatapoint(data) { + this.log("########### Datapoint: ", data); + } + + async updatePosition(data) { + this.log("########### UPDATE POSITION: ", data); + + const dp = data.dp; + const value = getDataValue(data); + const dataType = data.datatype; + + switch (dp) { + case this.dataPoints.presence: + this.log("presence state: ", value); + this.setCapabilityValue("alarm_motion", Boolean(value)); + break; + + case this.dataPoints.human_motion_state: + this.log("IAS Zone: ", value); + + switch (value) { + case 0: + this.log("None"); + this.setCapabilityValue("alarm_small_presence", false); + this.setCapabilityValue("alarm_large_presence", false); + this.setCapabilityValue("alarm_breathe_presence", false); + this.breathAlarmOffTrigger.trigger(); + this.smallAlarmOffTrigger.trigger(); + this.largeAlarmOffTrigger.trigger(); + + break; + case 1: + this.log("Large"); + this.setCapabilityValue("alarm_small_presence", false); + this.setCapabilityValue("alarm_large_presence", true); + this.setCapabilityValue("alarm_breathe_presence", false); + this.breathAlarmOffTrigger.trigger(); + this.smallAlarmOffTrigger.trigger(); + this.largeAlarmOnTrigger.trigger(); + break; + case 2: + this.log("Small"); + this.setCapabilityValue("alarm_small_presence", true); + this.setCapabilityValue("alarm_large_presence", false); + this.setCapabilityValue("alarm_breathe_presence", false); + + this.breathAlarmOffTrigger.trigger(); + this.smallAlarmOnTrigger.trigger(); + this.largeAlarmOffTrigger.trigger(); + break; + case 3: + this.log("Breathe"); + this.setCapabilityValue("alarm_small_presence", false); + this.setCapabilityValue("alarm_large_presence", false); + this.setCapabilityValue("alarm_breathe_presence", true); + this.breathAlarmOnTrigger.trigger(); + this.smallAlarmOffTrigger.trigger(); + this.largeAlarmOffTrigger.trigger(); + break; + } + break; + + case this.dataPoints.illuminance_value: + this.onIlluminanceMeasuredAttributeReport(value); + break; + + // INIT SETTINGS VALUES + case this.dataPoints.motion_detection_sensitivity: + case this.dataPoints.mov_minimum_distance: + case this.dataPoints.motion_detection_distance: + case this.dataPoints.fading_time: + case this.dataPoints.motion_false_detection: + case this.dataPoints.small_motion_detection_distance: + case this.dataPoints.small_motion_detection_sensitivity: + case this.dataPoints.indicator: + case this.dataPoints.static_detection_distance: + case this.dataPoints.static_detection_sensitivity: + case this.dataPoints.micro_minimum_distance: + case this.dataPoints.motionless_minimum_distance: + case this.dataPoints.breathe_false_detection: + case this.dataPoints.alarm_time: + case this.dataPoints.alarm_volume: + case this.dataPoints.working_mode: + case this.dataPoints.auto1: + case this.dataPoints.auto2: + case this.dataPoints.auto3: + const settings = this.getSettings(); + const dataPointKey = Object.keys(this.dataPoints).find( + (key) => this.dataPoints[key] === dp + ); + this.log("Setting value for key --> ", dataPointKey, " = ", value); + if (!dataPointKey && !settings[dataPointKey]) { + this.log("No settings for key --> ", dataPointKey); + } + if (dataPointKey && settings[dataPointKey] && this.isFirstInit()) { + await this.setSettings({ + [dataPointKey]: value, + }); + } + break; + + default: + this.log("Unknown Datapoint -->", "DP: " + dp, "Value: " + value); + } + } + + onDeleted() { + this.log("Radar sensor removed"); + } + + async onSettings({newSettings, changedKeys }) { + // + changedKeys.forEach((updatedSetting) => { + this.log( + "########### Updated setting: ", + updatedSetting, + " => ", + newSettings[updatedSetting] + ); + }); + + if (changedKeys.includes("motion_detection_sensitivity")) { + this.writeData32( + this.dataPoints.motion_detection_sensitivity, + newSettings["motion_detection_sensitivity"] + ); + } + + if (changedKeys.includes("mov_minimum_distance")) { + this.writeData32( + this.dataPoints.mov_minimum_distance, + newSettings["mov_minimum_distance"] + ); + } + + if (changedKeys.includes("motion_detection_distance")) { + this.writeData32( + this.dataPoints.motion_detection_distance, + newSettings["motion_detection_distance"] + ); + } + + if (changedKeys.includes("fading_time")) { + this.writeData32(this.dataPoints.fading_time, newSettings["fading_time"]); + } + + if (changedKeys.includes("motion_false_detection")) { + this.writeData32( + this.dataPoints.motion_false_detection, + newSettings["motion_false_detection"] + ); + } + + if (changedKeys.includes("small_motion_detection_distance")) { + this.writeData32( + this.dataPoints.small_motion_detection_distance, + newSettings["small_motion_detection_distance"] + ); + } + + if (changedKeys.includes("small_motion_detection_sensitivity")) { + this.writeData32( + this.dataPoints.small_motion_detection_sensitivity, + newSettings["small_motion_detection_sensitivity"] + ); + } + + if (changedKeys.includes("indicator")) { + this.writeBool(this.dataPoints.indicator, newSettings["indicator"]); + } + + if (changedKeys.includes("static_detection_distance")) { + this.writeData32( + this.dataPoints.static_detection_distance, + newSettings["static_detection_distance"] + ); + } + + if (changedKeys.includes("static_detection_sensitivity")) { + this.writeData32( + this.dataPoints.static_detection_sensitivity, + newSettings["static_detection_sensitivity"] + ); + } + + if (changedKeys.includes("breathe_false_detection")) { + this.writeBool( + this.dataPoints.breathe_false_detection, + newSettings["breathe_false_detection"] + ); + } + + if (changedKeys.includes("alarm_volume")) { + this.writeEnum(this.dataPoints.alarm_volume, newSettings["alarm_volume"]); + } + + if (changedKeys.includes("working_mode")) { + this.writeEnum(this.dataPoints.working_mode, newSettings["working_mode"]); + } + + // if (changedKeys.includes("minimum_range")) { + // this.writeData32( + // this.dataPoints.tshpsMinimumRange, + // newSettings["minimum_range"] * 100 + // ); + // } + + // if (changedKeys.includes("maximum_range")) { + // this.writeData32( + // this.dataPoints.tshpsMaximumRange, + // newSettings["maximum_range"] * 100 + // ); + // } + + // if (changedKeys.includes("detection_delay")) { + // this.writeData32( + // this.dataPoints.tshpsDetectionDelay, + // newSettings["detection_delay"] + // ); + // } + } + + onIlluminanceMeasuredAttributeReport(measuredValue) { + this.log( + "measure_luminance | Luminance - measuredValue (lux):", + measuredValue + ); + this.setCapabilityValue("measure_luminance", measuredValue); + } + + onIASZoneStatusChangeNotification({ + zoneStatus, + extendedStatus, + zoneId, + delay, + }) { + this.log( + "IASZoneStatusChangeNotification received:", + zoneStatus, + extendedStatus, + zoneId, + delay + ); + // this.setCapabilityValue("alarm_motion", zoneStatus.alarm1); + this.setCapabilityValue("alarm_motion", zoneStatus); + } +} + +module.exports = radarSensor_2; + +// { +// "ids": { +// "modelId": "TS0225", +// "manufacturerName": "_TZE200_2aaelwxk" +// }, +// "endpoints": { +// "ieeeAddress": "a4:c1:38:2a:a9:fd:ca:4d", +// "networkAddress": 13130, +// "modelId": "TS0225", +// "manufacturerName": "_TZE200_2aaelwxk", +// "endpointDescriptors": [ +// { +// "status": "SUCCESS", +// "nwkAddrOfInterest": 13130, +// "_reserved": 34, +// "endpointId": 1, +// "applicationProfileId": 260, +// "applicationDeviceId": 1026, +// "applicationDeviceVersion": 0, +// "_reserved1": 1, +// "inputClusters": [ +// 0, +// 3, +// 1280, +// 57346, +// 61184, +// 60928, +// 57344, +// 1024 +// ], +// "outputClusters": [ +// 3, +// 57346, +// 61184, +// 60928, +// 57344 +// ] +// }, +// { +// "status": "SUCCESS", +// "nwkAddrOfInterest": 13130, +// "_reserved": 10, +// "endpointId": 242, +// "applicationProfileId": 41440, +// "applicationDeviceId": 97, +// "applicationDeviceVersion": 0, +// "_reserved1": 0, +// "inputClusters": [], +// "outputClusters": [ +// 33 +// ] +// } +// ], +// "deviceType": "router", +// "receiveWhenIdle": true, +// "swBuildId": "0122052017", +// "capabilities": { +// "alternatePANCoordinator": false, +// "deviceType": true, +// "powerSourceMains": true, +// "receiveWhenIdle": true, +// "security": false, +// "allocateAddress": true +// }, +// "extendedEndpointDescriptors": { +// "1": { +// "clusters": { +// "basic": { +// "attributes": [ +// { +// "acl": [ +// "readable" +// ], +// "id": 0, +// "name": "zclVersion" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 1, +// "name": "appVersion" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 2, +// "name": "stackVersion" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 3, +// "name": "hwVersion" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 4, +// "name": "manufacturerName" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 5, +// "name": "modelId" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 7, +// "name": "powerSource" +// }, +// { +// "acl": [ +// "readable", +// "writable" +// ], +// "id": 18, +// "name": "deviceEnabled" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 16384, +// "name": "swBuildId" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 65533, +// "name": "clusterRevision" +// } +// ], +// "commandsGenerated": "UNSUP_GENERAL_COMMAND", +// "commandsReceived": "UNSUP_GENERAL_COMMAND" +// }, +// "identify": { +// "attributes": [ +// { +// "acl": [ +// "readable", +// "writable" +// ], +// "id": 0, +// "name": "identifyTime", +// "value": 0 +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 65533, +// "name": "clusterRevision", +// "value": 1 +// } +// ], +// "commandsGenerated": "UNSUP_GENERAL_COMMAND", +// "commandsReceived": "UNSUP_GENERAL_COMMAND" +// }, +// "iasZone": { +// "attributes": [ +// { +// "acl": [ +// "readable" +// ], +// "id": 0, +// "name": "zoneState", +// "value": "notEnrolled" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 1, +// "name": "zoneType", +// "value": "motionSensor" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 2, +// "name": "zoneStatus", +// "value": { +// "type": "Buffer", +// "data": [ +// 0, +// 0 +// ] +// } +// }, +// { +// "acl": [ +// "readable", +// "writable" +// ], +// "id": 16, +// "name": "iasCIEAddress", +// "value": "5c:c7:c1:ff:fe:9b:78:80" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 17, +// "name": "zoneId", +// "value": 6 +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 65533, +// "name": "clusterRevision", +// "value": 1 +// } +// ], +// "commandsGenerated": "UNSUP_GENERAL_COMMAND", +// "commandsReceived": "UNSUP_GENERAL_COMMAND" +// }, +// "illuminanceMeasurement": { +// "attributes": [ +// { +// "acl": [ +// "readable" +// ], +// "id": 0, +// "name": "measuredValue", +// "value": 1000 +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 1, +// "name": "minMeasuredValue", +// "value": 0 +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 2, +// "name": "maxMeasuredValue", +// "value": 4000 +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 65533, +// "name": "clusterRevision", +// "value": 1 +// } +// ], +// "commandsGenerated": "UNSUP_GENERAL_COMMAND", +// "commandsReceived": "UNSUP_GENERAL_COMMAND" +// } +// }, +// "bindings": { +// "identify": { +// "attributes": [ +// { +// "acl": [ +// "readable", +// "writable" +// ], +// "id": 0, +// "name": "identifyTime", +// "value": 0 +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 65533, +// "name": "clusterRevision", +// "value": 1 +// } +// ], +// "commandsGenerated": "UNSUP_GENERAL_COMMAND", +// "commandsReceived": "UNSUP_GENERAL_COMMAND" +// } +// } +// }, +// "242": { +// "clusters": {}, +// "bindings": {} +// } +// } +// } +// } diff --git a/drivers/radar_sensor_2/driver.compose.json b/drivers/radar_sensor_2/driver.compose.json new file mode 100644 index 00000000..c1277cbb --- /dev/null +++ b/drivers/radar_sensor_2/driver.compose.json @@ -0,0 +1,52 @@ +{ + "id": "radar_sensor_2", + "name": { + "en": "Radar Sensor ZG-205Z/W", + "nl": "Radar Sensor ZG-205Z/W" + }, + "class": "sensor", + "platforms": ["local"], + "connectivity": ["zigbee"], + "capabilities": [ + "measure_luminance", + "alarm_motion", + "alarm_small_presence", + "alarm_large_presence", + "alarm_breathe_presence" + ], + "images": { + "large": "{{driverAssetsPath}}/images/large.png", + "small": "{{driverAssetsPath}}/images/small.png" + }, + "energy": { + "approximation": { + "usageConstant": 2.5 + } + }, + "zigbee": { + "manufacturerName": ["_TZE200_2aaelwxk"], + "productId": ["TS0225"], + "endpoints": { + "1": { + "clusters": [ + 0, + 3, + 1280, + 57346, + 61184, + 60928, + 57344, + 1024 + ], + "bindings": [258, 61148] + } + }, + "learnmode": { + "image": "{{driverAssetsPath}}/icon.svg", + "instruction": { + "en": "Press and hold the reset button for 6 seconds. When the indicator light flashes it is in pairing mode.", + "nl": "Druk 6 seconden op de reset knop. Wacht tot de led gaat knipperen." + } + } + } +} diff --git a/drivers/radar_sensor_2/driver.flow.compose.json b/drivers/radar_sensor_2/driver.flow.compose.json new file mode 100644 index 00000000..96cbb42a --- /dev/null +++ b/drivers/radar_sensor_2/driver.flow.compose.json @@ -0,0 +1,133 @@ +{ + "triggers": [ + { + "id": "alarm_breathe_presence", + "title": { + "en": "Breath presence", + "nl": "Adem aanwezigheid", + "de": "Atempräsenz", + "fr": "Présence respiratoire", + "it": "Presenza del respiro", + "sv": "Andningsnärvaro", + "no": "Åndedrettsnærvær", + "es": "Presencia de la respiración", + "da": "Åndedræt nærvær", + "ru": "Присутствие дыхания", + "pl": "Obecność oddechu" + }, + "titleFormatted": { + "en": "Breath presence", + "nl": "Adem aanwezigheid", + "de": "Atempräsenz", + "fr": "Présence respiratoire", + "it": "Presenza del respiro", + "sv": "Andningsnärvaro", + "no": "Åndedrettsnærvær", + "es": "Presencia de la respiración", + "da": "Åndedræt nærvær", + "ru": "Присутствие дыхания", + "pl": "Obecność oddechu" + }, + "hint": { + "en": "This card will trigger when Breath Presence is activated.", + "nl": "Deze kaart wordt alleen geactiveerd wanneer de Adem aanwezigheid actief is.", + "de": "Diese Karte wird ausgelöst, wenn die Atempräsenz aktiviert wird." + }, + "args": [] + }, + { + "id": "alarm_small_presence", + "title": { + "en": "Small Presence", + "nl": "Kleine Aanwezigheid", + "de": "Kleine Präsenz", + "fr": "Petite Présence", + "it": "Presenza Piccola", + "sv": "Liten Närvaro", + "no": "Liten Nærvær", + "es": "Pequeña Presencia", + "da": "Lille Nærvær", + "ru": "Маленькое Присутствие", + "pl": "Mała Obecność" + }, + "titleFormatted": { + "en": "Small Presence", + "nl": "Kleine Aanwezigheid", + "de": "Kleine Präsenz", + "fr": "Petite Présence", + "it": "Presenza Piccola", + "sv": "Liten Närvaro", + "no": "Liten Nærvær", + "es": "Pequeña Presencia", + "da": "Lille Nærvær", + "ru": "Маленькое Присутствие", + "pl": "Mała Obecność" + }, + "hint": { + "en": "This card will trigger when Small Presence is activated.", + "nl": "Deze kaart wordt alleen geactiveerd wanneer de Kleine aanwezigheid actief is.", + "de": "Diese Karte wird ausgelöst, wenn die Kleine Präsenz aktiviert wird." + }, + "args": [] + }, + { + "id": "large_small_presence", + "title": { + "en": "Large Presence", + "nl": "Grote Aanwezigheid", + "de": "Große Präsenz", + "fr": "Grande Présence", + "it": "Presenza Ampia", + "sv": "Stor Närvaro", + "no": "Stor Nærvær", + "es": "Presencia Grande", + "da": "Stor Nærvær", + "ru": "Большое Присутствие", + "pl": "Duża Obecność" + }, + "titleFormatted": { + "en": "Large Presence", + "nl": "Grote Aanwezigheid", + "de": "Große Präsenz", + "fr": "Grande Présence", + "it": "Presenza Ampia", + "sv": "Stor Närvaro", + "no": "Stor Nærvær", + "es": "Presencia Grande", + "da": "Stor Nærvær", + "ru": "Большое Присутствие", + "pl": "Duża Obecność" + }, + "hint": { + "en": "This card will trigger when Large Presence is activated.", + "nl": "Deze kaart wordt alleen geactiveerd wanneer de Grote aanwezigheid actief is.", + "de": "Diese Karte wird ausgelöst, wenn die Große Präsenz aktiviert wird." + }, + "args": [] + } + ], + "conditions": [ + { + "id": "alarm_breathe_presence", + "title": { + "en": "Breath Presence alarm !{{is|is not}} on", + "nl": "Adem aanwezigheidsalarm !{{is|is niet}} aan" + } + }, + { + "id": "alarm_small_presence", + "title": { + "en": "Small Presence alarm !{{is|is not}} on", + "nl": "Kleine aanwezigheidsalarm !{{is|is niet}} aan" + } + }, + { + "id": "alarm_large_presence", + "title": { + "en": "Large Presence alarm !{{is|is not}} on", + "nl": "Groot aanwezigheidsalarm !{{is|is niet}} aan" + } + } + ], + "actions": [] +} diff --git a/drivers/radar_sensor_2/driver.settings.compose.json b/drivers/radar_sensor_2/driver.settings.compose.json new file mode 100644 index 00000000..9cebd5a4 --- /dev/null +++ b/drivers/radar_sensor_2/driver.settings.compose.json @@ -0,0 +1,207 @@ +[ + { + "id": "motion_detection_sensitivity", + "type": "number", + "label": { + "en": "Radar sensitivity", + "nl": "Radar sensitiviteit" + }, + "value": 6, + "min": 0, + "max": 10, + "units": { + "en": "x", + "nl": "x" + } + }, + { + "id": "mov_minimum_distance", + "type": "number", + "label": { + "en": "Minimum range", + "nl": "Minimale bereik" + }, + "value": 0, + "min": 0, + "max": 10, + "step": 1, + "units": { + "en": "meters", + "nl": "meters" + } + }, + { + "id": "motion_detection_distance", + "type": "number", + "label": { + "en": "Motion detection distance", + "nl": "Bewegingsdetectie afstand" + }, + "value": 600, + "min": 0, + "max": 1000, + "step": 1, + "units": { + "en": "centimeter", + "nl": "centimeter" + } + }, + { + "id": "fading_time", + "type": "number", + "label": { + "en": "Fading time", + "nl": "Reset tijd" + }, + "value": 0, + "min": 0, + "max": 28800, + "units": { + "en": "seconds", + "nl": "seconden" + } + }, + { + "id": "motion_false_detection", + "type": "number", + "value": 1, + "min": 0, + "max": 10, + "units": { + "en": "x", + "nl": "x" + }, + "label": { + "en": "Breathe False detection", + "nl": "Onjuiste Adem detectie" + } + }, + { + "id": "small_motion_detection_distance", + "type": "number", + "label": { + "en": "Small Motion detection distance", + "nl": "Kleine bewegingsdetectie afstand" + }, + "value": 600, + "min": 0, + "max": 600, + "step": 1, + "units": { + "en": "centimeter", + "nl": "centimeter" + } + }, + { + "id": "small_motion_detection_sensitivity", + "type": "number", + "label": { + "en": "Small Movement sensitivity", + "nl": "Kleine Beweging sensitiviteit" + }, + "value": 8, + "min": 0, + "max": 10, + "units": { + "en": "x", + "nl": "x" + } + }, + { + "id": "indicator", + "type": "checkbox", + "value": true, + "label": { + "en": "LED indicator", + "nl": "LED indicatie" + } + }, + { + "id": "static_detection_distance", + "type": "number", + "label": { + "en": "Static detection distance", + "nl": "Statische detectie afstand" + }, + "value": 600, + "min": 0, + "max": 600, + "step": 1, + "units": { + "en": "centimeter", + "nl": "centimeter" + } + }, + { + "id": "static_detection_sensitivity", + "type": "number", + "label": { + "en": "Static detection sensitivity", + "nl": "Statische detectie sensitiviteit" + }, + "value": 8, + "min": 0, + "max": 10, + "units": { + "en": "x", + "nl": "x" + } + }, + { + "id": "breathe_false_detection", + "type": "checkbox", + "value": false, + "label": { + "en": "Breathe False detection", + "nl": "Onjuiste Adem detectie" + } + }, + { + "id": "alarm_volume", + "type": "dropdown", + "value": "high", + "label": { "en": "Alarm volume", "nl": "Alarm volume" }, + "values": [ + { + "id": "mute", + "label": { "en": "Mute", "nl": "Gedempt" } + }, + { + "id": "low", + "label": { "en": "Low", "nl": "Laag" } + }, + { + "id": "medium", + "label": { "en": "Medium", "nl": "Middel" } + }, + { + "id": "high", + "label": { "en": "High", "nl": "Hoog" } + } + ] + }, + { + "id": "working_mode", + "type": "dropdown", + "value": "off", + "label": { "en": "Working mode", "nl": "Werk modus" }, + "values": [ + { + "id": "off", + "label": { "en": "Off", "nl": "Uit" } + }, + { + "id": "arm", + "label": { "en": "Arm", "nl": "Arm" } + }, + { + "id": "alarm", + "label": { "en": "Alarm", "nl": "Alarm" } + }, + { + "id": "doorbell", + "label": { "en": "Doorbell", "nl": "Deurbel" } + } + ] + } +] diff --git a/drivers/sirentemphumidsensor/driver.flow.compose.json b/drivers/sirentemphumidsensor/driver.flow.compose.json index 0b300812..ff9825f6 100644 --- a/drivers/sirentemphumidsensor/driver.flow.compose.json +++ b/drivers/sirentemphumidsensor/driver.flow.compose.json @@ -32,7 +32,7 @@ "en": "Change the alarm state to [[alarm_state]]", "nl": "Verander de alarm toestand naar [[alarm_state]]", "de": "Ändern des Alarmstatus zu [[alarm_state]]" - }, + }, "hint": { "en": "Change the alarm state; sound or silence the alarm", "nl": "Verander de alarm toestand; luiden of uitschakelen van het alarm", @@ -319,4 +319,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/drivers/smart_water_timer/assets/icon.svg b/drivers/smart_water_timer/assets/icon.svg new file mode 100644 index 00000000..76bae1ea --- /dev/null +++ b/drivers/smart_water_timer/assets/icon.svg @@ -0,0 +1,82 @@ + +image/svg+xml + + + + diff --git a/drivers/smart_water_timer/assets/images/large.jpg b/drivers/smart_water_timer/assets/images/large.jpg new file mode 100644 index 00000000..13a1a7c4 Binary files /dev/null and b/drivers/smart_water_timer/assets/images/large.jpg differ diff --git a/drivers/smart_water_timer/assets/images/nighttime.svg b/drivers/smart_water_timer/assets/images/nighttime.svg new file mode 100644 index 00000000..a04b8824 --- /dev/null +++ b/drivers/smart_water_timer/assets/images/nighttime.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + diff --git a/drivers/smart_water_timer/assets/images/pressure-gauge.svg b/drivers/smart_water_timer/assets/images/pressure-gauge.svg new file mode 100644 index 00000000..774ea45f --- /dev/null +++ b/drivers/smart_water_timer/assets/images/pressure-gauge.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + diff --git a/drivers/smart_water_timer/assets/images/small.png b/drivers/smart_water_timer/assets/images/small.png new file mode 100644 index 00000000..8749bd6b Binary files /dev/null and b/drivers/smart_water_timer/assets/images/small.png differ diff --git a/drivers/smart_water_timer/assets/images/sprinklers.svg b/drivers/smart_water_timer/assets/images/sprinklers.svg new file mode 100644 index 00000000..34827b5c --- /dev/null +++ b/drivers/smart_water_timer/assets/images/sprinklers.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/drivers/smart_water_timer/device.js b/drivers/smart_water_timer/device.js new file mode 100644 index 00000000..f89c3801 --- /dev/null +++ b/drivers/smart_water_timer/device.js @@ -0,0 +1,251 @@ +'use strict'; + +const Homey = require('homey'); +const { Cluster, debug, CLUSTER } = require('zigbee-clusters'); +const TuyaSpecificClusterDevice = require("../../lib/TuyaSpecificClusterDevice"); + +const TuyaSpecificCluster = require('../../lib/TuyaSpecificCluster'); + +Cluster.addCluster(TuyaSpecificCluster); + +const DEFAULT_ONOFF_DURATION = 1000 + +/* +reversesd engineered DP's from Tuya: +==================================== + +1 - Switch +2 - Regulating water volume +3 - Flow state +10 - Weather Delay +11 - Irrigation time + +101 - 倒计时剩余时间 countdown time remaining +102 - 倒计时剩余时间设置 countdown remaining time setting +103 - 开到底状态 open to the end +104 - 故障告警 fault alarm +105 - 默认倒计时开启 by default countdown is on +106 - 默认倒计时设置 default countdown settings +107 - 月使用时长 monthly usage time +108 - 月使用水容量 monthly water capacity +109 - 定时灌溉 regular irrigation +110 - 电池电量 battery power + +Tuya developer GUI sends: +========================= + +switch | Boolean | "{true,false}" +percent_control | Integer | { "unit": "%", "min": 0, "max": 100, "scale": 0, "step": 5 } +weather_delay | Enum | { "range": [ "cancel", "24h", "48h", "72h" ] } +countdown | Integer | { "unit": "s", "min": 0, "max": 86400, "scale": 0, "step": 1 +*/ + +const setDeviceDatapoints = (manufacturerName) => { + switch (manufacturerName) { + case "_TZE200_arge1ptm": + case "_TZE200_xlppj4f5": + return { + valve_state_auto_shutdown: 2, + water_flow: 3, + + shutdown_timer: 11, + remaining_watering_time: 101, + valve_state: 102, // countdown | Integer | { "unit": "s", "min": 0, "max": 86400, "scale": 0, "step": 1 + + last_watering_time: 107, + battery: 110, + + // DP received but not usefull for Homey + error: 104, + max_min: 108, + }; + break; + } +}; + +const dataTypes = { + raw: 0, // [ bytes ] + bool: 1, // [0/1] + value: 2, // [ 4 byte value ] + string: 3, // [ N byte string ] + enum: 4, // [ 0-255 ] + bitmap: 5, // [ 1,2,4 bytes ] as bits +}; + +const convertMultiByteNumberPayloadToSingleDecimalNumber = (chunks) => { + let value = 0; + + for (let i = 0; i < chunks.length; i++) { + value = value << 8; + value += chunks[i]; + } + + return value; +}; + +const getDataValue = (dpValue) => { + switch (dpValue.datatype) { + case dataTypes.raw: + return dpValue.data; + case dataTypes.bool: + return dpValue.data[0] === 1; + case dataTypes.value: + return convertMultiByteNumberPayloadToSingleDecimalNumber(dpValue.data); + case dataTypes.string: + let dataString = ""; + for (let i = 0; i < dpValue.data.length; ++i) { + dataString += String.fromCharCode(dpValue.data[i]); + } + return dataString; + case dataTypes.enum: + return dpValue.data[0]; + case dataTypes.bitmap: + return convertMultiByteNumberPayloadToSingleDecimalNumber(dpValue.data); + } +}; + +class SmartWaterTimer extends TuyaSpecificClusterDevice { + async onNodeInit({ zclNode }) { + this.printNode(); + + this.manufacturerName = this.getSetting("zb_manufacturer_name"); + this.dataPoints = setDeviceDatapoints(this.manufacturerName); + + zclNode.endpoints[1].clusters.tuya.on("response", (value) => + this.updateInformation(value) + ); + + this.registerCapability("onoff", CLUSTER.ON_OFF); + + this.registerCapabilityListener("onoff", async (value, options) => { + this.log("value " + value); + this.log("options " + options.duration); + + if (value == false) { + value = 0; + } else { + value = 100; + } + this.writeInteger(this.dataPoints.valve_state, value); + }); + + // Handler for waterflow + this.registerCapability("measure_water_flow", CLUSTER.SCENES); + this.registerCapabilityListener("measure_water_flow", async (value, options) => { + this.log("measure_water_flow value: " + value * 100); + this.writeInteger(this.dataPoints.valve_state, value * 100); + if(value <= 0) { + this.setCapabilityValue("onoff", false); + } else { + this.setCapabilityValue("onoff", true); + } + }); + + // measure_battery // alarm_battery + zclNode.endpoints[1].clusters[CLUSTER.POWER_CONFIGURATION.NAME].on( + "attr.batteryPercentageRemaining", + this.onBatteryPercentageRemainingAttributeReport.bind(this) + ); + } + + async updateInformation(data) { + const dp = data.dp; + const value = getDataValue(data); + + switch (dp) { + case this.dataPoints.water_flow: + this.log("Current water flow in %: " + value); + this.setCapabilityValue("meter_valve_state", value ).catch( + this.error + ); + // this.setCapabilityValue("water_flow", Boolean(value)); + break; + + case this.dataPoints.last_watering_time: + this.log("Duration of the last watering in seconds: " + value); + this.setCapabilityValue("last_watering_time", value).catch(this.error); + // this.setCapabilityValue("last_watering_time", value); + break; + + case this.dataPoints.remaining_watering_time: + this.log("remaining_watering_time: " + value); + this.setCapabilityValue("remaining_watering_time", value).catch( + this.error + ); + break; + + // case this.dataPoints.valve_state: + // this.log("Set valve to %: " + value/100); + // this.setCapabilityValue("meter_valve_state", value/100).catch(this.error); + // // this.setCapabilityValue("valve_state", value); + // break; + + case this.dataPoints.shutdown_timer: + this.log("Auto shutdown in seconds.: " + value); + this.setCapabilityValue("shutdown_timer", value).catch(this.error); + break; + + case this.dataPoints.valve_state_auto_shutdown: + this.log("Set valve to % with auto shutdown: " + value); + this.setCapabilityValue("valve_state_auto_shutdown", value).catch( + this.error + ); + break; + + case this.dataPoints.battery: + this.log("battery_level: " + value); + this.setCapabilityValue( + "measure_battery", + value + ).catch(this.error); + break; + + default: + this.log("dp value", dp, value); + } + } + + async onDeleted() { + this.log("Smart Water Timer removed"); + } + + async onSettings({ newSettings, changedKeys }) { + if (changedKeys.includes("valve_state")) { + this.writeData32(this.dataPoints.valve_state, newSettings["valve_state"]); + } + + if (changedKeys.includes("shutdown_timer")) { + this.writeData32( + this.dataPoints.shutdown_timer, + newSettings["shutdown_timer"] + ); + } + + if (changedKeys.includes("valve_state_auto_shutdown")) { + this.writeData32( + this.dataPoints.valve_state_auto_shutdown, + newSettings["valve_state_auto_shutdown"] + ); + } + } + + onBatteryPercentageRemainingAttributeReport(batteryPercentageRemaining) { + const batteryThreshold = this.getSetting("batteryThreshold") || 20; + //override batteryPercentageRemaining... + batteryPercentageRemaining = this.dataPoints.battery; + this.log( + "measure_battery | powerConfiguration - batteryPercentageRemaining (%): ", + batteryPercentageRemaining + ); + this.setCapabilityValue( + "measure_battery", + batteryPercentageRemaining + ).catch(this.error); + this.setCapabilityValue( + "alarm_battery", + batteryPercentageRemaining < batteryThreshold ? true : false + ).catch(this.error); + } +} + +module.exports = SmartWaterTimer; diff --git a/drivers/smart_water_timer/driver.compose.json b/drivers/smart_water_timer/driver.compose.json new file mode 100644 index 00000000..5416cd53 --- /dev/null +++ b/drivers/smart_water_timer/driver.compose.json @@ -0,0 +1,57 @@ +{ + "id": "SmartWaterTimer", + "name": { + "en": "QT-05M - Smart Water Timer" + }, + "class": "other", + "platforms": ["local"], + "connectivity": ["zigbee"], + "capabilities": [ + "onoff", + "alarm_battery", + "measure_battery", + "measure_water_flow", + "meter_valve_state", + "last_watering_time", + "remaining_watering_time", + "shutdown_timer", + "valve_state_auto_shutdown" + ], + "capabilitiesOptions": { + "onoff": { + "opts": { + "duration": true + } + }, + "measure_water_flow": { + "opts": { + "duration": true + }, + "preventInsights": true + } + }, + "energy": { + "batteries": ["AA", "AA", "AA", "AA"] + }, + "images": { + "small": "{{driverAssetsPath}}/images/small.jpg", + "large": "{{driverAssetsPath}}/images/large.jpg" + }, + "zigbee": { + "manufacturerName": ["_TZE200_arge1ptm", "_TZE200_xlppj4f5"], + "productId": ["TS0601"], + "endpoints": { + "1": { + "clusters": [0, 1, 4, 5, 6, 10, 25, 61184], + "bindings": [1, 6, 10, 25] + } + }, + "learnmode": { + "image": "{{driverAssetsPath}}/icon.svg", + "instruction": { + "en": "Ensure the indicator light is flashing. If the indicatore light isn't flashing: press and hold the reset button for 5 seconds until the indicator light starts to flashing.", + "it": "Assicurarsi che l'indicatore lampeggi. Se l'indicatore non lampegga: tenere premuto il pulsante di reset per 5 secondi finchè l'indicatore non inizia a lampeggiare." + } + } + } +} diff --git a/drivers/smart_water_timer/driver.flow.compose.json b/drivers/smart_water_timer/driver.flow.compose.json new file mode 100644 index 00000000..6e467e98 --- /dev/null +++ b/drivers/smart_water_timer/driver.flow.compose.json @@ -0,0 +1,91 @@ +{ + "triggers": [ + { + "id": "water_flow_changed", + "title": { + "en": "water_flow-level changed", + "nl": "water_flow-niveau veranderd", + "de": "water_flowm-Niveau geändert", + "fr": "Intensité lumineuse a été modifiée", + "it": "Intensità luminosa modificata", + "sv": "water_flowningsnivå ändrades", + "no": "Dempingsnivå ble endret", + "es": "La intensidad de la luz ha cambiado", + "da": "Lysniveau ændret", + "ru": "Уровень яркости изменен", + "pl": "Zmiana poziomu przygaszenia" + }, + "tokens": [ + { + "name": "water_flow", + "type": "number", + "title": { + "en": "Level", + "nl": "Niveau", + "de": "Niveau", + "fr": "Niveau", + "it": "Livello", + "sv": "Nivå", + "no": "Nivå", + "es": "Nivel", + "da": "Niveau", + "ru": "Уровень", + "pl": "Poziom" + }, + "example": 0.5 + } + ] + } + ], + "actions": [ + { + "id": "water_flow", + "highlight": true, + "title": { + "en": "waterflow to", + "nl": "waterflow naar", + "de": "waterflow auf" + }, + "args": [ + { + "name": "water_flow", + "type": "range", + "min": 0, + "max": 1, + "step": 0.01, + "value": 0.5, + "label": "%", + "labelMultiplier": 100, + "labelDecimals": 0 + } + ] + }, + { + "id": "water_flow_relative", + "title": { + "en": "Set relative water flow-level", + "nl": "Zet relatief water flow-niveau", + "de": "Relatives waterflow Niveau setzen" + }, + "hint": { + "en": "decrease or increase with respect to the device's current waterflow level.", + "nl": "Verhoog of verlaag de waterflow ten opzichte van het huidige waterflow niveau van het apparaat.", + "ru": "Уменьшите или увеличьте яркость относительно текущего уровня яркости устройства.", + "pl": "Przygaś lub rozjaśnij względem obecnego poziomu przygaszenia urządzenia." + }, + "args": [ + { + "name": "water_flow", + "type": "range", + "min": 0, + "max": 1, + "step": 0.01, + "value": 0.5, + "label": "%", + "labelMultiplier": 100, + "labelDecimals": 0 + } + ] + } + ] +} diff --git a/drivers/smart_water_timer/driver.settings.compose.json b/drivers/smart_water_timer/driver.settings.compose.json new file mode 100644 index 00000000..cab88fe6 --- /dev/null +++ b/drivers/smart_water_timer/driver.settings.compose.json @@ -0,0 +1,51 @@ +[ + { + "id": "batteryThreshold", + "type": "number", + "label": { + "en": "Battery Low Alarm Voltage Threshold (%)", + "it": "Soglia dell'allarme di batteria scarica " + }, + "hint": { + "en": "This setting determines the threshold before a battery alarm is given.", + "it": "Quest'impostazione determina la soglia alla quale l'allarme di batteria scarica viene dato" + }, + "value": 20, + "attr": { + "step": 1, + "min": 1, + "max": 99 + } + }, + { + "id": "shutdown_timer", + "type": "number", + "label": { + "en": "Maximum open percentage", + "nl": "Maximale open percentage" + }, + "hint": { + "en": "Auto shutdown in seconds.", + "nl": "Automatische stop in seconden" + }, + "value": 120, + "min": 0, + "max": 14400 + }, + { + "id": "valve_state_auto_shutdown", + "type": "number", + "label": { + "en": "Valve open in % after auto shutdown.", + "nl": "Kraan open in % na automatische stop." + }, + "hint": { + "en": "Set valve to % with auto shutdown.", + "nl": "Zet kraan op % met automatische stop." + }, + "value": 100, + "min": 0, + "step": 5, + "max": 100 + } + ] \ No newline at end of file diff --git a/drivers/valvecontroller/driver.compose.json b/drivers/valvecontroller/driver.compose.json index 0b3f1851..26335123 100644 --- a/drivers/valvecontroller/driver.compose.json +++ b/drivers/valvecontroller/driver.compose.json @@ -26,12 +26,14 @@ "_TYZB01_4tlksk8a", "_TZ3000_tvuarksa", "_TZ3000_j9568h44", - "_TZ3000_iedbgyxt" + "_TZ3000_iedbgyxt", + "_TZ3000_w0ypwa1f" ], "productId": [ "TS0111", "TS0001", - "TS011F" + "TS011F", + "TS0001" ], "endpoints": { "1": { @@ -47,4 +49,4 @@ } } -} \ No newline at end of file +} diff --git a/lib/TuyaSpecificClusterDevice.js b/lib/TuyaSpecificClusterDevice.js index db8c6540..0b63994d 100644 --- a/lib/TuyaSpecificClusterDevice.js +++ b/lib/TuyaSpecificClusterDevice.js @@ -3,83 +3,125 @@ const {ZigBeeDevice} = require("homey-zigbeedriver"); class TuyaSpecificClusterDevice extends ZigBeeDevice { + // Tuya Datapoint Functions + _transactionID = 0; + set transactionID(val) { + this._transactionID = val % 256; + } + get transactionID() { + return this._transactionID; + } - // Tuya Datapoint Functions - _transactionID = 0; - set transactionID(val) { - this._transactionID = val % 256; - } - get transactionID() { - return this._transactionID; - } + // Boolean + async writeBool(dp, value) { + const data = Buffer.alloc(1); + data.writeUInt8(value ? 0x01 : 0x00, 0); + return this.zclNode.endpoints[1].clusters.tuya.datapoint({ + status: 0, + transid: this.transactionID++, + dp, + datatype: 1, + length: 1, + data, + }); + } - // Boolean - async writeBool(dp, value) { - const data = Buffer.alloc(1); - data.writeUInt8(value ? 0x01 : 0x00,0); - return this.zclNode.endpoints[1].clusters.tuya.datapoint({ - status: 0, - transid: this.transactionID++, - dp, - datatype: 1, - length: 1, - data - }); - } + // int type value + async writeData32(dp, value) { + const data = Buffer.alloc(4); + data.writeUInt32BE(value, 0); + return this.zclNode.endpoints[1].clusters.tuya.datapoint({ + status: 0, + transid: this.transactionID++, + dp, + datatype: 2, + length: 4, + data, + }); + } - // int type value - async writeData32 (dp, value) { - const data = Buffer.alloc(4); - data.writeUInt32BE(value,0); - return this.zclNode.endpoints[1].clusters.tuya.datapoint({ - status: 0, - transid: this.transactionID++, - dp, - datatype: 2, - length: 4, - data - }); - } + // string + async writeString(dp, value) { + const data = Buffer.from(String(value), "latin1"); + return this.zclNode.endpoints[1].clusters.tuya.datapoint({ + status: 0, + transid: this.transactionID++, + dp, + datatype: 3, + length: value.length, + data, + }); + } - // string - async writeString(dp, value) { - const data = Buffer.from(String(value),'latin1'); - return this.zclNode.endpoints[1].clusters.tuya.datapoint({ - status: 0, - transid: this.transactionID++, - dp, - datatype: 3, - length: value.length, - data - }); - } + // enum + async writeEnum(dp, value) { + const data = Buffer.alloc(1); + data.writeUInt8(value, 0); + return this.zclNode.endpoints[1].clusters.tuya.datapoint({ + status: 0, + transid: this.transactionID++, + dp, + datatype: 4, + length: 1, + data, + }); + } - // enum - async writeEnum(dp, value) { - const data = Buffer.alloc(1); - data.writeUInt8(value, 0); - return this.zclNode.endpoints[1].clusters.tuya.datapoint({ - status: 0, - transid: this.transactionID++, - dp, - datatype: 4, - length: 1, - data - }); - } + // Int + async writeInteger(dp, value) { + const data = Buffer.alloc(4); + data.writeUInt32BE(value, 0); + return this.zclNode.endpoints[1].clusters.tuya.datapoint({ + status: 0, + transid: this.transactionID++, + dp, + datatype: 2, + length: 4, + data, + }); + } + + // raw data + async writeRaw(dp, data) { + return this.zclNode.endpoints[1].clusters.tuya.datapoint({ + status: 0, + transid: this.transactionID++, + dp, + datatype: 0, + length: data.length, + data, + }); + } + + // bitmap + async writeBitmap(dp, data) { + const value = new Bitmap(data); + return this.zclNode.endpoints[1].clusters.tuya.datapoint({ + status: 0, + transid: this.transactionID++, + dp, + datatype: 5, + length: value.length, + value, + }); + } + + // Radiator Actuator + // --------------------------------------------- + // dp 0x0101 On / Off > [off = off, on = heat] + // data 0 or 1 (off/on) + // + // dp 0x0203 Heating setpoint + // data temperature (in degrees Celsius) * 10 - // raw data - async writeRaw(dp, data) { - return this.zclNode.endpoints[1].clusters.tuya.datapoint({ - status: 0, - transid: this.transactionID++, - dp, - datatype: 0, - length: data.length, - data - }); + // Radiator Actuator Functions + /* async setRadiatorActuatorOn(value) { + return this.writeEnum(0x0101, value ? 1 : 0); } + async setRadiatorActuatorTemperature(value) { + return this.writeData32(0x0203, value * 10); + } */ } -module.exports = TuyaSpecificClusterDevice; \ No newline at end of file +module.exports = TuyaSpecificClusterDevice; diff --git a/package-lock.json b/package-lock.json index 393159eb..e60fe3ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "com.tuya.zigbee", - "version": "0.2.25", + "version": "0.2.26", "license": "MIT", "dependencies": { "homey-zigbeedriver": "^1.6.12",