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

Dernière mise à jour des prix le 19 septembre 2018 16 h 57 min

 

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.

Print Friendly, PDF & Email

Inscrivez-vous à la newsletter hebdomadaire

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

Comparateur de prix

Bons plans

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

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