Configurar sensor de apertura de puertas y ventanas Sonoff SNZB-04 con Zigbee2MQTT

El Sonof SNZB-04 es un sensor de contacto que se conecta a través de protocolo Zigbee y que se alimenta con una pila de botón de 3V CR2032. Nos permite detectar la apertura de una puerta o ventana.

Está compuesto por dos pequeños módulos, uno que contiene la electrónica y otro que contiene un imán. Estos módulos los podemos pegar en el borde de una puerta, poniendo uno de ellos en el marco o parte fija y el otro en la parte móvil, de forma que cuando esté cerrada, los dos módulos estén cerca el uno del otro y alineados según una marca de referencia.

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

 

Encendido

Para activar el sensor por primera vez es necesario retirar una protección que impide que la pila toque los contactos de alimentación del dispositivo. En primer lugar hay que abrir la tapa trasera del módulo principal, el de mayor tamaño. Para ello introducimos un destornillador en la muesca que tiene justo debajo de la tapa:

Giramos el destornillador para forzar la apertura y una vez retirada la tapa, veremos debajo de la pila una pieza de plástico con la misma forma que la pila y una pequeña lengüeta de la que deberemos tirar para quitarla.

Una vez quitada la pieza de plástico, la pila estará tocando los contactos de ambos polos. Volvemos a poner la tapa y el dispositivo estará ya operativo para hacer el emparejamiento.

 

Emparejamiento

Pulsamos durante cinco segundos el botón de reset, hasta que veamos parpadear tres veces un led rojo en la tapa superior del módulo principal. El botón de reset está en el módulo principal, 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á:

Device '0x00124b0025003318' joined
MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x00124b0025003318","ieee_address":"0x00124b0025003318"},"type":"device_joined"}'
Starting interview of '0x00124b0025003318'
MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x00124b0025003318","ieee_address":"0x00124b0025003318","status":"started"},"type":"device_interview"}'
MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x00124b0025003318","ieee_address":"0x00124b0025003318"},"type":"device_announce"}'
Successfully interviewed '0x00124b0025003318', device has successfully been paired
Device '0x00124b0025003318' is supported, identified as: SONOFF Contact sensor (SNZB-04)
MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"definition":{"description":"Contact sensor","exposes":[{"access":1,"description":"Indicates if the contact is closed (= true) or open (= false)","name":"contact","property":"contact","type":"binary","value_off":true,"value_on":false},{"access":1,"description":"Indicates if the battery of this device is almost empty","name":"battery_low","property":"battery_low","type":"binary","value_off":false,"value_on":true},{"access":1,"description":"Remaining battery in %","name":"battery","property":"battery","type":"numeric","unit":"%","value_max":100,"value_min":0},{"access":1,"description":"Voltage of the battery in millivolts","name":"voltage","property":"voltage","type":"numeric","unit":"mV"},{"access":1,"description":"Link quality (signal strength)","name":"linkquality","property":"linkquality","type":"numeric","unit":"lqi","value_max":255,"value_min":0}],"model":"SNZB-04","options":[],"supports_ota":false,"vendor":"SONOFF"},"friendly_name":"0x00124b0025003318","ieee_address":"0x00124b0025003318","status":"successful","supported":true},"type":"device_interview"}'

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:

  '0x00124b0025003318':
    friendly_name: '0x00124b0025003318'

Cambiamos el valor del atributo friendly_name por otro que nos resulte más fácil de reconocer:

  '0x00124b0025003318':
    friendly_name: 'sensor_apertura'

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_apertura.

 

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 detecta un cambio de estado de la apertura. Esto hace que las peticiones de lectura de valores no se procesen inmediatamente sino que sean encoladas y que el valor se reciba en la siguiente ocasión en la que el dispositivo está disponible, es decir, cuando hay un cambio de estado.

Para leer valores, nos suscribimos con mosquitto_sub al topic zigbee2mqtt/sensor_apertura 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_apertura"

Cuando la puerta o ventana está cerrada los dos módulos están alineados y recibimos el valor true en el parámetro contact.

{"battery":50,"battery_low":false,"contact":true,"linkquality":84,"tamper":false,"voltage":2800}

Cuando se abre los dos módulos dejan de estar alineados y se envía el valor false en ese mismo parámetro:

{"battery":50,"battery_low":false,"contact":false,"linkquality":96,"tamper":false,"voltage":2800}

Además del parámetro contact que es el que nos indica si la puerta o ventana está abierta o cerrada, el mensaje JSON muestra otros parámetros:

  • battery. Número que indica la batería restante en porcentaje.
  • 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.
  • 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).
  • 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.
  • voltage. Voltaje de la pila en milivoltios.

 

Resumen

Disponiendo de un gateway Zigbee y un broker MQTT se ha visto como emparejar un sensor de apertura de puertas y ventanas con conectividad Zigbee, en este caso el Sonoff SNZB-04, y la forma de consultar su estado a través de la publicación y suscripción a topics MQTT. Esto permite detectar la apertura de puertas y ventanas y realizar acciones en consecuencia, como disparar una alarma, un aviso, encender o apagar una luz. En combinación con Home Assistant permitiría definir automatizaciones de forma sencilla.

 

Referencias