Alternatives pour les scènes interrompues par les mises à jour

EDIT : discussions déplacées de Gladys Assistant 4.85.0 : widget Photo, navigation dans les graphiques, chauffe-eau & HomeKit - #21 par Will_71 pour dédier un sujet précis.


Bravo à tous pour toutes ces nouveautés et améliorations :heart_eyes:

J’ai une remarque qui me chiffonne presque à chaque mise à jour : les scènes qui ont un Attendre en cours.
Pour faire simple, je mets en route la pompe de la piscine pour une durée que je définis et donc j’ai une action Attendre de X heures. Malheureusement quand survient une mise à jour, et bien mon Attendre saute tout simplement et si je ne fais pas gaffe, la piscine peut tourner 8h au lieu de 3h :frowning:
A part mettre des variables MQTT pour le suivi d’une scène en cours (qu’il faudrait que je fasse), me créer des timestamps que je stocke aussi, et un script au (re)démarrage de Gladys (d’ailleurs ça existe un déclencheur au boot ?), il n’existerait pas un (nouveau ?) quelque chose pour reprendre ces scènes où elles se sont arrêtées ?

Merci pour le retour, et tu mets le doigt sur une vraie limite de l’implémentation actuelle :slight_smile:

Techniquement, le bloc « Attendre » c’est juste un timer en mémoire dans le process Gladys. Rien n’est stocké en base : ni le fait qu’une scène soit en cours, ni où elle en est dans sa liste d’actions. Du coup au moindre redémarrage (mise à jour, reboot, coupure de courant), tout ce qui vient après le Attendre part à la poubelle. C’est pas un bug de ton côté, c’est comme ça aujourd’hui.

Et oui, le déclencheur « Gladys démarre » existe bien, tu le trouveras dans la liste des déclencheurs.

Mais je te conseillerais plutôt de t’organiser pour ne pas en avoir besoin.

Le truc le plus malin dans ton cas, c’est de ne pas faire tenir le chrono par Gladys du tout, mais par la prise elle-même. La plupart du matériel sait faire « allume-toi et coupe-toi tout seul dans X secondes ». Ça dépend de ce que tu as :

  • Shelly, avec l’action Requête HTTP : http://<ip>/relay/0?turn=on&timer=10800 (Gen1) ou http://<ip>/rpc/Switch.Set?id=0&on=true&toggle_after=10800 (Gen2+)
  • Zigbee2MQTT, avec l’action Zigbee2MQTT : sur zigbee2mqtt/<ta_pompe>/set, tu envoies {"state":"ON","on_time":10800,"off_wait_time":0}. Ça marche sur pas mal de prises et modules Tuya/Moes/Aqara.
  • Tasmota : PulseTime 10900; Power ON (au-delà de 111, PulseTime vaut valeur − 100 en secondes)

Ta scène devient une seule action, plus aucun Attendre. Et l’avantage énorme pour une pompe de piscine : même si ton Gladys est coupé ou que le mini-PC ne redémarre pas, la pompe s’arrête quand même.

Si ton matériel ne sait pas faire ça, la deuxième approche c’est un décompte plutôt qu’une attente.

Tu crées une feature nombre via MQTT, genre minutes_restantes_pompe. Ta scène de démarrage allume la pompe et met la valeur à 180. À côté, tu fais une scène de surveillance avec un déclencheur planifié en mode intervalle toutes les 5 minutes, qui récupère la valeur, continue seulement si elle est > 0, la réécrit avec la formule {{0.last_value}} - 5, et si elle tombe à 0 elle coupe la pompe. Le mode formule marche aussi bien sur « Définir une valeur » que dans les conditions, donc tout se fait à la souris.

L’intérêt c’est que ça se répare tout seul : pas besoin de script au boot ni du déclencheur au démarrage, le prochain passage du cron rattrape la situation. Au pire tu perds les 5 minutes du tick en cours.

Et si tu peux t’en contenter, le plus simple reste deux scènes planifiées, départ à 10h et arrêt à 13h. Pour une pompe de piscine c’est souvent suffisant et c’est increvable. Si tu adaptes la durée à la température de l’eau, tu peux même faire 3 scènes d’arrêt (12h, 13h, 14h) avec chacune une condition sur la température, c’est un peu bourrin mais ça marche toujours.

Le principe à retenir : le Attendre est fait pour des délais courts à l’intérieur d’une séquence, genre 2 secondes entre deux commandes ou 30 secondes avant de vérifier un état. Dès que tu dépasses quelques minutes, et surtout quand c’est une action de coupure qui est en jeu, il faut soit déporter le minuteur sur le matériel, soit passer par un état stocké et relu régulièrement.

Ceci dit, ta demande de base reste légitime : persister les Attendre longs pour les replanifier au démarrage, c’est faisable. Si tu veux ouvrir une demande de fonctionnalité dessus, n’hésite pas.

Excellente méthode que je n’avais pas imaginé du tout.
J’ai un NodOn SIN-4-1-21 et il semble que ce soit possible :

On with timed off

When setting the state to ON, it might be possible to specify an automatic shutoff after a certain amount of time. To do this add an additional property on_time to the payload which is the time in seconds the state should remain on.

Additionally an off_wait_time property can be added to the payload to specify the cooldown time in seconds when the switch will not answer to other on with timed off commands.

Support depends on the switch firmware. Some devices might require both on_time and off_wait_time to work

Examples : {"state" : "ON", "on_time": 300}, {"state" : "ON", "on_time": 300, "off_wait_time": 120}.
Et comme je m’envoie un message à la fin du Attendre, il va falloir que je me fasse une scène de supervision qui checke toutes les minutes si le module est allumé ou éteint.

Merci pour l’astuce !

J’ai tenté avec le calcul de variable {"state":"ON","on_time": 1.1. Piscine (filtration_duree_cycle) *3600 ,"off_wait_time":0} et apparemment ça n’a pas fonctionné :frowning:

Il faut que je passe par une variable MQTT temporaire ?
Et le truc c’est que je n’ai aucun moyen de voir la commande envoyée (rien dans les logs Gladys, rien dans Z2M).

EDIT : finalement {"state":"ON","on_time":10800,"off_wait_time":0} ne fonctionne pas non plus :frowning:

Après quelques tests, il ne faut pas prendre l’action Envoyer un message zigbee2mqttmais Envoyer un message MQTT sinon ça ne marche pas.
@pierre-gilles il y a une différence spécifique entre les 2 actions ?

J’ai testé {"state":"ON","on_time":60,"off_wait_time":10} en MQTT (pas zigbee2mqtt) et ça fonctionne, 1 minute après le pompe s’arrête bien.

J’ai testé {"state":"ON","on_time":10800,"off_wait_time":10} et là il y a un soucis, soit côté Gladys soit z2m, car tout est multiplié par 10 et donc j’ai un out of range :

z2m: Publish 'set' 'state' to 'relais_03' failed: 'RangeError [ERR_OUT_OF_RANGE]: ZCL command 0x84b4dbfffe08ce6e/1 genOnOff.onWithTimedOff({"ctrlbits":0,"ontime":108000,"offwaittime":100}, {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":false,"direction":0,"reservedBits":0,"writeUndiv":false}) failed (The value of "value" is out of range. It must be >= 0 and <= 65535. Received 108000)'

Une idée ?

Je continue mes tests et les variables ne fonctionnent pas :


et dans les logs z2m :

z2m: Invalid message 'undefined', skipping...

pas super explicite …