Passa al contenuto

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

28 marzo 2025 di
Dimmer with ESP8266/ESP32 MQTT – Publish and Subscribe with Arduino IDE. Connecting to Home Assistant, Node-RED, Amazon AWS, and openHAB
Administrator
| Ancora nessun commento

Questo progetto mostra come utilizzare il protocollo di comunicazione MQTT con l'ESP32 per pubblicare messaggi e sottoscrivere topic di un broker MQTT su server come Home Assistant, Node RED, Amazon AWS e openHAB. Come esempio, controlleremo il dimmer. Il server può essere locale o nel cloud.

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.

È possibile caricare il seguente codice sul proprio ESP32. Il codice è commentato nei punti in cui è necessario apportare modifiche. 

È necessario modificare il codice con il proprio SSID, la password e l'indirizzo IP del broker MQTT.


  1. #include <RBDdimmer.h>
  2. #define outputPin 4
  3. #define zerocross 5
  4. dimmerLamp dimmer(outputPin, zerocross); //inizializzazione della porta per il dimmer per schede ESP8266, ESP32, Arduino Due
  5. #include <WiFi.h> // Per ESP8266 #include <ESP8266WiFi.h>
  6. #include <PubSubClient.h>
  7. // Credenziali della rete WiFi
  8. const char *ssid = "REPLACE_WITH_YOUR_SSID"; // nome della rete WiFi
  9. const char *password = "REPLACE_WITH_YOUR_PASSWORD"; // password della rete WiFi
  10. // Credenziali del server MQTT.
  11. // const char *HA_USER = "_____";
  12. // const char *HA_PASS = "_____";
  13. IPAddress broker(XXX,XXX,XXX,XXX); // Indirizzo IP del broker MQTT, es.
  14. const char *ID = "Example_Dimmer"; // Nome del nostro dispositivo, deve essere unico!!!
  15. char *STATE_TOPIC = "dimmer/power/state"; // Topic per pubblicare lo stato della luce
  16. char msg[50];
  17. WiFiClient wclient;
  18. PubSubClient client(wclient); // Configurazione del client MQTT
  19. // Gestione dei messaggi in arrivo dal broker
  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. // Connessione alla rete WiFi
  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) { // Attesa della connessione
  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. // Riconnessione al client
  54. void reconnect() {
  55. // Ciclo fino alla riconnessione
  56. while (!client.connected()) {
  57. Serial.print("Attempting MQTT connection...");
  58. // Tentativo di connessione
  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. // Attendere 5 secondi prima di riprovare
  68. delay(5000);
  69. }
  70. }
  71. }
  72. void setup() {
  73. dimmer.begin(NORMAL_MODE, OND); //Inizializzazione del dimmer
  74. Serial.begin(115200); // Avvio della comunicazione seriale a 115200 baud
  75. delay(100);
  76. setup_wifi(); // Connessione alla rete
  77. client.setServer(broker, 1883);
  78. client.setCallback(callback);// Inizializzazione della routine di callback
  79. }
  80. void loop() {
  81. if (!client.connected()) // Riconnessione in caso di perdita della connessione
  82. {
  83. reconnect();
  84. }
  85. client.loop();
  86. }

Il broker MQTT pubblica il valore del dimmer (0~100) nel topic dimmer/power/state. L'ESP32 è sottoscritto a questi topic. In questo modo, l'ESP32 riceve il valore di dimmerizzazione (0~100).

Per utilizzare il dimmer con 2–4 o più canali, è necessario aggiungere i topic e modificare la funzione callback per leggere i topic:

  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";
Condividi articolo
Accedi per lasciare un commento