Accueil | Domotique | MySensors v2 : décoder/envoyer des messages avec Node-RED

MySensors v2 : décoder/envoyer des messages avec Node-RED

Les objets MySensors communiquent entre eux sous la forme de petits messages texte envoyés par ondes radio. Il est très facile de décoder les messages en suivants les spécifications techniques de l’API série disponible sur le site officiel du projet. La librairie MySensors permet de faciliter le développement d’applications en tout genre (mobile, robotique, domotique) sans avoir à gérer la couche de communication entre les appareils. Nous allons utiliser Node-RED pour décoder les messages reçus par une gateway réseau ou série.

Pour en savoir plus sur la librairie MySensors, vous pouvez aussi lire cet article

Structure d’un message MySensors

MySensors communique avec de petits messages de 32 bytes (la taille maximale des messages envoyés par une puce nRF24L01). L’entête (header) du message est de 7 bytes. Il est composé ainsi :

node-id ; child-sensor-id ; message-type ; ack ; sub-type ; payload \n

  • node-id : le numéro du noeud.
  • child-sensor-id : l’identifiant d’un enfant. Par exemple la température mesurée par un capteur DHT22.
  • message-type : type de message
    • 0. Présentation du noeud. Il est envoyé lors de l’exécution de la fonction presentation() au démarrage du noeud
    • 1. Set. Envoi de données par un capteur
    • 2. Req. Demande à un actionneur d’executer la commande demandée
    • 3. Internal. Message interne
    • 4. Stream. Utilisé pour la mise à jour sans fil (OTA)
  • ack : demande d’accusé réception (ou accusé reception)
  • sub-type : le sous-type dépend du message-type
  • payload : contenu du message. Il est limité à 25 bytes.

25 bytes peut sembler faible, mais le nRF24L01 n’est pas conçu pour transmettre de grands messages, plutôt des états ou des mesures physiques.

Se connecter à une gateway MySensors avec Node-RED

On dispose de deux types de gateway MySensors. La serial gateway qui se branche sur le port USB d’un ordinateur ou d’un Raspberry. Elle est pratique pour débuter et lire les messages de debuggage envoyés sur le port série (par exemple avec le moniteur série de l’IDE Arduino). La passerelle réseau est maintenant très simple (et pas cher) à fabriquer à l’aide d’un ESP8266 (toutes les explications dans cet article). On peut l’installer (la cacher !) dans en endroit ou la réception radio est meilleure et on ne monopolise pas un port USB du Raspberry Pi.

Serial gateway, passerelle série sur port USB

Pour se connecter à une passerelle série, ajoutez un Node serial (dans Input)

Node-red serial node

Ouvrez le pour le configurer et appuyez sur le crayon pour configurer le port série. Appuyez sur la loupe et choisissez le port USB sur lequel est branché la gateway. Par exemple /dev/ttyUSB0.

node-red serial liste gateway usb

 

node-red serial ok

Par défaut, la vitesse de communication avec la gateway est de 115200 bauds. Laissez la configuration par défaut. 8 bits Data, Parity None, Stop Bits 1.

node-red serial settings

Enregistrez la configuration en appuyant sur Done.

LAN Gateway, passerelle réseau

Pour se connecter à une passerelle réseau, nous allons utiliser un Node TCP

node-red tcp mysensors lan gateway

Configurez la connexion ainsi :

  • Type : Connect to
  • Port : 5003 par défaut (à adapter à votre configuration)
  • at host : l’adresse ip de la gateway réseau
  • output : stream of … String
  • Donnez un nom
  • Enregistrez avec Done

node-red tcp mysensors lan gateway settings parametres

Plugin MySensors pour Node-RED

Le plugin node-red-contrib-mysensors développé par Thomas Mørch permet de décoder les messages MySensors et d’en envoyer à un noeud. Il s’installe avec cette commande

Après installation, relancez Node-RED avec les commandes suivantes et actualisez le navigateur.

Vous disposer maintenant d’une nouvelle palette appelée mysensors. Elle est composée de trois Nodes

  • mysdecenc : encodeur / décodeur de messages MySensors
  • mysencap : prépare le message à envoyer au noeud
  • mysdebug : rend lisible de messages MySensors

Fonction mysdebug

Partons par la fin pour une fois. La fonction mysdebug permet de décoder et de rendre plus lisible les messages reçus en envoyés par la gateway. Chaque code est remplacé par sa signification.

node-red mysensors mysdebug

Messages décodés affichés dans la console. Tout n’est pas correctement décodé (dans la version actuelle du plugin).

node-red mysensors mysdecenc mysdebug console log

Comment utiliser la fonction mysdecenc

