Laat een ESP8266 of ESP32 data versturen naar Home Assistant

Je kan de ESP8266 of ESP32 als zelfstandig sensoren uit te lezen en de gegevens te verwerken, maar je kan de ESP8266 / ESP32 ook gegevens laten delen met Home Assistant.
Juist de combinatie van een ESP8266 of ESP32 met Home Assistant kan versterkend werken. Een ESP8266 of ESP32 is ideaal voor het uitlezen van sensoren en daarop reageren.

Om het één en ander te kunnen demonstreren heb ik een eenvoudige testopstelling gemaakt. Er zijn twee LEDs, één voor de verbinding met WiFi en één voor de verbinging met MQTT
Daarnaast heb ik 4 LEDs die in de Loop worden aangestuurd.

MQTT is het protocol, de taal, waarmee de overdracht van gegevens tussen Home Assistant en in dit geval een ESP8266 of ESP32 plaatsvind. MQTT wordt ook bij bijvoorbeeld sOnOff schakelaars gebruikt.
Om MQTT in Home Assistant te kunnen gebruiken moet de MQTT broker geinstalleerd worden zoals uitgelegd wordt in mijn video over de instalatie van Home Assistant:
Installeren van Home Assistant op een Raspberry PI 4

Om in Home Assistant MQTT te kunnen gebruiken moet niet alleen de MQTT broker geinstalleerd worden, maar moet er ook code worden toegevoegd aan het config.yaml bestand.

De code voor de ESP8266 of ESP32 kan je hier vinden.
De code voor het Config.yaml bestand in Home Assistant kan je hier vinden.

De code voor de communicatie met Home Assistant uitgelegd

Het eerste stukje code voor MQTT vinden we boven in de code.
        #include <PubSubClient.h> // FOR MQTT 

        WiFiClient espClient;
        PubSubClient client(espClient); // MQTT Client
    
De PubSubClient zal eerst als bibliotheek in de Arduino compiler geladen worden. Meer informatie over de Arduino compiler vind je hier: HyperLink

Vervolgens moet je de credentials en het adres van je MQTT broker opgeven:
        const char* mqtt_server = "[het adres van jou MQTT server]";
        const char* mqtt_user = "[de gebruikersnaam van jou MQTT server]";
        const char* mqtt_password = "[het wachtwoord wat hoort bij de gebruikersnaam]";
    
Als alles is ingesteld, dan kunnen we in de "void Setup" de instellingen voor MQTT maken. Let op, voor de verbinding met de MQTT server gebruik ik een losse procedure ConnectMQTT().
        client.setServer(mqtt_server, 1883);
        ConnectMQTT();
    
De procedure ConnectMQTT probeert 5 keer een verbinding te maken met de MQTT server en verlaat daarna de procedure om de code niet oneindig te laten proberen.
Wat er verder nog gebeurd is dat er een Client ID wordt aangemaakt die bestaat uit "ESP8266Client-" en dan een random gegeneerd gedeelte. Op deze manier krijgt het bordje een eigen MQTT ID waarmee hij zich aanmeld in de server. Zou je dit niet doen, dan kan er maar één bordje aangemeld zijn.
Natuurlijk ben je vrij om te keuzen voor een eigen naam of een vaste naam per bordje. Ik ben soms wat gemakzuchtig en heb de programma code voor WiFi en MQTT als standaard code opgeslagen zodat ik dit niet steeds opnieuw hoef te maken. Misschien lui ..... misschien efficient.
     void ConnectMQTT() {
          // Recconnect to the MQTT server
          while (!client.connected() && MQTTTry < 5 ) {
              Serial.print("Attempting MQTT connection...");
              ++MQTTTry;
              // Create a random client ID
              String clientId = "ESP8266Client-";
              clientId += String(random(0xffff), HEX);
              // Attempt to connect
              if (client.connect(clientId.c_str(), mqtt_user, mqtt_password)) {
                Serial.println("connected");
                // Once connected, publish an announcement...
                client.publish("outTopic", "hello world");
                // ... and resubscribe
                client.subscribe("inTopic");
              } else {
                Serial.print("failed, rc=");
                Serial.print(client.state());
                Serial.println(" try again in 5 seconds");
                // Wait 5 seconds before retrying
                delay(5000);
            }
        }
    
Als laatste controleer ik in de void Loop() procedure niet alleen of de WiFi verbinding werkt, maar ook of de MQTT server bereikbaar is.
        if (WiFi.status() != WL_CONNECTED) { 
            Serial.println("No WiFi Connection!");  
            ConnectWiFi();
          } else {
            Serial.println("WiFi Connected");
            if (!client.connected()) {
              Serial.println("No MQTT Connection!");  
              digitalWrite(LEDGreen3, HIGH);
              ConnectMQTT();
              digitalWrite(LEDGreen3, LOW);
            }
            else {
              // Send Data to MQTT Server
              Serial.print("Connected status: "); Serial.println(client.connected());
            }
    
Video met uitleg:


Nu weet je hoe je een ESP32 / ESP8266 op de juiste manier met Home Assistant kan verbinden. Doe er je voordeel mee.

Nog een fijne dag.
Ap Matteman