Usando MQTT con Home Assistant

{::opciones coderay_line_numbers=“tabla” /}

Recientemente se agregó compatibilidad con MQTT a Home Assistant. El componente MQTT le permitirá hacer todo tipo de cosas. Lo más probable es que lo utilices para comunicarte con tus dispositivos. Pero a Home Assistant no le importa de dónde provienen los datos o se limita al hardware real siempre que haya soporte MQTT. Esto significa que no importa si los datos provienen de un humano, un servicio web o un dispositivo.

Un gran ejemplo se muestra en una publicación sobre Automatización de lavandería en este blog.

Esta publicación le brindará una pequeña descripción general de algunas otras posibilidades sobre cómo usar MQTT con Home Assistant.

Uso manual

La forma más sencilla, pero no la mejor, de que un ser humano interactúe con un sensor de Home Assistant es ejecutar un comando manualmente. Creemos un sensor de «estado de ánimo». Para simplificar, Home Assistant y el agente MQTT se ejecutan en el mismo host. Los fragmentos de configuración necesarios para agregar al configuration.yaml El archivo consta de dos partes: una para el corredor y otra para el sensor.

mqtt:   broker: 127.0.0.1  sensor:   - platform: mqtt     name: "Fabian's Mood"     state_topic: "home-assistant/fabian/mood" 

Después de reiniciar Home Assistant, el sensor de «estado de ánimo» aparecerá en la interfaz. Para obtener más detalles sobre la configuración del propio MQTT y el sensor, consulte el componente MQTT o la documentación del sensor MQTT.

Ahora podemos crear el ambiente. La herramienta de línea de comando (mosquitto_pub) que se envía con mosquitto se utiliza para enviar un mensaje MQTT.

mosquitto_pub  -h 127.0.0.1 -t "home-assistant/fabian/mood" -m "bad" 

El sensor de humor

Este es un ejemplo realmente malo. No hagas esto en el mundo real porque no podrás crear diagramas de datos históricos. Es mejor utilizar un valor numérico.

Enlaces de Python MQTT

La última sección fue bastante aburrida, lo sé. Nadie quiere enviar mensajes MQTT a mano si hay una computadora en el escritorio. Si estás jugando a la lotería, esta sección es para ti. Si no, léelo de todos modos porque la lotería es sólo un ejemplo :-).

Este ejemplo utiliza el enlace Paho MQTT Python porque ese enlace debería estar disponible en el host donde se ejecuta Home Assistant. Si desea utilizar este ejemplo en otra máquina, asegúrese de que los enlaces estén instalados (pip3 install paho-mqtt).

El primer paso es agregar un sensor MQTT adicional al configuration.yaml archivo. El sensor se llamará “Lotería” y la unidad de medida será “No”.

  - platform: mqtt     name: "Lottery"     state_topic: "home-assistant/lottery/number"     unit_of_measurement: "No." 

No olvides reiniciar Home Assistant para activar la configuración.

Para jugar necesitamos los números del 1 al 49 que se pueden marcar en el billete. Esos números deben ser aleatorios y mostrarse en la interfaz de Home Assistant. El siguiente script de Python es otro ejemplo sencillo sobre cómo enviar mensajes MQTT desde la línea de comandos; esta vez en un bucle. Para obtener más información y ejemplos, consulte la documentación de Paho MQTT.

#!/usr/bin/python3 # import time import random import paho.mqtt.client as mqtt import paho.mqtt.publish as publish  broker = '127.0.0.1' state_topic = 'home-assistant/lottery/number' delay = 5  # Send a single message to set the mood publish.single('home-assistant/fabian/mood', 'good', hostname=broker)  # Send messages in a loop client = mqtt.Client("ha-client") client.connect(broker) client.loop_start()  while True:     client.publish(state_topic, random.randrange(0, 50, 1))     time.sleep(delay) 

Cada 5 segundos se envía un mensaje con un nuevo número al corredor y Home Assistant lo recoge. Por cierto, mi estado de ánimo es mucho mejor ahora.

El sensor de lotería

Con sólo unas pocas líneas de Python y un broker MQTT puedes crear tu propio “dispositivo inteligente” o enviar información a Home Assistant en la que no habías pensado. Por supuesto, esto no se limita a Python. Si hay una biblioteca MQTT disponible, el dispositivo se puede utilizar con Home Assistant ahora.

arduino

Para comenzar con hardware real capaz de enviar mensajes MQTT, la plataforma Arduino es una forma económica de hacerlo. En esta sección se utiliza un Arduino UNO con un blindaje Ethernet y una fotorresistencia. La fotorresistencia está conectada al pin analógico 0 (A0) y tiene una salida de 0 a 1024.

El Arduino UNO con escudo Ethernet y fotorresistencia

El cliente MQTT para Arduino debe estar disponible en su IDE de Arduino. A continuación encontrará un boceto que podría servirle de punto de partida. Modifique las direcciones IP, la dirección MAC y el pin según sea necesario y cargue el boceto en su Arduino.

/*   This sketch is based on the basic MQTT example by   http://knolleary.github.io/pubsubclient/ */  #include <SPI.h> #include <Ethernet.h> #include <PubSubClient.h>  #define DEBUG 1 // Debug output to serial console  // Device settings IPAddress deviceIp(192, 168, 0, 43); byte deviceMac[] = { 0xAB, 0xCD, 0xFE, 0xFE, 0xFE, 0xFE }; char* deviceId  = "sensor01"; // Name of the sensor char* stateTopic = "home-assistant/sensor01/brightness"; // MQTT topic where values are published int sensorPin = A0; // Pin to which the sensor is connected to char buf[4]; // Buffer to store the sensor value int updateInterval = 1000; // Interval in milliseconds  // MQTT server settings IPAddress mqttServer(192, 168, 0, 12); int mqttPort = 1883;  EthernetClient ethClient; PubSubClient client(ethClient);  void reconnect() {   while (!client.connected()) { #if DEBUG     Serial.print("Attempting MQTT connection..."); #endif     if (client.connect(deviceId)) { #if DEBUG       Serial.println("connected"); #endif     } else { #if DEBUG       Serial.print("failed, rc=");       Serial.print(client.state());       Serial.println(" try again in 5 seconds"); #endif       delay(5000);     }   } }  void setup() {   Serial.begin(57600);   client.setServer(mqttServer, mqttPort);   Ethernet.begin(deviceMac, deviceIp);   delay(1500); }  void loop() {   if (!client.connected()) {     reconnect();   }   client.loop();    int sensorValue = analogRead(sensorPin); #if DEBUG   Serial.print("Sensor value: ");   Serial.println(sensorValue); #endif   client.publish(stateTopic, itoa(sensorValue, buf, 10));   delay(updateInterval); } 

El Arduino enviará el valor del sensor cada segundo. Para usar los datos en Home Assistant, agregue un sensor MQTT adicional al configuration.yaml archivo.

  - platform: mqtt     name: "Brightness"     state_topic: "home-assistant/sensor01/brightness"     unit_of_measurement: "cd" 

Después de reiniciar Home Assistant, los valores de su Arduino estarán disponibles.

El sensor de brillo

Espero que esta publicación pueda brindarte algunas ideas sobre el uso de Home Assistant y MQTT. Si está trabajando en un proyecto interesante que incluye Home Assistant, háganoslo saber ahora.