Scénario Multi Lancement : arrêter les autres instances en cours

Bonjour,
J’ai un scénario multi lancement, je voudrais lorsque celui ci démarre qu’il arrête toutes les autres instances déjà lancées / en cours de lui même.
Savez vous comment je peux faire ?
Merci :slight_smile:

Quand tu ajoutes une action dans 1 scénario :
sélection mot clé
Scénario
Choisir le scénario concerné
Puis l’action à lui faire : active, désactive, start, stop, etc…

Cela convient ?

Salut Tam85,
En fait non, voici le détail.
J’ai deux scénarios :

  • Allumer la lumière pour 10s. J’ai activé le multi lancement car je veux pouvoir le lancer plusieurs fois.
  • Allumer l’alarme : qui lui allume la lumière

Sauf que si j’appelle deux fois le allumer la lumière avec un interval de 5s j’ai une instance du scénario qui tourne pendant qu’un deuxième lancement démarre.

Je voudrais pouvoir arrêter la première instance quand la deuxième tourne. Donc quand je suis au début du scénario allumer la lumière je voudrais pouvoir arrêter toutes les autres instances qui tourne de lui même mais je ne peux pas utiliser le stop. Car le stop sur ce scénario arrête ce scénario là, pas les autres qui tournent déjà.

Tu vois ce que je veux dire ?
Merci à toi

Tu peux lancer une 2eme fois un scénario sur une PAUSE en cours ?
Je ne me sers très peu (que dans des scénario non imbriqués) des PAUSES car elles sont contraignantes.

Lance toutes les autres lumières sur un autre scénario, commandé par le premier.
Tu pourras mettre le STOP que sur ce scénario et sans stopper le premier.

Hum je ne suis pas sur de comprendre. Je vais être beaucoup plus précis.

La majorité de mes scénarios sont vu comme des fonctions que j’appelle à tout bout de champ.
Scénario 1 : fonction qui permet d’allumer ma gateway xiaomi avec en paramètre (tag) : la durée de la lumière, la couleur, et si je veux que ca clignote ou pas.

Ensuite j’ai plusieurs scénarios qui appellent cette fonction.
Scénario 2 : détecte une présence si l’alarme est allumée et envoi la lumière pendant 5min (via scénario 1)
Scénario 3 : désactive l’alarme et allume la gateway pendant 5sec (via scénario 1)

J’ai toujours scénario 2 puis scénario 3 dans cet ordre lorsque je rentre, et je voudrais donc que la fonction allumer la gateway eteigne automatiquement les autres instances d’elles même (car plus valide puis que j’ai désactivé l’alarme) avant de lancer cette nouvelle instance.
Je ne voudrais pas faire le stop dans le scénario 3 avant l’appel du scénario 1 car cela voudrait dire que je sais à l’avance qu’une autre instance de scénario 1 tourne. D’où le fait que je veuille le faire à l’intérieur du scénario 1.

C’est plus clair ?
Merci en tout cas !

Désolé, c’est difficile à comprendre et de se mettre dans la tête de celui qui écrit ses scénarios.

On écrit souvent en fonction de sa propre logique et pas celle du système…

Mais tu peux très bien dans un scénario X, faire un Start d’un scénario Y sous condition, puis ensuite faire un stop du scénario X, etc… (je pratique ainsi)
Après lorsqu’il y en beaucoup d’imbriqué c’est plus dur à suivre.

Oui je comprends très bien, merci de ton aide dans tous les cas !
En fait c’est ce que je fais, sauf que lorsque je stoppe le scénario X qui a fait un start du scénario Y cela n’arrête pas le scénario Y … et c’est ça que je veux faire :slight_smile:

Bonjour Chatelar, je viens de tomber sur thread et je me demandais si tu avais trouvé une solution car j’ai la même problématique sur un scénario avec une temporisation de 10s. Merci à toi.

Salut,
Non je n’ai pas remis la tête dedans. Avec du code PHP ce doit être faisable mais je n’ai pas encore regardé de plus près…
On m’a donné un bout de code pour stopper le lancement programmé d’un autre script (genre lancé via « Dans 30min »). Cela doit s’adapter j’imagine

