El panel de Home Assistant del aljibe: consumo y previsión de lluvia con el sensor de nivel Senvolon
Este tutorial se basa en el artículo sobre protección contra funcionamiento en seco y va un paso más allá: en lugar de solo proteger contra el vaciado, hacemos visible el consumo de agua y respondemos automáticamente a tres preguntas:
- ¿Cuánta agua he consumido esta semana?
- ¿Cuánto tiempo más dura el aljibe con el consumo actual?
- ¿Cuánta lluvia recibiré en los próximos 7 días y cuántos litros son esos para mi aljibe?
El tercer punto es especialmente interesante. Aquí el sistema aprende de forma completamente autónoma el factor de rendimiento individual de su aljibe. Para ello, simplemente compara la entrada de lluvia medida con la previsión meteorológica local.
Requisitos previos
- Sensor de nivel Senvolon, integrado en Home Assistant por MQTT, con la opción «Home Assistant» activada (MQTT Discovery). La base es un sensor ya montado. Qué técnica de medición conviene a su aljibe y qué tener en cuenta durante el montaje se explica en nuestro resumen sobre cómo medir el nivel de llenado en el aljibe de agua de lluvia.
- Home Assistant OS, con acceso a los archivos de
/configmediante un complemento como File Editor o Studio Code Server - Una integración meteorológica configurada con soporte de previsión (aquí: Met.no)
- Las siguientes entidades procedentes de la detección MQTT del sensor:
| Entidad | Significado |
|---|---|
sensor.level_sensor_fluid |
Nivel de llenado en litros |
sensor.level_sensor_level |
Nivel de llenado absoluto en cm |
sensor.level_sensor_distance |
Distancia a la superficie |
sensor.level_sensor_temperature |
Temperatura de la carcasa |
sensor.level_sensor_alert |
Alarma MIN/MAX |
sensor.level_sensor_rssi |
Intensidad de la señal WiFi |
sensor.level_sensor_ip |
Dirección IP |
Arquitectura general
Cuatro bloques que se apoyan unos en otros:
-
Contador de consumo: el nivel de llenado no es un contador, sino que fluctúa en ambas direcciones (baja con el consumo, sube con la lluvia o el rellenado). Un
utility_meteraplicado directamente al nivel de llenado contabilizaría deltas negativos con cada chaparrón. Por eso: un contador auxiliar que solo suma los descensos. - Entrada de lluvia: en espejo, un segundo contador auxiliar que solo suma los aumentos.
- Autonomía: el nivel de llenado dividido entre el promedio semanal de consumo.
- Rendimiento de lluvia autocalibrado: la comparación entre la entrada de lluvia medida (bloque 2) y la cantidad de lluvia en mm prevista para el día produce, con el tiempo, un factor empírico de litros por mm para su propio aljibe, sin ninguna suposición sobre la superficie del tejado o el material.
Acceso a los archivos de configuración en HAOS
En Home Assistant OS, el acceso se realiza, por ejemplo, mediante un complemento:
- Ajustes → Complementos → Tienda de complementos
- File Editor para edición de texto sencilla, o
- Studio Code Server para un editor completo al estilo VS Code con resaltado de sintaxis (recomendado si se editan varios archivos YAML en paralelo)
Tras la instalación, el icono del editor correspondiente aparece a la izquierda en la barra lateral; desde ahí se accede a la carpeta /config.
Bloque 1: contador de consumo
Un aviso nuestro: esta guía mezcla interfaz y YAML. ¿Qué preferiría: todo para hacer clic, o todo en un único archivo para copiar? Escríbanos un correo breve a support@senvolon.de, así construiremos los próximos tutoriales.
1.1 Crear el contador auxiliar
Ajustes → Dispositivos y servicios → Ayudantes → + Crear ayudante → Número. Mantenga los nombres de los ayudantes y sensores de plantilla en alemán tal como aparecen: Home Assistant deriva de ellos los ID de entidad que usa el código.
- Nombre:
Zisterne Wasserverbrauch (kumuliert) - Mínimo:
0, máximo:1000000, paso:0.1 - Unidad de medida:
L
ID de entidad (generado automáticamente): input_number.zisterne_wasserverbrauch_kumuliert
1.2 Automatización de la suma
Ajustes → Automatizaciones → Crear automatización → Editar en YAML
alias: Seguimiento del consumo del aljibe
description: >
Suma cada descenso del nivel de llenado al contador de consumo acumulado.
Los aumentos (lluvia, rellenado) se ignoran deliberadamente.
triggers:
- trigger: state
entity_id: sensor.level_sensor_fluid
conditions:
- condition: template
value_template: >
{{ trigger.from_state is not none and trigger.to_state is not none
and trigger.from_state.state not in ['unknown', 'unavailable']
and trigger.to_state.state not in ['unknown', 'unavailable']
and trigger.to_state.state | float(0) < trigger.from_state.state | float(0) }}
actions:
- action: input_number.set_value
target:
entity_id: input_number.zisterne_wasserverbrauch_kumuliert
data:
value: >
{{ states('input_number.zisterne_wasserverbrauch_kumuliert') | float(0)
+ (trigger.from_state.state | float(0) - trigger.to_state.state | float(0)) }}
mode: queued
1.3 Reflejar con un sensor de plantilla
El utility_meter necesita como fuente un sensor con state_class: total_increasing; un input_number por sí solo no es suficiente. Por eso se refleja el valor:
Ayudantes → + Crear ayudante → buscar «Plantilla» → Sensor de plantilla
- Nombre:
Zisterne Wasserverbrauch - Estado:
{{ states('input_number.zisterne_wasserverbrauch_kumuliert') }} - Unidad de medida:
L - Clase de dispositivo:
Agua - Clase de estado:
Total en aumento
Escollo: el tipo de ayudante de plantilla se llama en el buscador simplemente «Template» (plantilla), no «Sensor». Una búsqueda de «sensor» no lo encuentra, porque solo filtra los tipos de ayudante que contienen «sensor» en el nombre (por ejemplo, sensor derivado, sensor integral).
1.4 Utility Meter (solo posible mediante YAML)
Cree un nuevo archivo utility_meter.yaml en el directorio raíz de /config:
zisterne_verbrauch_taeglich:
source: sensor.zisterne_wasserverbrauch
cycle: daily
zisterne_verbrauch_woechentlich:
source: sensor.zisterne_wasserverbrauch
cycle: weekly
Incorpórelo en configuration.yaml:
utility_meter: !include utility_meter.yaml
Importante: en el archivo externo falta la palabra de nivel superior (utility_meter:), que ya queda establecida por el!include. El archivo empieza directamente con los nombres de los sensores en el nivel de indentación 0.
Después: Ajustes → Sistema → Reiniciar. Utility Meter se registra durante el arranque; un simple recargado de la configuración no es suficiente para esto, a diferencia de las plantillas sin disparador.
Tras el reinicio, compruebe en Herramientas de desarrollo → Estados: sensor.zisterne_verbrauch_taeglich y sensor.zisterne_verbrauch_woechentlich deberían existir. El atributo last_period (valor del último ciclo completado) todavía está en 0 en este momento; solo se rellena después del primer ciclo completo.
Bloque 2: entrada de lluvia
Exactamente en espejo respecto al bloque 1, solo que con la dirección de comparación invertida.
2.1 Contador auxiliar
input_number.zisterne_regenzufluss_kumuliert (misma configuración que arriba).
2.2 Automatización
alias: Seguimiento de la entrada de lluvia del aljibe
description: >
Suma cada aumento del nivel de llenado al contador de entrada de lluvia acumulada.
Supone que los aumentos se deben exclusivamente a la lluvia
(sin rellenado activo o llenado por bomba en la instalación).
triggers:
- trigger: state
entity_id: sensor.level_sensor_fluid
conditions:
- condition: template
value_template: >
{{ trigger.from_state is not none and trigger.to_state is not none
and trigger.from_state.state not in ['unknown', 'unavailable']
and trigger.to_state.state not in ['unknown', 'unavailable']
and trigger.to_state.state | float(0) > trigger.from_state.state | float(0) }}
actions:
- action: input_number.set_value
target:
entity_id: input_number.zisterne_regenzufluss_kumuliert
data:
value: >
{{ states('input_number.zisterne_regenzufluss_kumuliert') | float(0)
+ (trigger.to_state.state | float(0) - trigger.from_state.state | float(0)) }}
mode: queued
2.3 Sensor de plantilla y Utility Meter
Análogo al punto 1.3: sensor de plantilla Zisterne Regenzufluss (estado: {{ states('input_number.zisterne_regenzufluss_kumuliert') }}, unidad L, clase de dispositivo Agua, clase de estado Total en aumento).
Amplíe utility_meter.yaml:
zisterne_verbrauch_taeglich:
source: sensor.zisterne_wasserverbrauch
cycle: daily
zisterne_verbrauch_woechentlich:
source: sensor.zisterne_wasserverbrauch
cycle: weekly
zisterne_regenzufluss_taeglich:
source: sensor.zisterne_regenzufluss
cycle: daily
Es necesario reiniciar de nuevo.
Atención: este enfoque supone que los aumentos de nivel de llenado se deben exclusivamente a la lluvia. Quien tenga en su instalación un rellenado activo (por ejemplo, un aporte de agua potable en épocas de sequía) contaría eso erróneamente como lluvia; para este escenario (un aljibe puro sin recarga adicional), esto no es un problema.
Bloque 3: autonomía
Pura lógica de plantilla de estado, se hace completamente desde la interfaz.
Ayudantes → Plantilla → Sensor de plantilla
- Nombre:
Zisterne Reichweite - Estado:
{% set wochenverbrauch = state_attr('sensor.zisterne_verbrauch_woechentlich', 'last_period') | float(0) %}
{% if wochenverbrauch > 0 %}
{{ (states('sensor.level_sensor_fluid') | float(0) / (wochenverbrauch / 7)) | round(1) }}
{% else %}
{{ none }}
{% endif %}
- Unidad de medida:
d - Clase de dispositivo y clase de estado: dejar en blanco
Escollo: una fórmula ingenua sin comprobación de seguridad (fluid / (last_period / 7)) provoca unZeroDivisionErroren la vista previa en directo mientraslast_periodsiga en0, es decir, durante la primera semana tras la instalación. La comprobación{% if %}con{{ none }}en la rama else garantiza, en cambio, un estadounknownlimpio hasta que se completa el primer ciclo semanal.
Bloque 4: rendimiento de lluvia autocalibrado
4.1 Ayudantes de calibración
Dos ayudantes input_number:
-
Zisterne Kalibrierung mm gesamt(unidadmm, mínimo 0, máximo 100000, paso 0.1) -
Zisterne Kalibrierung Liter gesamt(unidadL, mínimo 0, máximo 1000000, paso 0.1)
Las unidades de medida no son estrictamente necesarias para el cálculo (las plantillas convierten de todos modos con | float(0)), pero hacen que los ayudantes se entiendan de inmediato en la vista general y en los paneles.
4.2 Automatización de calibración
Compara diariamente a las 23:50 la entrada de lluvia medida del día con la cantidad de lluvia prevista para ese día:
alias: Calibración diaria de lluvia del aljibe
description: >
Compara la entrada de lluvia medida con la cantidad de lluvia pronosticada
para hoy y actualiza el factor empírico de litros por mm.
triggers:
- trigger: time
at: "23:50:00"
actions:
- action: weather.get_forecasts
target:
entity_id: weather.forecast_home
data:
type: hourly
response_variable: forecast_data
- variables:
heute: "{{ now().strftime('%Y-%m-%d') }}"
mm_heute: >
{% set forecast = forecast_data['weather.forecast_home'].forecast %}
{{ forecast
| selectattr('datetime', 'match', heute)
| map(attribute='precipitation')
| map('float', 0)
| sum
| round(1) }}
liter_heute: "{{ states('sensor.zisterne_regenzufluss_taeglich') | float(0) }}"
- condition: template
value_template: "{{ mm_heute | float(0) > 0.5 }}"
- action: input_number.set_value
target:
entity_id: input_number.zisterne_kalibrierung_mm_gesamt
data:
value: "{{ states('input_number.zisterne_kalibrierung_mm_gesamt') | float(0) + mm_heute }}"
- action: input_number.set_value
target:
entity_id: input_number.zisterne_kalibrierung_liter_gesamt
data:
value: "{{ states('input_number.zisterne_kalibrierung_liter_gesamt') | float(0) + liter_heute }}"
mode: single
Sustituyaweather.forecast_homepor su propio ID de entidad meteorológica (Herramientas de desarrollo → Estados → filtrar porweather.).
Limitación importante:weather.get_forecastsnormalmente solo devuelve las horas futuras a partir del momento de la consulta, no las horas del día que ya han pasado. Así que, si por ejemplo llueve con fuerza por la mañana pero el resto del día se mantiene seco, la consulta de las 23:50 ya no ve nada de eso, porque ese periodo se encuentra en el pasado en ese momento.mm_heuterefleja, por tanto, más bien lo que todavía se esperaba para el resto del día desde el momento de la consulta que lo que realmente cayó durante todo el día. En un día de lluvia que se prolonga varias horas, la diferencia suele ser pequeña; en chubascos matutinos breves, la calibración puede contabilizar sistemáticamente valores de mm demasiado bajos frente a los litros realmente medidos, lo que distorsiona el factor de rendimiento hacia arriba de forma artificial. Promediado a lo largo de muchos días de lluvia, esto se compensa en su mayor parte, pero no es una medición exacta, sino una aproximación.
Escollo: según la versión de HA, Met.no devuelve la fecha de la previsión con o sin hora en formato ISO. Siselectattr('datetime', 'match', heute)no produce resultados, cambiematch(que solo coincide desde el inicio de la cadena) porsearch.
4.3 Sensor del factor de rendimiento
Pura lógica de plantilla de estado, se hace desde la interfaz:
Ayudantes → Plantilla → Sensor de plantilla
- Nombre:
Zisterne Ertrag pro mm - Estado:
{% set mm = states('input_number.zisterne_kalibrierung_mm_gesamt') | float(0) %}
{% set liter = states('input_number.zisterne_kalibrierung_liter_gesamt') | float(0) %}
{% if mm > 5 %}
{{ (liter / mm) | round(2) }}
{% else %}
{{ 30 }}
{% endif %}
- Unidad de medida:
L/mm(añádala como elemento personalizado, ya que HA no conoce esta unidad; no supone un problema, porque no hay clase de dispositivo establecida y HA por tanto no valida la unidad)
Hasta que se disponga de más de 5 mm de lluvia calibrada, el sensor devuelve un valor provisional aproximado (30 L/mm); después, el valor aprendido empíricamente.
Importante entender:mm_gesamtyliter_gesamtnunca se restablecen automáticamente, así que el factor de rendimiento es un promedio de toda la vida desde el primer día de calibración, no un promedio móvil de los últimos días o semanas. Esto hace que el valor sea muy estable y resistente a valores atípicos (un único día de lluvia inusual apenas lo modifica ya después de muchos días calibrados), pero tiene un punto ciego: si la característica real de escorrentía cambia con el tiempo (el tejado se llena de musgo, el canalón se obstruye, caída de hojas en otoño), el promedio de toda la vida reacciona a ello con mucha lentitud, porque los años anteriores, posiblemente más limpios, siguen contando en el peso. Para empezar, el enfoque simple es la solución más pragmática; quien más adelante note que el valor se desplaza de forma notable a lo largo de los años puede cambiar a un promedio móvil (por ejemplo, considerar solo los últimos 90 días de calibración).
4.4 Previsión de rendimiento de lluvia (7 días)
Este sensor necesita la sintaxis de plantilla basada en disparador con weather.get_forecasts y response_variable; esto no lo puede representar ningún ayudante de la interfaz, solo una plantilla YAML con su propio bloque trigger:.
Cree un nuevo archivo templates.yaml:
- trigger:
- trigger: time_pattern
hours: "/1"
action:
- action: weather.get_forecasts
target:
entity_id: weather.forecast_home
data:
type: daily
response_variable: forecast_data
sensor:
- name: "Zisterne Regenertrag 7d"
unique_id: zisterne_regenertrag_7d
unit_of_measurement: L
icon: mdi:weather-pouring
state: >
{% set forecast = forecast_data['weather.forecast_home'].forecast %}
{% set regen_mm = forecast[:7] | map(attribute='precipitation') | map('float', 0) | sum %}
{% set ertrag_pro_mm = states('sensor.zisterne_ertrag_pro_mm') | float(30) %}
{{ (regen_mm * ertrag_pro_mm) | round(0) }}
attributes:
regen_mm_7d: >
{% set forecast = forecast_data['weather.forecast_home'].forecast %}
{{ (forecast[:7] | map(attribute='precipitation') | map('float', 0) | sum) | round(1) }}
Incorpórelo en configuration.yaml:
template: !include templates.yaml
Reinicio (las plantillas basadas en disparador también necesitan un reinicio real, no una recarga en caliente).
Escollo: el sensor basado en disparador no se activa inmediatamente después del reinicio, sino solo en el siguiente tic de intervalo del disparador
time_pattern(aquí: en la próxima hora en punto). Quien compruebe justo después de configurarlo y vea quesensor.zisterne_regenertrag_7dtodavía está en0 Lo enunknownno ha cometido ningún error: el sistema simplemente aún no se ha disparado. Para probar rápidamente, el disparador puede acortarse temporalmente aminutes: "/2"(después, no olvide volver a ajustarlo ahours: "/1"y reiniciar de nuevo, o el sistema llamará a la API meteorológica con una frecuencia innecesaria).
Panel
Para no perder la visión de conjunto con la cantidad de entidades, se recomienda un panel propio con el tipo de vista sections, más reciente, en lugar de la clásica vista Masonry: en Masonry las tarjetas se deslizan automáticamente a columnas arbitrarias según su altura, mientras que en sections la colocación se mantiene exactamente como se define.
Ajustes → Paneles → + Añadir panel → Panel vacío, luego mediante los tres puntos arriba a la derecha «Editar en YAML»:
title: Aljibe
views:
- title: Resumen
path: zisterne
icon: mdi:water-pump
type: sections
sections:
- type: grid
cards:
- type: heading
heading: Valores en vivo
heading_style: title
- type: entities
title: Sensor de nivel
entities:
- entity: sensor.level_sensor_fluid
name: Nivel de llenado
- entity: sensor.level_sensor_level
name: Nivel de llenado absoluto
- entity: sensor.level_sensor_distance
name: Distancia a la superficie
- entity: sensor.level_sensor_temperature
name: Temperatura de la carcasa
- entity: sensor.level_sensor_alert
name: Alarma
- type: grid
cards:
- type: heading
heading: Consumo y autonomía
heading_style: title
- type: entities
title: Contador de consumo
entities:
- entity: sensor.zisterne_verbrauch_taeglich
name: Consumo hoy
- entity: sensor.zisterne_verbrauch_woechentlich
name: Consumo esta semana
- type: attribute
entity: sensor.zisterne_verbrauch_woechentlich
attribute: last_period
name: Consumo semana pasada
suffix: " L"
- entity: sensor.zisterne_reichweite
name: Agua para
- type: grid
cards:
- type: heading
heading: Entrada de lluvia y calibración
heading_style: title
- type: entities
title: Lluvia
entities:
- entity: sensor.zisterne_regenzufluss_taeglich
name: Entrada de lluvia hoy
- entity: sensor.zisterne_ertrag_pro_mm
name: Factor de rendimiento (aprendido)
- entity: sensor.zisterne_regenertrag_7d
name: Rendimiento esperado (7 días)
- entity: input_number.zisterne_kalibrierung_mm_gesamt
name: Base de calibración mm
- entity: input_number.zisterne_kalibrierung_liter_gesamt
name: Base de calibración litros
- type: grid
cards:
- type: heading
heading: Sistema y contadores brutos
heading_style: title
- type: entities
title: Diagnóstico
entities:
- entity: sensor.level_sensor_rssi
name: Señal WiFi
- entity: sensor.level_sensor_ip
name: Dirección IP
- entity: input_number.zisterne_wasserverbrauch_kumuliert
name: Consumo (contador bruto)
- entity: input_number.zisterne_regenzufluss_kumuliert
name: Entrada de lluvia (contador bruto)

