I peperoncini si annaffiano da soli

/Domotica/di Gianluca Epifani

I peperoncini si annaffiano da soli

Ogni sera alle nove

In giardino ho due fioriere e un vaso tondo di peperoncini: calabrese e cayenna nella prima, habanero e scorpion nella seconda, e un altro calabrese nel vaso tondo. Tutta roba che d’estate beve ogni giorno, e che se salti due sere di fila te lo fa capire. Il problema non era annaffiare, era ricordarselo. E poi c’erano le ferie: una settimana via ad agosto vuol dire o chiedere a qualcuno o trovare al ritorno cinque piante secche e un’estate buttata.

Quindi l’estate scorsa ho messo in piedi un impianto che le annaffia da solo, con Home Assistant, che in casa gira già da tempo su un Raspberry e si occupa di luci, condizionatore e qualche altra cosa. Questo post racconta com’è fatto, quanto è costato, e soprattutto una cosa che non è andata come previsto: i sensori di umidità del terreno, che nel disegno iniziale dovevano decidere quando dare l’acqua e che oggi non decidono niente.

Le fioriere di peperoncini a luglio, gli habanero gialli maturi, la pianta a ottobre
Da luglio a ottobre: le fioriere all'inizio, gli habanero che maturano, la pianta che a fine stagione è diventata un cespuglio.

Quattro pezzi e un pozzo

Il giardino sta a una decina di metri dal muro di casa. Il rubinetto è lì, collegato al pozzo: la pompa è di quelle con il pressostato, che si accendono quando la pressione nel tubo cala, cioè quando qualcuno apre l’acqua, e si spengono quando torna su. Il rubinetto lo tengo sempre aperto, e il lavoro di aprire e chiudere lo fa una valvola avvitata subito dopo.

La valvola è una Sonoff SWV: Zigbee, quattro pile stilo, filetto da tre quarti, si avvita tra il rubinetto e il tubo. Dentro ha anche un contalitri, che misura quanta acqua passa e lo riporta in Home Assistant. Dalla valvola parte un tubo a goccia che fa il giro delle due fioriere e del vaso.

Poi tre sensori di umidità del terreno, uno per fioriera e uno nel vaso tondo. Sono i classici sensori Tuya a forma di sonda, Zigbee, a pile, con una punta da piantare nella terra che riporta umidità in percentuale e temperatura. Ne parlo più avanti, perché è la parte interessante.

In casa, in soggiorno, c’è il Raspberry con Home Assistant e una chiavetta Zigbee, una ConBee II, gestita da Zigbee2MQTT. Dal soggiorno al muro verso il giardino ci sono otto metri, poi il muro, con una porta, poi altri dieci metri fino alle fioriere. Per allungare la rete Zigbee ho aggiunto una presa e una lampadina sul balcone e un’altra presa con lampadina vicino alle fioriere: i dispositivi alimentati fanno da ripetitori, quelli a pile no. Ne riparlo a proposito dei sensori.

Schema dell'impianto: Home Assistant e Zigbee2MQTT in casa, il muro, i ripetitori Zigbee, in giardino il pozzo con la pompa, la valvola sul rubinetto, il tubo a goccia verso le fioriere e i tre sensori
Due flussi: in blu il comando alla valvola, una volta al giorno, che deve funzionare sempre. Tratteggiate le letture dei sensori, che arrivano quando arrivano.
La valvola Sonoff SWV e il sensore di umidità del terreno Zigbee
La valvola, che si avvita sul rubinetto, e il sensore a sonda da piantare nel vaso.

L’automazione, così com’è

Questa è l’automazione che gira, copiata com’è, senza abbellimenti (e con un errore ben visibile):

YAML
alias: Irrigazione serale - Apri 30 minuti
description: Apre la valvola del giardino ogni sera per 30 minuti
triggers:
  - trigger: time
    at: "21:00:00"
conditions: []
actions:
  - action: telegram_bot.send_message
    data:
      message: 💧 Irrigazione partita - durata 15 minuti
  - action: switch.turn_on
    target:
      entity_id: switch.valvola_giardino
  - delay:
      minutes: 15
  - action: switch.turn_off
    target:
      entity_id: switch.valvola_giardino
  - action: telegram_bot.send_message
    data:
      message: ✅ Irrigazione completata
