Node-RED - Débuter avec Nodered

Bienvenue sur le topic « Débuter avec Nodered ».
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 HA.
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 Nodered
  • L’installation de l’addon Nodered
  • Revue la palette Home Assistant
  • Quelques noeuds sympas à utiliser
  • Quelques exemples qui permettent d’expliquer tout ça !

Ready !

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 noeuds 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 noeuds.
  • Un noeud : C’est l’élément actif. Il reçoit/[modifie]/envoie des messages.
    Il a 0/1/des entrées et une/des sorties en fonction de ses capacités ou options.
  • Un lien : c’est ce qui fait communiquer 2 noeuds. Un lien doit TOUJOURS être tracé entre l’entrée (input) d’un noeud et la sortie (output) d’un autre noeud.
  • Le message : c’est l’information qui passe de noeuds en noeuds via les liens. Ce message est un objet json qu’on peut manipuler au bon gré des noeuds utilisés sur son chemin.
    Sachant que le message est un objet json, le message pour contenir beaucoup de choses. En associant des clés à des valeurs. Pour accéder aux valeurs stockées il faudra en connaître le « path », le chemin en Français.
    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 nodered !
Un peu de lecture pour comprendre le json : https://la-cascade.io/json-pour-les-debutants/

Déjà avec ça on va pouvoir avancer pas mal :slight_smile:

L’installation de l’addon Nodered :
Avec hassio c’est très simple, si vous n’avez pas encore ajouté le repo des addons de la communauté (Frenck aux commandes) commencez par ça !
Ajoutez à vos repos d’addons : https://github.com/hassio-addons/repository

Ensuite vous retrouverez l’addon Nodered. Installez le via l’onglet hassio de votre instance.
La configuration est sommaire ajoutez un mot de passe pour l’option credential_secret sauvegardez, démarrez l’addon, ajoutez le raccourci via l’option correspondante et vous êtes prêts à démarrer :+1:

Revue de la palette Home Assistant :

  • Events :all : Ce noeud 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 HA… Ce noeud 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 noeud 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 noeud Events: state
  • call service : Ce noeud permet d’appeler un service Home Assistant (notify, light.turn_on…)
  • fire event : Ce noeud va permettre d’envoyer un event sur le bus d’events de Home Assistant
  • Current state : Avec ce noeud 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 noeud vous pourrez faire du templating depuis Nodered !
  • wait until : Comme son nom l’indique, quand ce noeud 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 noeuds complémentaires importants :
Par défaut l’addon nodered comprends la palette Home Assistant et tous les noeuds originaux de Nodered. Mais il y a aussi quelques autres ajouts. Je vais lister les quelques autres noeuds importants (liste non exhaustive et susceptible d’évoluer en fonction de mes usages/de vos questions et remarques !)

  • inject : Un des noeuds fondamentaux, permet d’envoyer un message sur un click dans l’interface nodered, où à intervalle régulier.
  • debug : Le noeud qui sert tout le temps, permets de visualiser le message dans la console nodered. 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 java
  • stop timer : pour temporiser le passage du message
  • big timer : le noeud 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 noeud limite le nombre de messages qui passent durant un laps de temps.
  • MQTT in/out : Ces noeuds 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 :stuck_out_tongue:) ?
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 nodered
  • trouvez le noeud inject dans le menu de gauche, glissez le sur la feuille de flow et déposez le ici.
  • trouvez le noeud debug et posez le à droite du noeud inject précédemment déposé (pas trop collé !)
  • Puis d’un coup de souris tracez un lien entre la sortie (à droite) du noeud inject à l’entrée du noeud debug
  • En haut à droite, cliquez sur Deploy
  • Bim ! Votre 1er flow ! (bon c’est de la merde hein :smiley: )
  • Cliquez sur le petit carré du noeud inject puis en haut à droite cliquez sur le petit icone d’insecte (Juste en dessous de deploy)
    Vous avez là le message que le noeud inject à envoyé à travers le lien au noeud debug. C’est quoi ce truc ? Un gros nombre… Le noeud inject par défaut envoie le timestamp et votre noeud 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.

