MQTT gebruiken met een ESP32 en Home Assistant
MQTT (Message Queuing Telemetry Transport) is een lichtgewicht en efficiënt communicatieprotocol dat veel gebruikt wordt in domotica, IoT-projecten en Home Assistant-integraties. Met MQTT kun je eenvoudig gegevens verzenden tussen apparaten, bijvoorbeeld van een ESP32 naar Home Assistant, of andersom.
Wat is MQTT?
MQTT werkt volgens het publish/subscribe-model. In plaats van dat apparaten direct met elkaar communiceren, sturen ze berichten naar een centrale server, de zogenaamde broker. Andere apparaten kunnen zich abonneren op bepaalde onderwerpen (topics) en ontvangen automatisch updates zodra er nieuwe informatie beschikbaar is.
Hoe gebruik je het met een ESP32?
De ESP32 kan met behulp van Arduino-code en de PubSubClient
-bibliotheek verbinding maken met een MQTT-broker zoals mosquitto
. Die broker kan lokaal draaien (bijvoorbeeld via Home Assistant) of extern (zoals via een publieke server of NAS).
Een voorbeeld van wat je met MQTT kunt doen:
- Sensorwaarden (temperatuur, licht, luchtkwaliteit) publiceren naar Home Assistant
- Commando’s ontvangen van Home Assistant (bijv. LED aan/uit)
- Foutmeldingen of systeemstatus loggen
Uitlegvideo: MQTT gebruiken met een ESP32
In deze video leg ik stap voor stap uit hoe je een ESP32 verbindt met MQTT en hoe je die koppelt aan Home Assistant.
Wat heb je nodig?
- ESP32 of ESP8266 board
- MQTT-broker (zoals Mosquitto op Home Assistant)
- PubSubClient bibliotheek (Arduino)
- Werkende WiFi-verbinding
Voorbeeldcode
In deze code gebruik ik "arduino_secrets.h" als mijn eigen bibliotheek. Deze kan je eenvoudig binnen je project aanmaken. In arduino_secrets.h heb ik mijn login credentials opgeslagen zodat deze niet in de code zichtbaar zijn.
Deze code is een uitbereiding op de code zoals beschreven in de WiFi pagina. In de video laat ik niet alleen zien hoe je de arduino code kan gebruiken, maar ook wat je moet doen in
Home Assistant om te communiceren via MQTT.
Deze code gebruik ik als standaard voor mijn sensoren en geeft een betrouwbaar en stabiel resultaat.
/*
* Maker : Matteman-Automation
* Project : Connect to WiFi and MQTT
* Version : 1.0
* Date : 08-2024
* Programmer : Ap Matteman
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "arduino_secrets.h"
int iWiFiTry = 0;
int iMQTTTry = 0;
String sClient_id;
int iCount; // For DEMO
const char* ssid = YourSSID;
const char* password = YourWiFiPassWord;
const char* HostName = "WiFi_and_MQTT";
const char* mqtt_broker = YourMQTTserver;
const char* mqtt_user = YourMQTTuser;
const char* mqtt_password = YourMQTTpassword;
WiFiClient espClient;
PubSubClient MQTTclient(espClient); // MQTT Client
void setup() {
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Connect2WiFi();
Connect2MQTT();
iCount = 0;
}
void Connect2WiFi() {
//Connect to WiFi
iWiFiTry = 0;
WiFi.begin(ssid, password);
WiFi.setHostname(HostName);
Serial.print("Connecting to WiFi ");
while (WiFi.status() != WL_CONNECTED && iWiFiTry < 11) { //Try to connect to WiFi for 11 times
++iWiFiTry;
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.print("Got IP: "); Serial.println(WiFi.localIP());
//Unique MQTT Device name
sClient_id = "esp-client-" + String(WiFi.macAddress());
Serial.print("ESP Client name: "); Serial.println(sClient_id);
}
void Connect2MQTT() {
// Connect to the MQTT server
iMQTTTry=0;
if (WiFi.status() != WL_CONNECTED) {
Connect2WiFi;
}
Serial.print("Connecting to MQTT ");
MQTTclient.setServer(mqtt_broker, 1883);
while (!MQTTclient.connect(sClient_id.c_str(), mqtt_user, mqtt_password) && iMQTTTry < 11) { //Try to connect to MQTT for 11 times
++iMQTTTry;
Serial.print(".");
delay(500);
}
Serial.println("");
}
void loop() {
if (!MQTTclient.connect(sClient_id.c_str(), mqtt_user, mqtt_password)) {
Connect2MQTT();
}
Serial.println("Begin Loop");
MQTTclient.publish("DEMO/iCount", String(iCount).c_str());
Serial.println(iCount);
++iCount;
if(iCount>99) {
iCount = 0;
}
delay(1000);
// If you want to reboot your device when WiFi is not working
if (iWiFiTry > 10){
Serial.println("REBOOTING");
Serial.println(" Reboot in 2 seconds");
Serial.println("");
delay(2000);
ESP.restart();
}
}
Bekijk ook de codevoorbeelden op deze site, waaronder het verbinden van een ESP32 met WiFi en het versturen van MQTT-berichten naar Home Assistant.