Domoticz. Comment envoyer des données via l’API/JSON depuis un IoT ESP8266

Partager sur facebook
Partager sur twitter
Partager sur linkedin
Partager sur pinterest
Partager sur email
Partager sur telegram

Table des matières

Dans ce tutoriel, nous allons utiliser les librairies ESP8266Client et ESP8266HTTPClient pour mettre en place une communication TCP/IP entre et un module ESP8266 NodeMCU et l’interface API/JSON de Domoticz. Nous utiliserons un capteur de température et d’humidité DHT22 ainsi qu’un capteur de pression atmosphérique BMP180 pour publier des mesures réelles sur des capteurs virtuels du serveur domotique.

Lectures conseillées

Si vous débutez en domotique et en programmation Arduino, je vous conseille de débutez avec le firmware ESP Easy (tous les tutoriels sur le sujet) qui permet de créer des objets connectés sans aucune programmation.

A LIRE AUSSI :
ESP8266. Comment se connecter au réseau WiFi (ESP8266WiFi et ESP8266WiFiMulti)

Matériel utilisé

Nous allons commencer par créer un petit montage qui vous nous permettre d’interagir entre Domoticz et l’ESP8266. Pour la partie sonde, vous pouvez utiliser un DHT11 ou un DHT22. Rapide à mettre en oeuvre grace à la librairie DHT.h Adafruit. J’ai également ajouté un BMP180 permettant 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 LoLin WeMos D1 Mini
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 pour LoLin 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
led 3mm Led (visualiser l’activation / désactivation du GPIO )
resistance 220ohms Résistance 220Ω
jumper dupont Jumper Dupont
breadboard Breadboard

Circuit

Composant Broches Repérage Arduino Broche ESP8266 (LoLin D1 mini)
DHT22 (shield Wemos D1 Mini) VCC 3V3 3V3
GND GND G
Data GPIO2 D4
BMP180 VCC 3V3 3V3
GND GND G
SDA GPIO4 D2
SCK GPIO5 D1
Led GPIO D7 Pole + GPIO13 D7
Pole – GND G

 

 

ESP8266 DHT22 BMP180 DOMOTICZ ESP8266HTTPCLIENT

Interface de communication Domoticz (API et URL JSON)

Domoticz met à disposition une interface de communication (API) qui permet d’envoyer des données (mesure, état…) depuis un objet connecté vers Domoticz. En retour Domoticz. Cette interface est très puissante. Non seulement il est possible d’envoyer des données à Domoticz, mais il est également possible de réaliser toutes les opérations d’administration directement depuis le programme Arduino. En voici quelques unes :

  • Créer un appareil virtuel (param=addhardware)
  • Créer un capteur virtuel (param=createvirtualsensor)
  • Ajouter, supprimer une scène
  • Ajouter, supprimer un groupe
  • Arrêter, redémarrer le système

Il est également possible de récupérer l’état et les valeurs des différents appareils et capteurs (param=getlightswitches). En retour Domoticz renvoi un fichier au format JSON.

Pour connaître en détail le fonctionnement de toutes les commandes disponibles, vous pouvez aller sur le wiki officiel. Je vous conseille également de lire cette excellente traduction française faite par easydomoticz.com

Ce qui va surtout nous intéresser dans ce tutoriel, c’est comment envoyer des données à l’API Domoticz. C’est assez simple à mettre en oeuvre. Domoticz récupère les données encodées dans l’URL. Par exemple pour envoyer la température (26°C) au device (IDX 111), il suffit d’envoyer au serveur la requête HTTP suivante.

http://#IP_SERVER#/json.htm?type=command&param=udevice&idx=111&nvalue=0&svalue=26

Capteur virtuel (température + humidité + baromètre)

Avant d’entamer le code Arduino, nous allons créer un capteur virtuel qui va recevoir les mesures en provenance du DHT22 et du BMP180 connectés à l’ESP8266. Allez dans les Réglages puis Matériel. Créez un nouveau matériel de type Dummy. Désactivez le délai d’attente des données puis Ajouter.

domoticz esp8266 tcp ip http dummy device

Un nouveau matériel a été créé. Cliquez sur le bouton Créer capteurs virtuels.

domoticz-esp8266-creer-capteur-virtuel

Donnez un nom au capteur et choisissez le type qui correspond. Ici Temp+Humidité+Baromètre

domoticz esp8266 capteur virtuel temperature barometre humidite

