Impianto di irrigazione con Raspberry Pi: piGarden, lo script di gestione (quinta parte)

Eccoci giunti alla quinta parte di questa serie di post in cui ho descritto come realizzare una centralina di irrigazione costruita attorno ad un Raspberry Pi.

Oggi vi presento lo script bash di gestione della centralina che ho realizzato. Con questo viene gestito l’apertura e chiusura delle elettrovalvole, il rilevamento della pioggia e l’eventuale interruzione di irrigamento in base alla condizione meteorologica.

Lo script molto fantasiosamente l’ho chiamato piGarden ed possibile scaricarlo da github https://github.com/lejubila/PiGarden.

Qui di seguito descrivo come installarlo sul nostro Raspberry Pi.

Innanzitutto occorre collegarsi via ssh sul Raspberry. Una volta giunti sulla propria home (/home/pi) è necessario installare git, del quale ci serviremo per scaricare lo script da github e le altre librerie da cui dipende:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git

bene, una volta installato git procediamo scaricando piGarden:

cd
git clone https://github.com/lejubila/piGarden.git

in questo modo verrà creata la cartella piGarden che conterrà lo script piGarden.sh ed altre varie sottocartelle di cui vi parlerò più avanti.

Ora procediamo con l’installazione delle librerie e pacchetti necessari per fare funzionare piGarden: wiringPi, curl, gzip, jq.

WiringPi:

cd
git clone git://git.drogon.net/wiringPi
cd wiringPi
git pull origin 
./build

Curl e Gzip:

cd
sudo apt-get install curl gzip

Jq:

cd 
sudo apt-get install flex -y 
sudo apt-get install bison -y 
sudo apt-get install gcc -y 
sudo apt-get install make -y 
sudo apt-get install autotools -y 
sudo apt-get install dh-autoreconf -y 
wget https://github.com/stedolan/jq/releases/download/jq-1.5/jq-1.5.tar.gz
tar xfvz jq-1.5.tar.gz
cd jq-1.5
autoreconf -i
./configure --disable-maintainer-mode
make
sudo make install

Configurazione

Bene, adesso che abbiamo installato tutto il necessario possiamo provvedere a configurare piGarden. Per fare questo dobbiamo copiare in /etc il file di configurazione di esempio:

cd
sudo cp piGarden/conf/piGarden.conf.example /etc/piGarden.conf

Apriamo adesso il file di configurazione appena creato e scorrendo le prime righe troveremo le seguenti definizioni:

# Numero totale di elettrovalvole
EV_TOTAL=6
 
# Definizione delle elettrovalvole
EV1_ALIAS="1" #
EV1_GPIO=17
 
EV2_ALIAS="2" #
EV2_GPIO=27
 
EV3_ALIAS="3" #
EV3_GPIO=22
 
EV4_ALIAS="4" #
EV4_GPIO=18
 
EV5_ALIAS="5" #
EV5_GPIO=23
 
EV6_ALIAS="6" #
EV6_GPIO=24

questa configurazione è già pronta per fare gestire sei zone (elettrovalvole) e per poter funzionare su di un Raspberry Pi B collegato ai vari moduli hardware come descritto nei precedenti post. Rimane soltanto da variare i nomi delle zone (alias) se quelli impostati di default non vi soddisfano. I nomi vanno assegnati alle variabili EV1_ALIAS, EV2_ALIAS, EV3_ALIAS, ecc.. e non devono contenere spazi.

Se invece volete diminuire o aumentare le zone gestite, dovete intervenire sulla variabile EV_TOTAL assegnandovi il numero totale delle elettrovalvole presenti nell’impianto, poi per ognuna di esse definite altre due variabili in cui indicare il nome della zona (alias) e la porta gpio dove è collegata l’elettrovalvola. La coppia di variabili dovrà rispettare la seguente nomenclatura, dove x indica il numero della zona che viene definita:

EVx_ALIAS=”Nome_zona”
EVx_GPIO=17

