La gateway WiFi pour MySensors est un mini pont domotique qui permet de relier des objets connectés radio à un réseau local WiFi (ou Ethernet). Les IoT communiquent entre eux par ondes radio à la fréquences de 2,4GHz à l’aide du protocole MySensors. Les modules ESP8266 sont supportés depuis la version 1.5 grâce au travail de Yveaux.
Tutoriel actualisé le 26 mai 2020
Une fois connectés au réseau local via la gateway, on pourra intégrer les accessoires à un serveur domotique à l’aide d’un plugin. MySensors est supporté par la majorité des logiciels domotiques Open Source. C’est le cas de Domoticz, Jeedom et Home Assistant notamment. La liste complète des logiciels supportés est disponible ici.
Sommaire
Comment fabriquer 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.
Circuit
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 réducteur de tension.
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.
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
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.
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.
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 Arduino compatible ESP8266
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
#include
#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.
Actualisez 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)
Ouvrez le journal (log) MySensors_node. Vous devriez commencer à recevoir les premiers messages (dès que des objets publient sur le réseau).
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.
Le journal de la gateway série est beaucoup plus complet.
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.
Après quelques secondes, un message apparait en haut de l’écran pour signaler qu’un nouveau matériel a été découvert.
A la fin du décompte, une fenêtre de configuration s’ouvre. Attribuer un parent, rendez le actif, visible… puis sauvegardez.
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é.
Voilà, rien de plus facile pour intégrer vos projets MySensors à Jeedom.
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.
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.
Maintenant, il ne reste plus qu’à l’ajouter au dashboard comme n’importe quel équipement. Le mieux est de passer par un appareil virtuel.
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.
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.
Depuis la roue, allez dans l’affichage avancé pour choisir le widget door.
Sauvegardez et ouvrez le dashboard. Tout fonctionne !
Comment utiliser des objets MySensors avec Domoticz
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.
Renseignez l’adresse ip (si vous l’avez fixée, c’est idéal) et le port (5003 par défaut). Enregistrez.
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).
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.
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”.
Allez ensuite dans les interrupteurs.
On y retrouve notre dispositif. Appuyez sur Editer. Dans la liste type interrupteur, choisissez Door Look. Sauvegardez.
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…
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é 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é.
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.
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).
Avez-vous aimé cet article ?