Une fois créé, le capteur virtuel est ajouté à la liste des dispositifs. Il a également automatiquement été ajouté dans les onglets Température et Météo. Ce qui est important, c’est de repérer son identifiant (IDX). Ici, c’est le 12.

4 domoticz esp8266 appareil

Envoyer des données depuis l’ESP8266 vers Domoticz (exemple avec DHT22 et BMP180)

Passons au choses sérieuses maintenant. Ouvrez l’IDE Arduino, créez un nouveau sketch et collez le code complet du projet. Modifiez les variables ssid, password ainsi que l’adresse IP du serveur Domoticz (variable host).

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <DHT.h>
#include <Adafruit_BMP085.h>

#define DHTTYPE   DHT22       // DHT type (DHT11, DHT22)
#define DHTPIN    D4          // Broche du DHT / DHT Pin

const char* ssid     = "XXXXXXXX";
const char* password = "XXXXXXXX";
const char* host = "XXX.XXX.XXX.XXX";
const int   port = 8080;
const int   watchdog = 60000; // Fréquence d'envoi des données à Domoticz - Frequency of sending data to Domoticz
unsigned long previousMillis = millis(); 

DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP085 bmp;
HTTPClient http;

void setup() {
  Serial.begin(115200);
  delay(10);
  
  if ( !bmp.begin() ) {
    Serial.println("BMP180 KO!");
    while (1);
  } else {
    Serial.println("BMP180 OK");
  }
  
  Serial.setDebugOutput(true);  
  Serial.println("Connecting Wifi...");

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
   
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.print(WiFi.localIP()); 
}

int value = 0;

void loop() {
  unsigned long currentMillis = millis();

  if ( currentMillis - previousMillis > watchdog ) {
    previousMillis = currentMillis;

    if(WiFi.status() != WL_CONNECTED) {
      Serial.println("WiFi not connected !");
    } else {  
      Serial.println("Send data to Domoticz");
      
      float t = dht.readTemperature();
      float h = dht.readHumidity();
      float pa = bmp.readPressure() / 100.0F;
      
      if ( isnan(t) || isnan(h) ) {
        Serial.println("DHT KO");
      } else {
        int hum_stat;
        int bar_for = 0;
        if ( h > 70 ) {
          hum_stat = 3;
        } else if ( h < 30 ) {
          hum_stat = 2; 
        } else if ( h >= 30 & h <= 45 ) {
          hum_stat = 0;
        } else if ( h > 45 & h <= 70 ) {
          hum_stat = 1;
        }

        if ( pa > 1030 ) {
          bar_for = 1;  
        } else if ( pa > 1010 & pa <= 1030 ) {
          bar_for = 2;
        } else if ( pa > 990 & pa <= 1010 ) {
          bar_for = 3;
        } else if ( pa > 970 & pa < 990 ) {
          bar_for = 4;
        }
        
        String url = "/json.htm?type=command&param=udevice&idx=12&nvalue=0&svalue=";
        url += String(t); url += ";";
        url += String(h); url += ";";
        url += String(hum_stat); url += ";";
        url += String(pa);url += ";";
        url += String(bar_for);
     
        sendDomoticz(url);
      }
    }
  }
}

void sendDomoticz(String url){
  Serial.print("connecting to ");
  Serial.println(host);
  Serial.print("Requesting URL: ");
  Serial.println(url);
  http.begin(host,port,url);
  int httpCode = http.GET();
    if (httpCode) {
      if (httpCode == 200) {
        String payload = http.getString();
        Serial.println("Domoticz response "); 
        Serial.println(payload);
      }
    }
  Serial.println("closing connection");
  http.end();
}

Le programme n’a rien de bien compliqué. Il faut simplement s’assurer que l’on a bien récupéré des mesures valides du DHT22 (et du BMP180) avant d’envoyer les mesures au serveur. En effet, Domoticz ne fait aucune vérification des valeurs entrantes. Il fait une confiance aveugle. Malheureusement, la librairie DHT.h renvoi nan si aucun mesure n’est renvoyée par le DHT. Dans ce cas, tous les afficheurs vont disparaître des différents onglets. Pas de panique toutefois, dès que des valeurs valides seront envoyées, les affichages seront rétablis.

Regardons de plus prêts comment envoyer les mesures. Si on regarde de plus près sur le wiki (ici), on doit envoyer une requête de la forme

/json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=TEMP;HUM;HUM_STAT;BAR;BAR_FOR

