Scénario qui s'auto active/désactive via un bloc "Dans"

Bonjour,

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 ?

Merci par avance pour votre aide :slight_smile:

Cdt,

Mick74

Bonjour,

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 ».

Ce sera justement la solution.
Deux scénarios qui s’activent mutuellement et se désactivent à la fin de leur exécution.

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 :wink:
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

1 « J'aime »

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 ?

As-tu compris ma proposition? Pas de sleep et un seul scénario.

Non ca évite, c’est mieux de stopper le scénario et qu’il redémarre plus souvent même s’il se coupe tout de suite pcq la condition n’est pas remplie.

la proposition de @mich0111 peut convenir aussi, à toi de voir, il y a toujours plusieurs façon de faire

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 :slight_smile:

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.

Le scénario est terminé c’est le gestionnaire de tâche qui prend la main

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 :wink:

Le scheduler:

Mon scénario principale avec mes pauses :

Encore merci pour votre aide et les détails sur les comportements.
Bonne continuation :slight_smile:

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…