nella prima variabile viene definito il nome della zona, che dovrà contenere una stringa alfanumerica senza spazi, mentre la seconda indica la porta gpio su cui è collegata l’elettrovalvola della zona.

Scorrendo ancora più in basso nel file di configurazione troviamo le seguenti definizioni:

# Definisce l'api key e il luogo per recuperare lo stato meteo online
WUNDERGROUND_KEY=""
WUNDERGROUND_LOCATION="IY/Monsummano"   # http://www.wunderground.com/weather/api/d/docs?d=resources/country-to-iso-matching&MR=1
 
# Blocca l'irrigazione se l'ultima pioggia rilevata online è avvenuta nell'ultima quantità di tempo inserita.
# Il tempo è espresso in secondi. Quindi inserendo 86400, se nelle ultime 24 ore ha pioviuto viene bloccata l'irrigazione. Inserendo il valore zero nonviene eseguito nessun controllo.
NOT_IRRIGATE_IF_RAIN_ONLINE=86400
 
# Il parametro è simile a quello precedente, il controllo però anziché essere fatto attingendo a wunderground, viene eseguito direttamente sul sensore se installato. Inserendo il valore zero nonviene eseguito nessun controllo.
NOT_IRRIGATE_IF_RAIN_SENSOR=86400

Con i parametri sopra riportati possiamo configurare il controllo sulle condizioni meteorologiche per far in modo che venga evitata l’irrigazione in caso di pioggia. Come avevo spiegato nel post Impianto di irrigazione con Raspberry Pi: il sistema di rilevamento pioggia (terza parte) abbiamo a disposizione due tipi di controllo meteo: tramite servizio online offerto da wunderground.com oppure, se l’abbiamo integrato nella centralina, tramite sensore hardware.

Se decidiamo di utilizzare il servizio di wunderground.com dobbiamo creare un nostro account in modo da avere una nostra api key da inserire nella variabile WUNDERGROUND_KEY. Per eseguire la registrazione e creare la vostra api key potete fare riferimento al post sopra menzionato.

Bene ora che abbiamo la nostra api key e l’abbiamo definita nel file di configurazione, dobbiamo indicare la posizione geografica in cui ci troviamo ed inserirla in WUNDERGROUND_LOCATION. La stringa da inserire dovrà contenere l’identificativo della nazione (IY per l’Italia) e la località geografica in cui vi trovate. Nel file di configurazione di esempio è riportata la città italiana Monsummano Terme. Per verificare che il nome della città che indicherete nella stringa di configurazione abbia un esito corretto, potete fare dei test con un browser inserendo l’url http://api.wunderground.com/api/TUA_API_KEY/conditions/q/IY/Monsummano.json (sostituendo TUA_API_KEY con la propria api key e IY/Monsummano con la località geografica in cui vi trovate). Se la stringa indicata sarà corretta, nella pagina del browser comparirà un json contenente le informazioni meteorologiche della vostra località.

Come ultima cosa dobbiamo indicare nella variabile NOT_IRRIGATE_IF_RAIN_ONLINE quanti secondi dovranno trascorrere dall’ultima pioggia per fare si che l’impianto di irrigazione riprenda ad irrigare in modo regolare. Il valore inserito di default è 86400 secondi, ovvero 24 ore. In questo modo se nelle ultime 24 ha piovuto la centralina interromperà l’irrigazione se in esecuzione oppure eviterà che questa si avvi se impartiremo il comando di apertura di una elettrovalvola.

Nel caso abbiate scelto di installare un sensore hardware (fate sempre riferimento al post Impianto di irrigazione con Raspberry Pi: il sistema di rilevamento pioggia (terza parte) per l’installazione e maggiori informazioni), similmente a come indicato prima, abbiamo a disposizione la variabile NOT_IRRIGATE_IF_RAIN_SENSOR nella quale dobbiamo indicare sempre il numero di secondi che dovranno passare dall’ultima pioggia che il sensore a rilevato, per far si che la centralina riprenda ad irrigare in modo regolare. Anche in questo caso il valore di default è di 24 ore.

