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.

 

Requisitos previos

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

 

Emparejamiento

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.

 

Asignación de un nombre amigable

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.

 

Lectura de valores

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 valor false.
  • 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 o false 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.

 

Parámetros de configuración

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.

 

Resumen

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.

 

Referencias