Salta al contenuto principale
  1. Posts/

La pompa di sentina sotto i riflettori: monitorare infrastrutture invisibili con Home Assistant

·2754 parole·13 minuti· loading · loading · ·
Marco Mornati
Autore
Marco Mornati
Costruisco, self-hosto e a volte rompo software in produzione — scrivendo di strumenti AI, coding agent e infrastrutture.

La mia cantina ha una pompa che salva la casa, e fino a qualche mese fa l’unico modo per sapere che funzionava ancora era tendere l’orecchio. Una pompa di scarico (chiamata anche pompa di sollevamento) sta in un pozzetto in cantina, raccoglie le acque sotterranee che filtrano e le spinge verso lo scarico. Quando funziona, nessuno la nota. Quando si guasta — galleggiante bloccato, motore bruciato, magnetotermico scattato — l’acqua sale piano finché la cantina non si allaga.

Questa è la definizione di infrastruttura invisibile: invisibile, critica e silenziosa finché non diventa costosa. Questo articolo racconta come l’ho messa sotto i riflettori con Home Assistant — cosa monitoro, lo YAML reale e i numeri reali della mia istanza live.

Nota onesta sul deploy. Ogni automazione di questo articolo è attiva nella mia configurazione, adesso. Ho estratto lo YAML direttamente da automations.yaml e verificato lo stato live tramite l’API prima di scrivere: le nove automazioni sono abilitate, e l’ultimo spegnimento forzato risale a ottobre 2025. Quello che vedete qui sotto è ciò che gira oggi.

Avvertenza: non sono né un idraulico né un elettricista. Una pompa di scarico e il drenaggio di una cantina sono appunti di campo di una casa nel nord della Francia, non consigli d’installazione per la vostra. Una pompa che gira a secco o una cantina allagata possono causare danni; monitorate, ma non sostituite mai la manutenzione fisica.

TL;DR — cosa può guastarsi, cosa fa HA
#

Modalità di guastoCosa fa Home Assistant
Pompa che gira troppo a lungo (galleggiante bloccato, scarico ostruito)Avviso a 2 min, avviso di anomalia a 5 min
La pompa riparte senza ripararsi da sola3 tentativi, poi spegnimento forzato + blocco 24 h
La pompa non riparte più dopo lo spegnimento forzatoRiattivazione automatica dopo 24 h
La pompa non è partita da 48 h (galleggiante bloccato, guasto)Avviso «non avviata» ogni 6 h
Qualunque avvioTracciamento completo: timestamp start/stop, durata, energia
Settimana trascorsaReport del lunedì: durata, energia, ultimo start/stop

L’hardware è volutamente banale: una presa Zigbee con misuratore di energia (friendly_name zigbee2mqtt pompe_cave) a cui è collegata la pompa. Niente sensore del galleggiante, niente sonda di livello: tutto è dedotto dal consumo elettrico. La pompa ci dice tutto ciò che serve semplicemente dall’elettricità che consuma.


Perché monitorare infrastrutture invisibili
#

Il modello dell’«apparecchio invisibile» è ovunque: la pompa di scarico, la pompa di circolazione del riscaldamento, il congelatore in garage, il gruppo di continuità sotto la scrivania. Ci pensiamo solo quando si fermano, e a quel punto il danno è già fatto.

Per una pompa di scarico la posta in gioco è concreta. L’acqua sale; la pompa gira; se smette di girare, la cantina si allaga in poche ore. Un livello di monitoraggio non aggiusta la pompa — aggiusta la sorpresa. Si viene a sapere alle 14:00 tramite una notifica invece che alle 19:00 con l’acqua alle caviglie.

C’è una ragione più sottile: le pompe si degradano lentamente. Un galleggiante che si irrigidisce, una girante che si ostruisce — i sintomi compaiono come cambiamenti del ciclo molto prima di un guasto franco. Tracciare il ciclo è il modo per coglierli in anticipo.


L’hardware: come HA vede la pompa
#

La pompa è alimentata da una presa Zigbee con misuratore di energia. In Home Assistant questo si presenta come un gruppo di entità:

EntitàCosa riporta
sensor.pompe_cave_power_2Potenza istantanea in W (0 W = a riposo)
sensor.pompe_cave_energy_2Contatore energia della presa in kWh
switch.pompe_cave_2La presa stessa (off = la pompa non ha corrente)
binary_sensor.pompe_caveTemplate: potenza > 5 W → on (la pompa gira)
sensor.pompe_cave_on_today / on_weeklyhistory_stats tempo di marcia oggi / 7 giorni

