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 @@
+
+
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",