mode: single

Alle nove di sera apre la valvola, aspetta quindici minuti, la chiude, e mi manda due messaggi su Telegram, uno all’inizio e uno alla fine. La pompa non compare da nessuna parte, perché non serve: la valvola apre, la pressione cala, la pompa parte; la valvola chiude, la pressione sale, la pompa si ferma. Un’automazione da venti righe e un’estate di piante annaffiate, ferie comprese. Il messaggio su Telegram serve più di quanto sembri: quando sei in vacanza, vedere “irrigazione completata” ogni sera alle nove e un quarto è il modo in cui sai che a casa va tutto bene.

Funziona, e ha due difetti. Uno si vede subito leggendo il codice, l’altro no.

Un numero in tre posti

Il primo lo avrete già notato. Il titolo dice trenta minuti, il messaggio dice quindici, il ritardo è di quindici. Ho cambiato la durata una volta, ho corretto un posto e me ne sono dimenticati due. Il titolo è solo brutto, ma se un giorno correggo il messaggio e non il ritardo, Telegram mi racconterà un’irrigazione diversa da quella che è successa, ed è peggio che non avere il messaggio.

La correzione è quella che farebbe chiunque in un programma: la durata vive in un posto solo e gli altri la leggono. In Home Assistant quel posto è un helper di tipo numero, input_number.durata_irrigazione, da uno a sessanta minuti, che compare anche nella dashboard come una casella da cambiare con il dito. L’automazione lo legge all’inizio e lo usa sia nei messaggi che nel ritardo:

YAML
alias: Irrigazione serale
description: Apre la valvola del giardino ogni sera per la durata impostata nell'helper
triggers:
  - trigger: time
    at: "21:00:00"
actions:
  - variables:
      durata: "{{ states('input_number.durata_irrigazione') | int }}"
  - action: telegram_bot.send_message
    data:
      message: "💧 Irrigazione partita - durata {{ durata }} minuti"
  - action: switch.turn_on
    target:
      entity_id: switch.valvola_giardino
  - delay:
      minutes: "{{ durata }}"
  - action: switch.turn_off
    target:
      entity_id: switch.valvola_giardino
  - action: telegram_bot.send_message
    data:
      message: "✅ Irrigazione completata ({{ durata }} minuti)"
mode: single

Il titolo non può leggere l’helper, per questo il numero dal titolo è sparito. Questa versione è pronta ma al momento in cui scrivo non è ancora al posto della prima: la stagione è finita, e la metto in produzione in primavera, quando ricomincia a servire.

Se Home Assistant si spegne a metà

Il secondo difetto non si vede nel codice, perché sta in quello che il codice dà per scontato. L’automazione apre la valvola e, quindici minuti dopo, la chiude. In mezzo c’è un ritardo, e un ritardo è uno stato che vive dentro Home Assistant. Se in quei quindici minuti il Raspberry si riavvia, per un aggiornamento, per la corrente che salta, per un errore qualunque, l’automazione non riprende da dove era: l’azione di chiusura non arriva mai e la valvola resta aperta. Con la pompa che continua a pescare dal pozzo finché qualcuno non se ne accorge. In vacanza, quel qualcuno non c’è.

È la stessa cosa che negli articoli sulle architetture chiamo tenere lo stato nel posto sbagliato: la decisione di chiudere sta in un processo che può morire, mentre l’unico pezzo che non può permettersi di dimenticare è la valvola. E la valvola, in effetti, sa chiudersi da sola. Via Zigbee2MQTT accetta, insieme al comando di apertura, un tempo massimo in secondi passato il quale si chiude anche se nessuno glielo dice più. Per usarlo da Home Assistant non basta il normale interruttore: si pubblica il comando direttamente sul topic MQTT del dispositivo, con il tempo massimo un po’ più lungo della durata prevista, così in condizioni normali la chiude ancora l’automazione e la valvola fa solo da rete di sicurezza:

YAML
  - action: mqtt.publish
    data:
      topic: zigbee2mqtt/valvola_giardino/set
      payload: '{"state": "ON", "on_time": {{ durata * 60 + 60 }}}'