Il binary sensor è il cuore di tutto. Trasforma una lettura di potenza continua in un segnale on/off pulito, su cui si attivano tutte le automazioni qui sotto:

# templates/sensors.yaml
- binary_sensor:
    - unique_id: pompe_cave_running
      name: "Pompe Cave Running"
      icon: mdi:pump
      device_class: running
      state: >
        {% set power = states('sensor.pompe_cave_power_2') %}
        {% if power in ['unavailable', 'unknown', 'none'] or power == '' %}
          {{ 'off' }}
        {% else %}
          {{ 'on' if power | float > 5.0 else 'off' }}
        {% endif %}

La soglia > 5.0 W conta: filtra il consumo a riposo della presa e il rumore di misura, così solo un vero avvio della pompa vale come on.

Due sensori template completano il quadro. Uno converte i timestamp tracciati in ore dall’ultimo avvio (999 quando mai avviata), l’altro calcola la durata del ciclo in corso in minuti:

- sensor:
    - unique_id: pompe_cave_hours_since_last_start
      name: "Pompe Cave Hours Since Last Start"
      unit_of_measurement: h
      icon: mdi:clock-outline
      state: >
        {% set last = states('input_datetime.pompe_cave_last_started') %}
        {% if last in ['unavailable', 'unknown', 'none', ''] %}
          {{ 999 }}
        {% else %}
          {{ ((now() - as_datetime(last)) / 3600) | round(1) }}
        {% endif %}

Le automazioni, una per una
#

A. Tracciamento di avvio/arresto
#

Due automazioni registrano ogni ciclo osservando il binary sensor. Quando la pompa parte, timbriamo input_datetime.pompe_cave_last_started; quando si ferma, input_datetime.pompe_cave_last_stopped:

- id: pompe_cave_track_start
  alias: "Pompe Cave - Suivi demarrage"
  mode: single
  triggers:
  - trigger: state
    entity_id: binary_sensor.pompe_cave
    from: 'off'
    to: 'on'
  conditions: []
  actions:
  - action: input_datetime.set_datetime
    target:
      entity_id: input_datetime.pompe_cave_last_started
    data:
      datetime: "{{ now() }}"

- id: pompe_cave_track_stop
  alias: "Pompe Cave - Suivi arret"
  mode: single
  triggers:
  - trigger: state
    entity_id: binary_sensor.pompe_cave
    from: 'on'
    to: 'off'
  conditions: []
  actions:
  - action: input_datetime.set_datetime
    target:
      entity_id: input_datetime.pompe_cave_last_stopped
    data:
      datetime: "{{ now() }}"

Questi due timestamp sono la spina dorsale di tutte le altre automazioni — la durata di marcia, l’avviso «non avviata» e il report settimanale li leggono tutti.

B. Rilevamento anomalie (con tentativi e blocco)
#

La pompa lavora a raffiche di circa un minuto. Se gira 5 minuti di fila, qualcosa non va — scarico ostruito, galleggiante bloccato, pompa che lotta contro un’acqua che non riesce a spostare. È il cuore del sistema, quindi è l’automazione più difensiva:

- id: pompe_cave_anomalie_detection
  alias: "Pompe Cave - Detection d'anomalie"
  mode: single
  max_exceeded: silent
  triggers:
  - trigger: numeric_state
    entity_id: sensor.pompe_cave_power_2
    above: 0
    for: 00:05:00
  conditions:
  - condition: state
    entity_id: switch.pompe_cave_2
    state: 'on'
  - condition: state
    entity_id: input_boolean.pompe_cave_force_disable
    state: 'off'
  actions:
  - action: notify.notify
    data:
      title: "Pompe Cave"
      message: "Pompe cave - Detection d'anomalie (5 min)."
  - action: switch.turn_off
    target:
      entity_id: switch.pompe_cave_2
  - action: input_number.increment
    target:
      entity_id: input_number.pompe_cave_retry_count
  - action: delay
    delay: 00:02:00
  - action: switch.turn_on
    target:
      entity_id: switch.pompe_cave_2
  - action: delay
    delay: 00:01:00
  - choose:
    - conditions:
      - condition: numeric_state
        entity_id: sensor.pompe_cave_power_2
        above: 0
      - condition: numeric_state
        entity_id: input_number.pompe_cave_retry_count
        above: 2
      sequence:
      - action: notify.notify
        data:
          title: "Pompe Cave"
          message: "Pompe cave - Desactivation forcee (apres 3 essais)."
      - action: switch.turn_off
        target:
          entity_id: switch.pompe_cave_2
      - action: input_boolean.turn_on
        target:
          entity_id: input_boolean.pompe_cave_force_disable
      - action: input_datetime.set_datetime
        target:
          entity_id: input_datetime.pompe_cave_last_forced_off
        data:
          datetime: "{{ now() }}"

