Aller au contenu

50. Contrôle GPIO avec Jeedom

50.1 En résumé...

Voici un résumé des informations essentielles du ou des prochains chapitres.

Notez que certaines fiches, qui font partie intégrante du cours, pourraient ne pas figurer dans ce résumé.

Je vous recommande d'effectuer une lecture de l'ensemble des fiches de ces chapitres afin de bien saisir les enjeux.

Lancer un script python avec le plugin script

Une fois le script Python écrit et testé à la ligne de commande, on peut le faire exécuter par Jeedom à l'aide du plugin Script.

Pour lancer le script, il faut ajouter un équipement (ce sera en fait une commande vers le script).

Rendez-vous dans le menu Plugins / Programmation / Script puis cliquez sur le +.

Donnez un nom à l'équipement, par exemple « Allumer DEL rouge ».

Cochez la case Activer pour que le script puisse être utilisé.

Si désiré, activez la case Visible pour rendre l'équipement visible sur le Dashboard. Notez que le script pourra fonctionner même s'il n'est pas visible.

Équipement dans le plugin Script

Cliquez ensuite sur l'onglet Commandes puis sur Ajouter une commande script.

Donnez un nom à la commande (ex : Lancer).

Le type doit être à Action.

Dans la case Requête, entrez une commande sous la forme sudo python3 /chemin/nom_du_script.PY.

  • Vous devez préciser le chemin complet du script.
  • Le nom du fichier doit se terminer par .PY en majuscules (ou autre extension de votre choix) car l'extension .py est automatiquement interprétée par Jeedom comme du Python 2.

Après avoir sauvegardé, vous pouvez cliquer sur le bouton Tester afin de voir si tout fonctionne.

Onglet Commandes

Le script Python, qui est une commande d'un équipement au yeux de Jeedom, peut désormais être utilisé au même titre que n'importe quelle autre commande dans vos scénarios Jeedom!

Scénario qui lance un script

Arreter correctement un scenario avec boucle infinie

Si un scénario lance un script Python qui fait clignoter une DEL (donc avec boucle infinie), on pourra arrêter le clignotement à l'aide d'un autre scénario qui se charge de :

  • Arrêter le scénario qui avait lancé le cligotement

Arrêter un scénario * Tuer le processus associé au script Python qui a lancé le clignotement à l'aide d'une commande du genre :

Terminal du Raspberry Pi

  sudo pkill -f clignoter.PY
* S'assurer que la DEL est éteinte : + lancer un script Python qui se charge d'éteindre la DEL

ou

50.2 Lancer un script Python avec le plugin Script

Le plugin Script, comme son nom le laisse entendre, permet de lancer à partir de Jeedom des scripts présents sur le Raspberry Pi.

Les possibilités offertes par ces scripts sont quasi illimitées. On s'en servira, notamment, de contrôler les ports du GPIO du Raspberry Pi.

Installation du plugin

Pour installer le plugin Script, rendez-vous dans Plugins / Gestion des plugins / Market.

Dans la zone de recherche, entrez script.

Cliquez sur le plugin Script - officiel par Jeedom SAS.

Plugin Script

Activation du plugin

Dans l'interface de Jeedom, rendez-vous dans le menu Plugins / Programmation / Script puis cliquez sur l'icône Configuration.

Pour activer le plugin, cliquez sur le bouton Activer dans la zone État.

Édition d'un script

Bien entendu, pour que le plugin exécute un script, il faut éditer ce script.

Plusieurs types de scripts sont supportés :

  • Script : Python ou Bash
  • HTTP
  • HTML
  • XML
  • JSON

Pour lancer une commande ou une série de commandes qui contrôlent une LED, un script Python est un excellent choix.

Pour éditer ce script, vous avez le choix entre :

  • écrire le fichier directement sur le Pi par exemple avec l'éditeur nano
  • l'écrire directement dans Jeedom
  • l'écrire sur votre ordinateur personnel puis de le copier sur le Pi Conseil.

Attention : si vous éditez le script sur un ordinateur Windows, les caractères de fin de ligne ne sont pas reconnus par Linux et Jeedom réagira en vous disant que le fichier n'existe pas.

Vous devez absolument changer l'encodage des fins de lignes afin que Linux puisse utiliser le fichier.

Dans le cas d'un script Python 3, le nom du fichier doit se terminer par .PY en majuscules (ou autre extension de votre choix) car l'extension .py est automatiquement interprétée par Jeedom comme du Python 2.

Pour renommer votre script :

Terminal du Raspberry Pi

mv /home/pi/mon_script.py /home/pi/mon_script.PY

Emplacement des scripts

Le script Python peut être placé n'importe où sur le Raspberry Pi.

Sachez que si le script est placé dans le dossier /var/www/html ou dans un de ses sous-dossiers, il fera automatiquement partie de la copie de sécurité de Jeedom.

Mais j'avoue que pour fins de simplicité, je place souvent mes scripts sous /home/pi (le dossier personnel de l'usager pi) puisque c'est le dossier qui apparaît lorsqu'on accède au Terminal à partir d'un clavier et d'un écran branchés au Pi ou via SSH.

À ce moment, je suis responsable d'effectuer mes copies de sécurité.

Il revient à chacun d'assumer ses choix!

Remarquez que sous Plugins / Programmation / Script / Configuration, la case Chemin des scripts utilisateur indique l'emplacement où seront enregistrés les scripts qui sont créés directement dans Jeedom.