Cette fonction permet de décoder les messages MySensors. pour l’utiliser, il suffit de la brancher à une gateway (série ou réseau). En sortie (payload), on récupère directement le payload de chaque message. Chaque information disponible est publiée sur un flux différent :

  • msg.payload : contenu du message (payload) envoyé par le noeud
  • msg.nodeId : noeud d’origine du message
  • msg.childSensorId : Id de l’enfant attaché au noeud
  • msg.messageType : type de message
  • msg.ack : demande d’accusé réception
  • msg.subType : sous-type de message

Cette architecture présente des avantages et des inconvénients. On récupère directement en sortie le payload de chaque message mais cela peut rapidement devenir compliqué pour filtrer les données de tel ou tel capteur.

node-red mysensors mysdecenc mysdebug

Messages décodés affichés dans la console.

node-red mysensors mysdecenc mysdebug console log

Code du flow

Fonction de décodage renvoyant un objet JSON

Je trouve plus facile et plus explicite de manipuler un objet JSON. J’ai développé une petite fonction que vous pouvez ajouter à vos projets Node-RED. Elle décode chaque message et créé un objet JSON au format clé:valeur.

node-red mysensors decoder projetsdiy

Elle renvoie un payload avec les informations suivantes :

  • nodeId : Id du noeud publiant le message
  • sensorId : Id de l’enfant
  • mode : presentation, set, req, internal, stream
  • type : numéro du sous-type de donnée (fonction du mode)
  • typeLabel : libellé du type de données correspondant
  • value : contenu du message (payload)

Vous pouvez également installer ce flow depuis le site officiel de Node-RED http://flows.nodered.org/flow/fa02078c160cb3e00e09f4980b534490

Voici ce que vous obtiendrez avec la fonction. Chaque message est maintenant explicite et formaté sous la forme d’un objet JSON plus facile à exploiter dans un projet.
node-red mysensors decoder projetsdiy console log

Libre à vous de la modifier en fonction de vos besoins.

Code du flow

La fonction mysencap

La dernière fonction mysencap proposée par le plugin permet de formater un message avant de le publier sur un noeud du réseau MySensors. On peut envoyer ce que l’on veut dans la limite de 25 bytes. Il faut également ajouter un retour à la ligne (\n) avant de l’injecter dans la fonction. Par exemple, on peut récupérer l’état d’un switch créé avec le plugin node-red-contrib-ui pour allumer ou éteindre une Led (ou une lampe via un relai). Nous verrons en détail ce plugin dans un prochain tutoriel.

Ajoutez un Node swich

http://www.projetsdiy.fr/wp-content/uploads/2016/10/17.-node-red-contrib-ui switch

Donnez lui un nom. Pour la valeur de sortie, indiquez 1 et 0 pour Off. Ce n’est pas très important, on peut très bien laisser True/False. Il faudra juste tester la bonne valeur dans le code Arduino du noeud MySensors.

configuration switch node-red-contrib-ui

Allez sur la page d’interface à l’adresse

Vous disposer maintenant d’un interrupteur à deux états.

node-red-contrib-ui switch mysensors

Il ne reste plus qu’à préparer le message. Ajoutez une fonction et coller ce code pour ajouter un retour à la ligne.

Ensuite ajoutez un Node mysencap et indiquez les paramètres du noeud de destination du message. Le type de message doit être Request. Voici un exemple :

configuration mysencap node-red mysensors.

Il ne reste plus qu’à injecter dans un Node mysdecenc avant d’envoyer le message sur une gateway (série ou réseau) MySensors.

piloter relai led mysensors depuis node-red

Ajoutez ce code sur le noeud MySensor pour intercepter les messages envoyés à cet objet.

Et voilà, si on appuie sur l’interrupteur, on reçoit bien les messages sur le noeud en provenance du flow Node-RED.

node-red mysensors iot reception message receive