La logica è una scala di tentativi: alimentato per 5 min → spegni, avvisa, conta un tentativo; attendi 2 minuti; riaccendi; attendi 1 minuto; se consuma ancora e siamo al 3° tentativo → molla. La pompa viene spenta forzatamente, il blocco pompe_cave_force_disable viene attivato perché nulla la riaccenda automaticamente, e l’ora dello spegnimento forzato viene timbrata. Dopo tre tentativi e una marcia continua di 5 minuti, lasciarla accesa è più rischioso che lasciarla spenta.

Questo è il momento «i monitor falliscono in modo diverso dagli umani»: una persona prima o poi noterebbe che la pompa non si ferma più. Home Assistant se ne accorge dopo 5 minuti, reagisce e ce lo segnala — senza che nessuno debba essere vicino alla cantina.

C. Riattivazione forzata dopo 24 h
#

Una pompa spenta forzatamente è protetta dal bruciarsi — ma una pompa disabilitata è anche una cantina allagata in preparazione. Quindi il blocco scade da solo dopo 24 ore:

- id: pompe_cave_restart_once_a_day
  alias: "Pompe Cave - Reactivation forcee apres 24h"
  mode: single
  triggers:
  - trigger: time_pattern
    hours: '/1'
  conditions:
  - condition: state
    entity_id: input_boolean.pompe_cave_force_disable
    state: 'on'
  - condition: template
    value_template: >
      {% set last_off = as_timestamp(states('input_datetime.pompe_cave_last_forced_off')) %}
      {% set since = (now().timestamp() - last_off) | int %}
      {{ since > 86400 }}
  actions:
  - action: input_boolean.turn_off
    target:
      entity_id: input_boolean.pompe_cave_force_disable
  - action: input_number.set_value
    target:
      entity_id: input_number.pompe_cave_retry_count
    data:
      value: 0
  - action: switch.turn_on
    target:
      entity_id: switch.pompe_cave_2

Ogni ora controlla: il blocco è attivo, e sono passate più di 24 h dallo spegnimento forzato? Se sì, azzera i contatori e ridà corrente alla pompa. La pompa ha diritto a una seconda chance — e se il problema c’è ancora, il rilevamento anomalie la riprende. Se il galleggiante è fisicamente bloccato, questo singolo test funziona anche come ciclo di prova manuale: alimenta la pompa per un istante e, se l’acqua nel frattempo si è drenata, il ciclo si conclude in modo pulito.

D. Avvisi «non avviata» e «in funzione da troppo tempo»
#

Due avvisi coprono il guasto opposto: la pompa che avrebbe dovuto girare e non l’ha fatto.

- id: pompe_cave_alert_not_started
  alias: "Pompe Cave - Pas demarree depuis longtemps"
  mode: single
  triggers:
  - trigger: time_pattern
    hours: '/6'
  conditions:
  - condition: template
    value_template: >
      {% set last = states('input_datetime.pompe_cave_last_started') %}
      {{ last != '' and states('sensor.pompe_cave_hours_since_last_start') | float > 48 }}
  - condition: state
    entity_id: input_boolean.pompe_cave_force_disable
    state: 'off'
  actions:
  - action: notify.notify
    data:
      title: "Pompe Cave"
      message: >-
        Pompe cave pas demarree depuis longtemps.
        Dernier demarrage: {{ states('input_datetime.pompe_cave_last_started') }}.
        Heures depuis: {{ states('sensor.pompe_cave_hours_since_last_start') }}h

Ogni 6 ore, se la pompa non è partita da più di 48 h, una notifica ce lo ricorda. In stagione secca può scattare legittimamente (la mia pompa ha girato pochissimo durante l’estate), quindi il messaggio porta il valore reale «ore trascorse» — è un promemoria, non un allarme.

L’avviso gemello scatta quando un ciclo c’è stato ma si rifiuta di finire:

