Accueil / Domotique / Domoticz / MySensors 2.0 – Gateway WiFi ESP8266 pour Jeedom et Domoticz

MySensors 2.0 – Gateway WiFi ESP8266 pour Jeedom et Domoticz

Nous continuons la série d’articles sur la librairie pour créer des objets connectés radio MySensors 2.0. Dans cet article nous allons apprendre comment fabriquer une Gateway WiFi à base d’un module ESP8266 et la connecter à Jeedom et Domoticz. Les modules ESP8266 sont supportés depuis la version 1.5 grâce au travail de Yveaux. Pour suivre les discussions sur le sujet (en Anglais, of course), une page du forum MySensors lui est dédiée ici.

Read this article in English

Comment préparer une Gateway WiFi ESP8266

Dans cet article, nous allons câbler un module radio nRF24L01 qui nous servira pour un prochain tutoriel.

Matériel nécessaire

Aucun module NodeMCU en particulier n’est préconisée. Cependant, compte tenu du prix modique et de la facilité à téléverser un programme (inutile de passer le module en mode bootload), je vous conseille d’opter pour une carte à base d’ESP-12 (NodeMCU v1 conseillé). Pour cet article, je suis resté fidèle à la Wemos D1 Mini (présentée ici).

Les modules radio nRF24L01 ne sont pas compatibles avec une breadboard. Il existe des platines de câblage qui facilitent la vie et qui permettent aussi d’avoir une alimentation 3,3 Volts de bonne qualité.

La librairie MySensors propose plusieurs options pour aider au diagnostique. Il est possible d’ajouter une Led qui clignotera en cas de défaut (ERR_LED_PIN), lors d’un envoi ou la réception de données radio (RX_LED_PIN et TX_LED_PIN). Il est aussi possible d’ajouter un bouton d’inclusion. Le processus d’inclusion se faisant de manière complètement transparente dans la version 2 (attribution automatique d’un identifiant par la Gateway au moment de la présentation), je doute qu’il y ait encore un intérêt à l’utiliser.

Câblage

Rien de particulier au niveau du câblage. Attention toutefois à l’alimentation des modules radio qui fonctionnent dans la grande majorité des cas en 3.3 Volts. Utilisez la sortie 3.3 Volts de la carte ou utilisez un abaisseur de tension.

Gateway Wifi ESP8266 + reed switch jeedom domoticz mqtt

Programmation : quelle Gateway choisir ?

Il existe deux types de Gateway à base d’ESP8266 :

  • La Gateway classique. La Gateway sera accessible depuis son adresse ip. Par défaut le port est le 5003. Les serveurs domestiques compatibles avec la librairie MySensors seront alors en mesure de communiquer avec les objets connectés au réseau MySensors.
  • Le client MQTT. Cette Gateway permet une communication via un serveur (broker) MQTT. Les échanges sont bidirectionnels. Cette solution permet d’intégrer les objets MySensors sur un serveur domotique (par exemple) qui ne dispose pas d’un plugin MySensors.

Dans les exemples, vous trouverez également une Gateway OTA qui permet la mise à jour « dans les airs » du programme. Je n’ai pas encore essayé.

Le choix est donc assez simple, si vous comptez intégrer des objets connectés MySensors sur un serveur domotique qui propose un plugin dédié (qu’il fonctionne et qu’il prenne en compte les fonctions de MySensors dont vous avez besoin), optez pour la Gateway classique, sinon optez pour le client MQTT.

Préparer le programme de la Gateway

mysensors arduino gateway mqtt client

Ouvrez le programme GatewayESP8266 (ou GatewayESP8266MQTTClient) et configurez celle-ci avant de le téléverser :

  • Identifiant et mot de passe du réseau WiFi : MY_ESP8266_SSID et MY_ESP8266_PASSWORD
  • Il est possible d’attribuer une ip fixe à la Gateway (MY_IP_ADDRESS). Dans ce cas, il faudra aussi renseigner l’adresse du serveur dhcp (MY_IP_GATEWAY_ADDRESS, MY_IP_SUBNET_ADDRESS). C’est très pratique car elle ne risque pas de changer d’adresse (même si les routeurs sont « intelligents »), ce qui casserait la liaison avec un serveur domotique.

C’est tout.

mysensors v2 arduino gateway ip static

Pour le client MQTT il y a un peu plus de choses à configurer :

  • L’adresse du serveur MQTT, le port et éventuellement identifiant et mot de passe
  • On peut ensuite définir le préfixe du Topic de souscription (se termine par in) et de publication (se termine par out). C’est pratique si on possède plusieurs Gateway WiFi. Attention coté serveur domotique, le out (sortie) est une entrée…
  • Le nom du client MQTT. C’est le nom qu’on utilisera pour la mise au point avec un client Mosquitto ou avec NodeRed par exemple.

