J’ai créé un scénario pour gérer un chauffage Dyson quand il y a une présence dans la pièce.
Pour gérer une durée entre des actions et éviter que les déclencheurs, qui sont le capteur de mouvement et la température de la pièce, relancent à chaque fois le scénario et donc passe toutes les conditions, je pensais désactiver durant une période le scénario pour garantir un temps de chauffe minimal et éviter qu’il se coupe, recoupe etc.
Pour cela j’ai voulu implémenter le bloc « Dans » pour qu’un cron soit créé et qu’il active ou désactive le scénario selon la situation après une certaine période.
En gros je lui dis de relancer dans 10mn le scénario que je coupe après.
Or lorsque le cron est lancé, il me dit qu’il peut pas procéder à la suite car le scénario est désactivé…
[2021-01-20 16:45:05][SCENARIO] Evaluation de la condition : [10] = 10
[2021-01-20 16:45:05][SCENARIO] Tâche : 170 programmée à : 2021-01-20 16:55:05 (+ 10 min)
[2021-01-20 16:45:05][SCENARIO] Désactivation du scénario : Chauffage Si Presence
[2021-01-20 16:45:05][SCENARIO] Fin correcte du scénario
------------------------------------
[2021-01-20 16:55:03][SCENARIO] Scénario désactivé non lancement de la sous tâche
J’ai l’impression qu’il a besoin de relancer le scénario pour comprendre qu’elle est la sous tache… du coup conflit.
Savez vous comment il serait possible de procéder ? Hormis dissocier en 2 scénarios ?
Ce n’est pas possible.
Il n’est pas possible d’exécuter un scénario ou tout bloc en faisant partie si celui-ci est désactivé.
Donc un scénario ou tout bloc en faisant partie ne peut pas « s’auto-activer ».
Merci pour le retour.
Donc cela veut dire qu’il est obligatoire de dissocier les scénarios ou sinon je dois mettre un sleep de 600s pour le mettre en pause, c’est bien cela ?
Mais au final, mettre un scénario qui va scruter un autre scénario toutes les secondes, c’est pas mieux… autant laisser le principal s’activer à chaque mouvement ou changement de température et mettre la condition qui va bien pour pas trop charger le système… Non ?
Dans ton scénario, tu peux commencer par tester l’état du détecteur de mouvement et si actif, faire un DANS 2 mn par exemple qui ne fait que relancer le même scenario.
Si le capteur est inactif alors tu éteins
c’est pas faux
faut penser à la « maintenance » aussi. Dans 6 mois ca sera plus facile de se rappeler le tout avec un seul scénario que de devoir se rappeler qu’en fait il y a un autre scénario qui interagit avec celui-ci
Yes, c’est ça… faire un scénario « coordinateur » de scénarios, ça risque vite d’être galère à maintenir…
Après le sleep, faut juste pas trop en abuser car cela met en pause le process et cela peut poser problème s’il y en a dans tous les sens, c’est bien ça ? Du coup un petit sleep de 5mn ou 10, vu que c’est pas un scenario parallélisé, cela ne devrait pas trop poser de pb, non ?
Non, justement je la relisais car je ne vois pas où tu veux en venir.
La seule chose que je verrais c’est mettre un « compteur » qui serait activé à la mise en route du chauffage, genre une variable à 5 et mettre un dans 2mn qui relancerait à chaque fois et décrémenterait la variable. Et une fois à 0, tu passes à la suite pour passer dans toutes les conditions.
Après je pense qu’il y a des tonnes de possibilités différentes.
En tout cas merci pour la confirmation du fait que c’était pas possible de s’auto réactiver. C’était ma principale interrogation. Pour la suite je devrais trouver des idées
Merci encore pour votre aide et les propositions !
Soit je n’ai pas compris ton besoin, soit tu n’as compris ce que je t’ai proposé.
Pour ne pas passer à côté, voici ma proposition.
Scénario toto
Déclencheur : détecteur de mouvement
SI détecteur == 1
ALORS
. DANS 2
. démarrer scénario toto
SINON
. Éteindre
Comme ça tu n’eteinds que quand le détecteur est inactif et tu ne bloques pas le scénario par un sleep en créant des tâches dans le cron qui seront examinées toutes les 2mn ou autre chose si tu veux.
Oui je pense que ça ne convient pas vraiment à mon cas car je prends également en compte la température de la pièce pour prendre des décisions suivant l’évolution de la température.
En fait ma situation très simplifiée est la suivante:
Déclencheur: Mouvement + Température
SI temp<consigne && var(chauffageON) == 0
ALORS
j’allume le chauffage
var(chauffage) = 1
j’attends au minimum 10 mn avant de reprendre une décision (qui sera liée à l’évolution de la temp dans la pièce)
SINON
SI temp>=consigne && var(chauffageON) == 1
ALORS
je coupe le chauffage
var(chauffage) = 0
j’attends au minimum 15 mn avant de redéclencher le scénario
En fait, une autre question me vient en tête.
Quand on fait un « Dans », il va lancer une action à cet instant là. Mais de ce que je comprends et ai constaté, il continue le scénario normalement. Par contre, est-ce qu’il considère que le scénario est terminé (et donc qu’un autre déclencheur le relancera), ou est ce qu’il reste running tant que le cron ne s’est pas déclenché ?
C’est un scénario que je vais améliorer (j’ai fait ça en 2/2 car j’avais froid ce matin et j’avais la flemme d’allumer, éteindre, allumer le chauffage), je me posais surtout des questions dans la gestion du temps dans les scénarios.
Je m’auto réponds:
Dans : Permet de lancer une action dans X minute(s) (0 est une valeur possible). La particularité est que les actions sont lancées en arrière-plan, elles ne bloquent donc pas la suite du scénario. C’est donc un bloc non bloquant.
Donc c’est pas si simple, il va falloir que je réfléchisse à tête reposée car pour moi je voudrais qqc de bloquant afin de ne pas relancer le scénario à chaque changement de température et détection de mouvement.
Ok, merci pour l’info, donc ça veut dire qu’il peut être à nouveau réenclenché… Ce qui fait qu’il y aurait des taches dans tous les sens… pas terrible quoi…
Du coup après réflexion, et si les wait ne sont pas à éviter comme les sleep, j’ai fait comme cela:
Déclencheur: Mouvement + Température
SI (temp<consigne && var(chauffageON) == 0)
ALORS
* j’allume le chauffage
* var(chauffage) = 1
* WAIT jusqu'à ce que la température dépasse la consigne, timeout 15mn
SINON
SI (temp>=consigne && var(chauffageON) == 1)
ALORS
* je coupe le chauffage
* var(chauffage) = 0
* WAIT que la température redescende avant de redéclencher le scénario, timeout 30mn
SINON
* WAIT jusqu'à ce que la température dépasse la consigne, timeout 5mn
Non ce n’est pas très grave.
Tu peux très bien déclencher ton scénario à chaque changement de température, tester où tu en es et décider d’allumer, d’éteindre ou de ne rien faire.
L’impact cpu sera vmt minim, c’est fait pour.
Je trouve ça même mieux que de faire un wait.
Alors du coup j’ai tout rechangé et fais les choses dans les règles de l’art.
Finalement j’ai créé un scénario « scheduleur » qui reçoit des paramètres et qui pilote en désynchro le scénario réel. Ainsi, dans mon scénario réel, je programme le déclenchement de mon scheduler en lui donnant l’action à faire (ENABLE/DISABLE), la durée d’attente souhaitée et le scénario concerné, puis je désactive mon scénario principale.
Ainsi, le scheduler reçoit la commande, crée la tache via un bloc « DANS » avec la durée souhaitée.
Du coup j’ai un scénario modulaire que je pourrai utiliser un peu partout
Salut,
tu n’as pas besoin de ton bloc code avant je pense, tu peux passer la valeur par défaut quand tu appelles ton tag, s’il n’existe pas tu recevras donc cette valeur.
donc par exemple, dans ton bloc DANS, tu écris simplement
tag(duree, 5)
et cela retournera la valeur de duree ou 5 si duree n’existe pas.
Merci pour ton retour. Je n’avais pas vu qu’il y avait aussi ce contrôle possible de valeurs par défaut via les tags. Je n’y avais pas pensé, surtout que je le fais avec les variables…