Bonjour,
Je n’ai pas testé mais…
Si ton scénario « fonction » appelé par les autres est le scénario 1 (comme dans ton exemple), et que tu ne sais jamais s’il est déjà lancé lorsque’un scénario 2 ou 3 va le lancer lui-même.

Est-ce que tu ne peux pas mettre dans tes scénarios 2 et 3 une commande qui stoppe systématiquement le scénario 1 (sans condition) juste avant la commande de lancement de celui-ci. S’il était déjà en cours, cela va le stopper avant que tu le relances (donc toujours une seule instance qui tourne) et s’il n’était pas en cours, ta commande d’arrêt du scénario est de toute façon sans effet.

Salut @FredT,
Oui tu as tout à fait raison. Mais cela oblige à avoir connaissance de ce mode de fonctionnement en dehors de la fonction.
Ce qui n’est pas idéal, mais tu as tout à fait raison, c’est mon moyen de contournement actuel.

Pour te faciliter les choses, tu nommes ces scénario d’une façon spécifique genre « Fonction_… » qui te rappellera systématiquement de toujours faire un stop avant appel :slight_smile:

1 « J'aime »

Je suis exactement dans le même cas (en gros un scénario qui allume la lumière X secondes lors d’une détection de mouvement, j’aimerais que si un nouveau mouvement est détecté cela relance le scénario au début en arrêtant l’autre instance en cours) mais je n’ai rien trouvé.

Quelqu’un sait si il existe une commande php permettant de lister les instances en cours d’un scénario ? Auquel cas ça serait assez facile ensuite de stopper les autres.

Ce n’est pas comme cela qu’il faut procéder pour la gestion des lumières, pas la peine d’avoir un scénario qui reste « en cours », il faut allumé la lumière sur déclencheur et ensuite un simple bloque DANS qui sera automatiquement réinitialisé.
Chercher les autres sujets qui en parlent, il y en a plein;

Le problème est bien plus complexe que ça. Le scénario doit gérer l’allumage/extinction des lumières en cas de passage mais aussi les interrupteurs qui si ils sont activés doivent désactiver/activer la gestion des lumières par les détecteurs (et aussi allumer/éteindre la lumière bien entendu), sans compter d’autres paramètres comme l’heure, la luminosité, la présence dans la maison, etc.
Ça fait quelques mois que je suis dessus et j’en suis à mon troisième scénario (le premier en blocs, les autres en php).
Si il n’y avait que les détecteurs à gérer, en effet un bête scénario avec un si mouvement = allumer lumière, dans 5 minutes si plus mouvement = éteindre lumière suffirait amplement.

Bref ma gestion des lumières n’étant absolument pas le sujet de ce topic je revient sur le sujet principal qui est d’arrêter les autres instances d’un scénario multi-lancement:

Après avoir fouillé dans les classes core/scenario.class.php et core/system.class.php, la solution pour qui veut le faire en php est au final assez simple à déduire.
J’en suis arrivé à ceci:

//Récupération du PID de l'instance actuelle
$pid = $scenario->getPID();

//Récupération de toutes les autres instances lancées en excluant l'actuelle
$instances = system::ps('scenario_id='.$scenario->getId(), $pid);
foreach($instances as $key => $instance)
{
	$scenario->setLog('Instance to kill '.$key.' => PID: '.$instance['pid']);
  	//Arrêt des autres instances
  	system::kill($instance['pid']);
}

Ce code va donc faire en sorte que seule la dernière instance reste active, chaque nouvelle instance tuant les précédentes. Testé et approuvé.

@chatelar Si tu es toujours intéressé, ce simple bloc code dans ton scénario suffira à tuer les autres instances en laissant la dernière en vie.

Excellent merci @Blm79 je vais essayer ça sur mon scénario fonction ! :nerd_face:

1 « J'aime »

Dis moi si tu as un soucis, perso chez moi ça fonctionne bien. :slight_smile:
Quand je vois que dans le code de la classe scénario il y a une boucle qui fait jusqu’à dix essais de kill, je me dis que chez certains ça prend peut-être plus de temps à le faire.

