Piloter le GPIO de l’ESP8266 (Serveur Web) depuis Domoticz en TCP/IP sans fil – Partie 2

Nous continuons aujourd’hui le tutoriel consacré à l’échange de données entre Domoticz et un ESP8266 par requête HTTP (TCP/IP) et plus particulièrement comment piloter le GPIO depuis Domoticz. Dans l’article précédent, nous avons mis en place l’envoi de données depuis un ESP8266 vers Domoticz. Dans cet article, nous allons mettre en place la communication dans l’autre sens. L’API JSON de Domoticz est une porte d’entrée polyvalente qui permet de mettre à jour des appareils, récupérer des données et réaliser des opérations sur le système domotique. Par contre, cette interface n’est pas bi-directionnelle. On va devoir utiliser un système de requêtes HTTP classique.  qui seront récupérées par un petit serveur Web qui fonctionne sur l’ESP8266.

Matériel utilisé

Nous allons reprendre le même montage que le tutoriel précédent. Cette fois, ce montage va permettre d’intégrer un ESP8266. Pour la partie sonde, vous pouvez utiliser un DHT11 ou un DHT22. Rapide à mettre en oeuvre grâce à la librairie DHT.h d’Adafruit. On pourra également ajouter un BMP180 qui permettra de créer un baromètre sur Domoticz. Pour le pilotage du GPIO, vous pouvez utiliser une simple LED ou un relai.

esp8266 Wemos D1 mini Module ESP8266 ESP-12. Par exemple Wemos D1 Mini
chargeur raspbery pi 3 5v 3000ma Alimentation 5V/3A micro-usb
BMP180 Capteur de pression atmosphérique

BMP180

Broches DHT22 Capteur de température et d’humidité

DHT11 ou DHT22

wemos d1 mini dht22 shield Shield DHT22 ou DHT11 pour Wemos D1 Mini

Le capteur est connecté à la broche D4 (GPIO2)

wemos d1 mini relai shield Shield relai  (250VAC/10A ou 30VDC/10A) pour Wemos D1 Mini.

Le relai est accessible depuis la broche D1 (GPIO5)

led 3mm Led (visualiser l’activation / désactivation du GPIO )
resistance 220ohms Résistance 220Ω
jumper dupont Jumper Dupont
breadboard Breadboard

Circuit

Composant Broches Broche ESP8266 (Wemos D1 mini)
DHT22 (shield Wemos D1 Mini) VCC 3V3
GND G
Data D4
BMP180 VCC 3V3
GND G
SDA D2
SCK D3
Led GPIO D7 Pole + D7
Pole – G
Shield relai Wemos D1 Mini D1

ESP8266 DHT22 BMP180 Shield Relay DOMOTICZ ESP8266HTTPCLIENT

Changer les broches du bus I2C de l’ESP8266

Avant d’aller plus loin, vous avez du remarquer que la carte relai de Wemos utilise la broche D1. La broche D1 est partagée avec le broche SCK du bus I2C. Il va donc falloir déplacer la broche du bus I2C pour pouvoir utiliser le shield relai en même temps. Pour cela, on utilise la librairie Wire.h

Déclarez la librairie en début de programme

Dans le setup() ; mais avant le d’initialiser l’objet BMP180 avec la commande bmp.begin() ; on déclare la initialise le bus I2C en indiquant les nouvelles broches. Comme d’habitude, inutile de chercher les broches équivalentes de l’Arduino, on indique directement les broches de l’ESP8266, la conversion se ferra automatiquement. Ici, j’ai déplacé par broche D1 (SCK) sur la broche D3, ce qui donne

C’est tout, vous pouvez maintenant déplacer le bus I2C sur les broches que vous voulez.

Piloter le GPIO de l’ESP8266 depuis Domoticz

Nous allons maintenant piloter le GPIO de l’ESP8266 depuis Domoticz. Vous pouvez également faire des demandes complexes en intégrant des requêtes HTTP dans vos scripts Lua. Ici, nous allons simplement activer le relai du shield relai pour Wemos D1 mini. Pour moins de 8€, vous pouvez réaliser une lampe connectée ou un simulateur de présence à l’aide d’un scénario.

