Connecter l'ouverture de la porte de garage avec MQTT, Home Assistant et un ESP8266


#1

Bonjour,

Je souhaiterais connecter l’ouverture de la porte de mon garage à Home Assistant. Je repars du code du tuto ESP8266 + DHT22 + MQTT… pour créer mon programme, en gros je supprime simplement ce qui concerne le DHT22. Je remplacerai le LED par un relais ensuite.

Le problème est le suivant : mon ESP8266 se connecte bien au WiFi et au serveur MOSQUITTO que j’ai installé via le “add-on store” de HA mais lorsque je clique sur le bouton dans HA parfois le LED s’allume, parfois pas…
Il n’y pas de mystère en informatique j’ai fait une erreur quelque part mais je ne parviens pas à trouver où, je pense donc que l’ESP8266 n’est pas toujours à l’écoute du broker…

Je souhaiterais vraiment maîtriser MQTT car j’ai plein de projets en tête et je crois que je commence à en comprendre le fonctionnement mais ici quelque chose m’échappe.

Merci de votre aide,

Lionel

/*
  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>

#define wifi_ssid "**********"
#define wifi_password "**************"

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

//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
     
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   
}

//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");
      client.subscribe("homeassistant/switch1");
    } 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();
  if (now - lastRecu > 100 ) {
lastRecu = now;
client.subscribe("homeassistant/switch1");
  }
}

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);  
  }
}

Voici ce que j’ai ajouté dans le fichier configuration.yaml :

mqtt: 
  broker: 192.168.1.199  
  port: 1883        
  client_id: home-assistant-1 
  keepalive: 60
  username: ************* #optionnel 
  password: *********** #optionnel 
  protocol: 3.1      #par défaut

switch:&nbsp;
  platform: mqtt
  name: "Garage"
  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 }}'

#2

Personne ne voit mon erreur ?