On connait déjà notre IDX. Ici c’est le 12. On va devoir construire une chaine en y incluant les mesures de température, humidité et pression atmosphérique. Domoticz est capable également de gérer 2 autres informationsbarometre2

  • HUM_STAT (Humidity Status). Il est définit un peu plus haut dans le wiki mais c’est à nous de le calculer
    • 0=Normal (normal) : de 30 à 45%
    • 1=Comfortable (confortable) : de 45 à 70%
    • 2=Dry (sec) : < 30%
    • 3=Wet (humide) > 70%
  • BAR_FOR (Barometer Forecast, prévision barométrique). C’est également à nous de faire le travail. En l’absence de la vitesse et de la direction du vent, la prévision sera très aléatoire. On pourrait aller chercher ses infos sur openweathermap.org par exemple. Sans aller si loin, on peut avoir une petite idée en nous basant uniquement sur la pression atmosphérique pour des plages précises. En dehors, on renverra 0 (no info). La classification est un peu déroutante, il manque la neige, les orages… il faudra se contenter de ça en attendant une évolution.
    • 0 = No info (aucune prévision)
    • 1 = Sunny (ensoleillé) : > 1030hPa
    • 2 = Partly cloudy (partiellement nuageux) de 1010 à 1030hPa
    • 3 = Cloudy (nuageux) de 990 à 1010hPa
    • 4 = Rain (Pluie) : de 970 à 990hPa

Cela donne par exemple la requête suivante

/json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=27.10;31.10;0;981.03;4

Il ne reste plus qu’à faire une requête GET. Un post ne convient pas vraiment dans ce cas car toutes les données ont été encodées dans une URL. Il n’y a aucunes autres données à envoyer au serveur.

http.begin(host,port,url);
int httpCode = http.GET();

Il est possible de réaliser d’autres traitements de vérification en testant le code renvoyé par la fonction GET.

Résultat obtenu

Une fois le code Arduino téléversé, retournez sur l’interface de Domoticz. Dès que Domoticz aura reçu les premières mesures, l’afficheur sera actualisé.

domoticz http tcpip esp8266 dht22 bmp180

 

Vous pouvez continuer par la lecture de ce tutoriel qui explique comment afficher d’autres types de données ou piloter un relais ou une prise connectée à l’aide de l’équipement virtuel Dummy Device de Domoticz.

A LIRE AUSSI :
Capteur et matériel virtuel Domoticz. Test avec ESP Easy et ESP8266
Avez-vous aimé cet article ?
[Total: 3 Moyenne: 5]
Partager sur facebook
Partager sur twitter
Partager sur linkedin
Partager sur pinterest
Partager sur email
Partager sur telegram

Vous avez aimé ce projet ? Ne manquez plus aucun projet en vous abonnant à notre lettre d’information hebdomadaire!

quel modèle esp8266 choisir
Quel modèle d'ESP8266EX choisir en 2020 ?
guide choix esp32 development board
Quel ESP32 choisir en 2020 ?

Vous rencontrez un problème avec ce sujet ?

Peut-être que quelqu’un a déjà trouvé la solution, visitez le forum avant de poser votre question

14 Commentaires
  1. Bonjour,
    J’avais le même problème que je viens de résoudre avec l’aide précieuse de ProjetsDiy et c’est très étonnant. Je me suis aperçu par hasard, que j’avais accès à Domoticz sur deux ports différents 8443 et 8084. Seul le 8084 fonctionne pour moi.
    Seb

    • Oui c’est étonnant, c’est bien le même serveur ? Il n’y aurait pas 2 containers docker en marche ?

      • Les messages se sont un peu mélangés, je voulais répondre à ANTHONY G.
        Pour moi, Domoticz est installé directement sur le NAS sans passer par un docker, enfin il me semble.
        un port eh http et l’autre en https, seul le http fonctionne pour recevoir le JSON
        En tout cas, merci pour toute l’aide.
        Seb

  2. Bonjour,
    Je débute avec la domotique, du coup j’ai parfois un peu de mal.
    J’ai domoticz sur un NAS Synology et j’ai essayé de dérouler ce tuto, mais sans succès.
    Pour faire un test, j’envoie une température fixe, Déjà, si ça pouvait communiquer 🙂
    Pas de soucis avec mon DI mini, il est bien sur le réseau, mais lors du “int httpCode = http.GET();” ça me renvoie “-5” connexion perdue il me semble.
    Il y a t ‘il une astuce particulière du fait que Domoticz soit sur un NAS ? Ou bien je loupe autre chose ?

    Merci

    • CELA FONCTIONNE !!!
      bravo et merci. Par contre cela titille ma suciosité car c’est exactement la même ligne de commande que j’ai utilisé. la différence, mais qui me semble anegdotique, c’est que pour tester, je suis passé d’abord par un capteur température, puis température/humidité.
      Si je trouve la raison de ce changement, je ne manquerai pas de l’indiquer sur ce fil pour aider les autres internautes. En tout cas, merci pour l’aide qui m’a été bien précieuse.
      Seb

      • Bonjour Seb, super nouvelle, merci beaucoup pour le retour ! J’ai fait quelques essais complémentaires et pour vous rassurer, j’ai rencontrer le même problème ! Je me demande s’il n’y a pas un problème avec l’interface JSON de Domoticz qui s’arrête par moment. J’ai fait une recherche mais je n’ai rien trouvé allant dans ce sens pour le moment. Affaire à suivre…Bon dimanche

    • Bonjour Seb. Avez vous testé la commande HTTP envoyée par l’ESP8266 sur un navigateur internet ? Ca permettrait déjà de voir si tout est correct de ce coté. Non, le fait que Domoticz soit installé sur un NAS ne change rien. Il faut bien récupérer l’IP et le port pour construire correctement la requête HTTP sur l’ESP8266.

      • Merci pour votre réponse, mais hélas, j’ai le même problème “La connexion a été réinitialisée”.
        C’est un acpteur température/humidité et j’envoie la ligne : http://192.168.xx.yy:8443/json.htm?type=command&param=udevice&idx=7&nvalue=0&svalue=25;33;0

        • J’avais mis le port 8443 car ma page Domoticz est a l’adresse 192.180.XX.YY:8443/#/Temperature
          Le port 8443 donne le message “La connexion a été réinitialisée” depuis linux “ERR_EMPTY_REPONSE”
          Le port 8080 “La connexion a échoué” depuis linux “ERR_CONNECTION_REFUSED”
          Le port 443 donne “La connexion a échoué” depuis un linux “400 Bad Request”

        • Bonsoir Seb. Oui si vous avez installé Domoticz via Docker, cela semble normal qu’il y ait un routage du port. Je pensais que vous étiez sur une VM, désolé. J’ai testé chez moi avec succès (chez moi Domoticz est accessible sur le port 8081) http://IP_NAS:8081/json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=25.4 La température est bien mise à jour et j’ai bien confirmation dans le navigateur
          {
          “status” : “OK”,
          “title” : “Update Device”
          }
          Il y a qq chose qui bloque la requête mais j’arrive pas à trouver quoi, pas facile à distance. Y a quoi dans les logs de Domoticz ? Chez moi j’ai cette trace
          2020-12-11 17:40:03.259 Active notification Subsystems: gcm, http (2/13)
          2020-12-11 17:40:03.267 Starting shared server on: :::6144

        • Oui il me semble qu’il y a une erreur au niveau du port. Le port est 8443. Ca doit être un mixte entre le 443 (sécurisé) et le 8080. ca devrait fonctionner après. Dites moi

  3. Bonsoir,

    Pour ma part en compilant ce code aucune réponse du serveur domoticz.

    J’ai essayé avec ou sans identifiant, en ajoutant dans les réseaux sans mot de passe, mais toujours rien.

    si je tape l’url directement dans chrome aucun soucis.

    Quelqu’un à une idée …???

  4. bonjour
    je suis un super novice
    j utilise un nodemcu ,il y a une modification a faire ? car j ai un message d erreur
    2018-11-25 12:01:52.883 Status: User: Admin initiated a switch command (26/d1/Off)
    2018-11-25 12:01:52.475 Error: Error opening url: http://192.168.1.88/gpio?id=D1&etat=1&token=123abCde
    2018-11-25 12:01:55.595 Error: Error opening url: http://192.168.1.88/gpio?id=D1&etat=0&token=123abCde
    2018-11-25 12:02:23.354 (1-wire) Temp (Temperature2)
    2018-11-25 12:03:38.361 (1-wire) Temp (Temperature4)
    2018-11-25 12:04:53.373 (1-wire) Temp (Temperature3)

    merci

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Calculateurs
×
Calculateur loi d'Ohm
Tension (U) - en Volt
Courant (I) - en Ampère
Résistance (R) - en Ohms
Puissance (P) - en Watts

Ce calculateur permet de calculer les relations entre le courant, la tension, la résistance et la puissance dans les circuits résistifs.

Saisir au moins deux valeurs puis cliquer sur calculer pour calculer les valeurs restantes. Réinitialisez après chaque calcul.

