Configurar sensor de movimiento Tuya ZM-35ZH-Q con Zigbee2MQTT

El Tuya ZM-35ZH-Q 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 que promete una duración de más de un año. Por sus reducidas dimensiones (33mm de diámetro por 30mm de altura) se puede colocar en cualquier sitio sin que resulte muy llamativo.

Está diseñado para funcionar con la aplicación Tuya Smart Life, 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-20 21:57:56: Device '0xa4c138b9576d55bf' joined
info  2022-02-20 21:57:56: MQTT publish: topic 'zigbee2mqtt/bridge/event', 
      payload '{"data":{"friendly_name":"0xa4c138b9576d55bf","ieee_address":"0xa4c138b9576d55bf"},
      "type":"device_joined"}'
info  2022-02-20 21:57:56: Starting interview of '0xa4c138b9576d55bf'
info  2022-02-20 21:57:56: MQTT publish: topic 'zigbee2mqtt/bridge/event', 
      payload '{"data":{"friendly_name":"0xa4c138b9576d55bf","ieee_address":"0xa4c138b9576d55bf",
      "status":"started"},"type":"device_interview"}'
info  2022-02-20 21:57:56: MQTT publish: topic 'zigbee2mqtt/bridge/event', 
      payload '{"data":{"friendly_name":"0xa4c138b9576d55bf","ieee_address":"0xa4c138b9576d55bf"},
      "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:

  '0xa4c138b9576d55bf':
    friendly_name: '0xa4c138b9576d55bf'

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

  '0xa4c138b9576d55bf':
   friendly_name: '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/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 o escritura para configurar parámetros 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/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/movimiento"

Cuando detecta un movimiento, recibimos el valor true en el parámetro occupancy.

{"battery":null,"battery_low":false,"linkquality":87,"occupancy":true,"tamper":false}

Cuando se deja de detectar, se envía el valor false en ese mismo parámetro:

{"battery":null,"battery_low":false,"linkquality":84,"occupancy":false,"tamper":false}

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. Según la documentación, debe mostrar un valor numérico entre 0 y 100, pero en las pruebas que se han realizado, siempre ha mostrado el valor null.
  • 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).

 

Parámetros de configuración

Para configurar su comportamiento, este dispositivo admite algunos parámetros que se describen a continuación. Como se ha indicado anteriormente, al tratarse de un dispositivo de bajo consumo, no está permanentemente disponible. Sólo lo está cuando se detecta movimiento ({"occupancy": true}).

sensitivity

Ajuste de sensibilidad al movimiento. Admite tres valores: low, medium y high. Para modificar la configuración hay que publicar un mensaje en el topic zigbee2mqtt/FRIENDLY_NAME/setcon el payload {"sensitivity": <valor>} con uno de esos tres valores. Para que se aplique la configuración lo antes posible, lo mejor es generar movimiento delante del sensor para que se active. Ejemplo para poner la sensibilidad al mínimo:

mosquitto_pub -h localhost -p 1883 \
-u $MQTTUSER -P $MQTTPASS \
-t "zigbee2mqtt/movimiento/set" \
-m '{"sensitivity": "low"}'

keep_time

Tiempo de espera tras una activación para volver al modo occupancy=false. Representa una cifra en segundos y admite sólo los valores 30, 60 y 120. En las pruebas realizadas se ha visto que es un valor aproximado, no exacto.

Para modificar este valor hay que publicar un mensaje en el topic zigbee2mqtt/FRIENDLY_NAME/set con el payload {"keep_time": <valor>}. Si se indica un valor numérico que no sea uno de los 3 especificados, no realiza ningún cambio.

mosquitto_pub -h localhost -p 1883 \
-u $MQTTUSER -P $MQTTPASS \
-t "zigbee2mqtt/movimiento/set" \
-m '{"keep_time": "60"}'

 

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 Tuya ZM-35ZH-Q. Se ha visto como configurarlo y consultar su estado a través de la publicación y 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.

 

Referencias