Primo Studios Web Blog

Home Assistant · 3 min

El sensor Zigbee llevaba casi dos días sin mandar nada y la pila seguía al 100 %: cómo vigilar la «línea plana»

Una mañana miré la gráfica de temperatura de uno de los dormitorios y vi algo raro: una línea completamente recta desde hacía casi dos días. Ni una décima arriba ni abajo, en una habitación donde la calefacción se enciende y se apaga varias veces al día. El sensor marcaba la pila al 100 % y Home Assistant enseñaba una temperatura que parecía normal. Era, simplemente, la última que había llegado.

Home Assistant no avisa de esto. Si un sensor Zigbee deja de mandar datos pero no se desconecta del todo, la entidad no pasa a «no disponible»: se queda con el último valor, y la tarjeta del panel no te da ninguna pista. Así que monté un vigilante que busca justo eso: sensores en línea plana.

El 100 % de la pila no significa nada

Lo primero que piensas es «será la pila». Pero marcaba 100 %, y no era un error de lectura. Estos sensores llevan pilas de botón, y ese tipo de pila da casi la misma tensión durante casi toda su vida y luego cae de golpe al final. El sensor convierte la tensión en porcentaje a saltos, y por encima de cierto valor ya dice «100 %». Así que la pila puede estar perfecta, o casi agotada, y el número es el mismo.

En mi caso ni siquiera era la pila: el sensor había perdido el contacto con la red y no se había vuelto a enganchar bien. Al emparejarlo de nuevo volvió con buena señal. Pero la lección importante es otra: no puedes fiarte del porcentaje de pila para saber si un sensor está vivo. Lo único fiable es mirar si sigue mandando datos.

La idea: medir cuánto calla cada sensor normalmente

Un umbral fijo («avisa si un sensor lleva 6 horas sin cambiar») no vale para todos. Un sensor de temperatura en un baño cambia cada pocos minutos; uno en un trastero puede pasar horas con el mismo valor. Así que el vigilante aprende qué es lo normal para cada aparato:

  • Coge el historial de los últimos 21 días de los sensores de datos de cada aparato: temperatura, humedad, puerta, presencia, luz… Deja fuera la batería, la señal y cosas parecidas, que no dicen si el sensor está vivo.
  • Mide los silencios: cuánto tiempo pasa entre un cambio de valor y el siguiente.
  • El umbral es 3 veces el percentil 95 de esos silencios, y nunca menos de 6 horas.

Una vez por hora revisa todos los sensores con pila. Si uno lleva callado más que su umbral, y además su pila dice estar bien (que es justo el caso engañoso), avisa por Telegram con el nombre, las horas que lleva parado y qué pila usa, para no tener que abrirlo para saber cuál comprar. Cuando vuelve a mandar datos, avisa también.

La trampa: con el percentil 99, el que más falla es el menos vigilado

Mi primera versión usaba el percentil 99, para ser tolerante con algún silencio largo de vez en cuando. Al probarla con el sensor que había fallado, el umbral le salía de 22 horas. Demasiado: habría tardado casi un día en avisar.

La razón es que su historial incluía sus propios fallos anteriores. Cada vez que el sensor se quedaba colgado, ese silencio largo entraba en la estadística y subía el umbral. Cuanto más fallaba, más tiempo se le dejaba callado antes de avisar. Justo al revés de lo que quieres.

Con el percentil 95, esos pocos silencios anormales quedan fuera del cálculo. Con él, el fallo de casi dos días se habría detectado a las 6 horas. Si tu historial tiene fallos dentro, y en un sensor que falla los tiene seguro, no uses un percentil tan alto.

Las excepciones: puertas y mandos

No todo encaja en el cálculo automático:

  • Sensores de puerta. Solo cambian cuando alguien abre. Si te vas un fin de semana, se quedan callados dos días y es normal. Les puse un umbral fijo de 36 horas, y más largo para el del lavavajillas, que a veces pasa días sin usarse.
  • Mandos e interruptores de pila. Solo mandan algo cuando los pulsas, así que el silencio no dice nada. Fuera de la vigilancia.
  • Aparatos con pocos datos. Si en 21 días hay menos de 10 cambios, no hay suficiente para saber qué es normal, y es mejor no inventárselo.

Dos detalles técnicos que me hicieron perder tiempo

  • La API de historial de Home Assistant (/api/history/period/<inicio>) solo devuelve un día si no le pasas end_time, aunque el inicio sea de hace tres semanas. Mi primera prueba salía casi vacía por eso.
  • Para probarlo, el script tiene un modo --informe que saca una tabla con cada sensor, su umbral y cuánto lleva callado, sin mandar avisos ni guardar nada. Probar un vigilante no debería disparar avisos de verdad.

En la primera revisión, ningún otro sensor estaba en línea plana: solo el que me había hecho montar todo esto. Pero ahora, si otro se queda colgado con la pila «al 100 %», me enteraré en horas y no al mirar una gráfica por casualidad dos días después.