Que ce passe-t-il au démarrage de la Gateway ?

Une fois le programme téléversé, regardons de plus près le journal d’exécution à l’aide du moniteur série.

esp8266 gateway wifi mqtt client wemos d1 mini

Starting gateway (RNNGE-, 2.0.0) : On charge bien la librairie MySensors v2 au démarrage.

Ensuite la librairie teste dans un premier temps que le module radio est opérationnel. Si tout est correctement câblé, vous obtiendrez TSM:READY.

La Gateway se connecte au réseau local et renvoie son adresse ip. Si vous avez configuré une adresse ip fixe, elle va s’afficher.

Si vous avez opté pour un client MQTT, la Gateway se connecte au serveur et renvoie MQTT connecter en cas de succès. En cas d’échec la gateway tente de nouveau à se connecter. Je n’ai pas trouvé de paramètre pour limiter le nombre de tentatives (ce qui semble logique).

Ajout d’un contacteur magnétique à la Gateway

Comme une Gateway peut également devenir un noeud du réseau MySensors, on va simplement ajouter un contacteur magnétique pour simuler une ouverture/fermeture de porte.

Code

Copiez ce code dans le programme GatewayESP8266MQTTClient. Ce code n’est pas optimisé (il n’envoi pas un état après une certaine durée…), il a juste pour objectif de tester l’intégration sur Jeedom et Domoticz.

#include <ESP8266WiFi.h>
#include <MySensors.h>

#define CHILD_ID_CONTACTEUR 0
#define CONTACTEUR_PIN D3          // Broche sur laquelle est attaché le contacteur 
boolean etatPrecedent = false;
MyMessage msgContacteur(CHILD_ID_CONTACTEUR, V_TRIPPED);

void setup() {
  pinMode(CONTACTEUR_PIN, INPUT);
  digitalWrite(CONTACTEUR_PIN, HIGH);
}

void presentation() {
  sendSketchInfo("Contacteur de porte - MySensors+MQTT", "1.0");
  present(CHILD_ID_CONTACTEUR, S_DOOR); 
}


void loop() {
  uint8_t etat;
  // Lit l'état du contacteur
  etat = digitalRead( CONTACTEUR_PIN );  
  if (etat != etatPrecedent) {
    etatPrecedent = etat;
  
    Serial.print("Etat du contacteur ");
    Serial.println(etat ? "Ouvert " : "Ferme" );
    send( msgContacteur.set( etat ? "1" : "0" ) );
  }  
  delay(50);
}

Voici quelques explications sur le code. On définit en enfant  sur lequel est relié le contacteur

#define CHILD_ID_CONTACTEUR 0

Celui-ci est relié à la broche D3 et à la masse (G)

#define CONTACTEUR_PIN D3

Une variable de type booléen permettra de tester l’état précédent et n’envoyer un message MQTT qu’en cas de changement d’état du contacteur

boolean etatPrecedent = false;

On créé un objet MyMessage pour l’enfant de type V_TRIPPED

MyMessage msgContacteur(CHILD_ID_CONTACTEUR, V_TRIPPED);

On présente ce noeud sur le réseau et indiquant que c’est un contacteur de porte.

void presentation() {
  sendSketchInfo("Contacteur de porte - MySensors+MQTT", "1.0");
  present(CHILD_ID_CONTACTEUR, S_DOOR); 
}

La boucle loop s’exécute toutes les 50ms et test si un changement d’état s’est produit sur le contacteur, si c’est le cas on publie le message

send( msgContacteur.set( etat ? "1" : "0" ) );

Comment utiliser des objets MySensors avec Jeedom

Version de Jeedom utilisée : v2.3.3 2.4.6

A l’aide du plugin dédié MySensors

La solution la plus simple et d’utiliser le plugin dédié. Avec Jeedom 2.3.3 (version 2016-08-10 14:42:48 du plugin) le plugin MySensors pouvait poser problème et renvoyer l’erreur { [Error: socket hang up] code: ‘ECONNRESET’ }.

Avec la version 2.4.6, tout est rentré dans l’ordre. Depuis le gestionnaire de plugin, installez et activez le plugin MySensors.

Relancez l’installation des dépendances. Pendant ce temps, allez dans la configuration et passez en mode expert. Dans la section Configuration réseau, saisissez l’adresse IP de la box. Il ne semble plus nécessaire d’indiquer de complément (/jeedom). Sauvegardez.