Chemin des scripts utilisateur

Lancement du script à partir de Jeedom

Pour lancer le script, il faut ajouter dans le plugin Script un équipement puis une commande.

Rendez-vous dans le menu Plugins / Programmation / Script puis cliquez sur le +.

Donnez un nom à l'équipement, par exemple « Allumer DEL rouge ».

Cochez la case Activer pour que le script puisse être utilisé.

Si désiré, activez la case Visible pour rendre l'équipement visible sur le Dashboard. Notez que le script pourra fonctionner même s'il n'est pas visible.

Équipement dans le plugin Script

Cliquez ensuite sur l'onglet Commandes puis sur Ajouter une commande script.

Donnez un nom à la commande (ex : Lancer).

Le type doit être à Action.

Il est possible d'éditer le script directement dans Jeedom en cliquant sur l'icône Nouveau ou de faire référence à un script existant.

Dans cette démonstration, j'utilise un script existant.

Dans la case Requête, entrez une commande sous la forme sudo python3 /chemin/nom_du_script.PY.

Vous devez préciser le chemin complet du script.

Après avoir sauvegardé, vous pouvez cliquer sur le bouton Tester afin de voir si tout fonctionne.

Onglet Commandes

Lancer le script à partir d'un scénario

Le script, qui est une commande d'un équipement au yeux de Jeedom, peut désormais être utilisé au même titre que n'importe quelle autre commande dans vos scénarios Jeedom!

Scénario qui lance un script

Quelques erreurs courantes

Extension .PY

Dans le cas d'un script Python 3, il faut changer l'extension du fichier pour .PY (en majuscules).

Si le nom se termine par .py, il sera considéré par Jeedom comme étant un fichier Python 2 et Jeedom ajoutera automatiquement la commande python devant la commande entrée. Vous obtiendrez alors un message d'erreur du genre « Erreur sur python sudo python3 /home/pi/allumer_led.py 2>&1 valeur retournée : 2. Détails : python: can't open file 'sudo': [Errno 2] No such file or directory ».

can't open file 'sudo': [Errno 2] No such file or directory

sudo

Pour qu'un script Python puisse interagir avec le GPIO, vous devez précéder la commande par sudo.

Si vous ne le faites pas, vous obtiendrez un message du genre « Erreur sur python3 /home/pi/allumer_led.PY 2>&1 valeur retournée : 1. Détails : Traceback (most recent call last): File "/home/pi/allumer_led.PY", line 23, in GPIO.setup(led, GPIO.OUT) RuntimeError: No access to /dev/mem Try running as root! ».

RuntimeError: No access to /dev/mem Try running as root!

Chemin du script

Vous devez spécifier le chemin complet du script.

Si vous ne le faites pas, vous obtiendrez un message du genre « Erreur sur sudo python3 allumer_led.PY 2>&1 valeur retournée : 2. Détails : python3: can't open file 'allumer_led.PY': [Errno 2] No such file or directory ».

can't open file 'allumer_led.PY': [Errno 2] No such file or directory

Droits d'exécution ou python3

Un script Python peut être exécuté de deux façons : en faisant précéder son nom par python3 ou en donnant des droits d'exécution au fichier.

Si l'usager courant n'a pas les droits d'exécution sur le fichier et que vous n'avez pas fait précéder son nom par python3 dans la commande sous Jeedom, vous obtiendrez un message du genre « Erreursur sudo /home/pi/allumer_led.PY 2>&1 valeur retournée : 1. Détails :sudo /home/pi/allumer_led.PY: command not found ».

(image)

Pour plus d'information

« Plugin Script ». Plugin Script. https://doc.jeedom.com/fr_FR/plugins/programming/script/

50.3 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,clignoter.

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 de scénarios. En effet, tant que le clignotement est en cours, aucun autre script Python ne peut travailler avec la broche utilisée, même pas pour lui envoyer le signal de s'éteindre. Si vous tentez de le faire, 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'».

Pour qu'un scénario puisse arrêter correctement le clignotement, il doit :

Arrêter 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 (technique présentée plus bas).

Scénario boucle sans fin

Heureusement, 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

Tuer le processus associé au script Python qui a lancé le clignotement

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 alors qu'il a été lancé au terminal, il est possible d'arrêter ce processus en appuyant sur les touches Ctrl+C.

Dans le cas où il a été lancé dans Jeedom, il faut utiliser la commande pkill suivie de -f puis du nom du script Python.

Cette commande peut être testée au terminal.

Terminal du Raspberry Pi

sudo pkill -f clignoter.PY

Dans Jeedom, le processus sera tué à l'aide du plugin Script. Il faut créer une commande de type action dans la quelle on entre 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

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é. Tout dépend de l'état dans lequel elle se trouvait au moment précis où le processus a été tué.

Pour l'éteindre, vous avez deux choix :

  • lancer un script Python qui se charge d'éteindre la DEL

ou * lancer le script Python qui se charge de réinitialiser toutes les broches

50.4 Lancer un script Python avec paramètre à partir de Jeedom

Un script Python peut recevoir des paramètres.

Le plugin Script de Jeedom permet de lancer un script Python en lui passant un ou plusieurs paramètres.

Il suffit d'entrer dans la case Requête une chaîne au format :

sudo python3 /chemin/nom_script.PY paramètre

paramètres