Zigbee, secure wireless mesh network

Zigbee, secure wireless mesh network

Cuando hablamos de redes IoT domésticas la mayoría de vosotros se habrá imaginado que vamos a utilizar nuestra red WiFi para ello. Estas son las 5 razones para no usar dispositivos WiFI para IoT:

  • Seguridad: tu red wifi está solo a un paso de internet a través de tu firewall, cualquier atacante podría llegar a utilizar tus bombillas para ataques DDOS.
  • Saturación de la red: la red wifi de tu casa debería de utilizarse para lo que es, únicamente para el uso de dispositivos como móviles, tablets, portátiles etc. Si añadimos 20 bombillas, después 20 sensores, después… nuestra red acabará por saturar y nuestra velocidad de navegación se verá resentida.
  • Alcance y velocidad: en una red domótica buscamos que la respuesta de cada sensor y actuador sea lo más rápida posible, para que nuestras automatizaciones sean instantáneas y no tengamos que esperar 3-4 segundos a que se encienda la luz al entrar en una habitación a oscuras. Además queremos que esta velocidad sea igual en la bombilla que está al lado del router así como la que tenemos en el balcón 4 paredes más allá. Una red WiFi normal en 2,4GHz realiza conexiones directas entre cada cliente y el router, haciendo que la comunicación con los equipos más alejados sea más lenta y menos robusta.
  • Consumo: un chip integrado WiFi consume mucha energía. Para el caso de actuadores enchufados a la red eléctrica es algo despreciable, pero si queremos añadir sensorica alimentada por baterías estos consumos se convierten en algo muy a tener en cuenta para que el ciclo de carga/descarga aumente lo máximo posible.
  • Gestión: el hecho de tener todos los sensores y actuadores IoT en nuestra red WiFi al lado de todos los equipos clientes como móviles, portátiles etc complica su gestión ya que todo lo tendríamos que hacer a través del router.

Con estos contras encima de la mesa, encontramos un protocolo estándar llamado ZigBee que nos elimina todos estos problemas de golpe y porrazo.

TOC

Tecnología

ZigBee es un conjunto de protocolos de comunicaciones inalámbricas diseñado para redes IoT seguras, de baja latencia, bajo consumo y separada de las redes habituales de comunicaciones como el WiFi. Para esta separación tendremos un gateway securizado que dividirá físicamente nuestra red local LAN con nuestra red IoT.

gateway

La topología de red es de tipo mesh (malla), una topología que nos permite que todos los elementos IoT que añadamos a la red se conviertan en nodos operativos que transportan información. De esta forma, el Gateway de la red ZigBee puede encontrarse en una punta de nuestra casa pero los dispositivos más alejados de la misma tendrán una cobertura asegurada ya que se conectarán al nodo más cercano que encuentre, y este a su vez al siguiente.

Además incluye entre sus protocolos uno para el cálculo de Shortest Path Bridging, algo muy útil en redes mesh ya que es el mismo sistema quien decidirá de forma autónoma las rutas más cortas y eficientes para el envío de información entre el Gateway y los dispositivos, consiguiendo así latencias bajas.

mesh

En una red IoT no necesitamos un ancho de banda muy grande ya que los paquetes de información son pequeños, lo que necesitamos es una latencia baja para que esos paquetes viajen de la forma más rápida posible. Esto hace que los chips ZigBee están diseñados para consumir una mínima cantidad de energía posible.

Las alternativas que se te habrán ocurrido leyendo esto seguro que son el Bluetooth Low Energy, Z-Wave o Lora, pero este tipo de protocolos tiene algunos aspectos en su contra que los hacen menos prácticos para una red IoT doméstica:

  • Bluetooth Low Energy o BLE: el consumo energético sigue siendo mayor al de ZigBee. El hardware es bastante más complejo de fabricar por lo que es más caro de implementar. La capama de comunicación es más compleja. Es cierto que se pueden crear redes Mesh pero no es algo habitual.
  • Z-Wave: Es algo muy parecido a ZigBee. La diferencia sustancial es la banda de frecuencia que utilizan, la cual implica una menor tasa de transferencia, y además que el tipo de chip utilizado es propietario (hay que pasar por caja si quieres hacer que tu dispositivo sea Z-Wave)
  • Lora: es un tipo de red pensado más para redes IoT de exterior o globales, como podría ser un ejemplo, un sistema de sensorización de coches. Está concebido para crear redes amplias de bajo consumo.