Exemple 2 : Avec le noeud current state

  • Déposez un noeud inject, un noeud current state puis un noeud debug et reliez les.
  • Double click sur le noeud 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 autocomplétion !!!)
  • Click sur Done puis Deploy.
  • Click sur le carré du noeud inject
  • Dans votre fenêtre de debug vous aurez le state remonté par votre capteur.
  • Double click sur le noeud debug et dans Output cliquez sur « msg. » et choisissez « complete msg object ».
  • Deploy puis click sur le carré du noeud inject
  • Cette fois le debug sera bien plus complet avec toutes les infos que le noeud current state est capable d’aller chercher.
    Passez en revue toutes ces infos, regardez les paths. Ca peut vous donner des idées de ce qui est faisable !

Bon deux exemples simples. On va parler un peu de l’objet « msg ». Le message qui passe et se modifie entre les noeuds. 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 noeud debugest utile et vous permet de visualiser où se trouvent ces infos. Utilisez le sans modération !
D’ailleurs, une sortie de noeud peut être reliée à plusieurs autres noeuds. Donc vous pouvez dans un flow intercaler des noeuds 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 noeud qui à créé cette entrée dans le debug log est entouré par des pointillés rouges !

6 J'aimes

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

  • Déposez un noeud inject et un noeud call service et reliez les
  • 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 noeud et click sur Deploy
  • Cliquez sur le carré du noeud inject et magie votre lampe s’allume si elle était éteinte et inversement au second click sur le noeud inject

Plus compliqué :slight_smile:
Imaginons que l’entity ID que vous avez dans le noeud call service est « petite_lampe »

  • Editez le noeud inject
    En face de Payload sélectionnez JSON et entrez {"domain":"light","service":"toggle","entity":"petite_lampe"} :warning: (pensez à remplacer « petite_lampe » par la bonne entité chez vous !)
    Validez avec Done
  • Editez le noeud 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 noeud inject Et boom ! ça fonctionne alors que le noeud call service est moitié vidé de sa config !

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

  • Une config « dynamique » du noeud call service :
    Les propriétés « domain » et « service » définies dans le noeud inject sont automatiquement lues par le noeud 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 noeud 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 noeud. C’est la partie « inputs » qui en parle.

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

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

:warning: 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 noeud event: state et deux noeuds call service sans les relier.
  • Configurez le noeud event: state comme suit :
    entity ID : device_tracker.moi
    if state is home
    Validez avec Done
    Le noeud aura donc 2 sorties, celle du haut si la condition « state is home » est vraie, l’autre si la condition est fausse.
  • Configurez le premier noeud call service comme suit :
    name : turn off
    domain : light
    service : turn_off
    entity ID : light.lampe
  • Configurez le second noeud call servicecomme suit :
    name : turn on
    domain : light
    service : turn_on
    entity ID : light.lampe
  • Reliez les noeuds en « Y »
    La sortie du haut du noeud event: state vers le noeud call service qui à le service turn_on et la sortie du bas vers le noeud qui à turn_off.
    image
  • 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 autre) alors la lumière va s’éteindre !

Bon c’est mignon mais allumer la lumière quand il fait jour c’est naze ! On va filtrer selon le soleil :slight_smile: Avec l’aide du noeud time range !

  • Ajoutez un noeud 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 noeud events: state et le service call « turn on ». (suffit de clicker dessus et faire « Suppr » sur son clavier !)
  • Reliez la sortie du haut du events: state au noeud time range appelé « nuit » et la sortie du haut de ce noeud « nuit » à l’entrée du noeud service call « turn on ».
    (la sortie du bas du noeud 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 !

à suivre…

6 J'aimes

Merci pour le partage @SNoof ! Tu maîtrises :+1:

1 J'aime

Merci pour ce beau tuto
Je vais m’y mettre prochainement

Gros taf Snoof c’est du lourd !
Je trouvais déjà le potentiel monstrueux d’Home Assistant mais en découvrant Nodered je pense n’avoir vu que la partie émergente de l’Iceberg…

Merci pour ce tuto ! Il m’aide enfin à comprendre comment fonctionne Node-RED ! :slight_smile: