
Dieses Projekt zeigt, wie das MQTT-Kommunikationsprotokoll mit dem ESP32 verwendet wird, um Nachrichten zu veröffentlichen und Topics eines MQTT-Brokers auf Servern wie Home Assistant, Node RED, Amazon AWS und openHAB zu abonnieren. Als Beispiel steuern wir den Dimmer. Der Server kann entweder lokal oder in der Cloud sein.
The ESP32 we’ll be programmed using Arduino IDE. The PubSubClient library provides a client for doing simple publish/subscribe messaging with a server that supports MQTT.
Sie können den folgenden Code auf Ihren ESP32 hochladen. Der Code ist an den Stellen kommentiert, an denen Sie Änderungen vornehmen müssen.
Sie müssen den Code mit Ihrer eigenen SSID, Ihrem Passwort und der IP-Adresse des MQTT-Brokers bearbeiten.
- #include <RBDdimmer.h>
- #define outputPin 4
- #define zerocross 5
- dimmerLamp dimmer(outputPin, zerocross); //Port für Dimmer initialisieren für ESP8266, ESP32, Arduino Due Boards
- #include <WiFi.h> // Für ESP8266 #include <ESP8266WiFi.h>
- #include <PubSubClient.h>
- // WiFi-Netzwerk-Zugangsdaten
- const char *ssid = "REPLACE_WITH_YOUR_SSID"; // Name Ihres WiFi-Netzwerks
- const char *password = "REPLACE_WITH_YOUR_PASSWORD"; // Passwort des WiFi-Netzwerks
- // MQTT-Server-Zugangsdaten.
- // const char *HA_USER = "_____";
- // const char *HA_PASS = "_____";
- IPAddress broker(XXX,XXX,XXX,XXX); // IP-Adresse Ihres MQTT-Brokers, z.B.
- const char *ID = "Example_Dimmer"; // Name unseres Geräts, muss eindeutig sein!!!
- char *STATE_TOPIC = "dimmer/power/state"; // Topic zur Veröffentlichung des Lichtstatus
- char msg[50];
- WiFiClient wclient;
- PubSubClient client(wclient); // MQTT-Client einrichten
- // Eingehende Nachrichten vom Broker verarbeiten
- void callback(char* topic, byte* payload, unsigned int length) {
- String response;
- int power_L;
- for (int i = 0; i < length; i++) {
- response += (char)payload[i];
- }
- Serial.print("Message arrived [");
- Serial.print(topic);
- Serial.print("] ");
- Serial.println(response);
- power_L=response.toInt();
- dimmer.setPower(power_L);
- delay(50);
- snprintf (msg, 50, "%ld", dimmer.getPower());
- client.publish(STATE_TOPIC, msg);
- Serial.print("State ");
- Serial.println(msg);
- }
- // Verbindung zum WiFi-Netzwerk herstellen
- void setup_wifi() {
- Serial.print("\nConnecting to ");
- Serial.println(ssid);
- WiFi.mode(WIFI_STA);
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED) { // Auf Verbindung warten
- delay(500);
- Serial.print(".");
- }
- Serial.println();
- Serial.println("WiFi connected");
- Serial.print("IP address: ");
- Serial.println(WiFi.localIP());
- }
- // Erneut mit dem Client verbinden
- void reconnect() {
- // Schleife bis zur erneuten Verbindung
- while (!client.connected()) {
- Serial.print("Attempting MQTT connection...");
- // Verbindungsversuch
- if(client.connect(ID,HA_USER,HA_PASS)) {
- client.subscribe(TOPIC);
- Serial.println("connected");
- Serial.print("Subcribed to: ");
- Serial.println(TOPIC);
- Serial.println('\n');
- } else {
- Serial.println(" try again in 5 seconds");
- // 5 Sekunden warten vor erneutem Versuch
- delay(5000);
- }
- }
- }
- void setup() {
- dimmer.begin(NORMAL_MODE, OND); //Dimmer initialisieren
- Serial.begin(115200); // Serielle Kommunikation mit 115200 Baud starten
- delay(100);
- setup_wifi(); // Mit Netzwerk verbinden
- client.setServer(broker, 1883);
- client.setCallback(callback);// Callback-Routine initialisieren
- }
- void loop() {
- if (!client.connected()) // Bei Verbindungsverlust erneut verbinden
- {
- reconnect();
- }
- client.loop();
- }
Der MQTT-Broker veröffentlicht den Dimmer-Wert (0~100) im Topic dimmer/power/state. Der ESP32 hat diese Topics abonniert. So empfängt der ESP32 den Dimmwert (0~100).
Um den Dimmer mit 2–4 oder mehr Kanälen zu verwenden, müssen die Topics hinzugefügt und die Callback-Funktion zum Lesen der Topics angepasst werden:
- char *STATE_TOPIC1 = "dimmer/power1/state";
- char *STATE_TOPIC2 = "dimmer/power2/state";
- char *STATE_TOPIC3 = "dimmer/power3/state";
- char *STATE_TOPIC4 = "dimmer/power4/state";