- id: pompe_cave_alert_running_too_long
  alias: "Pompe Cave - Fonctionnement prolonge"
  mode: single
  max_exceeded: silent
  triggers:
  - trigger: numeric_state
    entity_id: sensor.pompe_cave_power_2
    above: 0
    for: 00:10:00
  conditions:
  - condition: state
    entity_id: binary_sensor.pompe_cave
    state: 'on'
  - condition: state
    entity_id: input_boolean.pompe_cave_force_disable
    state: 'off'
  actions:
  - action: notify.notify
    data:
      title: "Pompe Cave"
      message: >-
        Pompe cave - Fonctionnement prolonge (10 min).
        Puissance: {{ states('sensor.pompe_cave_power_2') }}W.
        Duree: {{ states('sensor.pompe_cave_current_runtime_minutes') }}min

Una marcia continua di 10 minuti supera qualsiasi bisogno di una pompa sana — l’avviso è l’ultima parola prima (o in parallelo) della scala di anomalie, e include la potenza live per distinguere una pompa a pieno carico da una in difficoltà.

C’è anche un primo stadio più dolce, notify_pompe_cave_problem, che alza un avviso alla soglia dei 2 minuti — un segnale che la pompa gira a lungo, prima che l’escalation a 5 minuti prenda il sopravvento.

E. Il report settimanale
#

Ogni lunedì alle 08:00, una notifica riassume la settimana — durata di marcia, energia, ultima attività:

- id: pompe_cave_weekly_report
  alias: "Pompe Cave - Rapport Hebdomadaire"
  mode: single
  triggers:
  - trigger: time
    at: '08:00:00'
  conditions:
  - condition: time
    weekday:
    - mon
  actions:
  - action: notify.notify
    data:
      title: "Pompe Cave"
      message: >-
        Rapport hebdomadaire pompe cave.
        ON cette semaine: {{ states('sensor.pompe_cave_on_weekly') }}h.
        ON aujourd'hui: {{ states('sensor.pompe_cave_on_today') }}h.
        Energie: {{ states('sensor.pompe_cave_energy_2') }} kWh.
        Dernier demarrage: {{ states('input_datetime.pompe_cave_last_started') }}.
        Dernier arret: {{ states('input_datetime.pompe_cave_last_stopped') }}.
        Heures depuis demarrage: {{ states('sensor.pompe_cave_hours_since_last_start') }}h

Il report è dove il «monitorare il modello» ripaga: le settimane con un tempo di marcia improvvisamente maggiore, o un ciclo che non si ferma mai, saltano all’occhio con un solo sguardo. Un galleggiante che si irrigidisce lentamente appare come una tendenza settimanale prima di diventare un vero guasto.

Il supporto: gli input
#

Diversi helper input_* sostengono queste automazioni. Il più importante è il toggle di blocco:

# components/input_boolean.yaml
pompe_cave_force_disable:
  name: "Pompe Cave Forcee Off"
  icon: mdi:power-off
  initial: false

# components/input_number.yaml
pompe_cave_retry_count:
  name: "Pompe Cave Retry Count"
  min: 0
  max: 5
  step: 1
  initial: 0

Più tre helper input_datetime (pompe_cave_last_started, pompe_cave_last_stopped, pompe_cave_last_forced_off) che le automazioni di tracciamento e di avviso leggono e scrivono.


Numeri reali (dalla mia istanza live)
#

Li ho presi direttamente dall’API delle statistiche mentre scrivevo questo articolo — un giorno d’estate secco, quindi il valore di oggi è il tipo di zero interessante:

MetricaValore
Tempo di marcia oggi0,0 h (giornata estiva secca)
Tempo di marcia ultimi 7 giorni0,55 h in totale
Marcia/giorno, ultimi 90 giorni (media)~0,13 h (~8 min/giorno)
Marcia/giorno, ultimi 90 giorni (mediana)0,135 h
Marcia/giorno, ultimi 90 giorni (max)0,28 h
Marcia/settimana, ultimi 90 giorni (media)0,35 h
Energia totale, contatore della presa67,78 kWh
Ultimo ciclo2026-08-22 18:20:55 → 18:21:05 (~10 s)
Ore dall’ultimo avvio3,2 h
Ultimo spegnimento forzato2025-10-14 18:46:48

Due cose spiccano. Primo, i cicli tipici sono brevi — il 2026-08-16 il logbook mostra cicli di 1 min 06 s, 8 s e 1 min 15 s: la pompa lavora a micro-raffiche man mano che l’acqua filtra. È esattamente il motivo per cui la soglia di anomalia a 5 minuti funziona: un ciclo sano non ci si avvicina mai. Secondo, le estati secche sono tranquille — ~8 minuti di pompa al giorno in media su 90 giorni, e praticamente zero in un giorno d’estate. L’avviso «non avviata da 48 h» deve tollerarlo, ed è per questo che riporta le ore trascorse invece di limitarsi ad allarmare.

Lo spegnimento forzato dell’ottobre 2025 merita una menzione: è la scala di anomalie che fa il suo lavoro, una volta, durante un periodo invernale umido — e il sistema si è auto-ripristinato tramite la riattivazione delle 24 h.


Lezioni e compromessi
#

  • I falsi positivi sono il vero rischio. Ogni soglia scelta (5 W, 2 min, 5 min, 48 h) è stata calibrata per stare molto al di sopra del ciclo normale, così gli avvisi sono rari e significativi. Il periodo calmo dell’estate ha quasi garantito che l’avviso «non avviata» suonasse in modo innocuo — per questo porta contesto invece di gridare al lupo.
  • I tempi di raffreddamento contano. I ritardi di 2 minuti/1 minuto nella scala di anomalie esistono perché la pompa non venga sballottata on/off dalle automazioni stesse. Senza di loro, il monitor creerebbe i guasti che sorveglia.
  • Servono aspettative diverse tra periodi secchi e umidi. In un periodo secco la pompa può restare ferma per giorni — normale. In un periodo umido gira in continuazione — normale anche quello. Solo i cambiamenti rispetto al modello consolidato sono sospetti.
  • La presa è il sensore economico. Una presa Zigbee con misuratore di energia costa poche decine di euro e non richiede alcun lavoro idraulico. Il galleggiante e il motore esistono già — stiamo solo ascoltando l’unico segnale che producono già.

Generalizzare: un modello per qualsiasi apparecchio nascosto
#

Niente qui è specifico della pompa. Lo stesso scheletro — un consumo elettrico, un binary sensor on/off che ne deriva, tracciamento start/stop, una scala di anomalie con blocco, un avviso «non ha girato» e un report periodico — si applica direttamente a:

  • Pompa di scarico / sollevamento — stessa logica, più o meno le stesse soglie.
  • Pompa di circolazione del riscaldamento — traccia la durata, avvisa sull’assenza di cicli in inverno.
  • Congelatore / frigorifero — avvisa se il compressore non ha ciclato da ore.
  • Gruppo di continuità (UPS) — avvisa su età della batteria, eventi su batteria o un carico che cambia.
  • Qualsiasi apparecchio che noti solo quando si ferma.

La ricetta riutilizzabile: deriva un binary sensor «sta facendo il suo lavoro» dalla potenza, traccia i timestamp start/stop, costruisci una scala di tentativi con blocco per «gira ma non ripara», avvisa su «avrebbe dovuto girare e non ha girato», e riassumi ogni settimana. Copre la stragrande maggioranza dei guasti delle infrastrutture nascoste.


Avvertenze
#

  • Appunti di campo, non consigli. Queste sono le mie soglie, per la mia pompa, nella mia cantina, nel nord della Francia. La vostra pompa, la vostra falda, il vostro impianto elettrico sono diversi.
  • Non sono né un idraulico né un elettricista. Il lato fisico — la pompa, il pozzetto, la linea di scarico — è installato e manutenuto da professionisti; io descrivo il livello di monitoraggio, non l’impianto idraulico.
  • Monitorare non è fare manutenzione. Nessuna automazione sostituisce il controllo annuale, il test del galleggiante o la pulizia del pozzetto. Ciò che HA vi compra è tempo: rilevamento precoce invece della sorpresa.
  • Zigbee è una rete mesh, e le mesh perdono nodi. Il mio logbook mostra un passaggio unavailable sulla presa il 2026-08-16 (un singhiozzo Zigbee, non un guasto della pompa). Gli avvisi vanno progettati attorno a un sensore temporaneamente cieco, non solo attorno ai guasti della pompa.

Se dovessi ricostruire tutto da zero, terrei lo stesso nucleo: una presa con misuratore di energia, un binary sensor derivato e la scala di tentativi con blocco. Quel trio ha trasformato una pompa invisibile in un dispositivo con un battito — e una cantina a cui non devo pensare finché qualcosa non merita davvero di pensarci.