Como véis estos protocolos podrían perfectamente ser los elegidos para nuestra red IoT doméstica pero a todo esto hay que añadir que ZigBee es ya el protocolo elegido por grandes multinacionales como Philips, Samsung, Amazon, Ikea, Xiaomi, Lidl, Osram. Esto es algo importante a la hora de encontrar sensores y actuadores compatibles con nuestra red y además a buen precio.

alliance

Ahora que hemos elegido ZigBee como protocolo de nuestra red, nos encontramos con que aún siendo un estándar de comunicaciones, cada fabricante nos pide que utilicemos su gateway ZigBee (por ejemplo, xiaomi o ikea). Esto es un auténtico engorro ya que nos interesa poder tener una interoperabilidad que no nos ate a tener que adquirir los sensores o actuadores de marcas concretas según nuestras necesidades.

Por suerte para nosotros, como hemos dicho, el protocolo ZigBee es un estándar por lo que, como es habitual, existen proyectos de Software Libre que nos permiten utilizar un gateway genérico al que conectaremos cualquier tipo de dispositivo que podamos comprar.Además, como vimos en el anterior post, nuestro objetivo es comunicarnos con estos dispositivos utilizando el protocolo MQTT… y FUUUUSIÓN:

fusion


Zigbee2MQTT

Estamos de enhorabuena. Este proyecto, que es muy muy fácil de instalar, nos permite integrar en nuestro Home Asisstant cualquier dispositivo ZigBee a través de un gateway genérico.

arquitectura

Vamos a ponernos un poco técnicos. Una red zigbee requiere de los distintos elementos:

  • Coordinador: es el gateway de la red, el que comunicará nuestra red ZigBee con la red LAN. Debe existir solo uno por red y sus funciones son las de encargarse de controlar la red y el path planning que hemos comentado antes.
  • Router: dispositivos que funcionan como repetidores. Pueden ser equipos que únicamente hacen de repetidores o también dispositivos IoT conectados a la red eléctrica como las bombillas. Serán los nodos activos de nuestra red mesh por los que viajará la información. Nunca entran en modo sleep.
  • Dispositivo final: sensores o actuadores con chips pasivos. Son los dispositivos que funcionan a baterías, entrarán en modo reposo cuando no haya nada de qué informar o hacer reduciendo su consumo al mínimo. Son los nodos finales por los que no viaja información.

nodos

Teniendo esto en cuenta, debemos saber que cada tipo de chip coordinador tendrá especificado de fábrica cuantos router y dispositivos finales puede gestionar. Normalmente esto además depende del firmware que lleve dicho coordinador. Actualmente el protocolo ZigBee va por la versión 3.0 (backwards compatible con las versiones anteriores) el cual por definición permite redes de mayor tamaño.

Es importante antes de lanzaros a la piscina calcular cuántos dispositivos vais a añadir a la red, de forma que compraremos el coordinador que mejor se adapte a nuestras necesidades. Por los precio actuales yo os recomiendo empezar directamente por un coordinador con chip CC2652RB (con el firmware 3.X instalado) ya que nos permitirá gestionar hasta 200 dispositivos IoT por un precio razonable, siendo la opción de mejor rendimiento/precio.

Existen dos opciones que sabemos que funciona bien:

  • Slaesh’s CC2652RB stick (26 €) Slaesh

  • zzh! CC2652R Multiprotocol RF Stick (25 €) zzh!

En ambos casos no hay stock en estos momentos ya que como sabréis hay problemas de stock de microchips a nivel mundial. Mi recomendación (es el que yo tengo) es el stick de slaesh’s con la antena tipo 2 o 4 y con el firmware 3.0 ya instalado para evitarnos ese paso.

Otra alternativa es un stick Texas Instruments CC2531 (15 € el kit con el flasheador), aunque tendrás que flashear tu mismo el firmware y además solo podrás agregar 40 dispositivos como máximo.

Es muy recomendable comprar también un alargador USB para alejar el stick y su antena del servidor ya que este puede crear interferencias de señal. En mi caso además el servidor vive dentro de un pequeño armario metálico por lo que para evitar el efecto jaula de faraday es indispensable.


Dispositivos IoT ZigBee

Mientras esperas a que te llegue el stick, podemos dar un vistazo a la propia página de dispositivos “compatibles” del propio Zigbee2Mqtt. Teóricamente cualquier dispositivo ZigBee será compatible de serie, pero en esta página se listan todos los dispositivos que alguien de la comunidad ha testeado y explicado cómo proceder al emparejamiento etc.

Como podemos ver, todos los dispositivos de las marcas que he comentado antes están listadas (Philips, Samsung, Amazon, Ikea, Xiaomi, Lidl, Osram), además de un sinfin de marcas menos conocidas. La lista es ya prácticamente interminable.

aqara

Aquí ya está en tus manos seleccionar los dispositivos que se ajusten a tus necesidades, pero yo os voy a explicar la instalación actual que tengo:

  • Bombillas Ikea: baratas y de muy diferentes tipos. En concreto, tengo las Leptiter en cocinas y baños, tiras de led TRADFRI en la cocina para iluminar las encimeras, las TRADFRI GU10 para el pasillo y armarios empotrados y las bombillas TRADFRI normales E27 de distintas potencias para las lámparas de techo etc. Son muy baratas, fáciles de comprar y la gama es muy amplia. Además si el día de mañana se estropee alguna creo que será fácil que pueda comprar una exactamente igual.
  • Sensores de presencia Xiaomi: los sensores volumétricos de Ikea no me gustan ya que su respuesta es lenta y además el rango de visión es bajo (aparte de ser muy grandes y feos). Xiaomi tiene una gama llamada Aqara para domótica y unos sensores volumétricos pequeños que puedes disimular de forma fácil. Utilizan pilas de botón 2450 que duran aproximadamente DOS AÑOS. Además tengo pilas recargables de LIR2450 de litio que aunque duran un poco menos que las alcalinas (un año aproximadamente), las recargo en 30 minutos. Los sensores vienen con pilas alcalinas así que tienes dos años todavía para pensarlo.
  • Sensores de humedad Xiaomi: de la misma gama Aqara que los volumétricos. Estos van con pilas de botón 2032 y duran aproximadamente año y medio.
  • Sensores de puertas y ventanas Xiaomi: también son Aqara, usan pilas CR1632 y llevo ya 3 años sin necesidad de cambiarlas.
  • Enchufes inteligentes Osram: los hay de ikea pero son más grandes. ni miden la potencia consumida, por lo que solo los uso para on/off
  • Enchufes Xiaomi power plug: si quiero controlar el enchufe y medir la potencia consumida, utilizo estos
  • Bombillas Osram Substitube T8 Advanced UO: los tubos fluorescentes del garaje también los tengo cambiados por unos ZigBee
  • También tengo algún botón Aqara para acciones manuales
  • Finalmente para los dispositivos que van directos a la red eléctrica como el extractor de humedad de los baños, los tengo a través de un Sonoff Basic ZB R3

Como ves aquí ya entra en juego tu imaginación, presupuesto y ganas de automatizar los diferentes elementos de tu casa.


Instalación

La instalación de Zigbee2Mqtt es bastante simple. Lo primero de todo es enchufar nuestro stick ZigBee ya flasheado a uno de los puertos USB del panel trasero de nuestro servidor usando el alargador de USB. En unraid vamos a la pestaña Tools y entramos en System Devices y miramos en el apartado USB Devices si aparece algo como Cygnal Integrated Products, Inc. CP2102/CP2109 UART Bridge Controller [CP210x family]

decives

usb

(Si no aparece, convendría reiniciar el servidor con el stick enchufado. Para ello vamos a la pestaña main y damos a reboot y esperamos. Esto en principio no debería ser necesario.)

Ahora vamos a la pestaña Apps y buscamos por Zigbee2Mqtt:

app

Nos abrirá la plantilla y aquí, nos cargará por defecto el repositorio koenkk/zigbee2mqtt:

plantilla

Si hemos instalado un stick CC2531 podemos seguir adelante tal y como está, pero en caso de usar un CC2652RB existe un bug en la última versión que hace que en algunos casos no funcione bien por lo que vamos a cambiarlo por koenkk/zigbee2mqtt:1.17.1 siendo la versión 1.17.1 la última que sabemos que funciona bien. Esto esperemos que se arregle en el futuro y podamos volver de nuevo al repositorio “latest” para seguir al día con los parches de seguridad y mejoras.

La variable de device sirve para pasarle el stick USB al contenedor. Para poder hacerlo, necesitamos saber en qué ruta se encuentra el stick USB en nuestro host. Para ello vamos a abrir una consola de unraid haciendo click aquí:

consola

Escribimos el siguiente comando

ls -l /dev/serial/by-id

dev

Miramos lo que pone al final y lo ponemos igual precedido por /dev/ en el campo device, en mi caso:

/dev/ttyUSB0

plantilla2

Aplicamos y esperamos a que arranque.


Configuracion

Lo primero es que vayamos a \IP-DE-NUESTRO-UNRAID\mqtt y creemos un juego de usuario/contraseña como vimos en el anterior post. Apuntamos estos datos ya que los vamos a introducir en la configuracion de Zigbee2MQTT.

Ahora vamos a la ruta \IP-DE-NUESTRO-UNRAID\appdata\zigbee2mqtt y veremos una serie de archivos. Abrimos el archivo configuration.yaml con nuestro editor de código y vamos a configurar algunos aspectos. Vamos dejar el archivo de esta manera:

config

  • homeassitant: lo activamos para que se integre
  • permit join: por ahora lo dejamos en false, luego activaremos esto a demanda desde la interfaz web
  • mqtt: debes introducir la IP de tu servidor sin el puerto MQTT y el user/pass que acabas de crear
  • serial: añadimos lo mismo que el la variable device que hemos pasado al contenedor
  • Finalmente añadimos experimental y frontend para que nos cargue la interfaz WEB que nos facilitará muchísimo el trabajo.

Guardamos el archivo (Si no nos deja guardarlo directamente en la ruta por tema permisos de linux, lo que debemos hacer es guardarlo en nuestro escritorio del pc, borramos el archivo original en la ruta compartida y después copiamos el archivo modificado del escritorio a la ruta. Esto es algo que nos ocurrirá con frecuencia con servicios nuevos).

Ahora reiniciamos el contenedor y vamos abrir la ventana de LOGS para ver que todo arranca correctamente:

logs

logs2

Una vez arrancado, en el navegador abrimos una nueva ventana y vamos a http://IP-DE-UNRAID:8810 y veremos la interfaz web desde donde gestionaremos todos los dispositivos.


Integracion en HASS

Como hemos visto Zigbee2Mqtt se encarga de transformar todas las comunicaciones MQTT que hagamos desde Home Asisstant a la red ZigBee. Si seguiste los pasos del post anterior ya tendrás tu Broker MQTT integrado con Home Assistant y con el modo Autodiscovery activado, por lo que no es necesario hacer absolutamente nada. Podemos pasar a emparejar dispositivos directamente.


Emparejar dispositivos

Como hemos visto, hay infinidad de dispositivos compatibles con nuestro sistema y cada uno de ellos tendrá un sistema de emparejamiento diferente. Por tanto, lo mejor es buscar en el manual del fabricante o en la página del dispositivo en el listado de compatibles cómo podemos poner nuestro dispositivo en modo emparejamiento.

Una vez que lo tengamos claro y antes de poner el dispositivo en ese modo, vamos a la interfaz web de Zigbee2Mqtt http://IP-DE-UNRAID:8810 y hacemos click en permit join. Esto hará que nuestro coordinator se ponga a la espera de encontrar dispositivos en modo emparejamiento.

join

Una vez hecho esto, empezaremos a poner los diferentes dispositivos en modo emparejamiento uno a uno. Como hemos visto antes, podemos diferenciar los dispositivos por nodos activos o pasivos. Es conveniente que empieces emparejando primero los que serán nodos activos (bombillas, enchufes etc) ya que los coordinadores tienen una limitación de cuando nodos pasivos pueden tener conectados directamente a ellos. La idea es crear una red mesh empezando por los nodos del centro y después encender los nodos finales.

Estas son las típicas formas de entrar en modo emparejamiento:

  • Pulsar el botón durante 10 segundos
  • Encender y apagar la bombilla 6 veces seguidas de forma rápida
  • En algunos casos en el primer encendido el dispositivo se pone en modo emparejamiento por defecto.

Una vez veamos que el dispositivo se ha emparejado nos aparecerá un mensaje en verde en la interfaz web y aparecerá en la lista. Cuando terminemos de emparejar dispositivos ya podemos volver a dejar el join desactivado, no vaya a ser que algún vecino compre bombillas de ikea y se emparejen a nuestro sistema :).

Si vemos en esta lista en el lado derecho tenemos un botón para renombrar el dispositivo. Esto modificará el friendly_name en esta interfaz como el entity_id en Home Assistant, algo muy útil para que identificarlo sea mucho más sencillo:

rename

rename2

Si hacemos click en su nombre podremos ver los diferentes apartados de un dispositivo, como por ejemplo los elementos que expone hacia fuera. Cada uno de estos exposes será un sensor o actuador en Hass:

exposes

Una vez hecho todo esto ya podemos ir a nuestro Hass, vamos a herramientas para desarroladores y aquí buscamos por nuestro entity_id. Si hacemos clic podremos probar a encender y apagar una luz o ver los datos de algun sensor:

desarrolador

pasillo_1


Grupos

Una de las funciones más interesantes de Zigbee2Mqtt es la posibilidad de crear grupos de actuadores. Esto nos permite juntar las luces de una estancia para que se enciendan y apaguen a la vez. Si en la interfaz web de Zigbee2mqtt vamos a la pestaña Groups vamos a crear un grupo de las luces del pasillo:

grupo_pasillo

Ahora añadimos las distintas luces:

grupo_pasillo_2

Estos grupos no se crean automáticamente en Hass por lo que ahora nos toca crearlos a mano. Vamos a la ruta comapartida de los archivos de home assisstant: \IP-DE-NUESTRO-UNRAID\home-assistant-core y abrimos el archivo configuration.yaml

Nos posicionamos al final del todo y añadimos lo siguiente:

light: !include lights.yaml

Guardamos y cerramos. Ahora creamos un nuevo archivo en la misma ruta llamado lights.yaml. De esta forma el archivo de configuración general queda más limpio y en este nuevo archivo añadiremos los grupos. Como hemos dicho vamos a añadir el grupo pasillo escribiendo lo siguiente:

  - platform: mqtt
    schema: json
    name: Pasillo
    command_topic: "zigbee2mqtt/pasillo/set"
    state_topic: "zigbee2mqtt/pasillo"
    color_temp: true
    brightness: true
    rgb: false

En este caso mis bombillas del pasillo tienen los exposed de color_temp (permite cambiar el tono de blanco) y brightness (cantidad de brillo) por lo que estos dos los pongo en true. Sin embargo, al no ser bombillas RGB esta última opción lo pongo en false.

Guardamos el archivo y volvemos a nuestro Hass. Aquí vamos a configuración > controles del servidor y hacemos click en verificar configuración. Si hemos hecho todo bien nos dirá que la configuración es correcta y hacemos clic en reiniciar para que coja los cambios.

validar_1

validar_2

Una vez reiniciado volvemos a herramientas para desarrolladores y buscamos por el grupo pasillo y vemos que podemos encender todas las luces a la vez con un solo botón.

grupo_1

grupo_2

Esta forma de crear grupos es mejor hacerla de esta forma que os he explicado ya que lo que hemos hecho es crear un grupo virtual en el coordinador. Esto hace que desde hass solo salga un solo mensaje MQTT al coordinador para que encienda el grupo y este a su vez enviará la señal de encendido de forma simultánea y sincronizada a todos los nodos calculando la ruta a la vez.

Existe la forma de crear los grupos en Hass pero el funcionamiento sería justo lo contrario: desde hass se emitirán tantos mensajes MQTT como bombillas en el grupo y el coordinador irá procesandolos de uno en uno esperando la respuesta del nodo antes de seguir con el siguiente, por lo que sí tenemos la red algo saturada podremos encontrarnos con problemas de sincronismo en el encendido de las luces a parte de saturar el procesamiento del chip ZigBee en balde.


OTA

Por último quiero mencionar que ZIgbee2Mqtt incluye un sistema de actualización OTA (Over The Air) de nuestros dispositivos IOT desde la propia interfaz. Solo tienes que ir a la pestaña OTA, hacer clic en check y si encuentra actualizaciones disponibles te mostrará el dispositivo con un botón rojo.

ota_1

ota_2

Este sistema de actualización es algo que todavía está en fase beta por lo que ten cuidado al usarlo, puede que alguno de tus dispositivos se rompa. Además debes tener en cuenta que, como hemos dicho, las redes ZigBee tienen un ancho de banda limitado por lo que es aconsejable que solo actualices un dispositivo por vez para no saturar la red.


Y hasta aquí este post sobre ZigBee. En el próximo post veremos con más detalle la creación de pantallas frontend en Hass así como automatizaciones simples, y también aprenderemos a aplicar themes para dejar el dashboard a nuestro gusto.


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.