Nel caso non volessimo eseguire nessun controllo sulle condizioni meteorologiche basterà assegnare il valore zero alle due variabili NOT_IRRIGATE_IF_RAIN_ONLINENOT_IRRIGATE_IF_RAIN_SENSOR.

Altri due parametri che possono interessare sono LOG_FILELOG_FILE_MAX_SIZE che indicano rispettivamente la posizione del file di log che lo script genera e la dimensione massima che questo potrà avere. Una volta raggiunta questa dimensione il file di log verrà compresso e rinominato dando così spazio ad un nuovo file di log.

Le altre variabili STATUS_DIR, GPIO, JQ, CURL, WC, GZIP, MV contengono percorsi e nomi dei comandi di sistema utilizzati dallo script.

In fine sono presenti un altro insieme di variabili utilizzate per definire le porte gpio e gli stati da utilizzare per la gestione dell’alimentazione del elettrovalvole e per la connessione del sensore meteo.

Utilizzo dello script

Vediamo adesso come utilizzare lo script per gestire l’impianto di irrigazione.

Inizializzazione centralina

Prima di potere eseguire qualsiasi operazione la centralina deve essere inizializzata. Questa operazione configura nella giusta modalità le porte gpio ed eseguire la chiusura di tutte le elettrovalvole. L’inizializzazione avviene digitando il seguente comando:

/home/pi/piGarden/piGarden.sh init

Il mio consiglio è quello di inserire il comando nel crontab utente in modo che venga eseguito all’avvio del Raspberry Pi. Per fare ciò digitate il comando crontab -e in modo da aprire il file di configurazione di crontab e inserite la seguente linea:

@reboot 	/home/pi/piGarden/piGarden.sh init

Apertura e chiusura delle elettrovalvole

L’apertura e la chiusura delle elettrovalvole avviene passando a piGarden.sh l’argomento open o close seguito dall’alias della zona come definito nel file di configurazione. Esempio:

/home/pi/piGarden/piGarden.sh open giardino_posteriore
/home/pi/piGarden/piGarden.sh close giardino_posteriore

in questo modo viene prima aperta e poi chiusa l’elettrovalvola relativa alla zona definita con il nome giardino_posteriore.

Se vogliamo schedulare l’apertura e la chiusura di questa zona, possiamo inserire i due comandi nel crontab utente similmente a come segue (digitate crontab -e per aprire il crontab)

10 21 * 6-9 * 	/home/pi/piGarden/piGarden.sh open giardino_posteriore
40 21 * 6-9 * 	/home/pi/piGarden/piGarden.sh close giardino_posteriore

in questo modo nella zona giardino_posteriore verrà avviata l’irrigazione alle ore 21:10 di tutti i giorni dal mese di giugno al mese di settembre e verrà fermata alle ore 21:40 dello stesso periodo.

Controllo condizioni meteorologiche

Per fare si che venga gestito il ritardo e l’interruzione dell’irrigazione in caso di pioggia lo script deve interrogare costantemente il servizio online e/o il sensore hardware. Per fare questo andranno utilizzati uno o entrambi i seguenti comandi a seconda del sistema scelto:

/home/pi/piGarden/piGarden.sh check_rain_online  # Controllo pioggia online
/home/pi/piGarden/piGarden.sh check_rain_sensor  # Controllo pioggia da sensore

nel momento in cui invochiamo i due comandi qui sopra, questi in caso di pioggia scriveranno il timestamp corrente rispettivamente in /home/pi/piGarden/state/last_rain_online e in /home/pi/piGarden/state/last_rain_sensor. In questo modo lo script saprà la data e ora dell’ultima pioggia e gestirà l’apertura delle elettrovalvole nel modo opportuno.