Code Arduino / ESP8266

Pour recevoir des commandes depuis Domoticz, on va ajouter une partie serveur au code Arduino précédent. Ajoutez la librairie ESP8266WebServer au code précédent et créer un server écoutant sur le port 80.

Dans le startup ajouter une route sur /gpio après que la connexion au réseau Wi-Fi. Ce serveur sera simplement à l’écoute des appels sur une page /gpio. Chaque appel sur cette page déclenchera l’execution de la fonction updateGpio().

La fonction updateGpio() décode l’URL et met à jour l’état du GPIO correspondant. La fonction server.arg(“id”) permet de récupérer l’identifiant du GPIO etserver.arg(“etat”), l’état de ce dernier.

Remarque. On pourrait être tenté de répondre à Domoticz en lui demandant de changer l’état du switch ( /json.htm?type=command&param=switchlight&idx=99&switchcmd=On) mais cela provoque une boucle infinie ! C’est un peu dommage.

Voici le code Arduino complet qu’il vous suffit de téléverser après avoir modifié vos paramètres :

  • ssid et mot de passe WiFi
  • Adresse IP du serveur Domoticz (host) et le port s’il est différent de 8080

Configuration Domoticz : créer un interrupteur virtuel

Retournez dans le matériel pour ajouter un nouveau capteur virtuel.

Remarque. Donnez lui un nom sans espaces ni caractères spéciaux ou accentués si vous voulez créer un script en Lua.

domoticz esp8266 interrupteur shield relai wemos switch virtuel

Piloter le GPIO à l’aide d’une action

Pour allumer, éteindre une lampe sans aucune autre condition, le plus facile et le plus rapide est de configurer une action en fonction de l’état de l’interrupteur. Allez à l’onglet Interrupteurs et ouvrez l’appareil en édition.

Dans le champ Action On, collez l’URL suivante en remplaçant IP_ESP8266 par la votre

Pour l’état Off, on mettra donc simplement l’état à 0.

Enregistrez.

domoticz esp8266 shield relai wemos d1 mini url http action on off

Piloter le GPIO à l’aide d’un script Lua

L’autre manière de procéder et de créer un script Lua. C’est un peu plus long à mettre en place, mais on a toute la puissance du language à notre disposition. Si vous ne connaissez pas les scripts Lua, vous pouvez commencer par ce tutoriel.

Connectez-vous à votre serveur Domoticz en SSH et placez vous dans le répertoire des scripts Lua

On va créer u script qui se déclenche à chaque changement d’état de l’interrupteur. Par convention, le fichier devra donc porter le nom script_device_nomDuDevice.lua, ce qui donne

Collez ce code Lua. Modifiez l’adresse IP de votre ESP8266 dans la variable baseurlESP8266. Le script test la valeur de l’appareil RelayD1. Si elle est égale à On, on complète l’url en indiquant l’id=D1 avec l’état à 1, 0 dans le cas contraire. Vous pouvez mettre l’état à On, ON, ALLUME…il faudra simplement tester la valeur de la variable dans le code Arduino.

Sécuriser la communication

Il est possible d’améliorer la sécurité des échanges entre Domoticz et l’ESP8266. Vous avez certainement remarqué que l’envoi de données à Domoticz se fait sans la moindre authentification. Si on considère que le serveur domotique n’est jamais exposé à internet et que le réseau Wi-Fi est bien sécurisé, cela ne pose pas trop de problème. Par contre si vous voulez rendre accessible Domoticz depuis internet, il va falloir améliorer ça. Ici, nous n’irons pas jusqu’à chiffrer les échanges, c’est possible mais sort du cadre de ce tutoriel.

Réseaux locaux (pas d’identifiant ni mot de passe)

Dans la majorité des cas, vos objets connectés à base d’ESP8266 devrait se trouver sur le même réseau que le serveur Domoticz. Dans ce cas, le plus facile est d’ajouter les adresses IP de vos objets connectés à la liste des appareils autorisés à utiliser l’API dans autorisation. Pour cela, allez dans les réglages puis Paramètres et complétez le champ Réseaux.