Con questo, il caso peggiore diventa un minuto d’acqua in più. Anche questo è nella lista per la primavera, insieme a un’altra cosa che il contalitri rende possibile: il messaggio “irrigazione completata” oggi dice solo che Home Assistant ha mandato il comando di chiusura, non che l’acqua è davvero passata. La valvola riporta i litri erogati nell’ultima sessione, e un messaggio che dica “completata, 38 litri” racconta che la pompa ha funzionato, che il tubo non era staccato e che la valvola si è aperta davvero. Zero litri alle nove e un quarto sarebbe l’allarme giusto, prima ancora che le piante lo diano a modo loro.

Il sensore che doveva comandare

Il disegno iniziale era un altro. L’idea era di non annaffiare a orario ma a bisogno: un sensore nel terreno, una soglia, quando l’umidità scende sotto la soglia si apre l’acqua. Più elegante, più giusto per le piante, meno acqua sprecata quando piove. Per questo ho comprato tre sensori, uno per vaso, e ho fatto una dashboard con un grafico per fioriera.

Poi i sensori hanno cominciato a sparire. Non tutti insieme, non sempre: uno manda i suoi numeri per un po’, poi Home Assistant lo segna come non disponibile e resta così per giorni, poi magari torna. Ho aggiunto i ripetitori Zigbee di cui parlavo, la presa e la lampadina sul balcone e quelle vicino alle fioriere, e per i sensori di umidità non è cambiato quasi niente.

La dashboard Umidità di Home Assistant con il grafico vuoto di una fioriera e lo storico di ottobre del sensore: una riga piatta al 96 per cento e poi non disponibile
La dashboard a inizio novembre: grafico vuoto nell'ultima settimana. A destra lo storico di ottobre dello stesso sensore: una riga piatta al 96 per cento per un mese, poi non disponibile.

Il grafico di ottobre è onesto: una riga piatta al novantasei per cento per un mese intero. Un terreno non sta allo stesso numero per trenta giorni. Quella riga è l’ultimo valore che il sensore è riuscito a mandare, ripetuto dal grafico finché Home Assistant non si è arreso e l’ha dichiarato non disponibile. Il sensore era già muto da settimane, il grafico lo diceva in un modo che sembrava un dato.

Perché spariscono, non l’ho capito con certezza, e in rete ho trovato più gente con lo stesso problema che spiegazioni. La mappa della rete di Zigbee2MQTT, però, restringe il campo.

Mappa della rete Zigbee: coordinatore, presa e lampada del balcone, presa del giardino con sotto la valvola (qualità 137), la lampada del giardino e il sensore 3 (qualità 40); i sensori 1 e 2 senza nessun genitore
La mappa Zigbee ridisegnata da quella di Zigbee2MQTT: la valvola e il sensore 3 sono figli della presa del giardino, i sensori 1 e 2 non sono figli di nessuno.

La valvola, che sta nello stesso giardino, è attaccata alla presa del giardino con una qualità di collegamento di 137 su 255, un valore buono. Il sensore 3, a pochi metri, è attaccato alla stessa presa con 40, cioè al limite. I sensori 1 e 2 nel momento della foto non risultano figli di nessuno: non sono attaccati alla presa, non alla lampada, non al coordinatore. Sono nella rete, ma nessuno sa come raggiungerli. Quindi la distanza da sola non spiega: un dispositivo a pile nello stesso punto, la valvola, ci sta benissimo. La differenza sta nel sensore, e quello che si mette insieme è questo. Un sensore a pile è un dispositivo Zigbee che dorme quasi sempre: si sveglia, manda un numero, torna a dormire. Quando entra nella rete sceglie un genitore, il coordinatore o un ripetitore, e tende a restare attaccato a quello anche se nel frattempo ne è arrivato uno più vicino: per questo, dopo aver messo i ripetitori, ho rifatto l’associazione dei sensori stando lì vicino, e non è bastato. I ripetitori, dal canto loro, dopo un po’ che un dispositivo dorme possono dimenticarselo, e un sensore dimenticato dovrebbe accorgersene e rientrare, cosa che i sensori economici fanno male o non fanno. Poi c’è l’antenna: quella della valvola sta in una scatola a mezzo metro da terra, quella del sensore è nella testa di plastica di una sonda piantata nel terreno bagnato, in mezzo alle foglie, che a 2,4 GHz assorbono bene. E due pile ministilo che d’estate sotto il sole fanno quello che possono. Nessuna di queste cose da sola spiega tutto, insieme spiegano un 40 contro un 137 e due sensori orfani.

