Configurar sensor de movimiento Zigbee SNZB-03 con Zigbee2MQTT
El Sonoff SNZB-03 es un sensor de movimiento que se conecta a través de protocolo Zigbee. Se alimenta con una pila de botón de 3V CR2450. Presenta unas dimensiones muy reducidas (40x35x30mm)
Está diseñado para funcionar con la aplicación eWeLink, pero veremos cómo configurarlo para su uso con zigbee2mqtt, lo que abre el paso para su control mediante scripts o programas propios y a la integración plataformas como Home Assistant, pero sin requerir de servicios externos.
Debemos disponer de los siguientes componentes ya instalados y configurados:
- Broker MQTT. En este artículo se explica cómo instalar mosquitto en una Raspberry Pi.
- Zigbee2mqtt. La instalación y configuración básica se describen en este artículo
Pulsamos durante cinco segundos el botón de reset, hasta que comience a parpadear un led rojo. El botón de reset está dentro de un pequeño orificio para evitar que se active por accidente. Hay que pulsarlo con un pin similar a los que se utilizan para abrir la bandeja de la tarjeta SIM de los teléfonos, incluído en la caja del dispositivo. Una vez activada la sincronización en el log de zigbee2mqtt aparecerá:
info 2022-02-04 22:46:12: Device '0x00124b00250beb63' joined
info 2022-02-04 22:46:12: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x00124b00250beb63","ieee_address":"0x00124b00250beb63"},"type":"device_joined"}'
info 2022-02-04 22:46:12: Starting interview of '0x00124b00250beb63'
info 2022-02-04 22:46:12: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x00124b00250beb63","ieee_address":"0x00124b00250beb63","status":"started"},"type":"device_interview"}'
info 2022-02-04 22:46:13: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x00124b00250beb63","ieee_address":"0x00124b00250beb63"},"type":"device_announce"}'
Si en el log aparece el mensaje device_joined
será indicativo de que se ha emparejado correctamente.
Para dar un nombre más amigable al dispositivo, paramos el servicio zigbee2mqtt:
sudo systemctl stop zigbee2mqtt
Editamos el archivo de configuración de zigbee2mqtt, que en este caso está en /opt/zigbee2mqtt/data/configuration.yaml
.
Al final del archivo, en la sección devices
nos aparecerá una entrada del tipo:
'0x00124b00250beb63':
friendly_name: '0x00124b00250beb63'
Cambiamos el valor del atributo friendly_name
por otro que nos resulte más fácil de reconocer:
'0x00124b00250beb63':
firendly_name: 'sensor_movimiento'
y arrancamos el servicio de nuevo para que se aplique el nuevo nombre:
sudo systemctl start zigbee2mqtt
Ahora debe publicar los eventos en el topic zigbee2mqtt/sensor_movimiento
.
Se trata de un dispositivo de bajo consumo, por lo que el sensor no está accesible la mayoría del tiempo, sólo cuando se activa porque se detecta un movimiento.
Las peticiones de lectura de valores no se procesan inmediatamente sino que son encoladas y se envían en la siguiente ocasión en la que está disponible.
Para leer valores, nos suscribimos con mosquitto_sub
al topic zigbee2mqtt/sensor_movimiento
en nuestro broker MQTT. Si lo hacemos desde dentro de la propia Raspberry pi (o el servidor donde se esté ejecutando mosquitto) utilizaremos el parámetro -h localhost
. Si lo hacemos desde otro equipo, especificaremos la dirección IP del la máquina donde se ejecute mosquitto:
mosquitto_sub -h localhost -p 1883 \
-u $MQTTUSER -P $MQTTPASS \
-t "zigbee2mqtt/sensor_movimiento"
Cuando detecta un movimiento, recibimos el valor true
en el parámetro occupancy
.
{"battery":57.5,"battery_low":false,"linkquality":111,"occupancy":true,"tamper":false,"voltage":2900}
Cuando se deja de detectar, se envía el valor false
en ese mismo parámetro:
{"battery":57.5,"battery_low":false,"linkquality":114,"occupancy":false,"tamper":false,"voltage":2900}
Además del parámetro occupancy
que es el que nos indica si realmente se detecta movimiento, el mensaje JSON muestra otros parámetros:
- battery_low. Indica si la batería está a punto de acabarse, en cuyo caso contiene el valor
true
. Si la batería tiene un nivel aceptable contiene el valorfalse
. - battery. Número que indica la batería restante en porcentaje.
- tamper. Indica si el dispositivo es manipulado. Algunos detectores incluyen un par de terminales llamados tamper, como sistema anti-sabotaje. Cuando alguien trata de abrir el dispositivo, la apertura se detecta y se envía una señal para avisar de ello. En este caso, se envía el valor
true
en este parámetro si el dispositivo es manipulado ofalse
en caso contrario. - linkquality. Fuerza de la señal. El valor mínimo es 0 y el máximo 255. La unidad de este valor es lqi (Link Quality Indicator).
- voltage. Voltaje de la pila en milivoltios.
Este dispositivo no tiene parámetros de configuración conocidos a la hora de utilizarlo con Zigbee2mqtt como sí tienen otros dispositivos similares como el Tuya ZM-35ZH-Q.
Disponiendo de un gateway Zigbee y un broker MQTT se puede emparejar con el gateway un sensor de movimiento con conectividad Zigbee, en este caso el Sonoff SNZB-03. Se ha visto como consultar su estado a través de suscripción a topics MQTT. Esto permite detectar la entrada de una persona en un área y realizar acciones en consecuencia, como disparar una alarma, un aviso o encender una luz. En combinación con Home Assistant permitiría definir automatizaciones de forma sencilla.
Aún no he hecho un uso suficiente para sacar conclusiones definitivas. La parte negativa en comparación con el Tuya ZM-35ZH-Q es que no admite ningún parámetro de configuración como la sensibilidad o el tiempo en el que permanece activa la detención. Como ventaja sobre ese otro dispositivo, el Sonoff nos informa del estado exacto de la batería.
- https://www.zigbee2mqtt.io/devices/SNZB-03.html
- https://sonoff.tech/product-document/smart-home-security-doc/snzb-03-doc/
- https://sonoff.tech/wp-content/uploads/2021/03/%E5%BF%AB%E9%80%9F%E6%8C%87%E5%8D%97-SNZB-03-V1.0-20200506.pdf
- https://sonoff.tech/wp-content/uploads/2021/03/%E8%AF%B4%E6%98%8E%E4%B9%A6-SNZB-03-V1.0-20210305.pdf