jeedom mysensor plugin acces interne ip boxActualisez la page pour vérifier que le statut est passé à OK en vert.

Retournez au plugin pour terminer la configuration.

LAN Gateway, passerelle réseau

Dans le bloc configuration, choisissez Réseau dans la liste de sélection Gateway série maître puis indiquez l’adresse IP de la gateway réseau suivi du port. Par exemple

192.168.1.20:5003

Sauvegardez la configuration et démarrez le démon (flèche verte)

eedom mysensor plugin configurationOuvrez le journal (log) MySensors_node. Vous devriez commencer à recevoir les premiers messages (dès que des objets publient sur le réseau). 

https://i2.wp.com/www.projetsdiy.fr/wp-content/uploads/2016/08/4.-jeedom-mysensor-connecte-gateway-reseau.png?resize=660%2C303

Serial Gateway, passerelle USB

La configuration est presque identique. Dans la liste de choix, indiquez le port USB sur lequel est branché la gateway série.

jeedom-mysensor-configuration-gateway-serie-usb

Le journal de la gateway série est beaucoup plus complet.

jeedom mysensors gateway serial log

Inclusion d’objets MySensors (v1.x ou v2.x)

Sortez de la configuration et appuyez sur le bouton inclusion. Branchez votre objet. Jeedom détecte un nouveau objet lorsqu’on le branche, au moment où celui-ci se présente (fonction presentation()) sur le réseau MySensors.

jeedom-mysensor-mode-inclusion-objet

Après quelques secondes, un message apparait en haut de l’écran pour signaler qu’un nouveau matériel a été découvert.

jeedom-mysensor-inclusion-objet-detecte

A la fin du décompte, une fenêtre de configuration s’ouvre. Attribuer un parent, rendez le actif, visible… puis sauvegardez.

jeedom mysensor configuration sonde dht22

Retournez sur la page du plugin pour interrompre le mode inclusion. Vous pouvez suivre l’état de fonctionnement de vos objets MySensors en allant sur la page Santé.

jeedom-mysensor-sante-objets

Voilà, rien de plus facile pour intégrer vos projets MySensors à Jeedom.

-jeedom-mysensor-sonde-dashboard

A l’aide de MQTT

Si vous débuté avec Jeedom ou MQTT, suivez cet article qui explique comment préparer votre serveur, et celui-ci pour améliorer l’affichage des widgets en créant un périphérique virtuel.

A l’aide de la Gateway MQTT, l’intégration dans Jeedom via MQTT est très facile (si vous avez besoin d’en savoir plus sur MQTT et Jeedom, vous pouvez lire cet article). Seul bémol (Jeedom n’y est pour rien), Jeedom ajoute tous les Topics publiés par la Gateway, il va donc falloir la retrouver dans parmi tous les objets créés.

