Formation PUB420 : Système domotique DIY, 2020 Jeedom

5.44 Arrêter correctement un scénario avec boucle infinie


Règle générale, avec le plugin Scripts dans Jeedom, il faut éviter de lancer des scripts qui contiennent une boucle sans fin.

Parfois, cependant, la tâche à réaliser nécessite une telle boucle, par exemple pour faire clignoter une DEL branchée au GPIO.

Rappelez-vous que lorsqu'on lance le script Python à la ligne de commande, il faut appuyer sur Ctrl+C pour l'arrêter. Mais quand c'est Jeedom qui le lance, ceci n'est pas possible.

Ceci pose problème dans un système domotique qui doit démarrer ou arrêter le clignotement à l'aide d'un scénario. En effet, tant que le scénario qui a lancé le clignotement est en cours d'exécution, aucun autre script ne peut travailler avec la broche utilisée. Sans les précautions présentées plus bas, il serait impossible d'arrêter le clignotement dans Jeedom.

En effet, si vous lancez un autre script Python qui travaille avec la même broche alors que le script Python précédent est encore en cours d'exécution, vous obtiendrez une erreur du genre « ... File "/home/pi/mon_script.PY", line 34, in GPIO.setup(del, GPIO.OUT) ... lgpio.error: 'GPIO not allocated'».

Commande bash qui tue un processus

Quand un script Python est lancé, il est associé à un processus dans le système d'exploitation. Pour arrêter un script avec une boucle sans fin, il faut tuer le processus.

Pour tuer un processus au terminal, vous pouvez utiliser la commande pkill suivie de -f puis du nom du script Python.

Terminal du Raspberry Pi

sudo pkill -f clignoter.PY

Il est possible de faire de même directement dans Jeedom. Il suffit d'ajouter une commande de type action dans le plugin Script et d'entrer dans la case requête la commande pkill complète.

pkill

Quand vous lancez cette commande, il peut arriver que Jeedom affiche un message disant que la commande a retourné un code 15. Vous pouvez ignorer ce message.

S'assurer que la DEL est éteinte quand le processus est arrêté

Dans le cas d'un script qui fait clignoter une DEL, il peut arriver que la DEL demeure allumée après que le processus ait été tué.

Pour l'éteindre, vous avez deux choix :

Arrêter correctement le scénario qui a lancé le clignotement

Si vous faites afficher dans le Dashboard le scénario qui a lancé le clignotement, vous verrez une animation qui indique que le scénario est toujours en cours d'exécution et ce, même si vous avez pris soin de tuer le processus en charge du clignotement.

Scénario boucle sans fin

Le fait de tuer le processus n'arrête pas le scénario. Par contre, il est possible de demander au scénario qui doit arrêter le clignotement de commencer par arrêter le scénario précédent.

Pour qu'un scénario arrête un autre scénario, il faut choisir Sélectionner un mot-clé plutôt que Sélectionner la commande.

Sélectionner un mot-clé

Dans la liste déroulante qui apparaît, sélectionnez Scénario. Ceci permet d'avoir un scénario qui agit sur un autre scénario. 

À partir de là, vous pourrez sélectionner le scénario qui contient la boucle sans fin et choisir l'action Arrêter.

scénario qui arrête un autre scénario

Résumé du scénario qui arrête le clignotement

Si on met bout-à-bout les concepts expliqués plus haut, le scénario qui arrête le clignotement doit :

  • Arrêter le scénario qui avait lancé le cligotement
  • Tuer le processus associé au script Python qui a lancé le clignotement
  • S'assurer que la DEL est éteinte

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre