Configurar Sensor de Fugas de Agua Aqara SJCGQ11LM

El sensor Aqara SJCGQ11LM es un dispositivo con conectividad Zigbee que permite detectar fugas de agua. En este artículo veremos como configurarlo para que publique valores a través de Zigbee2mqtt, lo que permitirá automatizar avisos en caso de detección, ya sea a través de scripts o aplicaciones propias o de Home Assistant.

 

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

Mantenemos pulsada la parte superior del sensor, donde está el icono de la gota de agua, hasta que el led azul que está justo al lado del icono empiece a parpadear. Esto hará que se inicie el emparejamiento. En el log de zigbee2mqtt aparecerá:

info  2022-09-12 07:28:39: Device '0x00158d0008059a5b' joined
info  2022-09-12 07:28:39: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x00158d0008059a5b","ieee_address":"0x00158d0008059a5b"},"type":"device_joined"}'
info  2022-09-12 07:28:39: Starting interview of '0x00158d0008059a5b'
info  2022-09-12 07:28:39: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x00158d0008059a5b","ieee_address":"0x00158d0008059a5b","status":"started"},"type":"device_interview"}'
info  2022-09-12 07:28:40: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x00158d0008059a5b","ieee_address":"0x00158d0008059a5b"},"type":"device_announce"}'
info  2022-09-12 07:28:43: MQTT publish: topic 'zigbee2mqtt/enchufe', payload '{"current":0,"energy":0.12,"linkquality":72,"power":0,"power_outage_memory":"restore","state":"OFF","voltage":360}'
info  2022-09-12 07:28:58: MQTT publish: topic 'zigbee2mqtt/enchufe', payload '{"current":0,"energy":0.12,"linkquality":69,"power":0,"power_outage_memory":"restore","state":"OFF","voltage":358}'
info  2022-09-12 07:29:10: Successfully interviewed '0x00158d0008059a5b', device has successfully been paired
info  2022-09-12 07:29:10: Device '0x00158d0008059a5b' is supported, identified as: Xiaomi Aqara water leak sensor (SJCGQ11LM)
info  2022-09-12 07:29:10: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"definition":{"description":"Aqara water leak sensor","exposes":[{"access":1,"description":"Remaining battery in %","name":"battery","property":"battery","type":"numeric","unit":"%","value_max":100,"value_min":0},{"access":1,"description":"Indicates whether the device detected a water leak","name":"water_leak","property":"water_leak","type":"binary","value_off":false,"value_on":true},{"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":"Voltage of the battery in millivolts","name":"voltage","property":"voltage","type":"numeric","unit":"mV"},{"access":1,"description":"Measured temperature value","name":"temperature","property":"temperature","type":"numeric","unit":"°C"},{"access":1,"description":"Link quality (signal strength)","name":"linkquality","property":"linkquality","type":"numeric","unit":"lqi","value_max":255,"value_min":0}],"model":"SJCGQ11LM","options":[],"supports_ota":false,"vendor":"Xiaomi"},"friendly_name":"0x00158d0008059a5b","ieee_address":"0x00158d0008059a5b","status":"successful","supported":true},"type":"device_interview"}'
info  2022-09-12 07:29:10: MQTT publish: topic 'homeassistant/sensor/0x00158d0008059a5b/battery/config', payload '{"availability":[{"topic":"zigbee2mqtt/bridge/state"}],"device":{"identifiers":["zigbee2mqtt_0x00158d0008059a5b"],"manufacturer":"Xiaomi","model":"Aqara water leak sensor (SJCGQ11LM)","name":"0x00158d0008059a5b","sw_version":"3000-0001"},"device_class":"battery","enabled_by_default":true,"entity_category":"diagnostic","name":"0x00158d0008059a5b battery","state_class":"measurement","state_topic":"zigbee2mqtt/0x00158d0008059a5b","unique_id":"0x00158d0008059a5b_battery_zigbee2mqtt","unit_of_measurement":"%","value_template":"{{ value_json.battery }}"}'
info  2022-09-12 07:29:10: MQTT publish: topic 'homeassistant/binary_sensor/0x00158d0008059a5b/water_leak/config', payload '{"availability":[{"topic":"zigbee2mqtt/bridge/state"}],"device":{"identifiers":["zigbee2mqtt_0x00158d0008059a5b"],"manufacturer":"Xiaomi","model":"Aqara water leak sensor (SJCGQ11LM)","name":"0x00158d0008059a5b","sw_version":"3000-0001"},"device_class":"moisture","name":"0x00158d0008059a5b water leak","payload_off":false,"payload_on":true,"state_topic":"zigbee2mqtt/0x00158d0008059a5b","unique_id":"0x00158d0008059a5b_water_leak_zigbee2mqtt","value_template":"{{ value_json.water_leak }}"}'
info  2022-09-12 07:29:10: MQTT publish: topic 'homeassistant/binary_sensor/0x00158d0008059a5b/battery_low/config', payload '{"availability":[{"topic":"zigbee2mqtt/bridge/state"}],"device":{"identifiers":["zigbee2mqtt_0x00158d0008059a5b"],"manufacturer":"Xiaomi","model":"Aqara water leak sensor (SJCGQ11LM)","name":"0x00158d0008059a5b","sw_version":"3000-0001"},"device_class":"battery","entity_category":"diagnostic","name":"0x00158d0008059a5b battery low","payload_off":false,"payload_on":true,"state_topic":"zigbee2mqtt/0x00158d0008059a5b","unique_id":"0x00158d0008059a5b_battery_low_zigbee2mqtt","value_template":"{{ value_json.battery_low }}"}'
info  2022-09-12 07:29:10: MQTT publish: topic 'homeassistant/sensor/0x00158d0008059a5b/voltage/config', payload '{"availability":[{"topic":"zigbee2mqtt/bridge/state"}],"device":{"identifiers":["zigbee2mqtt_0x00158d0008059a5b"],"manufacturer":"Xiaomi","model":"Aqara water leak sensor (SJCGQ11LM)","name":"0x00158d0008059a5b","sw_version":"3000-0001"},"device_class":"voltage","enabled_by_default":false,"entity_category":"diagnostic","name":"0x00158d0008059a5b voltage","state_class":"measurement","state_topic":"zigbee2mqtt/0x00158d0008059a5b","unique_id":"0x00158d0008059a5b_voltage_zigbee2mqtt","unit_of_measurement":"mV","value_template":"{{ value_json.voltage }}"}'
info  2022-09-12 07:29:10: MQTT publish: topic 'homeassistant/sensor/0x00158d0008059a5b/temperature/config', payload '{"availability":[{"topic":"zigbee2mqtt/bridge/state"}],"device":{"identifiers":["zigbee2mqtt_0x00158d0008059a5b"],"manufacturer":"Xiaomi","model":"Aqara water leak sensor (SJCGQ11LM)","name":"0x00158d0008059a5b","sw_version":"3000-0001"},"device_class":"temperature","enabled_by_default":true,"name":"0x00158d0008059a5b temperature","state_class":"measurement","state_topic":"zigbee2mqtt/0x00158d0008059a5b","unique_id":"0x00158d0008059a5b_temperature_zigbee2mqtt","unit_of_measurement":"°C","value_template":"{{ value_json.temperature }}"}'
info  2022-09-12 07:29:10: MQTT publish: topic 'homeassistant/sensor/0x00158d0008059a5b/linkquality/config', payload '{"availability":[{"topic":"zigbee2mqtt/bridge/state"}],"device":{"identifiers":["zigbee2mqtt_0x00158d0008059a5b"],"manufacturer":"Xiaomi","model":"Aqara water leak sensor (SJCGQ11LM)","name":"0x00158d0008059a5b","sw_version":"3000-0001"},"enabled_by_default":false,"entity_category":"diagnostic","icon":"mdi:signal","name":"0x00158d0008059a5b linkquality","state_class":"measurement","state_topic":"zigbee2mqtt/0x00158d0008059a5b","unique_id":"0x00158d0008059a5b_linkquality_zigbee2mqtt","unit_of_measurement":"lqi","value_template":"{{ value_json.linkquality }}"}'

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:

  '0x00158d0008059a5b':
    friendly_name: '0x00158d0008059a5b'

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


  '0x00158d0008059a5b':
    friendly_name: 'sfa_banyo'

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/sfa_banyo.

 