Ca me paraît très bien, je n’ai pas encore rencontré le cas du double appel vraiment en même temps pour voir le comportement (surtout que c’est max 5s donc avec l’ordonnancement pas sûr que cela prenne le pas) mais ça à l’air de bien faire le taf merci !

EDIT : à ne pas utiliser !!! En fait, le kill se fait sur le parent sauf que dans le cas suivant :
Scénario A appelle Scénario B (scénario B est celui qui possède ce bout de code d’unicité) alors Scénario A est aussi tué !

------------------------------------
[2020-09-17 19:13:50][SCENARIO] Start : Lancement provoque. Tags : {"#couleur_xiaomi_gateway#":"\"#ff0000\"","#sleep_xiaomi_gateway#":"\"5\""}
[2020-09-17 19:13:50][SCENARIO] Exécution du sous-élément de type [action] : code
[2020-09-17 19:13:50][SCENARIO] Exécution d'un bloc code
[2020-09-17 19:13:50][SCENARIO] Exécution du sous-élément de type [action] : action
[2020-09-17 19:13:50][SCENARIO] Suppression des blocs DANS et A programmés du scénario
[2020-09-17 19:13:50][SCENARIO] Exécution de la commande [Appartement][Gateway][Définir Couleur] avec comme option(s) : {"background":"0","color":"#ff0000"}
[2020-09-17 19:13:51][SCENARIO] Exécution d'un bloc élément : 162
[2020-09-17 19:13:51][SCENARIO] Exécution du sous-élément de type [condition] : if
[2020-09-17 19:13:51][SCENARIO] Evaluation de la condition : [""=="yes"] = Faux
[2020-09-17 19:13:51][SCENARIO] Exécution du sous-élément de type [action] : else
[2020-09-17 19:13:51][SCENARIO] Exécution de la commande [Appartement][Gateway][On]
[2020-09-17 19:13:51][SCENARIO] Pause de 5 seconde(s)
[2020-09-17 19:13:56][SCENARIO] Exécution de la commande [Appartement][Gateway][Off]
[2020-09-17 19:13:56][SCENARIO] Fin correcte du scénario
------------------------------------
[2020-09-17 19:14:02][SCENARIO] Start : Lancement provoque. Tags : {"#couleur_xiaomi_gateway#":"\"#00ff00\"","#sleep_xiaomi_gateway#":"\"5\""}
[2020-09-17 19:14:02][SCENARIO] Exécution du sous-élément de type [action] : code
[2020-09-17 19:14:02][SCENARIO] Exécution d'un bloc code
[2020-09-17 19:14:03][SCENARIO] Instance to kill 0 => PID: 18625
[2020-09-17 19:14:03][SCENARIO] Exécution du sous-élément de type [action] : action
[2020-09-17 19:14:03][SCENARIO] Suppression des blocs DANS et A programmés du scénario
[2020-09-17 19:14:03][SCENARIO] Exécution de la commande [Appartement][Gateway][Définir Couleur] avec comme option(s) : {"background":"0","color":"#00ff00"}
[2020-09-17 19:14:03][SCENARIO] Exécution d'un bloc élément : 162
[2020-09-17 19:14:03][SCENARIO] Exécution du sous-élément de type [condition] : if
[2020-09-17 19:14:03][SCENARIO] Evaluation de la condition : [""=="yes"] = Faux
[2020-09-17 19:14:03][SCENARIO] Exécution du sous-élément de type [action] : else
[2020-09-17 19:14:03][SCENARIO] Exécution de la commande [Appartement][Gateway][On]
[2020-09-17 19:14:03][SCENARIO] Pause de 5 seconde(s)
[2020-09-17 19:14:08][SCENARIO] Exécution de la commande [Appartement][Gateway][Off]
[2020-09-17 19:14:08][SCENARIO] Fin correcte du scénario

Effectivement on voit bien qu’au premier lancement il n’y a rien mais qu’au second il trouve une instance à stopper. De rien :slightly_smiling_face:

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.