Ir al contenido

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

28 de marzo de 2025 por
Dimmer with ESP8266/ESP32 MQTT – Publish and Subscribe with Arduino IDE. Connecting to Home Assistant, Node-RED, Amazon AWS, and openHAB
Administrator
| Sin comentarios aún

Este proyecto muestra cómo utilizar el protocolo de comunicación MQTT con el ESP32 para publicar mensajes y suscribirse a topics de un broker MQTT en servidores como Home Assistant, Node RED, Amazon AWS y openHAB. Como ejemplo, controlaremos el dimmer. El servidor puede ser local o en la nube.

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.

Puede cargar el siguiente código en su ESP32. El código está comentado en los lugares donde necesita realizar cambios. 

Necesita editar el código con su propio SSID, contraseña y dirección IP del broker MQTT.


  1. #include <RBDdimmer.h>
  2. #define outputPin 4
  3. #define zerocross 5
  4. dimmerLamp dimmer(outputPin, zerocross); //inicializar puerto para dimmer en placas ESP8266, ESP32, Arduino Due
  5. #include <WiFi.h> // Para ESP8266 #include <ESP8266WiFi.h>
  6. #include <PubSubClient.h>
  7. // Credenciales de la red WiFi
  8. const char *ssid = "REPLACE_WITH_YOUR_SSID"; // nombre de su red WiFi
  9. const char *password = "REPLACE_WITH_YOUR_PASSWORD"; // contraseña de la red WiFi
  10. // Credenciales del servidor MQTT.
  11. // const char *HA_USER = "_____";
  12. // const char *HA_PASS = "_____";
  13. IPAddress broker(XXX,XXX,XXX,XXX); // Dirección IP de su broker MQTT, ej.
  14. const char *ID = "Example_Dimmer"; // Nombre de nuestro dispositivo, ¡debe ser único!
  15. char *STATE_TOPIC = "dimmer/power/state"; // Topic para publicar el estado de la luz
  16. char msg[50];
  17. WiFiClient wclient;
  18. PubSubClient client(wclient); // Configurar cliente MQTT
  19. // Manejar mensajes entrantes del 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. // Conectar a la red 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) { // Esperar conexión
  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. // Reconectar al cliente
  54. void reconnect() {
  55. // Bucle hasta reconectarse
  56. while (!client.connected()) {
  57. Serial.print("Attempting MQTT connection...");
  58. // Intento de conexión
  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. // Esperar 5 segundos antes de reintentar
  68. delay(5000);
  69. }
  70. }
  71. }
  72. void setup() {
  73. dimmer.begin(NORMAL_MODE, OND); //Inicializar el dimmer
  74. Serial.begin(115200); // Iniciar comunicación serie a 115200 baudios
  75. delay(100);
  76. setup_wifi(); // Conectar a la red
  77. client.setServer(broker, 1883);
  78. client.setCallback(callback);// Inicializar la rutina de callback
  79. }
  80. void loop() {
  81. if (!client.connected()) // Reconectar si se pierde la conexión
  82. {
  83. reconnect();
  84. }
  85. client.loop();
  86. }

El broker MQTT publica el valor del dimmer (0~100) en el topic dimmer/power/state. El ESP32 está suscrito a estos topics. De este modo, el ESP32 recibe el valor de atenuación (0~100).

Para usar el dimmer con 2–4 o más canales, es necesario agregar los topics y modificar la función callback para leer los topics:

  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";
Compartir esta publicación
Iniciar sesión para dejar un comentario