je souhaiterais avoir des explications sur le fonctionnement des scenarios et surtout du multi-lancement.
j’ai fait un scenario très basique pour test. Une lampe qui s’allume et s’éteint à une heure donnée, ici 2 minutes après le lancement du scenario.
J’ai fait un premier essai sans cocher multi-lancement:
1e exécution du scenario à 9:40:40 ---->l’allumage est programmé dans le log à 9:42
2e exécution du scenario à 9:41:03 ---->l’allumage est programmé dans le log à 9:43
A 9:42, rien se passe, à 9;43 la lampe s’allume puis s’éteint. La deuxième instance du scenario a tué la première. Il n’y a que la 2e exécution qui a fonctionné.
Deuxième essai après avoir coché la case multi-lancement:
1e exécution du scenario à 9:44 —>l’allumage est programmé dans le log à 9:46
2e exécution du scénario à 9:45 —>l’allumage est programmé dans le log à 9:47
je m’attends à ce que la lampe clignote à 9:46 et 9:47 puisque qu’il devrait y avoir deux instances séparées du scénario, seulement la lampe n’a clignoté qu’à 9:47, comme si la deuxième instance avait tué la première.
Est-ce qu’il y a un bug dans le core ou est-ce que je n’ai pas compris comment fonctionne le multi-lancement?
Donc, multi-lancement, ce n’est pas multi-instance, comme deux individus complètement séparés et indépendants.
Les scenarios peuvent potentiellement exister simultanément mais le registre des actions programmées est commun, donc ils s’interfèrent. La deuxième instance écrase les actions programmées de la première.
C’est correct?
Exemple très simple où la différence sera tres claire :
Tu fais un scénario avec 2 déclencheurs, par exemple télécommande bouton 1 et bouton 2 (si pas de télécommande : avec 2 virtuels)
Un scénario avec un SI
SI : trigger(… bouton 1)==1
—- Alors : action On sur lampe 1, sleep 30 seconds, action Off sur lampe 1.
——— Sinon : action On sur lampe 2, sleep 30 seconds, action Off sur lampe 2.
Puis tu clic sur le bouton 1 de la télécommande, puis le bouton 2.
Avec un scénario où le multi-lancement :
n’est pas coché : tu vas piloter uniquement la lampe 1 (quand tu appuiera sur le bouton 2, il se passera rien, car le scénario est déjà actif -lancé par le bouton 1-)
Est coché : tu vas piloter les deux lampes (une deuxième instance va etre lancé par le bouton 2)
C’est que quand tu programme un A/Dans, s’il y en avait un déjà programmé, il sera ecrasé par le nouveau.
Scénario multi-lancement ou pas.
Ex :
Si tu as un scénario avec
Dans 30 minutes : ON sur lampe 1
Tu executes a minuit
La lampe devrait s’allumer a 00h30
Mais tu execute à nouveau à 00h10, la lampe s’allumera seulement à 00h40 (00h10 + 30 min)
Le multi lancement permet juste d’en avoir plusieurs actif en même temps, il ne change pas les règles de base….
[2024-09-21 09:49:41][SCENARIO] -- Début : Scenario lance manuellement.
[2024-09-21 09:49:41][SCENARIO] - Exécution du sous-élément de type [action] : action
[2024-09-21 09:49:41][SCENARIO] Exécution de la commande [Salle ciné][Sony vidéoprojecteur][Rafraichir]
[2024-09-21 09:49:42][SCENARIO] - Exécution du sous-élément de type [condition] : at time_op(#time#, 2)
[2024-09-21 09:49:42][SCENARIO] Evaluation de la condition : [951] = 951
[2024-09-21 09:49:42][SCENARIO] Tâche : 336 programmée à : 2024-09-21 09:51:00
[2024-09-21 09:49:42][SCENARIO] Fin correcte du scénario
------------------------------------
[2024-09-21 09:50:04][SCENARIO] -- Début : Scenario lance manuellement.
[2024-09-21 09:50:04][SCENARIO] - Exécution du sous-élément de type [action] : action
[2024-09-21 09:50:04][SCENARIO] Exécution de la commande [Salle ciné][Sony vidéoprojecteur][Rafraichir]
[2024-09-21 09:50:04][SCENARIO] - Exécution du sous-élément de type [condition] : at time_op(#time#, 2)
[2024-09-21 09:50:04][SCENARIO] Evaluation de la condition : [952] = 952
[2024-09-21 09:50:04][SCENARIO] Tâche : 336 programmée à : 2024-09-21 09:52:00
[2024-09-21 09:50:04][SCENARIO] Fin correcte du scénario
------------------------------------
[2024-09-21 09:52:03][SCENARIO] ************Lancement sous tâche**************
[2024-09-21 09:52:03][SCENARIO] - Exécution du sous-élément de type [action] : do
[2024-09-21 09:52:03][SCENARIO] Exécution de la commande [Bureau][Spots Bureau My][On]
[2024-09-21 09:52:03][SCENARIO] Pause de 2 seconde(s)
[2024-09-21 09:52:05][SCENARIO] Exécution de la commande [Bureau][Spots Bureau My][Off]
[2024-09-21 09:52:05][SCENARIO] ************FIN sous tâche**************
On voit bien que l’action programmée par les deux instances correspondent à la tâche 336.
Sans doute à tort, j’ai appelé ça le registre attribué au scenario. Il peut y avoir plusieurs lancements du même scenario avec le multi-lancement mais si l’instance lance une tâche programmée, il va l’écrire dans le registre attribué au scenario, toutes les instances partagent ce même registre et à chaque écriture, l’élément précédent est effacé. C’est donc la dernière instance lancée qui fera valoir ses actions programmées.
Dans ton cas de 2 boutons, avec multi-lancement, on pourra appuyer sur le bouton 1 puis sur le bouton 2 mais si tu rajoutes dans ton programme une action par commande de bouton du type dans 2 minutes envoie un message, tu ne recevras que le message du dernier appui.
J’ai compris l’histoire du registre
(je suis pas informaticien / il y a des trucs qui m’échappent…)
Oui, c’est exactement cela !
Ps: pour des temps courts (inférieur à 1 h : j’ai pas le nombre exact en tete) c’est l’avantage du « sleep » qui lui te permettra d’attendre…
(Il y a toujours un débat sur le sleep / je préviens donc, mais en gros aucun soucis à l’utiliser, même longtemps, SAUF si tu en as une centaine en cours en meme temps, où alors ça peut être problématique !! Aussi une histoire de DB dont je pourrais te donner les tenants et aboutissants )