Découverte de Node-RED, un puissant logiciel d'automatisation

Node-RED est un outil d'automation de flux vous permettant de contrôler et interconnecter des services cloud ou des objets connectés entre eux.

Découverte de Node-RED, un puissant logiciel d'automatisation

Le précédent article, vous présentant Huginn et n8n, des outils d'automatisation pour vous affranchir d'IFTTT, semble vous avoir bien plu au vu du trafic généré et des réactions que nous avons reçus, en commentaire ou en direct.

Huginn et n8n, des alternatives à IFTTT, auto-hébergées et open-source
Vous connaissez IFTTT ? Ce sigle signifie IF This Then That (Si Ceci Alors Cela) et c’est la base de tout algorithme. Ce service web permet de déclencher des actions en fonction d’une ou plusieurs conditions.

Nous avons notamment eu plusieurs demandes et échanges concernant Node-RED, pour le comparer aux solutions décrites comme alternatives à IFTTT. Un article sur ce logiciel était déjà prévu pour vous le présenter, mais je n'avais pas encore pris le temps de l'installer et le tester, et donc commencé à écrire cet article.

De mon côté, j'utilisais jusqu'à aujourd'hui n8n pour plusieurs flow simples, notamment la publication automatique des articles sur Twitter et notre groupe Telegram.

Conçu et construit par IBM, Node-RED est un outil de développement open-source et gratuit, basé sur une programmation visuelle, permettant de connecter des périphériques matériels, des API ou des services en ligne dans le cadre de l'Internet des objets.

Node-RED fournit un éditeur de flux au sein de votre navigateur Web, et est articulé autour de nœuds (nodes). L'environnement est construit sur Node.js, les flux créés sont stockés à l'aide de fichiers JSON, les fonctions sont en JavaScript et les éléments des applications peuvent être enregistrés ou partagés pour être réutilisés. Node-RED est nativement en mesure de souscrire et publier en MQTT, ce qui en fait un compagnon idéal pour votre domotique.

Les nœuds disponibles sont nombreux et classés en catégories, les communs (avec l'injection de données, l'ajout de logs debug), les composants réseaux (pour faire des requêtes tcp, http ou mqtt), des fonctions (soit à définir soi-même avec du code JavaScript, soit avec des fonctions logiques telles que de l'analyse de cas), des éléments permettant de formatter, trier, séparer ou joindre des données entre elles, du stockage de fichiers, ... En plus des nœuds déjà existants, il est tout à fait possible d'ajouter des nœuds développés et proposés par la communauté.


Installation de Node-RED

Nous allons installer Node-RED en tant que conteneur dans une stack Docker-Compose, dont voici le contenu du fichier docker-compose.yml :

version: '3.8'
services:
  node-red:
    image: nodered/node-red:latest-12-minimal
    container_name: nodered
    ports:
      - 1880:1880
    networks:
      - network-nodered
    volumes:
      - ./nodered_data:/data
    restart: unless-stopped

networks:
  network-nodered:

On spécifie ici d'utiliser l'image latest-12-minimal, ce qui veut dire qu'on requiert la version 12 de Node.js et avec l'image allégée qui se base sur Alpine OS. Si on ne précise pas de tag ou qu'on renseigne le tag latest, l'image fournie utilise encore la version 10 de Node.js, ce qui peut amener quelques incompatibilités, par exemple avec les certificats utilisant tlsv3 (Notez également que Node.js 10 arrive en fin de support étendu au 30 avril 2021).

Attention ! Si vous utilisez un répertoire (et non un volume Docker), il faut que celui-ci appartienne à un utilisateur ayant comme uid 1000 et guid 1000. (voir la documentation)

Si l'utilisateur qui lance la stack n'a pas les bons uid et guid (comme root), vous pouvez simplement utiliser la commande suivante :

chown 1000:1000 /votre/repertoire/nodered/data

Vous remarquerez également qu'on a décrit dans le fichier docker-compose.yml que le conteneur nodered utilisera le network network-nodered, ce qui permet de restreindre la communication entre le réseau et les conteneurs.
Pour rappel, nous avons publiés quelques bonnes pratiques sécurité pour votre environnement Docker.

Démarrez la stack avec la commande suivante :

docker-compose up -d

L'interface de Node-RED est accessible depuis votre navigateur avec l'adresse http://<IP.DE.VOTRE.DOCKER>:1880.

Vous aurez remarqués (ou pas) qu'il ne vous a pas été demandé d'identifiants (et que nous n'en avons pas configurés dans le fichier docker-compose.yml) pour vous connecter à l'interface web de Node-RED, ce qui est pourtant indispensable si vous souhaiter ouvrir votre instance de Node-RED vers l'extérieur.

Pour remédier à cela, vous devez éditer le fichier settings.js dans le répertoire /data, que nous avons monté dans le dossier nodered-data sur l'hôte Docker. Vous devrez décommenter les lignes 116 à 123 en supprimant les caractères //.

    // Securing Node-RED
    // -----------------
    // To password protect the Node-RED editor and admin API, the following
    // property can be used. See http://nodered.org/docs/security.html for details.
    adminAuth: {
        type: "credentials",
        users: [{
            username: "admin",
            password: "LeHashDeVotreSuperMotDePasseQueVousAvezGenere",
            permissions: "*"
        }]
    },

Vous devez également générer le password en vous connectant au terminal du conteneur noderedet en exécutant la commande qui suit.

docker exec -it nodered bash
node -e "console.log(require('bcryptjs').hashSync(process.argv[1], 8));" Votre-Mot-De-Passe

Renseignez le résultat de la commande dans le fichier settings.js et procédez enfin au redémarrage du conteneur :

docker-compose restart

En rechargeant l'onglet de votre navigateur, les identifiants de connexion vous seront cette fois demandés.


Prise en main et réalisation d'un flux simple

L'interface de Node-RED est plutôt simple et épurée. Vous aurez au centre l'espace de travail, avec des onglets pour identifier les flux sur lesquels vous travaillerez. Sur la partie gauche, vous retrouverez les nœuds , classés par catégorie, que vous pouvez ajouter sur votre espace de travail. Sur la droite se trouve le résumé des flux que vous aurez développé, la documentation des nœuds , ou encore l'affichage de la console de debug, utile pour vous aider dans le développement de vos flux.

Comme évoqué un peu plus tôt, vous pouvez ajouter des nouveaux nœuds ou des flux proposés par la communauté, que vous pouvez consulter ici :

Library - Node-RED

Pour ajouter des nouveaux nœuds, cliquez sur le Menu puis sur "Settings". Dans "Palette", cliquez sur l'onglet "Install", effectuez une recherche et installez le nœud qui vous intéresse. Un pop-up apparaît pour vous proposer d'ouvrir la page d'information du nœud et de l'installer.

Nous allons maintenant créer ensemble en pas-à-pas détaillé un flux simple, pour nous alerter dans le cas où une machine est indisponible, qui sera mon NAS Synology dans cet exemple.

Nous avons donc besoin de faire un ping sur l'adresse IP du NAS, et d'envoyer une notification s'il n'y a pas de réponse.

  1. On commence par installer (de la manière expliquée juste avant) les nœuds node-red-node-ping et node-red-node-email.
  2. On crée ensuite un nouveau flux en cliquant sur le "+" dans la barre principale en haut de l'espace de travail. En double-cliquant dessus, vous pourrez donner un nom à votre flux.
  3. Ajoutez les nœuds "ping" et "email" en les cherchant dans la librairie des nœuds disponibles et en les glissant sur l'espace de travail. Le triangle rouge qui apparaît sur le nœud "ping" vous indique qu'il y a une configuration manquante pour ce dernier. Le rond bleu indique que ce nœud n'a pas été déployé. J'ajoute également un nœud "debug" qui permet de voir ce qui se passe en tant que log.
  4. Double-cliquez sur le nœud "ping" pour l'éditer. Renseignez l'adresse IP du NAS, le protocole (Automatique, IPv4 ou IPv6), le mode de lancement du nœud (Timed pour une planification selon l'intervalle défini dans le champ suivant ou Triggered pour que le ping soit déclenché par un autre événement) et enfin le nom que vous souhaitez afficher pour le nœud sur l'espace de travail, avant de sauvegarder avec le bouton "Done".
  5. Double-cliquez sur le nœud "email" pour l'éditer. Renseignez l'adresse email du destinataire, l'adresse du serveur SMTP à utiliser pour l'envoi, ainsi que son port (et s'il s'agit d'une connexion sécurisée) et les identifiants. Donnez un nom au nœud et sauvegardez-le. (Attention, pour utiliser Gmail en tant que serveur SMTP sortant, il faut que le compte ait son niveau de sécurité bas dans ses paramètres)
  6. On relie le nœud "ping nas" au nœud "debug" (avec le nom "msg.payload" par défaut) en cliquant sur le carré gris au bord droit du nœud "ping nas" et en faisant glisser la ligne qui apparaît sur le carré gris au bord gauche du nœud "debug". On fait la même chose pour relier le nœud "ping nas" au nœud "email".
  7. Cliquez sur le bouton "Deploy" en haut à droite pour déployer le nœud et l'activer. Le ping se déclenchera automatiquement selon l'intervalle défini, ce que nous pouvons vérifier en affichant la console debug, en cliquant sur le petit scarabée dans la partie droite de l'écran de Node-RED. Vous pouvez voir que le ping est bien effectué et que le retour de la commande s'affiche dans la console, sous la forme d'une valeur numérique pour "msg.payload" (il s'agit du temps de réponse de la commande ping).
  8. En parallèle de l'écriture de la valeur du ping, un mail a été envoyé au destinataire spécifié, ayant comme objet la cible du nœud "ping nas" et comme contenu le résultat de la commande.

OK alors c'est bien, mais on ne veut pas recevoir un mail chaque minute pour nous indiquer la latence de la commande ping vers le NAS, mais plutôt être averti uniquement au cas où le NAS ne répond pas au ping (donc avec la valeur false retournée pour le contenu de msg.payload), donc semble être injoignable. Nous allons donc modifier le flux pour intégrer une fonction de vérification de la valeur de msg.payload.

  • Cliquez sur les liens entre les nœuds pour les supprimer (avec la touche Suppr de votre clavier). Cherchez et ajoutez les nœuds "switch" et "change". Le nœud "switch" va permettre de faire un test logique SI le résultat de la commande ping est "false" ALORS on envoie un mail et le nœud "change" va permettre de personnaliser le contenu du mail envoyé.
  • Double-cliquez sur le nœud "switch" et indiquez que le test doit être is false.
  • Double-cliquez sur le nœud "change" (qui apparaît sous le nom "set msg.payload") et renseignez un message pour la valeur de msg.payload. Ajoutez une règle, indiquez qu'il s'agit de mettre à jour la valeur de msg.topic et renseignez le titre du mail à envoyer.
  • Reliez les nœuds entre eux dans l'ordre logique d'exécution (ping, vérification du ping, définition du contenu du mail puis envoi du mail). J'ajoute comme toujours un nœud de debug pour surveiller l'exécution.
  • Cliquez enfin sur "Deploy".

Une autre amélioration qui peut être apportée serait de n'envoyer la notification qu'après plusieurs tentatives de ping échouées, et également de ne pas la renvoyer tant que le NAS n'est pas revenu en ligne.


Quelques astuces pour Node-RED

Node-RED est assez intuitif, mais on peut passer plusieurs minutes (voire plus) à chercher comment faire une action si on ne connait pas. Je viendrais ajouter ici, au fur et à mesure de mes découvertes ou des demandes que vous me ferez, les "astuces" importantes à connaitre pour gagner du temps :

  • Comment lancer un flow ? Pour être lancé, un flow doit être déployé et comporter un élément déclencheur, que ce soit un cron ou un événement.
  • Comment sauvegarder un flow ? En le déployant. Attention, déployer un flow pourra éventuellement le lancer selon le déclencheur.
  • Comment désactiver un flow ? En cliquant sur le bouton en bout de ligne d'un flow dans le résumé des flows. Ici, le premier flow est activé tandis que le second est inactif.
  • Comment supprimer un nœud ? Sélectionnez le nœud et utilisez les touches "Suppr / Del" ou "Backspace" de votre clavier. Vous pouvez également double-cliquer sur le noeud et utiliser le bouton "Delete".
  • Comment supprimer un flow ? Double-cliquez sur le flow et utilisez le bouton "Delete".

Utilisation de Node-RED pour réaliser des automatisations domotique

Comme je vous l'ai annoncé au début de l'article, Node-RED inclut des nœuds MQTT pour souscrire ou publier sur des topics précis. Pour rappel, vous pouvez suivre la série d'articles sur le mqtt :

MQTT, un protocole pour tous les rassembler - Partie 2 : publier et souscrire
Nous avons vu dans la première partie de cet article[/mqtt-un-protocole-pour-tous-les-rassembler-partie-1-le-broker/] ce qu’était leprotocole MQTT et comment mettre en place un broker.Nous allons continuer avec la configuration de différents types d’objetsconnectés : modules wifi Shelly, capteur…

Je vais vous détailler ici un flux permettant de contrôler une lampe Philips Hue avec un interrupteur sans-fil Xiaomi, avec un appui simple pour allumer et un appui double pour éteindre la lampe :

  1. Le nœud "mqtt in" écoute le topic zigbee2mqtt/double_interrupteur_salon/action sur notre broker pour détecter les appuis sur l'interrupteur.
  2. Ce nœud "switch" a la fonction d'aiguilleur, il permet de diriger les différentes valeurs reçues de l'interrupteur (appui simple ou double, et quel bouton) vers des sorties distinctes.
  3. Le nœud "change" indique quel est le message qui va être envoyé.
  4. Ce dernier nœud "mqtt out" indique sur quel topic MQTT on va publier la valeur définie au nœud précédent.
  5. Ce nœud permet d'écrire en debug la valeur de sortie des nœuds qui lui sont liés. Ici, cela permet d'historiser les appuis sur le bouton.

De nombreux scénarios peuvent être construits dans Node-RED, qui peut tout à fait venir remplacer le moteur de scénarios inclus dans la solution domotique que vous utilisez, que ce soit des action simples comme celle que je viens de vous montrer, ou encore la gestion de l'ouverture et la fermeture des volets en fonction de l'heure, de la saison, de la température et de la luminosité, la gestion du thermostat...


Conclusion

Node-RED est donc un logiciel d'automatisation très complet, fort d'une communauté importante et permettant aussi bien d'automatiser des flux simples que complexes, que ce soit pour interagir avec des services sur internet ou contrôler vos équipements connectés. Avec les nombreux nœuds qu'il peut utiliser, Node-RED n'a de limite que votre imagination.
Plus puissant que n8n mais tout aussi intuitif, j'ai pu remplacer celui-ci facilement par Node-RED.

Je vous invite à poser vos questions dans les commentaires ou à venir échanger avec nous sur notre groupe Telegram, où nous nous ferons un plaisir de vous aider.