Ma il punto dell’articolo non è aggiustare i sensori. È che cosa si fa con un sensore di cui non ci si può fidare, e la risposta è: non gli si dà in mano la valvola. Un’automazione del tipo “apri se il terreno è secco” deve decidere cosa fare quando il sensore non risponde, e ha solo due scelte, entrambe sbagliate. Se tratta il silenzio come “non è secco”, le piante restano senz’acqua per tutti i giorni in cui il sensore è muto, che sono tanti. Se tratta il silenzio come “potrebbe essere secco, meglio aprire”, annaffia ogni volta che il sensore sparisce, cioè sempre, e allora tanto vale l’orario. Un ingresso che può mancare per giorni non può stare nell’anello di controllo: qualsiasi cosa ci costruisci sopra eredita la sua inaffidabilità.

Quindi l’acqua va a orario, perché l’orologio del Raspberry non va mai offline, e i sensori fanno un altro mestiere: guardare. Quando funzionano, il grafico dell’umidità dice se quindici minuti al giorno sono troppi o pochi, se dopo una settimana di caldo il terreno non risale, se un vaso beve più degli altri. Sono loro a dirmi come regolare la durata, e la durata la cambio io, a mano, nell’helper. Chi comanda è semplice e affidabile, chi osserva può permettersi di essere approssimativo. È una separazione che vale per i vasi come per i sistemi grandi: la cosa che prende le decisioni deve dipendere da meno ingressi possibile, e ognuno di quegli ingressi deve essere lì sempre.

La lista della spesa

Questi sono i pezzi e quello che ho pagato, con i link ai prodotti che ho usato io.

CosaQuantiPagato
Valvola Sonoff SWV, Zigbee, con contalitri130 € su Amazon
Sensore di umidità del terreno, Zigbee, a pile37 € l'uno su AliExpress
Chiavetta Zigbee ConBee II per il Raspberry120 € su Amazon
Prese Zigbee come ripetitori217 € l'una su Amazon
Tubo a goccia con gocciolatori e raccordi1 kitpochi euro in ferramenta

In tutto poco più di cento euro, tubo a parte, e la metà sono i sensori e le prese che li dovevano aiutare, cioè la parte che non comanda nulla. Quello che annaffia davvero, la valvola e la chiavetta che le parla, sono cinquanta euro, più Home Assistant che c’era già. Le pile della valvola sono quattro stilo e hanno fatto l’intera stagione.

Il raccolto

I primi due peperoncini a luglio, il raccolto di agosto su un tagliere, la ciotola piena di inizio novembre
I primi due a metà luglio, il raccolto di agosto, la ciotola di inizio novembre.

A metà luglio i primi due, uno scorpion e un habanero. Ad agosto un tagliere pieno. A inizio novembre una ciotola che a casa mia basta per un anno di sughi, e qualche amico che ne ha avuto in regalo e non ne vuole più sapere. Le piante le hanno annaffiate un Raspberry e una valvola da trenta euro, ogni sera alle nove, anche nella settimana in cui non c’era nessuno. Con una parte del raccolto di agosto ci ho fatto le marmellate, un barattolo per varietà più un mix. La ricetta, magari, un’altra volta.

Dieci barattoli di marmellata di peperoncino impilati a piramide, con le etichette scritte a mano: habanero, scorpion, cayenna e calabria, mix
Le marmellate di agosto: habanero, scorpion, cayenna con calabrese, e un mix in cima.

Concludo

L’impianto che avevo in testa era quello con i sensori che decidono, e quello che funziona è quello con l’orologio che decide e i sensori che guardano. Ci ho messo un’estate a fare pace con l’idea che la versione meno elegante fosse quella giusta, e il grafico piatto di ottobre me l’ha confermata meglio di qualsiasi ragionamento. Restano due cose da fare prima della prossima stagione, la durata in un posto solo e il tempo massimo di apertura dentro la valvola, ed entrambe vanno nella stessa direzione: togliere all’automazione tutto quello che può ricordarsi male, e lasciare al pezzo più semplice la responsabilità di chiudere l’acqua. Il resto lo fanno le piante, che di tutto questo non sanno niente e a ottobre erano alte un metro.