C’est assez simple. En activant le mode Debug (#define MY_DEBUG), on peut connaitre facilement l’adresse du capteur. En fait la gateway publie un Topic suivant le schéma de l’API Serial de MySensors (disponible ici en Anglais). Par exemple dans le cas présent on aura

mygw1-out/0/0/1/0/16

Que l’on retrouve coté Jeedom. L’écriture est légèrement différente, Jeedom retire les / et tronque la fin de l’adresse du Topic.

Jeedom MySensors v2 objet MQTTMaintenant, il ne reste plus qu’à l’ajouter au dashboard comme n’importe quel équipement. Le mieux est de passer par un appareil virtuel (déjà présenté dans cet article). Tout d’abord, on configure au minimum l’objet en le préfixant de MQTT. C’est plus facile pour faire la différence entre l’équipement virtuel et l’équipement MQTT.

jeedom mqtt equipement mysensor contacteur de porte

Configurez l’appareil virtuel en n’oubliant pas de changer le type de données (binaire), sinon il ne sera pas possible de choisir l’animation du widget.

jeedom appareil virtuel configuration mysensors

Depuis la roue, allez dans l’affichage avancé pour choisir le widget door.

jeedom appareil virtuel choix widget

Sauvegardez et ouvrez le dashboard. Tout fonctionne !
jeedom dashboard capteur mysensors v2

Comment utiliser des objets MySensors avec Domoticz

Version de Domoticz utilisée : v3.4834

Sur Domoticz, l’intégration de MySensors est native, c’est à dire qu’il n’y a aucun plugin à installer.

Ajouter la gateway ESP8266

Pour ajouter la Gateway, allez dans les réglages puis Matériel. Dans la liste, sélectionnez MySensors Gateway with Lan interface.

domoticz mysensor ajout choix gateway

Renseignez l’adresse ip (si vous l’avez fixée, c’est idéal) et le port (5003 par défaut). Enregistrez.
2. domoticz mysensor ajout gateway esp8266
La gateway est ajoutée à la liste. Cliquez sur réglages et attendez au moins une minute le temps que Domoticz fasse son travail et récupère les fils connectés. Vous pouvez en profitez pour donner un nom au noeud (la Gateway ESP8266 en l’occurence).

3. domoticz mysensor ajout dispositifs noeuds et fils

Ajouter un dispositif

Maintenant il ne reste plus qu’à créer un dispositif. Allez dans les Réglages puis Dispositifs. On y trouve notre matériel.

4. domoticz mysensor ajout appareil

Comme vous pouvez le voir, Domoticz se trompe en créant le dispositif en considérant que c’est un éclairage. Pour le moment, Domoticz ne supporte pas encore la version 2. Ce n’est pas grave, on va changer tout ça. Appuyez sur la flèche verte pour activer l’utilisation du dispositif. Donnez lui un nom, ici « Porte Fenêtre ».

5. Domoticz ajout dispositif

Allez ensuite dans les interrupteurs.

6. Domoticz dispositif mysensors

On y retrouve notre dispositif. Appuyez sur Editer. Dans la liste type interrupteur, choisissez Door Look. Sauvegardez.

7. Domoticz changement type interrupteur

Si vous voulez que ce dispositif soit affiché sur le Tableau de Bord, appuyé sur l’étoile. Voilà, votre contacteur de porte connecté est parfaitement intégré dans Domoticz. Il ne reste plus qu’à imaginer les scénarios…

8. Domoticz dispositif mysensors configuré

L’intégration sous Domoticz est beaucoup plus facile que sous Jeedom. Coté réactivité, je trouve que Jeedom est meilleur, mais c’est juste une impression.

Plus rien ne fonctionne !

La gateway ESP8266 est muette

J’ai rencontré le problème après avoir débranché mon ESP8266 de l’ordinateur (c’est ça quand on fait plein d’essais pour écrire les articles :-)). Malgrès une réinstallation du programme Arduino, rien n’y faisait. J’ai simplement réinstallé un programme Blink puis réinstallé le programme gateway. Tout est rentré dans l’ordre. Aucune idée sur l’origine du problème mais au moins ce n’était pas un problème matériel.

Avec Domoticz

Une panne de courant, un câble débranché… plus rien ne fonctionne…pas de panique. Tout d’abord, allez dans la configuration de la gateway et donnez un délai de redémarrage en cas d’inactivité.

domoticz force redemarrage apres delai d'attente

Ca n’a pas vraiment de sens pour un contacteur de porte, mais au moins en cas de perte de connexion, on force Domoticz à redémarrer le matériel et donc rétablir la situation.

domoticz force reconnexion gatezway mysensor apres inactivite
Log Domoticz : force la re-connexion à la gateway MySensor si inactive depuis plus d’une minute.

Seule ombre au tableau, l’architecture même de MySensor ne permet pas à Domoticz de récupérer l’état du capteur (surtout si on utilise la fonction sleep). Par exemple si une porte a été ouverte durant la panne, Domoticz va afficher le dernier état connu, qui évidemment, était probablement fermé !!. On reste dans le DIY, ça fonctionne mais ce n’est parfait. Il faudra attendre le prochain changement d’état pour rétablir l’état.

Si vous avez d’autres astuces, n’hésitez pas à les partager dans les commentaires comme d’habitude.

Mises à jour

  • 27/10/2016. Utilisation du plugin MySensors sous Jeedom 2.4.6 depuis image netinstall (tutoriel d’installation). Inclusion d’objets MySensors v2 depuis une gateway Serial ou une Gateway Réseau (à base d’ESP8266).
  • Saâd Benmansour

    Bonjour,
    Quand vous dites qu’une ESP-01 pourrait faire l’affaire, comment envisagez-vous le branchement de la radio NRF, sachant que ce modèle d’ESP ne compte que 2 GPIO ?
    Serait-il possible de considérer l’ESP seulement comme module de connectivité un peu comme le sketch pour W5100 ou ENC28J60, et donc de connecter les 2 modules à un arduino qui ferait alors office de gateway ?

    • Bonjour Saâd. Merci pour votre remarque. Oui, c’est exactement ça que j’avais en tête. Effectivement il n’y a pas assez de GPIO disponibles sur un ESP-01 pour y brancher un module nRF. J’ai modifié le texte pour éviter toute confusion. A très bientôt.