Además, ciertas entidades se pueden integrar en el panel de protección de la bomba creado anteriormente.

Planificar la fase de rodaje
Tras el reinicio, el sistema está técnicamente terminado, pero todavía no ofrece valores del todo representativos:
-
Autonomía: válida solo después del primer ciclo semanal completo (
cycle: weeklyempieza por defecto el lunes a las 00:00) - Factor de rendimiento: válido solo tras acumular más de 5 mm de lluvia calibrada, es decir, después de los primeros uno o dos días de lluvia significativos
- Consumo/entrada de lluvia hoy/esta semana: correctos de inmediato, ya que se derivan directamente de valores medidos en vivo
Anexo: todas las entidades de un vistazo
Referencia rápida para consultar: la explicación completa y el código YAML correspondiente se encuentran en la sección respectiva más arriba.
Ayudantes básicos (entradas de número):
-
input_number.zisterne_wasserverbrauch_kumuliert: solo aumenta, suma cada descenso del nivel de llenado -
input_number.zisterne_regenzufluss_kumuliert: solo aumenta, suma cada aumento del nivel de llenado -
input_number.zisterne_kalibrierung_mm_gesamt: suma de todos los milímetros de lluvia calibrados desde el inicio -
input_number.zisterne_kalibrierung_liter_gesamt: suma de los litros realmente medidos en esos días de lluvia
Sensores reflejados:
-
sensor.zisterne_wasserverbrauch: contador de consumo contotal_increasing, lo que lo hace utilizable para Utility Meter -
sensor.zisterne_regenzufluss: lo mismo para la entrada de lluvia
Utility Meter:
-
sensor.zisterne_verbrauch_taeglich: consumo desde la medianoche, se reinicia diariamente -
sensor.zisterne_verbrauch_woechentlich: consumo desde el lunes, se reinicia semanalmente, proporcionalast_period -
sensor.zisterne_regenzufluss_taeglich: entrada de lluvia desde la medianoche, consultada por la calibración
Sensores calculados:
-
sensor.zisterne_reichweite(«Agua para»): nivel de llenado dividido entre el promedio semanal, en días -
sensor.zisterne_ertrag_pro_mm: factor de litros por mm aprendido, promedio de toda la vida -
sensor.zisterne_regenertrag_7d: previsión de lluvia a 7 días en litros, actualizada cada hora
Automatizaciones:
- Seguimiento del consumo del aljibe: detecta descensos de nivel de llenado, alimenta el contador de consumo
- Seguimiento de la entrada de lluvia del aljibe: detecta aumentos de nivel de llenado, alimenta el contador de entrada de lluvia
- Calibración diaria de lluvia del aljibe: compara diariamente a las 23:50 la previsión con el valor medido, alimenta el factor de rendimiento