ESP8266 + DHT22 + MQTT : fabriquer un objet connecté et l’inclure dans Home Assistant

ESP8266 + DHT22 + MQTT, voici comment nous allons apprendre à réaliser notre premier objet connecté (une sonde de température) et le connecter au serveur domotique Home Assistant.

 

Pour réaliser cet objet connecté nous aurons besoin d’un module WiFi ESP8266, d’un capteur de température et d’humidité DHT22 et d’une Led (pour simuler la commande d’une lampe). Pour la partie domotique, nous utiliserons le logiciel Home Assistant présenté précédemment.

Configuration nécessaire

Vous aurez besoin d’un ordinateur avec les logiciels suivants installés :

  • Un Broker (serveur) MQTT. Je vous conseille Mosquitto déjà présenté dans cet article
  • Un serveur domotique. Le plus facile si vous débutez en domotique et que l’anglais ne vous rebute pas trop, est d’installer Home-Assistant décrit dans cet article.

Pour réaliser cet article, j’ai utilisé un Raspberry Pi 3 avec une connexion SSH active (si vous avez besoin d’en savoir plus sur SSH, lisez cet article au préalable).

Matériel nécessaire

Pour réaliser ce projet, vous aurez besoin du matériel suivant

 

Circuit

La Wemos D1 mini se câble comme un Arduino classique. Lorsque la Wemos D1 Mini est branchée au port USB de l’ordinateur, on récupère l’alimentation sur le Pin +5V. Pour faire fonctionner la Wemos sur batterie LiPo ou piles il suffira de brancher sur les Pin 5V et G.

Dans le programme, le DHT22 est branché sur le Pin D4, la Led sur le Pin D2.

 

IOT object connecté domotique home-assistant ESP8266+DHT22+MQTT_bb

Code

L’ESP8266 (ESP-12) peut se programmer en Lua ou à l’aide de l’IDE Arduino. Encore une fois c’est question de goût. J’ai une préférence pour l’IDE par habitude mais surtout les librairies ESP8266Wifi et PubSub simplifient vraiment la vie des développeurs.

Pour publier les mesures sur le Broket MQTT Mosquitto, nous allons avoir besoin d’intégrer les 3 librairies suivante à notre projet Arduino :

  • ESP8266WiFi.h : cette librairie et la boîte à outil idéal pour connecter (et reconnecter) un ESP8266 à internet, à un serveur…
  • PubSubClient.h : cette librairie permet d’envoyer et de recevoir des messages MQTT et de gérer le QoS
  • DHT.h : cette librairie permet de récupérer facilement les mesures du capteur DHT11 ou DHT22

Créez un nouveau projet et collez le code suivant en l’adaptant à votre configuration.

