Voilà maintenant près d'un mois que Joël m'avais contacté pour savoir s'il était possible d'envoyer un SMS sur le changement d'état d'une GPIO, contré par un contact sec de relais. Je lui avais répondu qu'il n'y avait aucune difficulté et promis de réaliser un petit tuto à ce sujet d'ici la fin du mois de Juillet. Il est donc (juste à) temps de répondre à cette demande...
Joël dispose d'une installation de type alarme résidentielle et motorisation de portail électrique. Il dispose d'un relais à contact sec qui se ferme lorsque les deux conditions sont réalisés :
- son alarme d'habitation est activée
- son portail est fermé
Il souhaite envoyer un seul message SMS lorsque cette condition est rempli.
Voilà donc un problème simple à résoudre et j'ai choisi de le faire avec un flow Nodered car l'exercice est le pendant du sujet traité par Ingrid dans l'article Détecter la réception de SMS avec Nodered. De plus, il est facile d'imaginer plusieurs flow actifs pour gérer plusieurs process différents.
Je suis donc parti d'une carte SD de 8GB avec une installation Nadbian toute fraîche dont vous trouverez le tutoriel ici. Cette distribution est entièrement paramétrée pour l'utilisation d'une carte SIM Free, avec code pin désactivé.
Coté matériel, je me suis décidé à exploiter la GPIO.0 (broche 6, BCM27) pour lire l'état du relais. Pour cela j'ai câblé :
- entre la broche 11 (GPIO.0) et la broche 17 (GND) une résistance de tirage à la masse de 330 ohms (code couleur ORANGE/ORANGE/MARRON)
- entre la broche 11 (GPIO.0) et la broche 9 (P3V3) un interrupteur poussoir ON/OFF (avec mémoire mécanique de l'état), afin de simuler le relais.
Voilà en photo le câblage réalisé :
Passons maintenant aux tests, et commençons interrupteur ouvert. Dans une fenêtre de terminal, tapez la commande :
gpio readall
Vous devriez obtenir un écran similaire à celui ci avec la GPIO.0 lue à zéro (colonne V) :
Je bascule l'interrupteur en position fermé et je relance la commande :
gpio readall
Vous devriez obtenir un écran similaire à celui ci avec la GPIO.0 lue à un (colonne V) :
Nous voilà maintenant sûr que le câblage est correct. La carte NadHAT est automatiquement mise sous tension au démarrage de la distribution. La led verte allumée en continue en atteste. Reste à vérifier que le deamon gammu-smsd tourne correctement en tâche de fond et reste prêt à envoyer (ou à recevoir) un SMS. Pour cela, tapez la commande :
systemctl status gammu-smsd.service
Vous devriez obtenir la réponse suivante :
qui mentionne le bon fonctionnement du service. Pour s'en assurer, nous pouvons maintenant envoyer en ligne de commande un SMS avec la commande suivante (en indiquant u numéro de téléphone portable valide :
sudo gammu-smsd-inject TEXT 06xxxxxxxx -text "Nous sommes le `date`"
Ce qui donne pour résultat :
Et, en toute logique, envoie sur votre téléphone le SMS suivant :
Voilà, vous connaissez toutes les ficelles, nous pouvons maintenant prendre de la hauteur et développer un petit flow sous Nodered qui enverra un SMS après la fermeture de l'interrupteur, avec une attente de 5s. Prenons un navigateur sur un ordinateur connecté à votre réseau local tout comme votre carte Raspberry pi zéro W et tapez l'adresse attribué à votre carte suivi du port 1880. Cela donne par exemple pour l'adresse IP 192.168.1.12 dans la barre d'adresse de votre navigateur :
http://192.168.1.12:1880
L'interface Nodered s'affiche :
Afin de gagner du temps, et en espérant en trouver pour remplacer cette ligne par une petite vidéo YT explicative, voici le code du flow, à copier dans le presse papier :
[{"id":"6ae401c1.270d2","type":"rpi-gpio in","z":"5f9da11a.bb2a7","name":"GPIO.0","pin":"11","intype":"down","debounce":"500","read":false,"x":80.5,"y":77,"wires":[["e53d4840.62f658"]]},{"id":"e53d4840.62f658","type":"trigger","z":"5f9da11a.bb2a7","op1":"","op2":"0","op1type":"nul","op2type":"str","duration":"5","extend":false,"units":"s","reset":"1","name":"","x":251.5,"y":77,"wires":[["4a35f73d.396358"]]},{"id":"4a35f73d.396358","type":"exec","z":"5f9da11a.bb2a7","command":"sudo gammu-smsd-inject TEXT 06xxxxxxxx -text \"Maison fermée le `date`\"","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":true,"name":"","x":641.5,"y":77.5,"wires":[[],[],[]]}]
Réalisez ensuite les trois opérations suivantes dans l'interface WEB de Nodered :
- Ouvrez le menu droite, sélectionner Import, puis Clipboard : un fenêtre s'ouvre dans laquelle vous pouvez coller le code ci-dessus, puis appuyez sur le bouton PASTE. Le flow comprenant 3 nodes s'affiche, placez le puis cliquer pour l'ancrer.
- Double-cliquez sur le node EXEC couleur saumon afin d'éditer le numéro de téléphone destinataire du SMS dans la section command. A la fin de l'édition, cliquez sur le bouton DONE
- Cliquez sur le bouton Deploy, qui passe alors de couleur rouge à gris foncé. Votre flow est actif.
Dès maintenant, en actionnant l'interrupteur et le laissant fermé pendant plus de 5 secondes, j'envoie un SMS sur mon téléphone portable.
Quelques explications :
> Le premier node est un node de lecture de GPIO spécifique à la carte Raspberry PI, en cas de changement d'état de l'entrée, il envoie sur sa sortie dans la variable msg.payload le nouvel état de la broche sous forme de texte : "0" ou "1".
> Le second node est un node TRIGGER qui à son démarrage n'envoie rien en sortie. Le msg.payload="0" du flow amont (la gpio) réinitialise en permanence le trigger, il ne se passe rien sur sa sortie. Par contre, en présence d'un msg.payload="1" maintenu pendant plus de 5 secondes propage le message sur la sortie.
> Le troisième node est un node de type EXEC, il exécute la commande "sudo gammu-smsd-inject" à la réception sur son entrée du signal du trigger. Le contenu du message amont est sans importance, le trigger ne laisse traverser que les signaux contenant un msg.payload="1". Ainsi, seule les transitions de 0 à 1 de la GPIO.0 sont traitées.
Vous pouvez tour à tour double cliquer sur chaque node afin de comprendre son paramétrage.
Le mot de la fin :
Vous pouvez cumuler les flows sans restrictions et par delà associer à plusieurs GPIO, autant en entrée qu'en sortie, un mode d'action ou de réaction choisi, chaque flow étant indépendant. C'est un avantage de la programmation graphique avec Nodered qui se différencie d'une programmation par algorithme plus traditionnelle.
Bon développement.