Ejemplo 3. Interconexión «simplificada» con Home Assistant vía MQTT
Si bien la HomeassistantMQTTDemo.ino aunque es bonita resulta bastante complicada de seguir por cuanto la mayor parte del código se debe exclusivamente a temas gráficos hemos querido escribir un programa mucho más sencillo centrado únicamente en la entrada/salida de mensajes vía MQTT y que se ven únicamente en el Serial Monitor de Arduino.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#include #include #include #include "secrets.h" // Configuración del servidor MQTT const char* mqttServer = "192.168.1.144"; const int mqttPort = 1883; const char* topic1 = "homeassistant/sensor/co2/value"; const char* topic2 = "homeassistant/sensor/pm25/value"; const char* topic3 = "homeassistant/VibrationMotor"; WiFiClient wifiClient; PubSubClient client(wifiClient); void setup() { Serial.begin(115200); conectarWiFi(); client.setServer(mqttServer, mqttPort); client.setCallback(callback); if (!client.connected()) { reconnect(); } client.subscribe(topic1); // Suscribirse al primer tópico client.subscribe(topic2); // Suscribirse al segundo tópico client.subscribe(topic3); // Suscribirse al segundo tópico } void loop() { if (!client.connected()) { reconnect(); } client.loop(); } void conectarWiFi() { Serial.print("Conectando a WiFi..."); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("-"); } Serial.println("> Conectado a WiFi.\n"); } void reconnect() { while (!client.connected()) { Serial.print("Conectando al servidor MQTT con autenticación..."); if (client.connect("ArduinoClient", MQTT_USER, MQTT_PASSWORD)) { Serial.println(" CONECTADO!"); client.subscribe(topic1); client.subscribe(topic2); client.subscribe(topic3); } else { Serial.print("Fallo. Código de error: "); Serial.print(client.state()); Serial.println(" Intentando de nuevo en 1 segundos..."); delay(1000); } } } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Mensaje recibido en el tópico: "); Serial.println(topic); char mensaje[100]; strncpy(mensaje, (char*)payload, length); mensaje[length] = '\0'; if (strcmp(topic, topic1) == 0) { Serial.print("Variable 1: "); Serial.println(mensaje); } else if (strcmp(topic, topic2) == 0) { Serial.print("Variable 2: "); Serial.println(mensaje); } else if (strcmp(topic, topic3) == 0) { Serial.print("Variable 3: "); Serial.println(mensaje); } } |
Los datos enviados corresponden a dos de las medidas de contaminación del aire (CO2 y PM2.5) que se envían tan pronto llegue un nuevo dato tal y como se define en automations.yaml.

Por cierto y seguro que nos lo agradecerá más de uno os recomendamos que instaléis en vuestro PC, MAC o Linux la app open source MQTT Explorer que os ayudará a ver todos los mensajes que van o vienen a vuestro MQTT.

4265