Le code du projet est également disponible sur GitHub ici
/*
  Projet d'apprentissage d'un objet connecté (IoT)  pour réaliser une sonde de température
  ESP8266 + DHT22 + LED + MQTT + Home-Assistant
  Projets DIY (https://www.projetsdiy.fr) - Mai 2016
  Licence : MIT
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"          // Librairie des capteurs DHT

#define wifi_ssid "yourSSID"
#define wifi_password "yourPASSWORD"

#define mqtt_server "ipMOSQUITTO"
#define mqtt_user "guest"  //s'il a été configuré sur Mosquitto
#define mqtt_password "guest" //idem

#define temperature_topic "sensor/temperature"  //Topic température
#define humidity_topic "sensor/humidity"        //Topic humidité

//Buffer qui permet de décoder les messages MQTT reçus
char message_buff[100];

long lastMsg = 0;   //Horodatage du dernier message publié sur MQTT
long lastRecu = 0;
bool debug = false;  //Affiche sur la console si True

#define DHTPIN D4    // Pin sur lequel est branché le DHT

// Dé-commentez la ligne qui correspond à votre capteur 
//#define DHTTYPE DHT11       // DHT 11 
#define DHTTYPE DHT22         // DHT 22  (AM2302)

//Création des objets
DHT dht(DHTPIN, DHTTYPE);     
WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  Serial.begin(9600);     //Facultatif pour le debug
  pinMode(D2,OUTPUT);     //Pin 2 
  setup_wifi();           //On se connecte au réseau wifi
  client.setServer(mqtt_server, 1883);    //Configuration de la connexion au serveur MQTT
  client.setCallback(callback);  //La fonction de callback qui est executée à chaque réception de message   
  dht.begin();
}

//Connexion au réseau WiFi
void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connexion a ");
  Serial.println(wifi_ssid);

  WiFi.begin(wifi_ssid, wifi_password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("Connexion WiFi etablie ");
  Serial.print("=> Addresse IP : ");
  Serial.print(WiFi.localIP());
}

//Reconnexion
void reconnect() {
  //Boucle jusqu'à obtenur une reconnexion
  while (!client.connected()) {
    Serial.print("Connexion au serveur MQTT...");
    if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
      Serial.println("OK");
    } else {
      Serial.print("KO, erreur : ");
      Serial.print(client.state());
      Serial.println(" On attend 5 secondes avant de recommencer");
      delay(5000);
    }
  }
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  long now = millis();
  //Envoi d'un message par minute
  if (now - lastMsg > 1000 * 60) {
    lastMsg = now;
    //Lecture de l'humidité ambiante
    float h = dht.readHumidity();
    // Lecture de la température en Celcius
    float t = dht.readTemperature();

    //Inutile d'aller plus loin si le capteur ne renvoi rien
    if ( isnan(t) || isnan(h)) {
      Serial.println("Echec de lecture ! Verifiez votre capteur DHT");
      return;
    }
  
    if ( debug ) {
      Serial.print("Temperature : ");
      Serial.print(t);
      Serial.print(" | Humidite : ");
      Serial.println(h);
    }  
    client.publish(temperature_topic, String(t).c_str(), true);   //Publie la température sur le topic temperature_topic
    client.publish(humidity_topic, String(h).c_str(), true);      //Et l'humidité
  }
  if (now - lastRecu > 100 ) {
    lastRecu = now;
    client.subscribe("homeassistant/switch1");
  }
}

// Déclenche les actions à la réception d'un message
// D'après http://m2mio.tumblr.com/post/30048662088/a-simple-example-arduino-mqtt-m2mio
void callback(char* topic, byte* payload, unsigned int length) {

  int i = 0;
  if ( debug ) {
    Serial.println("Message recu =>  topic: " + String(topic));
    Serial.print(" | longueur: " + String(length,DEC));
  }
  // create character buffer with ending null terminator (string)
  for(i=0; i<length; i++) {
    message_buff[i] = payload[i];
  }
  message_buff[i] = '\0';
  
  String msgString = String(message_buff);
  if ( debug ) {
    Serial.println("Payload: " + msgString);
  }
  
  if ( msgString == "ON" ) {
    digitalWrite(D2,HIGH);  
  } else {
    digitalWrite(D2,LOW);  
  }
}

Si vous découvre les modules ESP8266, lisez d’abord cet article pour apprendre comment le programmer et téléverser un programme à l’aide de l’IDE Arduino.

Intégration à un serveur domotique Home Assistant

Si vous ne connaissez pas Home-Assistant, je vous invite à lire cet article qui explique comment l’installer et y configurer votre box pour y accéder depuis internet.

Ce qui est génial avec Home-Assistant c’est qu’il n’y a qu’un script à modifier pour pouvoir afficher la température et l’humidité publiée par l’ESP8266 sur Mosquitto. Allez dans le répertoire d’installation d’Home-Assistant.io

cd ~/.homeassistant

puis ouvrez le fichier de configuration

sudo nano configuration.yaml

On ajoute une section mqtt

mqtt: 
  broker: localhost #si le Broker est installé sur le même poste qu'Home-Assistant&nbsp; 
  port: 1883        #par défaut 
  client_id: home-assistant-1 
  keepalive: 60
  username: USERNAME #optionnel 
  password: PASSWORD #optionnel 
  protocol: 3.1      #par défaut

Maintenant on ajoute un nouveau capteur (sensor) et on récupère la température sur le topic sensor/temperature. La valeur se trouve dans le payload

sensor:
  platform: mqtt
  state_topic: "sensor/temperature"
  name: "Température"
  qos: 0
  unit_of_measurement: "°C"
  #value_template: '{{ payload }}'

On fait de même pour l’humidité en ajoutant un sensor 2

sensor 2: 
  platform: mqtt
  state_topic: "sensor/humidity"
  name: "Humidité"
  qos: 0
  unit_of_measurement: "°C"
  #value_template: '{{ payload }}'

Enregistrez la configuration (Ctrl + X puis O) et lancez le serveur avec la commande hass. Actualisez la page dans votre navigateur pour voir apparaître la mesure de température et d’humidité.

home assistant mqtt sensor esp8266

Allumer, éteindre une Led depuis Home-Assistant

Ajoutons maintenant un interrupteur qui va nous permettre d’allumer ou d’éteindre un Led. C’est un exemple général. On active simplement une sortie de l’Arduino. On pourrait très simplement remplacer la Led par un relai.

Arrêtez Home-Assistant et ouvrez de nouveau le fichier de configuration.yaml dans lequel on va ajouter un bloc switch

switch:&nbsp; 
  platform: mqtt
  name: "Cuisine"
  command_topic: "homeassistant/switch1" #Topic sur lequel on publie l'état de l'interrupteur
  payload_on: "ON" # A vous de choisir le message envoyé lorsque l'interrupteur est allumé&nbsp;
  payload_off: "OFF" # et éteint
  optimistic: true # Mettez à true pour maintenir l'état
  qos: 0
  retain: true
  value_template: '{{ value.x }}'

esp8266 wemos d1 mini home assistant switch interrupteur mqtt  

Relancez Home-Assistant. Vous avez maintenant un nouveau widget nommé “Switch” dans lequel se trouve l’interrupteur de la cuisine. Appuyez sur l’éclair pour allumer la LED.

Si vous avez configuré votre box pour rendre accessible le serveur Home-Assistant depuis internet, vous pouvez même allumer et éteindre la led depuis votre smartphone.

 

IOT object connecté domotique home-assistant ESP8266+DHT22+MQTT wemos d1 mini

J’espère que vous avez apprécié ce petit projet de découverte des modules ESP8266 intégrés à un serveur domotique. Dans un prochain article nous l’intégrerons à Jeedom.

Inscrivez-vous à la newsletter hebdomadaire

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

Promos à ne pas louper

41
Poster un Commentaire

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.

  S’abonner  
Notifier de
ludovic bell

merci

BabyfacePi

Bonjour

Merci pour ce tuto, étant donné qu’ils il y plusieurs autres pin de disponibles.
Est-il possible de connecter d’autres capteurs ?

Si “Oui” pouvez-vous s’il vous plait indiquer les lignes des codes à ajouter
par exemple j’ai 3 Aquariums qui sont côte à côte, il y en a un j’ai un DHT Sensor DS18B20 (water proof) et je voudrais utiliser le même Wemos D1 mini pour connecter deux autres DS18B20
cdmt

Bonjour et merci beaucoup. Oui absolument. Tout va dépendre du type de bus de données utilisé par le capteur/actionneur. Les capteurs numériques I2C utilisent 2 broches (D1 et D2) mais ils sont connectés en réseau. On peut donc avoir jusqu’à 127 capteurs (de mémoire). Si c’est un signal analogique, on ne pourra connecter qu’un seul capteur car l’ESP8266 ne dispose que d’un seul convertisseur (à moins d’utiliser une carte additionnelle qui va ajouter des entrées supplémentaires). A très bientôt

BabyfacePi

Merci pour votre réponse très rapide Du coup pour ajouter un autre objets j’ai juste à a jouter un objet et changer le pin D2 par D4 ou D4 par exemple ? //Création des objets DHT dht(DHTPIN, DHTTYPE); DHT dht2(DHTPIN, DHTTYPE); WiFiClient espClient; PubSubClient client(espClient); //Création des objets void setup() { Serial.begin(9600); //Facultatif pour le debug pinMode(D2,OUTPUT); //Pin 2 setup_wifi(); //On se connecte au réseau wifi client.setServer(mqtt_server, 1883); //Configuration de la connexion au serveur MQTT client.setCallback(callback); //La fonction de callback qui est executée à chaque réception de message dht.begin(); } void setup() { Serial.begin(9600); //Facultatif pour le debug pinMode(D3,OUTPUT); //Pin… Lire la suite »

Oui, c’est ça. Par contre il ne peut y avoir qu’une seule fonction setup. C’est la boucle d’initialisation. Pour créer un 2nd objet (au sens objet C/C++) on fera par exemple
int PINDHT1 D4;
int PINDHT2 D2;
DHT dht(PINDHT1,DHTTYPE);
DHT dht2(PINDHT2,DHTTYPE);

BabyfacePi

D’accord
Merci beaucoup

Avec plaisir

BabyfacePi

149 lines (126 sloc) 4.19 KB /* Projet d’apprentissage d’un objet connecté (IoT) pour réaliser une sonde de température ESP8266 + DHT22 + LED + MQTT + Home-Assistant Projets DIY (https://www.projetsdiy.fr) – Mai 2016 Article du projet : https://www.projetsdiy.fr/esp8266-dht22-mqtt-projet-objet-connecte/ Licence : MIT */ #include #include #include “DHT.h” // Librairie des capteurs DHT #define wifi_ssid “SSID” #define wifi_password “MOT-DE-PASSE” #define mqtt_server “ADRESSE-IP-MOSQUITTO” #define mqtt_user “guest” //s’il a été configuré sur Mosquitto #define mqtt_password “guest” //idem #define temperature_topic “sensor/temperature” //Topic température #define humidity_topic “sensor/humidity” //Topic humidité //Buffer qui permet de décoder les messages MQTT reçus char message_buff[100]; long lastMsg = 0; //Horodatage… Lire la suite »

BabyfacePi

Re bonjour je reviens vous embêter à nouveau depuis la derniere fois j’ai tenté d’additionner d’autres Capteurs sur des pin libres mais au moment de charger le code sur la carte j’ai erreur rouge je voudrais rajouter un DHT11 SR pin3 et DS18B20 sur pin 5 mais null comme je suis je n’y arrive pas pouvez-vous ou quelqu’un d’autre m’aider s’il vous plait? il y a beaucoup d’autres pin de disponible je trouve domage de ne pas pouvoir les utiliser.

Merci d’avance

Bonsoir Babyface. Serait-il possible de m’envoyer le message d’erreur pour que je puisse chercher une piste ?

BabyfacePi

Bonsoir
Désolé unpeu du retatrd j’ai essayé de trouver la solution par moi même mais je n’ai pas reussi.

J’obtien cette erreur :

exit status 1
expected initializer before ‘D4’

BabyfacePi

exit status 1
‘DS18B20’ was not declared in this scope

Bonsoir Babyface. D’après cette erreur, l’objet DS18B20 n’a pas été initialisé (instancié) avant d’être utilisé. Un bon exemple à suivre http://forum.arduino.cc/index.php?topic=176697.0
#include
#include

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

=> donc cela va donner avec l’objet DS18B20 : DallasTemperature DS18B20(&oneWire);

Voilà, amusez vous bien !

BabyfacePi

Merci
Beaucoup, mais j’ai laissé tombé, je suis novice dans le domaine.

D’accord, je vais ajouter le thème pour un prochain projet si ça peut vous aider. Bon week-end

BabyfacePi

Ouiii!!
Ca m’aiderai beaucoup,
J’ai des aquariums super posé, j’ai voulue utiliser ce projet pour mettre plusieur DS18B20 sur seul carte ESP8622 wemos mais mes competances sont limitées 🙂

D’accord alors, je vais m’y coller !

BabyfacePi

Merci beaucoup

Il manque probablement le point virgule à la ligne précédente

Bonsoir Babyface. Si ça peut vous aider, je viens de publier ce tutoriel pour gérer plusieurs capteurs DS18B20 avec du code Arduino et publier les mesures sur un serveur Domoticz https://projetsdiy.fr/mesure-temperature-dallas-ds18b20-code-arduino-compatible-esp8266-esp32-domoticz-http/

BabyfacePi

Merci beaucoup c’rst Très gentil

BabyfacePi

Merci pour votre réponse très rapide Du coup pour ajouter un autre objets j’ai juste à a jouter un objet et changer le pin D2 par D4 ou D4 par exemple ? //Création des objets DHT dht(DHTPIN, DHTTYPE); DHT dht2(DHTPIN, DHTTYPE); WiFiClient espClient; PubSubClient client(espClient); //Création des objets void setup() { Serial.begin(9600); //Facultatif pour le debug pinMode(D2,OUTPUT); //Pin 2 setup_wifi(); //On se connecte au réseau wifi client.setServer(mqtt_server, 1883); //Configuration de la connexion au serveur MQTT client.setCallback(callback); //La fonction de callback qui est executée à chaque réception de message dht.begin(); } void setup() { Serial.begin(9600); //Facultatif pour le debug pinMode(D3,OUTPUT); //Pin… Lire la suite »