Lectura de valores

El funcionamiento del dispositivo es muy sencillo. En la parte inferior tiene dos tornillos. Si ambos tornillos entran en contacto con agua, se transmite electricidad entre ambos y se considera que hay fuga de agua. 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 una fuga de agua. Podemos forzarla introduciendo el sensor en un vaso con el nivel de agua para que los dos tornillos de la parte inferior entren en contacto con ella.

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/sfa_banyo 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/sfa_banyo"

Cuando se detecta una fuga de agua, el mensaje enviado es el siguiente:

{"battery":100,"battery_low":false,"linkquality":36,"tamper":false,
"temperature":25,"voltage":3015,"water_leak":true}

Cuando deja de producirse la fuga, el mensaje enviado es el siguiente:

{"battery":100,"battery_low":false,"linkquality":96,"tamper":false,
"temperature":25,"voltage":3015,"water_leak":false}

Los parámetros que publica son los siguientes:

  • battery. Número que indica el tanto por ciento (%) de batería restante. En las pruebas realizadas, hasta que transcurrió una hora del emparejamiento del dispositivo, no empezaron a transmitirse valores en este parámetro y aparecía el valor null.
  • battery_low. Envía true si la pila está baja y es necesario cambiarla o false si tiene un nivel correcto.
  • linkquality. Número que indica la fuerza de la señal de enlace con el hub. El valor puede oscilar entre 0 (mínimo valor, cuando no hay señal) y 255, que sería el máximo valor. 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.
  • temperature. Temperatura del dispositivo en ºC. En las pruebas realizadas, hasta que transcurrió una hora del emparejamiento del dispositivo, no empezaron a transmitirse valores en este parámetro y aparecía el valor null.
  • voltage. Voltaje de la pila en milivoltios. Al igual que ocurre con battery y temperature, en las pruebas realizadas, hasta que transcurrió una hora del emparejamiento del dispositivo, no empezaron a transmitirse valores en este parámetro y aparecía el valor null.
  • water_leak. Si se detecta una fuga de agua, contendrá el valor true. Cuando no haya ninguna fuga detectada, se enviará valor false.