Per fare si che lo script sia costantemente aggiornato sulle condizioni meteo dovremo schedulare nel crontab utente i due comandi visti sopra in questo modo:

*/3 * * * * 	/home/pi/piGarden/piGarden.sh check_rain_online 2> /tmp/check_rain_online.err
* * * * *	/home/pi/piGarden/piGarden.sh check_rain_sensor 2> /tmp/check_rain_sensor.err

Come ultimo passo, se vogliamo che un’irrigazione attualmente in corso venga interrotta in caso di pioggia, dobbiamo schedulare nel crontab utente questo ulteriore comando:

*/5 * * * *	/home/pi/piGarden/piGarden.sh close_all_for_rain 2> /tmp/close_all_for_rain.err 1> /dev/null

Altri comandi

Lo script oltre a quelli già visti sopra, prevede altri parametri. Riporto qui sotto l’elenco completo:

# Inizializza le porte gpio, il sistema di alimentazione e chiude tutte le elettrovalvole
piGarden.sh init
 
#Apre un'elettrovalvola, se passato l'ulteriore parametro "forece" forza l'apertura anche in caso di pioggia
piGarden.sh open alias [force]
 
# Chiude un'elettrovalvola
piGarden.sh close alias
 
# Visualizza l'elenco degli alias (nomi zone) configurati
piGarden.sh list_alias
 
# Visualizza lo stato di una elettrovalvola (1=aperta, 0=chiusa)
piGarden.sh ev_status alias
 
# Visualizza lo stato di tutte le elettrovalvole
piGarden.sh ev_status_all
 
# Visualizza un json contenente lo stato di tutte le elettrovalvole e altre informazioni di sistema
piGarden.sh json_status
 
# Controlla lo stato meteo dal servizio online e memorizza il timestamp se piove
piGarden.sh check_rain_online
 
# Controlla lo stato meteo dal sensore hardware e memorizza il timestamp se piove
piGarden.sh check_rain_sensor
 
# Chiude tutte le elettrovalvole se attualmente piove
piGarden.sh close_all_for_rain
 
# Chiude tutte le elettrovalvole, se viene passato anche il parametro "force" forza la chiusura anche delle elettrovalvole risultano già chiuse
piGarden.sh close_all [force]

Conclusioni

Bene, siamo arrivati alla fine. Con questo concludo per adesso l’argomento. Per il futuro ho in progetto di realizzare un pannello web per la gestione dell’impianto, ma dato il poco tempo libero, prevedo che non riuscirò a rilasciarlo in tempi brevi.

Per qualsiasi dubbio o domanda sono a disposizione ……. alla prossima 🙂