Remarque. Dans ce cas, il est préférable d’attribuer une adresse IP fixe à l’ESP8266 car en cas de panne du routeur, l’adresse IP de ce dernier pourrait changer, et par conséquent ne plus fonctionner.

Authentification par utilisateur et mot de passe (code Arduino)

Si vous avez protégé l’accès de votre Domoticz par un identifiant et un mot de passe, il vous suffit de modifier la variable host

domoticz-securite-identifiant-mot-de-passeLa variable host prendra alors la forme

Remarque. Cette protection ne fonctionne que dans le sens ESP8266 vers Domoticz. Si vous voulez sécuriser le pilotage du GPIO, il faudra par exemple intégrer une clé publique qu’il suffira de vérifier dans le code Arduino.

Ajouter un token (jeton) dans la requête HTTP

Ces deux méthodes de sécurisation ne fonctionnent que dans le sens ESP8266 vers Domoticz. Il n’est pas (encore) possible de crypter le serveur web de l’ESP8266. Pour sécuriser les commandes, le plus simple est d’ajouter un clé publique ou un jeton qu’il suffira de tester dans le code Arduino. C’est une sécurisation assez basique mais c’est toujours mieux que rien.

domoticz relay shield wemos d1 mini request tcp ip

Voilà, vous pouvez maintenant envoyer des données, l’états de capteurs et piloter le GPIO de l’ESP8266 depuis un serveur Domoticz. La prochaine fois, nous verrons comment faire pour Jeedom.

Inscrivez-vous à la newsletter hebdomadaire

Aucun spam et aucun autre usage ne sera fait de votre email. Vous pouvez vous dés inscrire à tout moment.

Comparateur de prix

Bons plans

