Zum Inhalt springen

Dimmer with ESP8266/ESP32 MQTT – Publish and Subscribe with Arduino IDE. Connecting to Home Assistant, Node-RED, Amazon AWS, and openHAB

28. März 2025 durch
Dimmer with ESP8266/ESP32 MQTT – Publish and Subscribe with Arduino IDE. Connecting to Home Assistant, Node-RED, Amazon AWS, and openHAB
Administrator
| Noch keine Kommentare

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.


  1. #include <RBDdimmer.h>
  2. #define outputPin 4
  3. #define zerocross 5
  4. dimmerLamp dimmer(outputPin, zerocross); //Port für Dimmer initialisieren für ESP8266, ESP32, Arduino Due Boards
  5. #include <WiFi.h> // Für ESP8266 #include <ESP8266WiFi.h>
  6. #include <PubSubClient.h>
  7. // WiFi-Netzwerk-Zugangsdaten
  8. const char *ssid = "REPLACE_WITH_YOUR_SSID"; // Name Ihres WiFi-Netzwerks
  9. const char *password = "REPLACE_WITH_YOUR_PASSWORD"; // Passwort des WiFi-Netzwerks
  10. // MQTT-Server-Zugangsdaten.
  11. // const char *HA_USER = "_____";
  12. // const char *HA_PASS = "_____";
  13. IPAddress broker(XXX,XXX,XXX,XXX); // IP-Adresse Ihres MQTT-Brokers, z.B.
  14. const char *ID = "Example_Dimmer"; // Name unseres Geräts, muss eindeutig sein!!!
  15. char *STATE_TOPIC = "dimmer/power/state"; // Topic zur Veröffentlichung des Lichtstatus
  16. char msg[50];
  17. WiFiClient wclient;
  18. PubSubClient client(wclient); // MQTT-Client einrichten
  19. // Eingehende Nachrichten vom Broker verarbeiten
  20. void callback(char* topic, byte* payload, unsigned int length) {
  21. String response;
  22. int power_L;
  23. for (int i = 0; i < length; i++) {
  24. response += (char)payload[i];
  25. }
  26. Serial.print("Message arrived [");
  27. Serial.print(topic);
  28. Serial.print("] ");
  29. Serial.println(response);
  30. power_L=response.toInt();
  31. dimmer.setPower(power_L);
  32. delay(50);
  33. snprintf (msg, 50, "%ld", dimmer.getPower());
  34. client.publish(STATE_TOPIC, msg);
  35. Serial.print("State ");
  36. Serial.println(msg);
  37. }
  38. // Verbindung zum WiFi-Netzwerk herstellen
  39. void setup_wifi() {
  40. Serial.print("\nConnecting to ");
  41. Serial.println(ssid);
  42. WiFi.mode(WIFI_STA);
  43. WiFi.begin(ssid, password);
  44. while (WiFi.status() != WL_CONNECTED) { // Auf Verbindung warten
  45. delay(500);
  46. Serial.print(".");
  47. }
  48. Serial.println();
  49. Serial.println("WiFi connected");
  50. Serial.print("IP address: ");
  51. Serial.println(WiFi.localIP());
  52. }
  53. // Erneut mit dem Client verbinden
  54. void reconnect() {
  55. // Schleife bis zur erneuten Verbindung
  56. while (!client.connected()) {
  57. Serial.print("Attempting MQTT connection...");
  58. // Verbindungsversuch
  59. if(client.connect(ID,HA_USER,HA_PASS)) {
  60. client.subscribe(TOPIC);
  61. Serial.println("connected");
  62. Serial.print("Subcribed to: ");
  63. Serial.println(TOPIC);
  64. Serial.println('\n');
  65. } else {
  66. Serial.println(" try again in 5 seconds");
  67. // 5 Sekunden warten vor erneutem Versuch
  68. delay(5000);
  69. }
  70. }
  71. }
  72. void setup() {
  73. dimmer.begin(NORMAL_MODE, OND); //Dimmer initialisieren
  74. Serial.begin(115200); // Serielle Kommunikation mit 115200 Baud starten
  75. delay(100);
  76. setup_wifi(); // Mit Netzwerk verbinden
  77. client.setServer(broker, 1883);
  78. client.setCallback(callback);// Callback-Routine initialisieren
  79. }
  80. void loop() {
  81. if (!client.connected()) // Bei Verbindungsverlust erneut verbinden
  82. {
  83. reconnect();
  84. }
  85. client.loop();
  86. }

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:

  1. char *STATE_TOPIC1 = "dimmer/power1/state";
  2. char *STATE_TOPIC2 = "dimmer/power2/state";
  3. char *STATE_TOPIC3 = "dimmer/power3/state";
  4. char *STATE_TOPIC4 = "dimmer/power4/state";
Diesen Beitrag teilen
Anmelden , um einen Kommentar zu hinterlassen