Simulateur de présence
Toujours dans le but de déplacer toutes mes automatisations Domoticz vers Node-RED, je me suis attaqué à mon simulateur de présence.
Sur Domoticz, j'avais mis en place un système compliqué qui générait via un script Python des heures aléatoires et les ajoutait dans des variables Domoticz.
Je me servais ensuite des ces différentes heures pour créer un planning afin d'allumer et éteindre mes lumières.
Je suis très attaché au coté aléatoire parce que ça ne me semble pas très intelligent, lors d'une absence, d'allumer puis éteindre les lumières toujours à la même heure.
J'ai tardé à migrer ce système sous Node-RED parce que cela me semblait trop compliqué. Et en fait pas du tout !
Domoticz vers Node-RED
Dans Domoticz, j'ai conservé mon capteur virtuel qui est un simple bouton on/off. L'appui sur ce bouton va être récupéré dans Node-RED pour deux choses :
- Ajouter l'état dans un topic MQTT spécifique
- Répercuter cet état dans une variable globale Node-RED
Le flow est assez simple et je ne vais pas le détailler plus que ça :
- Je souscris au topic
domoticz/out
, je filtre sur l'IDX de mon capteur virtuel, et je récupère l'état (nvalue) que je reporte ensuite dans un topic spécifique (exemple :internal/simulation_presence/state
) sous la forme On/Off - Lorsque ce topic spécifique est modifié, j'ajoute la valeur dans une variable globale Node-RED (exemple :
global.simulation_presence
)
Planning
Pour la partie planning, j'ai utilisé le plugin (palette) eztimer qui permet une programmation horaire très poussée en incluant notamment un offset random.
Sur mon node eztimer j'ai configuré :
- Les jours concernés
- Le type de timer (on/off)
- L'heure de début (on) et de fin (off) en incluant un offset random
En fonction de l'évènement (on/off), mon payload passe respectivement à 1 ou 0.
A la sortie de ce node, je vérifie l'état de ma variable globale et en fonction du payload reçu, je peux soit allumer soit éteindre mes lumières (ou tout autre action : allumer une prise, la télévision, mettre de la musique, etc.).
Le flow correspondant :
[
{
"id": "58384177.d243f",
"type": "eztimer",
"z": "4822a4b8.947954",
"name": "Lumière Bureau",
"debug": false,
"autoname": "17:00:00 - 23:00:00",
"tag": "",
"suspended": false,
"sendEventsOnSuspend": false,
"lat": "",
"lon": "",
"timerType": "1",
"startupMessage": false,
"ontype": "2",
"ontimesun": "dawn",
"ontimetod": "17:00:00",
"onpropertytype": "msg",
"onproperty": "payload",
"onvaluetype": "num",
"onvalue": 1,
"onoffset": "30",
"onrandomoffset": true,
"onsuppressrepeats": false,
"offtype": "2",
"offtimesun": "dusk",
"offtimetod": "23:00:00",
"offduration": "00:01:00",
"offpropertytype": "msg",
"offproperty": "payload",
"offvaluetype": "num",
"offvalue": 0,
"offoffset": "30",
"offrandomoffset": true,
"offsuppressrepeats": false,
"mon": true,
"tue": true,
"wed": true,
"thu": true,
"fri": true,
"sat": true,
"sun": true,
"x": 120,
"y": 900,
"wires": [
[
"6f97c378.647d4c"
]
]
},
{
"id": "ffbf54e5.9786e8",
"type": "switch",
"z": "4822a4b8.947954",
"name": "Check on/off",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "num"
},
{
"t": "eq",
"v": "0",
"vt": "str"
}
],
"checkall": "false",
"repair": false,
"outputs": 2,
"x": 490,
"y": 900,
"wires": [
[
"9e052a73.66d308"
],
[
"eb0bbf15.78d73"
]
]
},
{
"id": "9e052a73.66d308",
"type": "change",
"z": "4822a4b8.947954",
"name": "Turn on",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "ON",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 680,
"y": 880,
"wires": [
[
"a5b733a1.cd81c"
]
]
},
{
"id": "eb0bbf15.78d73",
"type": "change",
"z": "4822a4b8.947954",
"name": "Turn off",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "OFF",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 680,
"y": 920,
"wires": [
[
"a5b733a1.cd81c"
]
]
},
{
"id": "a5b733a1.cd81c",
"type": "mqtt out",
"z": "4822a4b8.947954",
"name": "Zigbee2MQTT",
"topic": "zigbee2mqtt/group_ampoules_bureau/set",
"qos": "",
"retain": "",
"broker": "1949a812.2568e8",
"x": 860,
"y": 900,
"wires": []
},
{
"id": "6f97c378.647d4c",
"type": "switch",
"z": "4822a4b8.947954",
"name": "Check variable",
"property": "simulation_presence",
"propertyType": "global",
"rules": [
{
"t": "eq",
"v": "On",
"vt": "str"
}
],
"checkall": "false",
"repair": false,
"outputs": 1,
"x": 320,
"y": 900,
"wires": [
[
"ffbf54e5.9786e8"
]
]
},
{
"id": "1949a812.2568e8",
"type": "mqtt-broker",
"name": "Mosquitto",
"broker": "192.168.0.47",
"port": "1883",
"clientid": "",
"usetls": false,
"compatmode": true,
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthRetain": "false",
"birthPayload": "",
"closeTopic": "",
"closeQos": "0",
"closeRetain": "false",
"closePayload": "",
"willTopic": "",
"willQos": "0",
"willRetain": "false",
"willPayload": ""
}
]