22 pensieri su “Impianto di irrigazione con Raspberry Pi: piGarden, lo script di gestione (quinta parte)

  1. Ciao lejubila, complimenti per il tuo lavoro e sopratutto per la chiarissima spiegazione.
    Anche io ho un vecchio Raspberry PI B che sta facendo polvere in un cassetto.
    Sto finendo di ristrutturare casa e stavo pensando a come poter sfruttare il Raspberry.
    Avevo in mente una soluzione molto simile alla tua ma la differenza sostanziale è che io vorrei comandare (magari anche da remoto) i termostati ambiente dell’impianto di riscaldamento delle zone della mia abitazione.
    Ho visto altri progetti di termostati con sensori di temperature attaccati al raspberry e/o accensione e spegnimento della caldaia (nessuno di questi mi ha convinto); ho visto che in commercio vendono anche cronotermostati wifi a prezzi però secondo me folli.
    Vorrei creare comunque una cosa semplice: installare i classici termostati nelle varie zone dell’abitazione (impostati ai gradi desiderati) e poi poter dare tensione o staccare gli stessi termostati ambiente che comandano le elettrovalvole (elettrovalvole con micro a 220V) magari come dicevo da remoto o meglio ancora con una app sul cellulare.
    Gran parte del tuo lavoro mi sembra possa combaciare. Ho visto che per i moduli relè per le mie 7 zone di casa c’è anche questo articolo in amazon

    http://www.amazon.it/COLEMETER-Modulo-Canali-Arduino-Elettronica/dp/B00E370JAC/ref=pd_sim_147_2?ie=UTF8&dpID=51a1%2BrIC2tL&dpSrc=sims&preST=_AC_UL160_SR160%2C160_&refRID=01JW4HYESPRTGWVNNDFZ

    Il relè n. 8 potrei magari utilizzarlo per accendere o spegnere la luce fuori di casa (magari sempre da remoto).
    Ti volevo chiedere se secondo te il progetto è fattibile e volevo magari qualche consiglio sulla programmazione del Rpi (io non ne so proprio niente purtroppo di programmazione). Le elettrovalvole nel mio caso dovranno essere sempre in tensione o sempre staccato come pure la luce fuori casa (relè n. 8).
    Grazie. Ciao.
    Mirco

  2. Ciao Mirko,
    del tuo progetto non ben capito il raspberry pi cosa dovrebbe comandare: itermostati o le elettrovalvole ?
    Il linea di massima comunque penso non ci siano problemi di realizzazione se non riuscire a stendere tutti i cavi che collegheranno i termostati/elettrovalvole con i relè comandati dal raspberry.
    Il modulo dei relè dovrebbe andare bene, anche io avrei optato per un modello simile ma ormai ne avevo già acquistati 2 da 4.
    Per il resto se vuoi un aiuto per la programmazione ti do una mano volentieri.
    Ciao.

  3. Quando lancio il comando
    sudo apt-get install autotools -y
    ottengo
    E: Impossibile trovare il pacchetto autotools

    Sai come risolvere?
    Ciao e grazie. Ivano

  4. Ciao Ivano hai ragione il raspberry non ha il pacchetto autotool.
    Prova a sostituire il comando con questo

    sudo apt-get install libtool autoconf automake gettext

    fammi sapere se così funziona.
    David.

  5. L’installazione dei pacchetti indicati è riuscita, anche perchè c’erano già …
    Io per prova, prima di scriverti avevo installato autotools-dev (non so se c’entra …).
    Comunque alla fine ottengo sempre un errore facendo make (a proposito i 2 comandi che hai scritto su una sola riga “make sudo make install” vanno separati):
    src/builtin.c:1375:23: fatal error: builtin.inc: No such file or directory
    compilation terminated. …. e altro …

  6. Allora, ho rieseguito l’installazione di jq su un raspberry dove ancora non l’avevo fatto.
    I comandi giusti dovrebbero essere i seguenti:

    cd
    sudo apt-get install flex -y
    sudo apt-get install bison -y
    sudo apt-get install gcc -y
    sudo apt-get install make -y
    sudo apt-get install dh-autoreconf -y
    wget https://github.com/stedolan/jq/releases/download/jq-1.5/jq-1.5.tar.gz
    tar xfvz jq-1.5.tar.gz
    cd jq-1.5
    autoreconf -i
    ./configure –disable-maintainer-mode
    make
    sudo make install

    Fammi sapere se funziona.
    David.

  7. Mi ha dato qualche warning ma sembra funzionare …
    Ho dovuto correggere però il file di configurazione:
    # Posizione js
    JQ=”/usr/local/bin/jq”
    va aggiunto /jq e diventa
    # Posizione js
    JQ=”/usr/local/bin/jq/jq”

    Ti ringrazio e ti auguro buon anno!
    Ivano

  8. Ciao Ivano,
    ho corretto nel post le istruzioni di installazione di JQ. Comunque sia a me il path di installazione risulta corretto /usr/local/bin/jq

    Grazie e buon anno anche a te!
    David.

  9. A me l’installazione ha creato in /usr/local/bin una directory di nome jq contenente poi l’eseguibile jq.
    Dato che nel piGarden.conf la variabile $JQ indica il percorso dell’eseguibile (completo del comando) ho dovuto aggiungere come detto un ulteriore /jq.
    Così funziona, altrimenti da l’errore :
    -bash: /usr/local/bin/jq: E’ una directory

    Ciao. Ivano

  10. Ciao. Ho ordinato il relè (evviva – spero mi arrivi presto).
    Volevo chiederti una cosa. Ho letto che nel tuo progetto hai usato elettrovalvole bistabili per non lasciarle sotto tensione come le elettrovalvole monostabili. Quindi quando dai il comando di apertura e chiusura il relè fa chiudere il circuito per pochi secondi e poi ripassa nella posizione di circuito aperto?
    Funziona come un pulsante di un campanello o dell’apertura del cancelletto pedonale di casa tanto per capirci? (avevo in mente qualche altra autorizzazione in casa).
    Ciao.

  11. Si Mirco funziona come hai detto te, il comando di apertura fa chiudere il relè per mezzo secondo dopo di che viene riaperto. Il comando di chiusura funziona allo stesso modo solo che prima di chiedere il relè eseguo un’inversione di polarità della tensione applicata all’elettrovalvola.

  12. Ciao Lejubila, complimenti per questo progetto.
    Innanzitutto volevo sapere se posso contattarti in privato (mail) perchè ho molte domande da farti, sono uno studente universitario ed è sempre un piacere avere la possibilità di confrontarsi con persone più esperte. Come posso contattarti se possibile?
    Grazie in anticipo.

  13. Ciao Paolo,
    se vuoi chiedere qualcosa inerente a questo progetto qui é il posto giusto. Può usare i commenti del blog in modo che anche altre persone possano leggere.
    Comunque sia ti scrivo anche in privato in modo che possiamo contattarci direttamente.

  14. Ciao, scusami il disturbo ma ho visto che l’ultimo commento è del 30 gennaio, spero tu non abbia abbandonato questo bellissimo progetto che data la sua praticità e chiarezza nella guida mi ha spinto a provare a realizzarlo (è il mio primo “progetto elettronico”).
    Ti volevo chiedere se esiste una pagina riassuntiva o un pdf ancor meglio con tutte le guide fin ora realizzate e soprattutto chiederti se avevi avuto tempo in questi mesi di realizzare il pannello web per la gestione dell’impianto.
    Grazie di aver condiviso!
    Luca

  15. Ciao Luca,
    non ho assolutamente abbandonato il progetto. Purtroppo l’interfaccia web non è ancora pronta. Purtroppo a causa di mancanza di tempo non sono ancora riuscito a portarla a termine.
    Mi dispiace deluderti ma non esiste nessun post riassuntivo o pdf del progetto.

  16. Ci vorrebbero più ferie e tempo libero per tutti, questo è il problema 🙂
    Non mi è chiaro però come sono stati collegati i fili alle elettrovalvole e quindi al tuo sistema di irrigazione. Non dal punto di vista connessione (che è spiegato chiaramente sul tuo schema elettrico) ma proprio dal punto di vista pratico (i fili che escono dalla scatola dentro un tubo sono “volanti” prima di arrivare alle elettrovalvole?). Riesci cortesemente a fare una foto e postarla sul blog ad uso e informazione di tutti? Altrimenti anche inviarla alla mia email, come ti è più comodo.
    Grazie ancora della disponibilità a supporto di noi noob!
    Luca

  17. Ciao! Certo che sono interessato, sto provando a creare il tutto appena ho un pò di tempo!
    Grazie del nuovo upload (il link è alla quinta parte però), lo guardo subito.
    Luca

  18. Ciao,
    complimenti ottimo progetto. Se ti serve una mano sulla parte web possiamo vederla insieme.

    Francesco

  19. #Francesco,
    grazie per l’offerta. Attualmente sono quasi a termine dello sviluppo della dashboard. Una volta sistemata questa parte penso di pubblicare una prima versione.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *