
Esquema Rápido
Zigbee2MQTT
Los dispositivos domésticos inteligentes de Zigbee están en todas partes hoy. Zigbee2MQTT es un software que te permite controlarlos a todos.
Muchas marcas diferentes están produciendo dispositivos Zigbee hoy en día, por lo que es muy fácil que termine con un montón de puertas de enlace y aplicaciones diferentes para controlarlos. Y nada que funcione sin una conexión a Internet. ¿No te gusta eso? ¡Yo tampoco! Así es como puede controlar la mayoría de las bombillas inteligentes (y muchos otros dispositivos domésticos inteligentes) con una puerta de enlace barata y el software Zigbee2MQTT. Totalmente bajo su control e independiente del fabricante y del software de control. ¡Vamonos!
¿Por qué Zigbee?
Como habrás adivinado, esta guía exacta solo funcionará para dispositivos inteligentes que utilicen el protocolo Zigbee. ¡Eso es realmente bueno! Zigbee es un gran protocolo de red diseñado para dispositivos domésticos inteligentes y de IoT. Está hecho para un bajo consumo de energía (dispositivos que funcionan con batería) y crea automáticamente una red entre todos los dispositivos (los dispositivos de pared se convierten en enrutadores) sin que el usuario, nosotros, tengamos que hacer nada.
Puede que no lo hayas notado, pero la mayoría de las grandes marcas como Philips Hue, Ikea Tradfri y Xiaomi Aqara / Mijia ya están usando Zigbee. Simplemente vienen con su propia puerta de enlace que une Zigbee y su Wifi. Eso funciona muy bien si compra dispositivos de un solo fabricante y no le importa compartir sus datos con ellos, así como confiar en una conexión a Internet en la mayoría de los casos. ¡Así que arreglemos esto!
El hardware
Antes de que podamos empezar, necesitamos nuestro propio portal. Algo que sea barato, fácil de comprar y confiable. Ah, y puedo hablar con dispositivos Zigbee. La base del hardware puede ser prácticamente cualquier cosa, una vieja PC, una máquina virtual o algo más. Ni siquiera necesito ser realmente poderoso. Recomendaría conseguir una Rasperry Pi (un modelo más nuevo 3 o 4).
Para aquellos que no conocen la Rasperry Pi: es una computadora de placa única pequeña y barata. Utiliza mucho menos energía y espacio que una computadora completa, pero sigue siendo lo suficientemente potente como para ejecutar todo el software doméstico inteligente que necesita. Necesitas
- Una Raspberry Pi , preferiblemente la Pi 4 con 2 o 4 GB de RAM
- Una fuente de alimentación USB (C para Pi 4, Micro USB para los más antiguos) con alrededor de 3.0A
- Una tarjeta microSD , 16 + GB de un fabricante confiable, debe ser rápida: clase 10 / UHS-1
- Opcional: un estuche (con refrigeración) para el Pi
- Opcional: si aún no tiene uno, compre un lector / grabador de tarjetas SD
- Opcional: acceso a la red. O un cable LAN o, si no está utilizando un Pi más nuevo, un dongle USB Wifi separado.
- Alternativamente, puede obtener un kit que incluye todo lo que necesita:
Una vez que tenga todo esto, debe instalar un sistema operativo de su elección. Esto dependerá del software del controlador del hogar inteligente que vaya a utilizar. Si va a utilizar OpenHab, le recomiendo encarecidamente que utilice OpenHabian . La configuración es muy fácil. Si no planea usar un determinado sistema o no está seguro, puede optar por el sistema Raspbian. Ejecutará todo el software que necesitamos para esta guía y también puede instalar prácticamente cualquier otra cosa. Hay una guía sobre cómo ejecutarlo aquí . Solo asegúrese de habilitar el acceso SSH para su uso sin un monitor.
Ahora que tenemos una computadora en funcionamiento, necesitamos agregar soporte para Zigbee. Afortunadamente, existen varias formas sencillas de hacerlo. Existe la memoria USB Conbee (II). Yo nunca lo he usado, pero viene con su propio software y supuestamente funciona bastante bien. Sin embargo, parece que el software no es de código abierto y la memoria USB es un poco más cara. Por eso probé otra solución: la memoria USB CC2531.
El CC2531 es un rastreador Zigbee que se puede utilizar para interactuar con dispositivos Zigbee. Para usarlo para nuestros propósitos, necesitamos actualizar un firmware personalizado, un proceso para el que necesitaríamos hardware adicional. Afortunadamente, esto se ha vuelto bastante popular, por lo que la gente vende CC2531 actualizados en línea. Recomiendo comprar uno de esos. Simplemente conéctelo a uno de los puertos USB de Rasperry Pi. Si quieres hacerlo tú mismo, aquí tienes una buena guía de Zigbee . Si tiene problemas con la estufa o si guarda el Pi en algún lugar cerrado, le recomendaría usar un cable de extensión USB para el CC2531.
Eso es todo, el hardware está listo.
¿Por qué MQTT?
Ok, hagamos una pausa aquí por un segundo. Ahora tenemos nuestra propia puerta de enlace que puede hablar con dispositivos Zigbee. Ahora necesitamos alguna forma de comunicar estados y comandos desde y hacia estos dispositivos desde nuestro software de controlador de hogar inteligente. Por supuesto, podríamos usar algún complemento de software que se comunique directamente con la memoria USB Zigbee, pero hay una forma más elegante y desacoplada.
Existe un software llamado Zigbee2MQTT que toma estos mensajes de la red Zigbee y los traduce en mensajes fáciles de usar y bien estructurados en otro protocolo: MQTT.
Pero primero déjame explicarte rápidamente qué es MQTT. MQTT significa Message Queue Server Telemetry Transport y es un sistema ligero de publicación y suscripción diseñado para aplicaciones de IoT. ¿Eh? MQTT es un sistema de mensajería diseñado para dispositivos de baja potencia con conexiones intermedias menos que óptimas y puede «enviar» mensajes a los dispositivos. También es muy flexible y está bastante extendido, por lo que es una excelente opción para fines de automatización del hogar. Solo necesita un servidor (llamado intermediario) que generalmente se ejecuta en la máquina en la que ejecuta su controlador doméstico inteligente. También permite múltiples usuarios al mismo tiempo y presenta datos en una topología de árbol bien estructurada.
Todos los principales controladores domésticos inteligentes abiertos como OpenHab, HomeAssistant y Domoticz admiten MQTT. Eso facilita la configuración de esos dispositivos y también está preparado para el futuro si planea cambiar en un momento posterior. El software Zigbee2MQTT también admite cientos de dispositivos listos para usar y viene con características agradables como: listas blancas y negras, detección automática para HomeAssistant e incluso soporte OTA experimental.
Configuración de Zigbee2MQTT
¿Suena genial? Vamos a instalarlo. El manual siempre actualizado se puede encontrar aquí . Esta es la descripción general.
// find the serial port the USB adapter is connected to. Check with
ls -l /dev/ttyACM0 // <- standard port
// you need to install Node.js 12 for this to work which is unfortunately not (yet) in the normal repos. So do it this way
sudo curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs git make g++ gcc
// check with
node --version # Should output v12.X or v10.X
npm --version # Should output 6.X
// now clone the actual software from Github
sudo git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
sudo chown -R pi:pi /opt/zigbee2mqtt // replace pi with your user
// and install dependencies
cd /opt/zigbee2mqtt
npm ci
// installation should be done :) Now open the config file for Zigbee2MQTT
nano /opt/zigbee2mqtt/data/configuration.yaml
Este archivo de configuración se utiliza para configurar todo para el programa. Puede encontrar información detallada aquí . Tengo la siguiente configuración básica:
configuration.yaml para Zigbee2MQTThomeassistant: false
permit_join: true
mqtt:
base_topic: zigbee2mqtt
server: 'mqtt://localhost'
# user: my_user
# password: my_password
serial:
port: /dev/ttyACM0
advanced:
network_key: GENERATE
devices:
// ... see rest of tutorial
No estoy usando Homeassistant en este momento, por lo que el mecanismo de descubrimiento está desactivado. Para comenzar, debe configurar el puerto serie (para el adaptador USB) al que está conectada su memoria USB. En MQTT.server, debe agregar el nombre o la dirección IP de su servidor MQTT. En mi caso, se está ejecutando en la misma máquina, por lo que localhost funcionará bien.
Si aún no tiene un agente (servidor) MQTT, puede instalar mosquitto en la misma Raspberry Pi. Eso es súper fácil:
Instalación del broker Mosquitto MQTTsudo apt update // get newest packages
sudo apt install mosquitto // install mosquitto
Si configura su corredor con soporte de nombre de usuario / contraseña, puede agregarlos en el archivo config. De lo contrario, deje esa parte fuera. También debe establecer un tema base en el que se agruparán todos los mensajes de este programa. De esa manera, puede separarlo fácilmente de otros dispositivos que se comunican a través de MQTT (como mis dispositivos Tasmota) .
La configuración permit_join permite que nuevos dispositivos ingresen a la red. Debe habilitarse cada vez que intente agregar dispositivos. Esto definitivamente puede ser una vulnerabilidad de seguridad si lo dejas encendido todo el tiempo así. Puede desactivarlo aquí una vez que haya terminado de conectar sus dispositivos.
El «network_key: GENERATE» obligará a Zigbee2MQTT a generar una clave aleatoria para su red en el próximo inicio. Eso es opcional pero recomendado (cuidado, si agrega esto más tarde, tendrá que volver a emparejar todos sus dispositivos).
Si busca consejos y trucos relacionados con esas configuraciones y Zigbee2MQTT en general, consulte mi artículo aquí .
La parte de dispositivos se utilizará para cambiar el nombre y almacenar todos los dispositivos conectados a la red. Por ahora déjalo vacío. Ahora puede guardar el archivo e iniciar el programa mediante «npm start» . Obtenga un programa para ver los mensajes MQTT (puedo recomendar el explorador MQTT ) y verifique si puede ver algo. Debería haber un tema «zigbee2mqtt / bridge» con valores de estado y configuración.
Emparejar un dispositivo
Ahora que todo está configurado correctamente, podemos comenzar emparejando un dispositivo Zigbee. Cientos de dispositivos son compatibles con Zigbee2MQTT, pero como ejemplo, puedo recomendar los dispositivos Xiaomi Aqara, baratos pero increíbles. Tengo varios sensores de temperatura / humedad y de movimiento funcionando como parte de mi sistema de hogar inteligente . También puedo usar un sensor de fugas de agua y algunos interruptores inalámbricos de Aqara .
Para emparejar uno de esos, primero debemos habilitar la configuración «permit_join» en la configuración como se describe anteriormente (si aún no lo tiene). Ambos dispositivos tienen un pequeño botón en el lateral. Simplemente presione eso durante 5 segundos hasta que un pequeño LED comience a parpadear. Ahora el sensor intentará emparejarse con su puerta de enlace. Si tiene problemas para el emparejamiento, vuelva a comprobar la configuración anterior y acerque el sensor a la memoria USB Zigbee (aunque no demasiado, déle al menos medio metro).
Para comprobar si el emparejamiento ha funcionado, consulte los registros de Zigbee2MQTT.
Registros Zigbee2MQTTtail -f /opt/zigbee2mqtt/data/log/TheDateYouStartedTheService/log.txt
// use the newest date; the log file is sometimes called log2, log3, ...
// if a log statement like this appeared pairing was successful
"Successfully interviewed '0x00158d0001dc126a', device has successfully been paired"
Ahora abra el archivo configuration.yaml de antes nuevamente. Debería ver una nueva entrada en la parte » dispositivos » del archivo. Cámbialo así
'0x00158d0002b7f7fe': // this is the id of the new device, don't change it
friendly_name: MotionSensor1 // this will initially be the id too. Change it to a name you can recognize for easier use later on
retain: false // I don't see why we should save messages, so disable this
Ahora solo recuerde el nombre amigable que le dio a su nuevo dispositivo y diríjase a su controlador de hogar inteligente para integrarlo.
Integración del controlador del hogar inteligente – OpenHab 2
Si está utilizando Home Assistant, puede habilitar la detección automática. Más detalles sobre todo esto aquí. Casi todos los demás controladores domésticos inteligentes también pueden interactuar con MQTT y, por lo tanto, pueden usar sus dispositivos de esta manera.
Actualmente estoy usando OpenHab 2 (2.5 con el nuevo enlace MQTT), así que veamos cómo integrar esos dispositivos en él. Como siempre, el primer paso es crear algo para su dispositivo.
Archivo MQTT ThingsBridge mqtt:broker:mosquitto [host="localhost", port=1883, secure=false, clientID="openHAB2"] {
Thing topic motionZigbee1 "Bewegung Küche" @ "Küche" {
Channels:
Type switch : motion "Bewegung" [ stateTopic="zigbee2mqtt/MotionSensor1", transformationPattern="JS:js/getZigbeeOccupancy2Switch.js"]
Type number : illuminance "Helligkeit" [ stateTopic="zigbee2mqtt/MotionSensor1", transformationPattern="JSONPATH:$.illuminance"]
Type number : battery "Batterie" [ stateTopic="zigbee2mqtt/MotionSensor1", transformationPattern="JSONPATH:$.battery"]
Type number : voltage "Spannung" [ stateTopic="zigbee2mqtt/MotionSensor1", transformationPattern="JSONPATH:$.voltage"]
Type number : link "Link Qualität" [ stateTopic="zigbee2mqtt/MotionSensor1", transformationPattern="JSONPATH:$.linkquality"]
}
}
Necesitamos una cosa puente aquí que represente a nuestro corredor MQTT. Apúntelo a su host y puerto (en mi caso, se ejecuta en el mismo dispositivo en el puerto estándar de 1883).
Ahora podemos agregar cosas aquí que representan un tema MQTT. En este caso se llama “motionZigbee1” con una descripción (opcional y en este caso en alemán) de “Bewegung Küche” (cocina en movimiento) como parte de la sala “Küche” (cocina). La parte @ room es opcional y se utiliza principalmente para PaperUI.
El tema tendrá diferentes canales, que representan los datos reales que proporciona este sensor. Podría decirse que el más importante es la detección de movimiento. Para ello, es necesario agregar un canal de tipo interruptor (encendido / apagado == movimiento / sin movimiento) con una descripción y un tema MQTT, así como una transformación. El tema del estado es la fuente de datos aquí. Es el tema MQTT al que el dispositivo envía los datos. En nuestro caso “zigbee2mqtt / MotionSensor1” . Esto se construye a partir del «base_topic» definido en el software Zigbee2MQTT ( zigbee2mqtt ) y el nombre descriptivo que le dimos a nuestro sensor de movimiento ( MotionSensor1 ). Este tema recibirá los siguientes datos cuando el sensor detecte movimiento:
// sent to zigbee2mqtt/MotionSensor1
{
"illuminance": 36,
"linkquality": 5,
"occupancy": true, // <- the important part
"battery": 100,
"voltage": 3035
}
Ahora tenemos un problema aquí. Openhab espera valores como «ON» y «OFF» para un interruptor. Sin embargo, lo que vemos aquí es un objeto JSON completo e incluso la propiedad de ocupación interesante muestra verdadero / falso en lugar de ON / OFF. Es por eso que necesitamos una transformación para convertir los datos.
Dirígete a tus archivos de configuración o PaperUI e instala 2 nuevas transformaciones: Transformación Javascript y Transformación JSONPath. Ahora agregue un nuevo archivo javascript a su carpeta transform / js.
getZigbeeOccupancy2Switch.js(function(x){
var result = "";
var json = JSON.parse(x);
if (json.occupancy)
{
result="ON";
}
else
{
result="OFF";
}
return result;
})(input)
Esta es la transformación utilizada en el canal anterior. Los otros canales están usando la transformación de ruta json. «JSONPATH: $. Linkquality», por ejemplo, simplemente extraerá el valor de la calidad del enlace (algo como la intensidad de la señal Wifi) del objeto JSON.
Como siempre, a continuación, necesitamos vincular esta novedad a los elementos de OpenHab. Así que cree un nuevo archivo de elementos o agréguelo a uno existente:
/* Motion sensor 1 */
Switch motionZigbee1 "Bewegung Küche [MAP(motion.map):%s]" <motion> (grMotion) { channel="mqtt:topic:mosquitto:motionZigbee1:motion" }
Number motionZigbee1_brightness "Helligkeit Küche [%d lumen]" <sun> (grBrightness) { channel="mqtt:topic:mosquitto:motionZigbee1:illuminance" }
Number motionZigbee1_battery "Batteriestand [%d%%]" (grBattery) { channel="mqtt:topic:mosquitto:motionZigbee1:battery" }
Number motionZigbee1_voltage "Spannung [%d mV]" { channel="mqtt:topic:mosquitto:motionZigbee1:voltage" }
Number motionZigbee1_link "Link Qualität" { channel="mqtt:topic:mosquitto:motionZigbee1:link" }
La definición del artículo es en su mayoría estándar, pero el canal es interesante. Esto es lo que vincula el elemento a la cosa (canal) que creamos arriba.
- mqtt – protocolo utilizado
- : topic – estamos escuchando un tema MQTT
- : mosquitto – el nombre de nuestro artículo puente desde arriba (el corredor), cámbielo para reflejar su archivo de cosas
- : motionZigbee1 – el nombre del dispositivo (nombre descriptivo en Zigbee2MQTT, nombre de la cosa en OpenHab)
- : movimiento – el nombre del canal en el archivo de cosas
También estoy usando grupos aquí para cosas comunes como interruptores de movimiento, valores de brillo y valores de batería. Para la descripción del movimiento, también estoy usando un archivo de mapa para traducir los valores a algo más descriptivo (como «ON» se convierte en «Movimiento detectado»).
Estos elementos ahora se pueden usar en cualquier lugar de OpenHab. Úselo en reglas o agréguelo a una de las muchas IU. Aquí hay un ejemplo de la interfaz de usuario simple. Agréguelo a su mapa del sitio.
Frame label="Bewegung" {
Text item=motionZigbee1
Text item=motionZigbee1_brightness
Text item=motionZigbee1_battery
Text item=motionZigbee1_voltage
Text item=motionZigbee1_link
}
¡Ahora ve y diviértete con tu hogar inteligente!