Les offres suivantes se terminent bientôt. Utilisez le coupon indiqué pour profiter du prix promo

  • Migui Pda

    Bonjour,

    sujet intéressant puisque j’aimerais bien aboutir à ceci :

    1) un Wemos D1 Mini (merci de mentionner si il serait alors preferable de prendre le 16M plutôt que le 4M)

    2) il serait place sur un “Dual board” pour avoir

    a) d’un côté avoir le Wemos D1 Mini avec un SHT30 (T° et H° plutôt qu’un DHT22) et un senseur de CO2 (https://www.aliexpress.com/item/MQ-9-combustible-gas-sensor-detects-carbon-monoxide-alarm-module-sensor-for-arduino-Compatible-1pcs/32794413364.html?spm=2114.01010208.3.319.GahB8Q&ws_ab_test=searchweb0_0,searchweb201602_6_10065_10068_433_434_10136_10137_1)

    b) de l’autre côté, un “Motor Shield Dual motor driver” (https://www.aliexpress.com/store/product/Motor-Shield-For-WeMos-D1-mini-I2C-Dual-Motor-Driver-TB6612FNG-1A-V1-0-0/1331105_32700182142.html?spm=2114.12010608.0.0.KpkN6A) en vue de commander en meme temps deux store (Rideau enrouleur), d’un bouton pour pouvoir le commander manuellement sans devoir passer par l’interface domotique (https://www.aliexpress.com/store/product/1-Button-Shield-for-WeMos-D1-mini-button/1331105_32575988167.html?spm=2114.12010615.0.0.yyPmKd) et pourquoi pas, avec un détecteur de presence pour peaufiner (seulement si nécessaire) (https://www.aliexpress.com/item/HC-SR04-Ultrasonic-Ranging-Module-Module-ultrasonic-sensors-for-arduino-Compatible-1pcs/2033580925.html?spm=2114.01010208.3.116.GahB8Q&ws_ab_test=searchweb0_0,searchweb201602_6_10065_10068_433_434_10136_10137_10138_10060_10)
    Ce dual board serait alors place sur chaque fenêtre (qui est compose de deux battants) donnant ainsi la T° et H° de la pièce, la possibilité de monter/descendre ensemble les deux stores sur les deux battants de fenêtres, mais également et surtout, de prévenir (le Banana Pi M2+ étant pairé en Bluetooth sur une baffle (speaker) centralisé) de toute accumaltion risquée de CO2 (indépendamment) pour chaque pièce (permettant alors d’enclencher les extracteurs d’humiditié ou VMC pour éviter les accidents).
    Merci, dans la mesure du possible, d’orienter le present article vers une solution cumulée comme présentée ci-dessus.
    Au plaisir de vous lire,
    Miguipda 😉

    • Bonjour Migui. Très beau projet ! Pour moi, c’est tout à fait possible. Pour le moment j’ai toutefois quelques réserves coté matériel. Je m’explique. Les capteurs de la série MQ sont des capteurs photochimiques. Ils doivent atteindre une température de fonctionner…donc il faut le laisser en permanence alimentée, c’est qui peut être problématique avec une alimentation sur batterie (même solaire). Il faut compter 15 minutes pour que la mesure soit correcte. Ensuite ce sont des capteurs sensibles à plusieurs polluants, on récupère un signal mais il faut procéder à un étalonnage pour connaître la teneur pour le gaz recherché. Comme personne n’est équipé, il faut s’en remettre à internet et là y a vraiment de tout ! J’ai mis en pose les articles sur le sujet (je n’aime pas écrire un article sans avoir vérifié/testé). J’ai commandé un autre MQ135 pour corréler mes mesures. Je pense qu’il vaudrait mieux partir sur des capteurs CO2 pré-calibré. Ils sont 10x plus couteux mais la mesure devrait être plus fiable. On trouve des exemples de code pour le MH-Z19 par exemple (http://s.click.aliexpress.com/e/yb6aiEm). Concernant le shield Motor, je viens de commander mon 3ème, les 2 premiers ne fonctionnent pas ! Il semble que le microcontroleur I2C STM32F030 des clones du shield Wemos ne sont pas programmés ! Et c’est pas très facile à faire : https://hackaday.io/project/18439-motor-shield-reprogramming. En attendant, il y a toujours le L293D ou L298N (http://s.click.aliexpress.com/e/I2zVjAA). Concernant la Wemos Pro 16M, les 16M ne sont pas encore (facilement) pris en charge. Pour moi l’intérêt réside dans la possibilité d’ajouter une antenne externe.Pratique si la wemos est dans une boite au lettre par exemple. Par contre, il faut au moins 5dBi pour commencer à voir la différence. Bon, c’est pas très positif comme réponse mais on devrait finir par trouver le matériel pour le faire. Bon week end

  • Migui Pda

    Oups, j’ai oublié ceci :
    3) l’idée étant, dans la mesure du possible et après calcul des consummation, d’alimenter ce Dual board avec une batterie solaire place à la fenêtre (parce que mes quatre fenêtres disposent d’un ensoleillement dès le matin jusqu’à 16 hr).
    Je me dis qu’en utilisant le fameux “Deep sleep”, peut-être pourrais-je le faire :
    a) ouvrir les stores le matin dès 6 hr
    b) lire toutes les heures (ou à convenir) la T° et H° sur la journée pour ne fermer les stores qu’à la demande du bouton ou à l’heure souhaitée le soir (que ce soit dès allumage des lampes intérieures – tiens faudrait rajouter un senseur de lumière).
    A bon entendeur 😉

  • Steph Des

    Dans la partie “Changer les broches du bus I2C”

    Au lieu de “Wire.begin(D2,D3);” ce n’est pas plutôt “Wire.begin(D1,D3);” ?

    • Bonjour Steph. On peut passer les broches que l’on souhaite au moment de l’appel Wire.begin. C’est pratique sur la Wemos par exemple car les shields se marchent un peu sur les pieds comme il y a moins de broches que sur un Arduino (vivement l’ESP32 !)

  • Steph Des

    Oups, j’ai oublié de te remercier vivement pour tous tes posts qui me sont bien utiles !

Projets DIY - Domotique et objets connectés à faire soi-même