Rappel sur la Loi d'Ohm
La loi d'Ohm explique la relation entre la tension, le courant et la résistance en déclarant que le courant traversant un conducteur entre deux points est directement proportionnel à la différence de potentiel entre les deux points.
La loi d'Ohm s'écrit U = IR, où U est la différence de tension, I est le courant en ampère et R est la résistance en Ohms (symbole Ω).
Loi d'Ohm (U=RI)
×
Déchiffrer le code couleur d'une résistance à 4 bandes
Bande 1 Bande 2 Multiplicateur Tolérance
   

Résistance:  

1 000 Ω ±5%

Comment déchiffrer le code couleur d'une résistance à 4 anneaux
Formule : ab*cΩ ±d%
Les deux premières bandes (a, b) permettent de déterminer le chiffre significatif. La première bande correspond au chiffre de la dizaine, le second anneau le chiffre de l'unité. Par exemple Brun(1), Noir (0) donne le nombre 10.
La troisième bande (c) est un coefficient multiplicateur. Par exemple, l'anneau rouge est un coefficient multiplicateur de 100, ce qui donne 10 X 100 = 1000Ω.
Le quatrième anneau (d) indique la tolérance de la valeur nominale de la résistance. Par exemple l'anneau Or correspond à ±5%. Donc le fabricant de la résistance s'engage à ce que sa valeur soit comprise entre 950 Ω et 1050 Ω.
Déchiffrer code couleur 4 bandes
×
Déchiffrer le code couleur d'une résistance à 5 bandes
Bande 1 Bande 2 Bande 3 Multiplicateur Tolérance

Résistance:  

1 000 Ω ±5%

Comment déchiffrer le code couleur d'une résistance à 5 anneaux
Formule : abc*dΩ ±e%
Les trois premières bandes permettent de déterminer le chiffre significatif. La première bande correspond au chiffre de la dizaine, le second anneau le chiffre de l'unité. Par exemple Brun(1), Noir (0), Noir (0) donne le nombre 100
La quatrième bande est un coefficient multiplicateur. Par exemple, l'anneau brun correspond au coefficient multiplicateur 10, ce qui donne 100 X 10 = 1000Ω.
Le cinquième anneau indique la tolérance de la valeur nominale de la résistance. Par exemple l'anneau Or correspond à ±5%. Donc le fabricant de la résistance s'engage à ce que la valeur de la résistance soit comprise entre 950 Ω et 1050 Ω.
Déchiffrer code couleur 5 bandes
×
Calculateur de résistance série pour une ou plusieurs LED
Tension d'alimentation en Volt
Tension directe en Volt
Courant en mA
Résistance calculée en Ω
Puissance estimée en W

Ce calculateur permet de déterminer la résistance requise pour piloter une ou plusieurs LED connectées en série à partir d'une source de tension à un niveau de courant spécifié.

Remarque. Il est préférable d'alimenter le circuit avec une puissance nominale comprise entre 2 et 10 fois la valeur calculée afin d'éviter la surchauffe
Couleur Longueur d'onde (nm) Tension (V) pour LED ⌀3mm Tension(V) pour LED ⌀5mm
Rouge 625-630  1,9-2,1 2,1-2,2
Bleu 460-470 3,0-3,2 3,2-3,4
Vert 520-525 2,0-2,2 2,0-2,2
Jaune 585-595 2,0-2,2 3,0-3,2
Blanc 460-470 3,0-3,2 1,9-2,1
Résistance en série pour une ou plusieurs LED
×
Calculateur durée de vie d'une batterie
Capacité de la batterie
Consommation de l'appareil ou objet connecté

Ce calculateur estime la durée de vie d'une batterie, en fonction de sa capacité nominale et du courant ou de la puissance qu'une charge en tire.

La durée de vie de la batterie est une estimation idéalisée. La durée de vie réelle peut varier en fonction de l'état de la batterie, de son âge, de la température, du taux de décharge et d'autres facteurs. C'est le mieux que vous pouvez espérer obtenir.

Autonomie de la batterie = capacité de la batterie en mAh / courant de charge en mA

Durée de vie batterie
Publicité
À lire aussi
Composants
Sur le Forum
Domotique et objets connectés à faire soi-même
Domotique et objets connectés à faire soi-même
Vous avez aimé ce tutoriel

Ne manquez plus les prochains projets

Recevez chaque semaine le récapitulatif des tutoriels et projets.

Vous pouvez vous désabonner à tout moment.