Admite la calibración de la temperatura del dispositivo, que podemos realizar añadiendo en la correspondiente entrada del archivo configuration.yaml de zigbee2mqtt lo siguiente:

  '0x00158d0008059a5b':
    friendly_name: 'sfa_banyo'
    device_temperature_calibration: 3

o bien publicar en el servidor mqtt un payload con ese valor en el topic asociado al dispositivo:

mosquitto_pub -d -h localhost -p 1883 \
-u $MQTTUSER -P $MQTTPASS \
-t "zigbee2mqtt/sfa_banyo" \
-m '{"device_temperature_calibration": "3"}'

 

Resumen

Podemos tener un sistema de detección de fugas de agua para aquellos lugares donde exista riesgo de ello de una forma muy sencilla con este dispositivo. Para ello debemos disponer de un gateway Zigbee y un broker MQTT al que emparejaremos el sensor de fugas de agua con conectividad Zigbee Aqara SJCGQ11LM. Se ha visto como configurarlo y consultar su estado sin necesidad de hacer uso de aplicaciones del fabricante, a través de la publicación y suscripción a topics MQTT, lo que permitiría detectar mediante scripts en bash o cualquier lenguaje de programación como python las fugas y disparar una alarma o enviar un aviso. En combinación con Home Assistant permitiría crear automatizaciones de forma sencilla para estos casos.

 

Referencias