MQTT, el protocolo estándar para mensajería IoT

MQTT, el protocolo estándar para mensajería IoT

Tras arrancar con nuestro core domótico Home Assistant, vamos a dejar todo listo para empezar a agregar dispositivos IoT a nuestra casa virtual integrando el sistema de comunicación MQTT.

Este sistema es un protocolo Publish & Subscribe en el que tendremos un servicio centralizado que gestionará todos los envíos de información como las señales de los sensores y las actuaciones a las luces.

El protocolo MQTT es cada vez más utilizado tanto en el ámbito IoT como el IIoT (siendo un estándar ISO/IEC 20922 de mensajería Pub/Sub ligera), aunque existen otros protocolos similares como Redis (sirve también como buffer de datos) o ZeroMQ (es un Brokerless).

(Foto de portadaVolodymyr Hryshchenko en Unsplash)

TOC

Conceptos básicos

Vamos a utilizar esta imagen como base para entender los conceptos del protocolo MQTT:

broker-client

Broker

Es el servicio centralizado al que se conectarán todos nuestros sensores y actuadores. Cada uno de ellos enviará la información con una codificación (topic) y de esta manera podremos utilizar el dato (payload) para diferentes tareas.

Topic

Es la etiqueta que definirá a quién corresponde la información. Se construye de la siguiente manera (es un ejemplo para entenderlo de forma fácil):

/Mundo/País/CCAA/Provincia/Ciudad/Barrio/Casa

Con esta estructura de ejemplo, si queremos encender todas las luces de un barrio en concreto enviaremos el comando de encender las luces con el topic:

/Mundo/Pais/CCAA/Provincia/Ciudad/Barrio

Al llegar ese mensaje al broker, todas las bombillas que estén suscritas a ese barrio se encenderán. Si solo queremos encender una casa en concreto enviamos con el topic:

/Mundo/País/CCAA/Provincia/Ciudad/Barrio/Casa

En nuestra casa virtual podríamos aplicar como base el topic /hass/casa/habitación para poder definir las diferentes estancias de nuestra casa.

Payload

Es donde realmente reside el dato a enviar. Un sensor de temperatura enviará la información como:

{ “Temperature”: “22.0” }

Un sensor de presencia enviará lo siguiente cuando haya detectado movimiento:

{ “occupancy”: “true” }

Y cuando deje de detectar movimiento:

{ “occupancy”: “off” }

Si desde hass queremos encender la luz de la oficina con el brillo al 90% enviaremos el siguiente topic y payload:

/hass/casa/luz_oficina/set { “brightness”:”90” ,“state”:“ON” }

Estos mensajes no vamos a tener que escribirlos nosotros manualmente, por lo que no es necesario que profundicemos mucho más, pero es importante que entendamos el concepto general para que seamos capaces de hacer debugging en caso de que haya cualquier problema.

Pub & Sub

Como ves, cada componente IoT responderá ante ciertos mensajes. Esta respuesta vendrá dada según suscribimos a cada componente a unos topic en concreto. En el ejemplo anterior, para automatizar un encendido automático de una luz en la oficina, suscribiremos a HASS al siguiente topic:

/hass/casa/sensor_oficina

Y a su vez suscribiremos a la bombilla al siguiente topic:

/hass/casa/luz_oficina/set

En Hass crearemos una automatización para que cuando el sensor de presencia publique el siguiente payload en el primer topic:

{ “occupancy”: “true” }

Hass publique a su vez el siguiente payload en el segundo topic:

{ “State”: “ON” }

JSON

Como ves todos estos payload los he escrito en un formato que a priori es posible que no conozcas. Este formato es el JavaScript Object Notation o JSON, un formato estándar para enviar/compartir información entre sistemas informáticos de forma ligera y entendible por humanos que viene a sustituir el ya archiconocido XML.

Tiene una sintaxis específica pero muy versátil que nos permite construir mensajes de la complejidad necesaria. Es el mismo formato que se utiliza por ejemplo en las API REST(un protocolo muy utilizado en mundo de servicios web).


Instalación

Para instalar un broker MQTT en nuestro unraid, tendremos que ir como siempre a la pestaña APPS y buscar por MQTT.

broker-client

Como vemos, hay un broker mantenido por un usuario de la comunidad que nos facilita muchísimo el trabajo. Concretamente es una implementación de Mosquitto MQTT sobre una base de Alpine linux.

Vamos a instalarlo tal y como nos carga la plantilla, sin cambiar nada:

plantilla

Le damos Apply y esperamos a que termine la instalación.

done

En este momento ya tenemos el Broker MQTT funcionando en nuestro servidor. Como puedes ver, el servicio tiene dos puertos configurados, por un lado el 1883 y por otro el 9001, más adelante veremos para qué sirven.


Configuración

Por ahora lo que vamos a hacer es abrir nuestro explorador de archivos y navegaremos a la ruta del share donde se han creado los archivos de configuración del servicio, que será algo como //IP_O_NOMBRE_DE_RED_DE_TU_UNRAID/appdata/mqtt:

share

Lo que vamos a hacer es abrir el archivo mosquitto.conf.example con nuestro editor de código.

En este archivo tenemos tres bloques:

config_file

  • Configuración general: En principio no tocamos nada. Lo único que podriamos necesitar tocar son las tres líneas sobre persistencia del dato. En principio por la naturaleza de un sistema Pub/Sub como MQTT los clientes no podrán conocer el historial de los eventos del pasado, toda la comunicación será en tiempo real. La persistencia del dato podría servir para algunos casos concretos en un futuro pero por ahora lo vamos a dejar desactivado.

  • Configuración de RED: Como hemos visto, la conexión MQTT puede realizarse por dos puertos. El puerto 1883 sería para realizar conexiones inseguras sin ningún tipo de cifrado y el 9001 para conexiones seguras con cifrado TLS. En caso de que fuéramos a tener un cliente MQTT conectado a nuestro broker desde internet, sería conveniente utilizar la conexión segura con cifrado TLS para que nadie pueda descifrar la información que enviamos. Nosotros por ahora solo vamos a realizar las conexiones por el puerto 1883 ya que nuestro HASS y el broker MQTT estarán en la misma red local sin necesidad de salir a internet.

  • Seguridad de user/pass: Además de esta seguridad de cifrado de los paquetes, el propio broker tiene un sistema de seguridad basado en autenticación con usuario y contraseña. Aquí lo importante es desactivar la opción de conexión anónima ya que sería una brecha de seguridad.

Guardamos el archivo con el nuevo nombre mosquitto.conf.

Para terminar, vamos a crear un juego de credenciales para que en el siguiente paso podamos integrar el MQTT en HASS. Es conveniente que aprendamos bien cómo crear un usuario y contraseña ya que cada vez que conectemos un cliente MQTT al broker es conveniente crear un nuevo juego de autenticación.

Si abrimos el archivo passwords.README nos explica los pasos a dar:

  1. Crear un archivo con el nombre password.txt password.txt
  2. Abrir el archivo y escribir el juego o juegos de user pass con formato usuario:contraseña. En nuestro caso por ejemplo creamos un usuario llamado hass y una contraseña segura (apunta esta contraseña para después) user:pass
  3. Guardamos el archivo.

Ahora vamos la pestaña docker de HASS, hacemos click en el logo del contenedor MQTT y le damos a Restart para que el Broker consuma el archivo password.txt que hemos creado. restart

Integración

Ya tenemos todo listo, solo nos queda que HASS se conecte como cliente a este broker. Por suerte para nosotros, HASS tiene un cliente nativo por lo que solo tendremos que hacer lo siguiente:

  1. Abrimos nuestro Hass y vamos a configuración. Aquí vamos a integraciones y seleccionamos + Añadir integración new_integration
  2. Buscamos por MQTT mqtt
  3. Seleccionamos y rellenamos los datos con la IP de nuestro servidor, el puerto 1883 y el juego user/pass que acabamos de crear. Seleccionamos Habilitar Descubrimiento (esto veremos para que sirve en los próximos post) y aceptamos save

Voilá, ya tenemos HASS conectado a nuestro broker MQTT. En el siguiente post ya podremos empezar a agregar elementos IoT a nuestra casa virtual a través de MQTT.


Suscríbete, que es gratis

Nota: algunos de los enlaces a productos o servicios pueden ser enlaces referidos con los que podemos obtener una comisión de venta.