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.
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
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.
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
.
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 ofalse
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 ofalse
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
ytemperature
, 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 valornull
. - water_leak. Si se detecta una fuga de agua, contendrá el valor
true
. Cuando no haya ninguna fuga detectada, se enviará valorfalse
.
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"}'
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.