Code du flow

  • gandolfi

    bonjour,

    Peux t’on recouper node red et jeedom ou bien remplacer l’un par l’autre ?

    Par exemple : Consulter les données d’une sonde BME280 couplé à un ESP8266 et pouvoir les consulter sous forme de graphique (sous jeedom grace à un de tes tutos). Et faire agir un moteur selon la température qu’il fait ?

    Je cherche à avoir une solution simple pour consulter différentes sondes de manière numerique et graphique (statistique et instantanée) et élaborer des scénarios en fonction des données reçues.

    Merci

    • Bonjour Gandolfi. Oui c’est tout à fait possible et on peut le faire sans passer par un logiciel domotique. Plusieurs solutions :
      1. 100% ESP8266 avec le système de règles d’ESPEasy détaillé dans cet article http://www.projetsdiy.fr/rules-espeasy-mini-serveur-domotique-esp8266/. Gros avantages : 100% autonome, ne dépend pas de la connexion WfFi ou d’un serveur pour fonctionner.
      2. Si le système de règles d’ESPEasy n’est pas suffisant, tu peux écrire ton propre plugin. Je vais publier un tuto sur le sujet début janvier.
      3. Pour les graphiques et des scénarios, tu peux utiliser Node-RED et le module dashboard de Node-RED (http://www.projetsdiy.fr/node-red-dashboard-interface-partie1/). L’article sur les graphs arrive aussi début janvier. C’est simple à mettre en place, par contre faut pas faire des graphs avec trop de points sinon ça fait planter la page du navigateur. Dans ce cas, tu peux passer à Grafana qui a été conçu pour faire du monitoring de serveurs mais qui s’adapte très bien à l’affichage de données en provenance d’objets connectés (http://www.projetsdiy.fr/grafana-graphiques-installation-macos-mysensors-influxdb-partie1/). Seul hic, faut se brancher sur une base de données. Par exemple InfluxDB (http://www.projetsdiy.fr/tutoriel-influxdb-installation-configuration-macos/) mais je n’ai pas encore réussi à la faire fonctionner sur Raspberry. Je suis preneur si quelqu’un a une version arm déjà compilée.
      4. Pour piloter ton moteur, Node-RED encore une fois. Le plus facile est de communiquer avec l’ESP via MQTT (http://www.projetsdiy.fr/category/objets-connectes/broker-mqtt-objets-connectes-iot). Je te conseille encore une fois ESPEasy (on élimine toute programmation coté ESP, facile à modifier via l’interface WEB).
      Voilà, j’espère avoir répondu le plus précisémment possible à ta question. En tout cas n’hésite pas à m’en dire plus si tu as besoin d’aide. A très bientôt. Christophe

      • gandolfi

        Merci pour ta réponse très détaillée.

        1/ J’ai installé ESP easy grace à ton tuto. Je peux monitorer les sondes directement à partir de l’adresse ip de l’esp8266. Mais c’est un peu spartiate. Il faudrait peut être que je regarde si je peux récuperer les données dans un site web (wordpress ou autres).

        2/J’attend impatiemment ton article sur le plugin pour savoir ce que l’on pourrait faire avec.

        3/ Je vais regarder node red plus précisément pour voir comment récuperer les infos envoyer par ESPeasy.

        4/ je vais regarder pour MQTT car j’avais bifurqué sur jeedom que je trouve bien mais cela me monopolyse un PI3 pour pas grand chose et un raspberry n’est pas top en serveur je trouve.

        Je recherche une solution utilisant le moins de ressources et de composants tout en pouvant la mettre en oeuvre facilement pour peut etre pouvoir l’enseigner à des élèves .

        Ce qui serait top ce serait de profiter au mieux de la connexion wifi de l esp8266 pour :
        – Pouvoir recevoir des infos des sondes directement sur une tablette ou PC par wifi (site web, interface spéciale…).
        – Pouvoir envoyer des infos a l’esp8266 par wifi pour commander un appareil (moteur, relais…).

        • Je trouve que Node-RED est vraiment très bien adapté quelque soit le niveau des élèves. J’ai aussi des enfants et j’en profite pour commencer à leur apprendre les rudiment de la programmation. Node-RED est un peu moins facile d’accès que Scratch (en anglais, plus de code, trouver les bons modules, dashboard…) mais c’est vraiment puissant et rapide à prendre en main. Pour moi tu devrais réussir à faire tout ce que tu veux :
          – profiter au mieux de la connexion wifi de l esp8266 : OK Node-RED
          – Pouvoir recevoir des infos des sondes directement sur une tablette ou PC par wifi
          => site web : Node-RED permet de coder du HTML et générer des pages de sortie
          => interface spéciale : module Dashboard Node-RED (afficheurs, boutons, formulaires), plus rapide que faire du HTML
          – Pouvoir envoyer des infos a l’esp8266 par wifi pour commander un appareil (moteur, relais…) : Node-RED + MQTT 😉
          Il y a beaucoup d’autres solutions mais il me semble que c’est une des plus facile à mettre en pratique.

          • gandolfi

            Salut. j’ai mis en place l’ESP 8266 (ESPeasy 14) des sondes BMP280 et DTH22, Node-red. Comment récuperer les infos des sondes sur Node-Red ?

          • Bonjour Gandolfi. Tu vas plus viiiiite que moi. Oui, je vais préparer un tuto pour faire ça. A très bientôt.

          • gandolfi

            salut. Merci. j’ai regardé sur le net mais j’ai pas trouvé grand chose de simple. j’ai du mal à faire le lien node-red – EasyESP et le MQTT à coté. A bientot

          • Bonjour Gandolfi. Je viens de mettre en ligne un tutoriel pour faire communiquer ESP Easy avec Node-RED à l’aide de MQTT (Mosquitto) http://www.projetsdiy.fr/espeasy-mqtt-mosquitto-nodered-communication-bidirectionnelle-dashboard/ J’espère que ça correspond à ce que tu voulais faire.

          • gandolfi

            Merci beaucoup . je vais regarder cela avec attention