Débuter avec Node Red

[size=2]Publié par : https://hacf.fr/bien-debuter-avec-node-red-et-home-assistant/[/size]

Comment bien débuter avec Node-Red.

Ce tutoriel un copier coller depuis un autre forum avec l’accord de son auteur @SNoof (Merci à lui)

Introduction.

Bienvenue sur le topic « Débuter avec Node-Red ».
J’espère convertir un peu de monde à NodeRed. Vous pourrez y créer des automatisations bien plus avancées que les automatisations YAML de Home Assistant.
Je vais tenter de couvrir un peu le sujet, surtout pour les débutants. S’il y a des manques, des questions, des points que vous souhaitez voir abordés en plus, n’hésitez pas ! Si je peux répondre et apporter un plus je le ferai !

Nous allons voir dans ce topic :

  • Un peu de vocabulaire pour comprendre Node-Red
  • Revue la palette Home Assistant
  • Quelques nœuds sympas à utiliser
  • Quelques exemples qui permettent d’expliquer tout ça !

Ready !

Mise à jour : 15/07/2020 – Temps de lecture / réalisation : < 1 / 10min – Difficulté : Faible.

Prérequis.


Un peu de vocabulaire.

  • Un flow : le flow c’est une feuille (un peut à la manière Excel) sur laquelle vous allez créer des nœuds qui seront reliés par des liens.
    On peut en créer plusieurs qui peuvent, où pas, communiquer entre eux.
  • Une palette : C’est un ensemble de nœuds.
  • Un nœud : C’est l’élément actif. Il reçoit, modifie, envoi des messages.
    Il peut avoir une ou plusieurs entrées et/ou sorties en fonction de ses capacités ou options.
  • Un lien : c’est ce qui fait communiquer deux nœuds. Un lien doit TOUJOURS être tracé entre loutput (la sortie) d’un nœud et l’input (l’entrée) d’un autre nœud.
  • Le message : c’est l’information qui passe de nœuds en nœuds via les liens. Ce message est un objet JSON que l’on peut manipuler au bon gré des nœuds utilisés sur son chemin.

Sachant que le message est un objet JSON, le message pour contenir beaucoup de choses, en lui associant des clés à des valeurs. Pour accéder aux valeurs stockées, il faudra en connaître le PATH (le chemin).

Exemple :

{"msg":
  {"payload":
    {
      "clé1":"Toto",
      "clé2":"Titi"
    },
  "clé3":"Tutu"
  }
}

Le chemin pour accéder à la valeur de la clé1 (soit Toto) sera msg.payload.clé1
De même pour avoir la valeur de la clé2 : msg.payload.clé2
Pour la clé3 : msg.clé3
Je vous invite fortement à lire un peu sur le JSON pour vous faciliter la tâche avec Node-Red !

Avec ça, on va pouvoir avancer.

Revue de la palette Home Assistant :

  • Events :all : Ce nœud permet d’écouter les événements home assistant comme le changement d’état d’un entité, une action de notification retournée, le démarrage où l’arrêt de Home Assistant… Ce nœud c’est celui qui peut écouter absolument tout de votre instance. Mais il n’est pas très filtrable donc assez gourmand en ressources vu qu’il voit beaucoup de choses passer !
  • Events: state : Un peu comme le nœud précédent mais celui ci n’écoute que les events de type state_change. Donc il ne verra passer que les changements d’états de vos entités.
  • Trigger: state : Une version avancée du nœud Events: state
  • call service : Ce nœud permet d’appeler un service Home Assistant (notify, light.turn_on…)
  • fire event : Ce nœud va permettre d’envoyer un event sur le bus d’events de Home Assistant
  • Current state : Avec ce nœud vous allez pouvoir interroger le statut courant d’une entité.
  • get entities : Permet de rechercher des entités selon plusieurs critères
  • get history : Pour aller rechercher le statut d’une entité dans l’historique de la database de Home Assistant. C’est la machine à remonter le temps !
  • get template: Si vous vous servez du moteur de templating de Home Assistant, avec ce nœud vous pourrez faire du templating depuis Node-Red !
  • wait until: Comme son nom l’indique, quand ce nœud reçoit un message, il va attendre que l’entité définie atteigne le statut défini avant de laisser passer le message !
  • API : Pour faire appel à l’API de Home Assistant

Quelques nœuds complémentaires importants :

Par défaut l’addon Node-Red comprends la palette Home Assistant et tous les nœuds originaux de Node-Red. Mais il y a aussi quelques autres ajouts. Je vais lister les quelques autres nœuds importants (liste non exhaustive et susceptible d’évoluer en fonction de mes usages/de vos questions et remarques !)

  • inject : Un des nœuds fondamentaux, permet d’envoyer un message sur un clic dans l’interface Node-Red, où à intervalle régulier.
  • debug : Le nœud qui sert tout le temps, permets de visualiser le message dans la console Node-Red. Quand on veut expérimenter/débugger
  • switch : 1 entrée et plein de sorties ce qui permet d’orienter le message vers un branche où une autre en fonction du contenu du message
  • change : permet de manipuler le message
  • function : permet de manipuler le message avec du javascript
  • stop timer : pour temporiser le passage du message
  • big timer : le nœud ultime pour la programmation d’envoi de messages en fonction d’événements temporels (date/heure/soleil…). Très complet !
  • time range : 1 entrée et 2 sorties, on est dans l’intervalle de temps définie alors le message sort sur la sortie 1 sinon sur la sortie 2 ! Pratique et simple !
  • limit : Pour éviter de laisser passer plein de messages, ce nœud limite le nombre de messages qui passent durant un laps de temps.
  • MQTT in/out : Ces nœuds permettent de se connecter à un broker MQTT et de souscrire à un topic pour y envoyer ou en recevoir des messages.

La mise en pratique par l’exemple

Vous êtes toujours en vie (où vous n’avez rien lu de ce qui est au dessus) ?
On va faire un peu de pratique avec pour commencer un exemple tout simple qui permet de poser les bases !

Exemple 1 :

  • Ouvrez l’interface de Node-Red
  • trouvez le nœud inject dans le menu de gauche, glissez le sur la feuille de flow et déposez le ici.
  • trouvez le nœud debug et posez le à droite du nœud inject précédemment déposé (pas trop collé !)
  • Puis d’un coup de souris tracez un lien entre la sortie (à droite) du nœud inject à l’entrée du nœud debug
  • En haut à droite, cliquez sur Deploy
  • Bim ! Votre 1er flow ! (bon c’est de la merde hein).
  • Cliquez sur le petit carré du nœud inject puis en haut à droite cliquez sur le petit icône d’insecte (Juste en dessous de deploy)
    Vous avez là le message que le nœud inject à envoyé à travers le lien au nœud debug. C’est quoi ce truc ? Un gros nombre… Le nœud inject par défaut envoie le timestamp et votre nœud debug vous le restitue tout simplement.
    Si on se penche un peu plus sur la fenêtre de debug, on peut voir 2 petits boutons à droite du message. Ils sont pratiques ! Le premier copie le « path » (voir le paragraphe vocabulaire), le second copie la valeur affichée.

Débuter avec Node-Red Flow 1
Débuter avec Node-Red Flow 1 Debug

Exemple 2 : Avec le nœud current state.

  • Déposez un nœud inject, un nœud current state puis un nœud debug et reliez les.

  • Double clic sur le nœud current state pour éditer ses propriétés (s’ouvre à droite de l’écran)
  • Dans Entity ID prenez par exemple un capteur de température de votre Home Assistant (commencez par taper « sensor. » et il y a une auto-complétion !!!)
  • Cliquer sur Done puis Deploy.

  • Clic sur le carré du nœud inject

Débuter avec Node-Red Flow 2 Fini

  • Dans votre fenêtre de debug vous aurez le state remonté par votre capteur.

Débuter avec Node-Red Flow 2 Résultat

  • Double clic sur le nœud debug et dans Output cliquez sur « msg. » et choisissez « complete msg object ».

Débuter avec Node-Red Flow 2 Debug

  • Deploy puis clic sur le carré du nœud inject
  • Cette fois le debug sera bien plus complet avec toutes les infos que le nœud current state est capable d’aller chercher.
    Passez en revue toutes ces infos, regardez les paths. Ça peut vous donner des idées de ce qui est faisable !

Débuter avec Node-Red Flow 2 Debug résultat

Bon deux exemples simples. On va parler un peu de l’objet « msg ». Le message qui passe et se modifie entre les nœuds. D’une façon générale, l’information importante d’un message est souvent contenue dans le path msg.payload mais parfois on veut aller chercher des infos secondaires elles sont souvent ailleurs dans le message. C’est pour ça que le nœud debug est utile et vous permet de visualiser où se trouvent ces infos. Utilisez le sans modération !
D’ailleurs, une sortie de nœud peut être reliée à plusieurs autres nœuds. Donc vous pouvez dans un flow intercaler des nœuds debug à plusieurs endroits pour voir l’évolution du message ! Quand vous passez le curseur de la souris sur les messages qui sont dans la fenêtre de debug le nœud qui à créé cette entrée dans le debug log est entouré par des pointillés rouges !

Exemple 3 : Le nœud call service (exemple valable si vous avez des lumières connectées !)

  • Déposez un nœud inject et un nœud call service et reliez les

Débuter avec Node-Red Flow 3

  • Dans les options du noeud call service
    • dans la case domain sélectionnez light
    • Dans la case service sélectionnez toggle
    • Dans la case entity ID sélectionnez une de vos lampes connectées

  • Validez le nœud et clic sur Deploy
  • Cliquez sur le carré du nœud inject et magie votre lampe s’allume si elle était éteinte et inversement au second clic sur le nœud inject.

Débuter avec Node-Red Flow 3

Plus compliqué.

Imaginons que l’entity ID que vous avez dans le nœud call service est « petite_lampe ».

  • Éditez le nœud inject. En face de Payload sélectionnez JSON et entrez {"domain":"light","service":"toggle","entity":"petite_lampe"} (pensez à remplacer « petite_lampe » par la bonne entité chez vous !)
  • Validez avec Done

Débuter avec Node-Red Flow 3 JSON

  • Éditez le nœud call service et effacez le contenu des cases domain et service puis entrez {{payload.domain}}.{{payload.entity}} dans entity ID
  • Validez avec Done
  • Deploy.

Cliquez sur le carré du nœud inject Et boom ! ça fonctionne alors que le nœud call service est moitié vidé de sa config !

Qu’est ce qu’on à fait ? 2 choses :

  • Une config « dynamique » du nœud call service :
    Les propriétés « domain » et « service » définies dans le nœud inject sont automatiquement lues par le nœud call service et intégrées à sa configuration.
  • Du templating : La propriété « entity ID » elle à été récupérée par {{payload.domain}}.{{payload.entity} qui est en fait une sorte de variable qui est lue venant du message entrant.

Du coup vous comprenez que pour un seul nœud call service vous pouvez lui faire faire un nombre d’actions différentes assez conséquent, en fonction du message qui entrera dedans !

Pour la config dynamique je vous conseille de lire la doc qui s’affiche à droite dans la fenêtre « i » (à côté du débug) quand vous sélectionnez un nœud. C’est la partie « inputs » qui en parle.

Bon on a joué avec du inject mais c’est pas comme ça qu’on automatise.

Exemple 4 (plus concret) : Allumer la lumière quand j’arrive à la maison et l’éteindre quand je pars (aucune condition).

NOTA : Cet exemple admet que vous ayez un device tracker, une zone home définie et une lumière connectée, pour l’exemple nous les appelleront device_tracker.moi et light.lampe => pensez à remplacer avec des valeurs correctes pour votre setup !

  • Déposez un nœud event: state et deux nœuds call service sans les relier.

Débuter avec Node-Red Flow 4

Configurez le nœud event: state comme suit :

  • entity ID : device_tracker.moi (sur l’image person.mcfly)
  • if state is home.

Validez avec Done.

Débuter avec Node-Red Flow 4 Current State

  • Configurez le premier nœud call service comme suit :
  • name : turn on
  • domain : light
  • service : turn_on
  • entity ID : light.lampe

Puis le deuxième avec le service turn_off.

Reliez les nœuds en « Y » la sortie du haut du nœud event: state vers le nœud call service qui à le service turn_on et la sortie du bas vers le nœud qui à turn_off.

Le nœud aura donc 2 sorties, celle du haut si la condition « state is home » est vraie, l’autre si la condition est fausse.

Cliquer sur Deploy.

On est bons ! Quand le device_tracker va passer à l’état home alors la lumière va s’allumer avec le service call light.turn_on et quand il passera à away ou not_home (ou autre) alors la lumière va s’éteindre !

NOTA : pour faire le test allez changer votre état dans Outils de développement puis état. Rechercher votre state puis forcer la valeur home ou not_home par exemple.

outils de développement

Bon c’est mignon mais allumer la lumière quand il fait jour c’est naze ! On va filtrer selon le soleil, avec l’aide du nœud time range !

Ajoutez un nœud time range et configurez le comme suit :

  • name : nuit
  • Latitude : soit il est pré-rempli si tout est OK, soit vous mettez ici la Latitude de votre domicile
  • Longitude : pareil que pour la Latitude !
  • Start time : sunset
  • End time : sunrise

Validez avec Done.

Supprimez le lien entre le nœud events: state et le service call turn on . (suffit de cliquer dessus et faire Suppr sur son clavier !)

Reliez la sortie du haut du events: state au nœud time range appelé nuit et la sortie du haut de ce nœud nuit à l’entrée du nœud service call turn on.
(la sortie du bas du nœud time range laisse passer le message en dehors de la période configurée => En gros le jour quoi !)

  • Deploy.

Et voilà, si vous rentrez la nuit la lumière va s’allumer. Elle ne s’allumera pas la journée. Par contre si vous quittez votre domicile elle s’éteindra toujours automatiquement, que ce soit le jour, où la nuit !


Conclusion.

Cet article sur le fonctionnement de Node-Red pour un débutant et un très bon article de @SNoof, qui nous a autorisé à le copier coller sur notre site. Nous le remercions pour ce beau travail est espérons qu’il y en aura d’autres.

Nous espérons que cet article vous aidera a mieux comprendre Node-Red qui facilite grandement la mise en place des automatisations depuis Home Assistant. Vos automatisation seront beaucoup plus visuel et surtout moins sujettes a des problème d’indentations.


Aides (Forum).

Vous souhaitez signaler un erreur, partager votre configuration ou ajouter un matériel fonctionnant ? Cliquez sur les boutons ci-dessous.

Partager une config
Signaler une faute
Ajouter un matériel


Trucs & astuces.

Mise à jour : (détails)

15/07/2020 :

  • Ajout des images pour les flow exemple. (McFly)

10/07/2020 :

  • Création de l’article

Sources.

  • RAS
9 « J'aime »

Merci pour le tuto j’aurais bien aimé le trouvé il y a quelques semaines quand j’ai débuter avec Node-red ca m’aurais bien aidé ! très complet et une bonne base pour démarrer… j’espère en voir d’autres avec plus de détails et exemple encore avec les json :slight_smile:

Super boulot. Exactement ce que je cherchais pour débuter. Du coup, je crois que je vais m’y mettre également.

Suggestion : Peut-être créer un topic avec des exemples de flows… pour partager nos différents flows créés

1 « J'aime »

Merci c’est une trés bonne base de départ pour un noob :innocent:en node red…

1 « J'aime »

Très sympa le tuto.

Quelques idées en vrac pour compléter au besoin :

Le node (désolé, j’utilise principalement les termes anglais par habitude) debug. Le node debug donc -disais-je- est ton meilleur ami. Foutez-en partout quand vous créez un flow (dans la fenêtre d’affichage du debug il est possible de choisir le node qui est affiché (all/flow/current node) pour s’y retrouver).

C’est le meilleur moyen de comprendre la structure de message de NodeRed.

A titre perso, je conseille toujours de foutre un events: all + debug pour commencer. On choppe tout ce qui passe, mais ça donne une idée justement de comment les choses passent. Après on filtre sur ce qui est intéressant dans le flow.

La logique de base de NodeRed est plus ou moins linéaire/mono-tâche. C’est à dire que chaque message est géré avant que le suivant ne puisse être pris en compte. Inutile d’espérer interrompre un flow avec un autre message, mais l’outil dispose de routines qui ne sont pas dans le flow à proprement parler qu’on peut lancer avec un message et interrompre avec (un des) le suivant.

Une fois compris la manière dont les messages sont structurés, il est facile de les éditer. Beaucoup de nodes prennent en compte le contenu du message dans leur exécution. Un call_service par exemple peut être défini dans sa fenêtre de paramètres à la création, mais également dans le message qui lui parvient.
On pourra alors jouer avec des nodes change qui permettront de modifier le message à la volée pour envoyer les instructions souhaitées au node d’action (call_service par exemple).

2c de contribution à un bel OP

Bonjour,

Merci pour ce tuto que je commence tout juste , donc première question :
1 - entre l’exemple 1 et l’exemple 2 comment je fait pour effacer les noeuds déjà en place pour en mettre d’autres .

Salut tu cliques dessus et supprimer ?

Merci pour ce tuto.
Je débute également avec Node RED, savez-vous où je peux trouver des modèles de flow afin que je puisse avoir quelques idées ? Ou des tutos vidéo en Français ?

Des tutos vidéos en Fr je sais pas trop…
Des idées avec des exemples c’est compliqué, à toi d’imaginer ton utilisation et ensuite de te mettre à la tâche !
Evidemment si tu as des questions passe par ici :slight_smile:

1 « J'aime »

bonjour
Grace à cet article j’ai pu mettre en place mes premières automatisation sous node red. Un grand merci à @SNoof d’avoir pris le temps de l’écrire et à Mc Fly pour l’avoir enrichi.

bonnes fêtes de fin d’années à tous.

2 « J'aime »

Avec plaisir !
N’hésite pas à partager tes créations et a poser des questions.

1 « J'aime »

Salut à tous !
Grand débutant dans node red, j’ai une question probablement ridicule…
Quand on à suvi le tuto et que ca semble fonctionner, le flow il apparait quelque part dans HA ??? Ca s’active comment ? La, j ai bien mon schema tout comme le tuto mais je sais pas quoi en faire ! ( j’avais prévenu que c’était pas fufute comme question et que ca doit faire bondir les spécialistes :slight_smile: )

@l_endormi Sache qu’il n’y aucune queqtiin bete ou ridicule.

A partir de cet exemple (le 3) oui car cela agit sur HA mais avant non seul les debug t’affichent quelques choses.

Donc tant que le flow existe dans node red, ca fonctionne (d’ou le running avec le carré vert en dessous de state) ?

Oui c’est ca. apres si tu n’a rien place un debug apres le noeud qui te renvoi l’info. Ou des fois io y a des informations en dessous (quand il est en attente par exemple)

En farfouillant un peu et grâce a ce tuto, j ai réussi a faire en sorte que mes capteurs allument la lumière de mes escaliers pendant 30 s. Maintenant je n’ai plus qu’ insérer une condition pour que ca ne fonctionne que la nuit et se sera bon !!! La logique de fonctionnement est simple, la réalisation un peu moins :wink: (D’ailleurs la solution est dans ce tuto)

1 « J'aime »

Je dirais plutot « visuelle » car elle est aussi simple avec HA.

Pour l’instant ca marche, je debug encore vu que mon schéma est un peu un schéma de brut vu qu’il y deux capteurs, une intégration tuya fébrile ( je suis pas encore en tout local) et que ca peut deconner de pas mal d’endroit, mais j’avance, j’avance…

1 « J'aime »

Apres quelques heures pour un truc finalement simple, ca fonctionne ! Merci de ton tuto et de tes conseils ( le debug m’a été TRES utile )

[{"id":"efc74f09177072ce","type":"tab","label":"Capteur led automatique","disabled":false,"info":"","env":[]},{"id":"3aab51056158afd9","type":"trigger","z":"efc74f09177072ce","name":"","op1":"1","op2":"0","op1type":"num","op2type":"num","duration":"30","extend":true,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":810,"y":340,"wires":[["e76fd9a05db859d6"]]},{"id":"bdadc634e254d47c","type":"api-call-service","z":"efc74f09177072ce","name":"Leds On","server":"c424b271.0b0ee","version":3,"debugenabled":false,"service_domain":"switch","service":"turn_on","entityId":"switch.led_escaliers_socket_1","data":"","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1200,"y":280,"wires":[[]]},{"id":"82c41f730337faef","type":"server-state-changed","z":"efc74f09177072ce","name":"Capteurs bas escaliers","server":"c424b271.0b0ee","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.pir_motion_sensor_2","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"","forType":"num","forUnits":"seconds","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":580,"y":380,"wires":[["3aab51056158afd9"],[]]},{"id":"e76fd9a05db859d6","type":"switch","z":"efc74f09177072ce","name":"payload == 1 or 0","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"num"},{"t":"eq","v":"0","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":1010,"y":340,"wires":[["bdadc634e254d47c"],["34737835d5f51d78"]]},{"id":"1901627329d4ea3f","type":"server-state-changed","z":"efc74f09177072ce","name":"Capteur haut escaliers","server":"c424b271.0b0ee","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.pir_motion_sensor_2_sonoff","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":580,"y":260,"wires":[["3aab51056158afd9"],[]]},{"id":"34737835d5f51d78","type":"api-call-service","z":"efc74f09177072ce","name":"Leds Off","server":"c424b271.0b0ee","version":3,"debugenabled":false,"service_domain":"switch","service":"turn_off","entityId":"switch.led_escaliers_socket_1","data":"","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1200,"y":380,"wires":[[]]},{"id":"c424b271.0b0ee","type":"server","name":"Home Assistant","version":2,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30}]
1 « J'aime »