Alasta

Bonjour,

n’est-il pas necessaire de mettre une résistance de pull-up sur la sonde ?
a+

Bonjour Alasta. C’est vrai qu’elle est toujours présente sur les anciens tutos et en principe il en faut une mais ça fonctionne très bien sans.

Ferhat MAMECHE

Bonjour, ai-je nécessairement besoin d’un Raspeberry pour réaliser ce projet ou pas ?

Bonjour Ferhat. Non ce n’est pas nécessaire. Vous pouvez installer un broker MQTT sur windows (si vous êtes sur Windows). MQTT est un protocole très répandu , c’est même un standard depuis l’année dernière, vous pourrez récupérer les données sur beaucoup de logiciels. A très bientôt

Frederic S

Bonjour! J’ai quelques petites questions concernant le code de l’ESP8266 1- A quoi sert le petit bout de code: if (now – lastRecu > 100 ) { lastRecu = now; client.subscribe(“homeassistant/switch1”); Si j’ai bien compris, on re-souscrit au topic homeassistant/switch1 toutes les 100ms ? Pourquoi pas le faire à l’initi et dans reconnect (juste une fois) ? (je decouvre, peut etre que j’ai mal compris comment ca fonctionne) 2- Le code: //Envoi d’un message par minute if (now – lastMsg > 1000 * 10) { Pour moi ca fait toutes les 10secondes et non une fois par minutes, me trompe-je… Lire la suite »

Bonjour Frédéric, 1. Oui, c’est ça effectivement. On vérifie toutes les 100ms si un nouveau message a été envoyé par home assistant. Je vais faire un article sur le sujet, ce sera plus claire 2. Oui, c’est exact, j’ai mis un temps plus court pour mes tests et ensuite j’ai oublié de modifier mon code . Merci ! 3. millis() donne le temps écoulé depuis le démarrage de l’Arduino / ESP8266. C’est n’est pas bloquant. On va simplement stocker le dernier passage dans la boucle lastRecu = now pour le tester au tour suivant. Par contre lorsqu’on appel un delay,… Lire la suite »

Ferhat MAMECHE

Bonjour, je n’ai pas encore acheté le Raspberry Pi 3 mais j’ai tout de même essayé d’installer homeassistant, ce que je remarque par rapport aux vidéos tuto c’est que je n’ai pas forcément les mêmes options et notamment “straming update” est-ce normal? sinon comment installer homeassistant concrètement, étape par étape

Bonjour Ferhat. Home Assistant est un projet qui bouge beaucoup et rapidement. Pas facile pour moi de connaitre tous les paramètres de tous les logiciels domotiques. Pour installer sur Raspberry, il y a ce tutoriel https://www.projetsdiy.fr/home-assistant-serveur-domotique-raspberry-pi/, sinon on peut aussi tester sur Windows, Linux, macOS, NAS avec Docker (https://www.projetsdiy.fr/tester-logiciels-domotique-docker-jeedom-openhab-domoticz-ha/). A très bientôt.

Ferhat MAMECHE

Je veux savoir si le Raspberry Pi3 est primordial pour réaliser ce projet, configurer et gérer HomeAssistant

Le 20 janv. 2017 4:52 AM, “Disqus” a écrit :

Vous pouvez m’en dire un peu plus sur votre projet ?

Ferhat MAMECHE

Je cherche à refaire le projet ESP8266+DHT22+MQTT, mais lorsque je telecharge et essaie d’utiliser homeassistant, je remarque que je n’ai pas le même que dans les tutoriels, je n’ai pas notamment l’option “streaming update”, je ne peux pas rajouter aussi la partie Sensor au fichier configuration.ymal,  serait-ce parce que je n’ai pas utiliser de raspberry ? Sent from my Galaxy Tab® A——– Message d’origine ——–De : Disqus Date : 20/01/2017 23:24 (GMT-05:00) À : mameche.ferhat@gmail.com Objet : Re: Comment on ESP8266 + DHT22 + MQTT : réaliser votre 1er objet connecté “Vous pouvez m’en dire un peu plus sur votre… Lire la suite »

Bonjour Ferhat, si vous débutez en domotique, je vous conseille plutot de démarrer avec Domoticz sur Raspberry Pi https://www.projetsdiy.fr/domoticz-installation-configuration-raspberry-pi-3/ ou jeedom https://www.projetsdiy.fr/jeedom-raspberry-pi-3-installation-wifi/ (en français)

Ferhat MAMECHE

Mais est-ce que ce projet est réalisable avec ce que vous me suggérer, et dois je toujours utiliser MTQQ

Le 23 janv. 2017 1:47 PM, “Disqus” a écrit :

Oui sans aucun problème, il y a tous les tutos necessaires sur mon blog ?

Ferhat MAMECHE

Vous pouvez m’envoyer le lien du blog et ainsi pouvoir entamer cela ? Merci d’avance

Le 23 janv. 2017 3:34 PM, “Disqus” a écrit :

Ferhat MAMECHE

je voulais savoir, dans le cas de l’utilisastion d’un Raspeberry, aurai-je besoin d’un module WiFi ESP8266 ou pas? parce que je suis novice dans le domaine et je ne sais pas à quoi sert exactement le Raspeberry

2017-01-23 13:43 GMT-05:00 Disqus :

Bonjour Ferhat. Pas facile de tout expliquer dans un commentaire mais voici pour commencer quelques infos : – Raspberry = (mini) ordinateur qui fonctionne sous Linux (une version spéciale pour les microprocesseurs ARM, différent d’Intel). On installe un logiciel domotique dessus (Domoticz, Jeedom…) – ESP8266 : arduino avec du Wifi. Si vous voulez fabriquer vos propres modules domotiques Pour faire de la domotique, vous pouvez achetez des modules (détecteurs d’ouverture de porte, de fumée, météo, interrupteur…) qui vont communiquer avec le logiciel domotique. Il y a beaucoup de façon de communiquer. ZWave (ondes radio made in samsung), Ethernet (pas très… Lire la suite »

visvic

Bonjour 🙂 Super tuto !! comme dis par email les tutos sont géniaux ! Bon, je me heurte à un petit problème :s. J’ai repris la même base de votre projet et adapté un capteur DS18B20. Je récupère la température, je la convertis pour en faire une chaine et ensuite je publie sur test.mosquitto.fr. SAUF que très souvent les messages ne sont pas publiés. On regarde d’un peu plus près la doc de l’API (http://pubsubclient.knolleary.net/api.html#publish1) et la le message est soit trop long soit la connection est perdu. Pourtant il y a bien une vérif qui est faite en amont… Lire la suite »

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