piGardenSched uno schedulatore alternativo per piGarden

RELEASE HISTORY

aggiornato alla versione 0.3.6f (15/06/2021)

  • inserita le gestione dei lock per evitare sovrapposizioni di schedulazioni
  • inserita funzionalità di cleanup al boot (rimozione eventuali lock files)
  • migliorata l’integrazione con drv_rainsensorqty, poiché quest’ultimo non solo gestisce l’evento pioggia secondo i criteri di piGarden, ma registra anche ogni singolo movimento della vaschetta
  • inserita l’irrigazione progressiva che si riduce in base alla quantità di pioggia precipitata, se questa non è sufficiente per determinare l’evento pioggia

NOTE IMPORTANTI versione 0.3.3:

  • con questa versione le valvole vengono indicate con EV# anziché con EV#_ALIAS (es. EV1 vs EV1_ALIAS)
  • per poter utilizzare la nuova versione è necessario cancellare a mano dal file /etc/piGarden.sched le occorrenze di “_ALIAS”; in alternativa è possibile cancellare il file e ricostituire le schedulazioni con i comandi di seguito indicati.
  • il nuovo file per impedire l’irrigazione, al fine di verificare il funzionamento dello schedulatore, è: /home/pi/piGardenSched/include/TEST

piGardenSched


piGardenSched.sh e’ un’alternativa all’attuale schedulatore di piGarden.

E’ stato scritto dall’amico Andrea, il quale vedendo nell’attuale gestione di piGarden alcune limitazioni, ha deciso di creare un nuovo sistema di pianificazione delle irrigazioni.

Uno dei principali vantaggi di piGardenSched è quello di poter programmare l’apertura di una EV senza una schedulazione di apertura e una di chiusura, ma semplicemente indicando l’orario di partenza, il tempo di azione da eseguire e la ricorrenza.

Sono in oltre presenti funzioni avanzate come quella di potere impostare in un’unica schedulazioni l’irrigazione sequenziale di più elettrovalvole.

Lascio ora la parola ad Andrea, il quale vi spiegherà nel dettaglio come funziona piGardenSched.

 

Ciao a tutti, mi presento: sono Andrea e androtto è il mio avatar!

Sono orgoglioso di condividere con voi questo progetto che è cresciuto piano piano aggiungendo funzioni su funzioni.

INSTALLAZIONE


Si consiglia di installare piGardenSched sotto la home dell’utente pi, quindi il percorso del package sara’ /home/pi/piGardenSched.

E’ possibile farlo semplicemente scaricando l’ultima versione del pacchetto dal repository da github.

cd /home/pi

git clone https://github.com/lejubila/piGardenSched.git

Possiamo considerare due aree di funzionamento:
* gestione file di schedulazione
* esecuzione delle schedulazioni

Le vedremo nel dettaglio successivamente.

STRUTTURA DEL PACCHETTO:


Una volta installato potete trovare il seguente contenuto (nota: orari e dimensioni dei file potrebbero essere differenti nel caso di versioni successive):

drwxr-xr-x 2 pi pi 4096 Apr 28 16:29 conf
drwxr-xr-x 2 pi pi 4096 Apr 29 22:51 include
-rwxr-xr-x 1 pi pi 5918 Apr 28 15:51 piGardenSched.sh
-rw-r--r-- 1 pi pi 35473 Apr 29 23:41 README

in /home/pi/piGardenSched/conf potete trovare alcuni esempi, tra cui il file di configurazione, la cui funzione e’ spiegata di seguito.
in /home/pi/piGardenSched/include vi sono tutte le funzioni suddivise per tipologia (cron, rain e generali functions), oltre agli script che vengono eseguiti con la partenza dell’irrigazione (irrigating.sh) e la gestione delle attese tra open/close e contestuale verifica dello stato della pioggia (raincheck-waitloop.sh):

-rw-r--r-- 1 pi pi 730 Apr 28 15:52 cron.include.sh
-rw-r--r-- 1 pi pi 26637 Apr 28 16:30 functions.include.sh
-rwxr-xr-x 1 pi pi 1903 Apr 28 00:43 irrigating.sh
-rwxr-xr-x 1 pi pi 2074 Apr 27 00:35 raincheck-waitloop.sh
-rw-r--r-- 1 pi pi 5002 Apr 26 23:58 rain.include.sh

Al primo avvio verranno create le directory:

drwxr-xr-x 2 pi pi 4096 Apr 28 15:40 log
drwxr-xr-x 2 pi pi 4096 Apr 28 00:22 state

Nella directory /home/pi/piGardenSched/log troveremo ogni volta che viene lanciato da crontab il log principale (piGardenSched.log); troveremo inoltre un file di log per ogni combinazione di EV+orario di esecuzione (ZONA1_pratoSud-10:00.log).
in /home/pi/piGardenSched/state vengono registrate le attività di ogni EV schedulata nella sua ultima esecuzione (ZONA1_pratoSud-10:00.lastrun) e il suo storico (ZONA1_pratoSud-10:00.history)
E’ anche presente lo storico di ogni EV effettivamente aperta con l’orario e la durata (ZONA1_pratoSud-irrigationhistory).
Più avanti vedremo quali sono le opzioni da passare a piGardenSched per consultare ed interpretare tali file di stato.
Infine in /home/pi/piGardenSched/tmp vi sono i file temporanei creati/impiegati da piGardenSched durante il suo funzionamento.

ATTIVAZIONE


Per poter essere attivato piGardenSched deve essere a sua volta presente in crontab.
Esistono 3 opzioni per la gestione della propria entry in crontab da parte di piGardenSched.sh e sono:
cronadd crondel croncheck
con la conseguente azione facilmente comprensibile.

La prima cosa da fare ovviamente è copiare piGardenSched.conf da /home/pi/piGardenSched/conf/piGardenSched.conf, con il seguente comando:
pi@raspberrypi:~/piGardenSched $ sudo cp conf/piGardenSched.conf /etc

successivamente attivare la entry in crontab:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh croncheck
ERROR: crontab entry for piGardenSched.sh NOT found
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh cronadd
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh croncheck
NORMAL: crontab entry for piGardenSched.sh found
pi@raspberrypi:~/piGardenSched $ crontab -l |grep piGardenSched
* * * * * /home/pi/piGardenSched/piGardenSched.sh >> /home/pi/piGardenSched/log/piGardenSched.log 2>&1
pi@raspberrypi:~/piGardenSched $

FILE DI CONFIGURAZIONE


I file di configurazioni sono riferiti dal file /home/pi/piGardenSched/.cfgfiles che contiene:

PIGARDEN_CONFIG_ETC="/etc/piGarden.conf"
PIGARDENSCHED_CONF="/etc/piGardenSched.conf"

HINT: indicare i file di configurazione attraverso questo dot file è utile per eventuali test di configurazioni e/o installazioni in directory diverse, anche utlizzando il flag include/TEST

File di configurazione /etc/piGardenSched.conf

/etc/piGardenSched.conf e’ il file di configurazione. Deve essere presente, altrimenti lo script non parte.

Ecco il contenuto del file:

# pigarden config file
# Author: androtto

verbose="no" # yes|no

PIGARDENSCHED=/etc/piGarden.sched

PIGARDEN_HOME="/home/pi/piGarden"
STATUS_DIR="$PIGARDEN_HOME/state"

#integration with drv_rainsensorqty
RAINSENSORQTY_LASTRAIN="$STATUS_DIR/rainsensorqty_lastrain"
RAINSENSORQTY_HISTORY="$STATUS_DIR/rainsensorqty_history"

# activate integration with drv_rainsensorqty
autostoprain=yes # yes|no
autodelayrain=yes # yes|no

# set 0 for leave enabled autostoprain (if set to yes) for each EV
# set 1 for override autostoprain and leave active even if it will be raining
EV1_NORAIN_RAINSENSORQTY=0
EV2_NORAIN_RAINSENSORQTY=0
EV3_NORAIN_RAINSENSORQTY=0
EV4_NORAIN_RAINSENSORQTY=0
EV5_NORAIN_RAINSENSORQTY=0
EV6_NORAIN_RAINSENSORQTY=0

# progressive irrigation
EV1_PROGRESSIVE_RAINSENSORQTY=1
EV2_PROGRESSIVE_RAINSENSORQTY=1
EV3_PROGRESSIVE_RAINSENSORQTY=0
EV4_PROGRESSIVE_RAINSENSORQTY=1
EV5_PROGRESSIVE_RAINSENSORQTY=0
EV6_PROGRESSIVE_RAINSENSORQTY=1

ulteriori entry per ogni EV come la precedente se ne avete piu’ di 6 come nell’esempio)

Breve spiegazione di ciascuna entry

verbose consente di aumentare il livello di informazioni nell’esecuzione dello script. Per esempio, con verbose=no, non viene visualizzato (e quindi riversato nel log) nessun output quando viene lanciato piGardenSched.sh se non vi sono schedulazioni. Con verbose=yes viene ad esempio visualizzato l’output “16:30:59-28/04/19 NORMAL: no irrigation run at 16:30“.

PIGARDEN_HOME STATUS_DIR sono relative rispettivamente alla home di piGarden e alla sua sottodirectory state.
Queste variabili servono per le due successive: RAINSENSORQTY_LASTRAIN RAINSENSORQTY_HISTORY utili per l’integrazione con il driver RAINSENSORQTY.

autostoprain consente l’interruzione della pioggia – usando la componente opzionale drv_rainsensorqty – durante l’irrigazione.
per poter fare cio’ deve essere disattivata l’integrazione con il sistema di rilevazione pioggia integrato in piGarden, quindi in /etc/piGarden.conf ciascuna valvola deve riportare l’entry come la seguente:
EV1_NORAIN=1 # Non interrompe l'irrigazione di questa zona in caso di pioggia
piGardenSched considera tale gestione pioggia la CLASSIC mentre quella opzionale QTY. I messaggi che verranno eventualmente segnalati conterranno informazioni delle variabili gestite da piGardenSched le quali sono EVNORAINQTY e EVNORAINCLASSIC
Se vi fossero dei conflitti sulle impostazioni per la gestione della pioggia, piGardenSched le segnala.
E’ possibile disattivare il comportamento autostoprain per ogni EV con le variabili EV1_NORAIN_RAINSENSORQTY (o similare con numero cambiato, es. EV2_NORAIN_RAINSENSORQTY ecc.)

autodelayrain permette il ritardo automatico della schedulazione se vi sono state delle pioggie nei giorni precedenti tra il momento dell’irrigazione e la precedente.
Ad esempio, se il prato viene irrigato ogni 3 gg alle 10.30 e la precedente irrigazione e’ avvenuta il 5 aprile/10.30 la successiva sarebbe l’8 aprile/10.30
Se l’ultima pioggia fosse stata il 7 aprile/10.00, l’irrigazione verrebbe ritardata di 2 gg, quindi il 10 aprile/10.30
Se invece fosse stata il 7 aprile/11.00 (nelle 24 ore precedenti alla schedulazione dell’8 aprile/10.30 ), verrebbe rimandata di 3gg, l’11 aprile/10.30
Ad oggi non esiste il controllo di autodelayrain solo per ciascuna EV. E’ una variabile globale.

EV1_PROGRESSIVE_RAINSENSORQTYpermette di controllare il tempo di irrigazione dinamicamente in proporzione alla quantità di pioggia precipitata – integrazione disponibile solo con rainsensorqty.

GESTIONE FILE DI SCHEDULAZIONE /etc/piGarden.sched

/etc/piGarden.sched e’ il file di schedulazione. Alla prima esecuzione piGardenSched.sh crea il file configurazione vuoto.
E’ possibile popolarlo editandolo manualmente anche se sconsigliato, in quanto potrebbero verificarsi errori di sintassi.

Vi sono diverse opzioni che servono per popolare il file di schedulazione. Le vediamo di seguito ad una ad una con il corrispondente output.
E’ sempre possibile eseguire ./piGardenSched.sh help per avere un riepilogo delle diverse opzioni presenti.

La prima opzione che vediamo e’ add. Serve per inserire una entry. Con piGardenSched.sh si fa riferimento alle EV con il numero progressivo, ovvero EV1, EV2 e cosi’ via.
La prima esecuzione con parametri insufficienti – crea nel comtempo il file di configurazione vuoto:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh add EV1 
WARNING: piGarden_sched Config file not found in /etc/piGarden.sched
creating empty file
18:38:42-24/04/19 ERROR: 4 parameters needed
piGardenSched.sh add ev? duration time frequency
pi@raspberrypi:~/piGardenSched $

Con i parametri corretti: cioe’ il nome della EV; la durata in minuti dell’irrigazione; l’orario di schedulazione; e la frequenza in giorni, 1 significa ogni giorno; due ogni due giorni (1 si’ e 1 no), e cosi’ via.

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh add EV1 20 14:00 1
18:39:10-24/04/19 SUCCESS adding new schedule for EV1
pi@raspberrypi:~/piGardenSched $

E’ sempre possibile verificare il contenuto del file eseguendo il comando:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV1;20;14:00;1;active
pi@raspberrypi:~/piGardenSched $

Lo si puo’ anche visualizzare direttamente, ma verranno visualizzati anche i commenti:

pi@raspberrypi:~/piGardenSched $ cat /etc/piGarden.sched
#piGarden.sched config file
#author: androtto
#version 0.2.1
#format file
#1st field;2nd field;3rd field;4th field;5th field
#EV?;duration;time;every_X_days;active|inactive
#EV?;duration;EV?_previous
#time is HH:MM 24h format
#every_X_days means daily frequency, 1= every day, 2=every three days (first yes, second no)),3= every three days (first yes, second and third no), etc...
EV1;20;14:00;1;active
pi@raspberrypi:~/piGardenSched $

piGardenSched gestisce l’irrigazione sequenziale concatenando in sequenza le EV specificate attraverso l’opzione seq. Viene quindi schedulata solo la prima EV e le successive verranno comandate in sequenza.

La sequenza deve coincidere con l’ordine numerico; cioè possono essere in sequenza le EV 1 2 3 4, oppure le 3 4 5, ma non le 4 3 6, ne’ 2 3 5.
Per poter funzionare il comando, la prima EV deve essere presente.
Ad esempio, pur essendo corretta la sequenza del comando successivo, va in errore perche’ EV2 non e’ presente:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh seq EV2 EV3 EV4
00:02:38-29/04/19 ERROR:first member EV2 of sequence NOT found
pi@raspberrypi:~/piGardenSched $

Mentre e’ corretta la prossima esecuzione, per la quale, non essendo gia’ presenti le EV 2 3 e 4, la durata di apertura viene ereditata dalla EV1 (20 minuti):

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh seq EV1 EV2 EV3 EV4
18:39:49-24/04/19 NORMAL: first member EV1 of sequence is present
18:39:49-24/04/19 SUCCESS creating sequence EV1 EV2 EV3 EV4
pi@raspberrypi:~/piGardenSched $

 

Per controllare il contenuto:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV1;20;14:00;1;active
EV2;20;EV1;;
EV3;20;EV2;;
EV4;20;EV3;;
pi@raspberrypi:~/piGardenSched $

 

Se uso l’opzione add facendo riferimento ad una entry gia’ esistente ottengo un errore:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh add EV1 20 14:00 1
ERROR: EV4 is already present; use "add_time, change_time, change_freq or change_dur" option
18:40:06-24/04/19 ERROR adding new schedule for EV4
pi@raspberrypi:~/piGardenSched $

Non e’ quindi possibile aggiungere due volte la stessa entry. Se si vuole fare piu’ schedulazioni e’ possibile aggiungere un altro orario:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh add_time EV1 15:55
19:01:03-24/04/19 NORMAL: 14:55 added to EV1 entry
pi@raspberrypi:~/piGardenSched $

e conseguente verifica:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV1;15;16:00,14:55;1;inactive
EV2;15;EV1;;
EV3;15;EV2;;
EV4;15;EV3;;
pi@raspberrypi:~/piGardenSched $

La schedulazione con piu’ orari e’ solo possibile se la frequenza giornaliera e’ a 1.

Ad oggi non vi e’ nessun controllo se le schedulazioni sulla stessa EV si sovrappongono: EV1 con schedulazione 15:55 e 16:00 con durata di 15 minuti.

E’ possibile eliminare un orario dalla schedulazione:
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh del_time EV1 16:00
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV1;15;14:55;1;inactive
EV2;15;EV1;;
EV3;15;EV2;;
EV4;15;EV3;;
pi@raspberrypi:~/piGardenSched $
Oppure posso sostituire tutte quelle presenti (anche se solo una) con una nuova:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh change_time EV1 16:00
00:06:49-29/04/19 NORMAL: change done
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV1;20;16:00;1;active
EV2;20;EV1;;
EV3;20;EV2;;
EV4;20;EV3;;
pi@raspberrypi:~/piGardenSched $

Non e’ possibile cambiare l’orario o la frequenza di un membro, che non sia il primo, di una sequenza:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh change_time EV3 16:00
00:08:25-29/04/19 ERROR: cannot change scheduled time for a sequential irrigation - EV3 will run after EV2
pi@raspberrypi:~/piGardenSched $
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh change_freq EV3 3
00:09:04-29/04/19 ERROR: cannot change frequency for a sequential irrigation - EV3 will run after EV2
pi@raspberrypi:~/piGardenSched $

Mentre per la durata e’ possibile:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh change_dur EV2 15
00:10:56-29/04/19 NORMAL: change done
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh change_dur EV4 25
00:11:04-29/04/19 NORMAL: change done
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV1;20;16:00;1;active
EV2;15;EV1;;
EV3;20;EV2;;
EV4;25;EV3;;
pi@raspberrypi:~/piGardenSched $

E’ altresi’ possibile annullare la sequenza; le nuove entry verranno automaticamente schedulate per gli orari calcolati come se fossero in sequenza:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh noseq
00:12:18-29/04/19 NORMAL: change done
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV1;20;16:00;1;active
EV2;15;16:20;1;active
EV3;20;16:35;1;active
EV4;25;16:55;1;active
pi@raspberrypi:~/piGardenSched $

Errore di esecuzione opzione seq con ordine non in sequenza:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh seq EV1 EV2 EV4
ERROR: wrong sequence given EV1 EV2 EV4
number are not contiguous or repeated (1 2 4 )
pi@raspberrypi:~/piGardenSched $

mentre e’ corretta:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh seq EV2 EV3 EV4
00:14:25-29/04/19 NORMAL: first member EV2 of sequence is present
00:14:25-29/04/19 SUCCESS creating sequence EV2 EV3 EV4
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV1;20;16:00;1;active
EV2;15;16:20;1;active
EV3;20;EV2;;
EV4;25;EV3;;
pi@raspberrypi:~/piGardenSched $

e puo’ essere ripristinata la sequenza originale senza dover rimuovere quella eventualmente parzialmente presente:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh seq EV1 EV2 EV3 EV4
00:15:51-29/04/19 NORMAL: first member EV1 of sequence is present
00:15:51-29/04/19 SUCCESS creating sequence EV1 EV2 EV3 EV4
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV1;20;16:00;1;active
EV2;15;EV1;;
EV3;20;EV2;;
EV4;25;EV3;;
pi@raspberrypi:~/piGardenSched $

Questa volta essendo le entry della sequenza presenti, la durata viene mantenuta e non ereditata dalla prima EV1.

Possiamo aggiungere una nuova EV:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh add EV5 20 18:00 1
00:19:07-29/04/19 SUCCESS adding new schedule for EV5
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV1;20;16:00;1;active
EV2;15;EV1;;
EV3;20;EV2;;
EV4;25;EV3;;
EV5;20;18:00;1;active
pi@raspberrypi:~/piGardenSched $

Ma deve essere dichiarata in /etc/piGarden.conf . Ad esempio, avendo impostato in tale file di configurazione EV_TOTAL=6, non posso aggiungere EV7:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh add EV7 20 19:00 1
00:19:38-29/04/19 ERROR: EV7 is NOT between range (EV_TOTAL = 6 )
00:19:38-29/04/19 ERROR: EV7 is not a valid EV
pi@raspberrypi:~/piGardenSched $

Cosi’ come non sono permessi errori specificando in modo errato l’EV:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh add EV6_ALIA 20 19:00 1
00:20:06-29/04/19 ERROR: EV6_ALIA format is NOT right "EV[0-9] or EV[0-9][0-9]"
00:20:06-29/04/19 ERROR: EV6_ALIA is not a valid EV
pi@raspberrypi:~/piGardenSched $
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh add EV6 20 19:00 1
00:20:34-29/04/19 SUCCESS adding new schedule for EV6
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV1;20;16:00;1;active
EV2;15;EV1;;
EV3;20;EV2;;
EV4;25;EV3;;
EV5;20;18:00;1;active
EV6;20;19:00;1;active
pi@raspberrypi:~/piGardenSched $

Vengono fatti i controlli sulle EV come abbiamo visto poco fa, sugli orari (23:61 non è permesso) e sulle durate e frequenze (numeri):

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh change_dur EV5 20A
ERROR: 20A is not a valid duration in minutes
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh change_dur EV5 20
18:41:27-24/04/19 NORMAL: change done
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh change_time EV5 15:65
ERROR: 15:65 is not a valid time
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh change_time EV5 24:65
ERROR: 24:65 is not a valid time
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh change_time EV5 23:59
18:41:46-24/04/19 NORMAL: change done
pi@raspberrypi:~/piGardenSched $

E’ possibile variare la frequenza per EV5:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh change_freq EV5 3
00:23:29-29/04/19 NORMAL: change done
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV1;20;16:00;1;active
EV2;15;EV1;;
EV3;20;EV2;;
EV4;25;EV3;;
EV5;20;18:00;3;active
EV6;20;19:00;1;active
pi@raspberrypi:~/piGardenSched $

E’ possibile cancellare l’entry EV6:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh del EV6
00:24:57-29/04/19 NORMAL: found EV6 in line 6 - removed
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV1;20;16:00;1;active
EV2;15;EV1;;
EV3;20;EV2;;
EV4;25;EV3;;
EV5;20;18:00;3;active
pi@raspberrypi:~/piGardenSched $

Ma non l’entry di una sequenza:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh del EV2
00:25:32-29/04/19 ERROR: found EV2 in part of a concatenated irrigation
pi@raspberrypi:~/piGardenSched $

A meno che non sia la prima:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh del EV1
00:25:51-29/04/19 NORMAL: found EV1 in line 1 - removed
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV2;15;16:20;1;active
EV3;20;EV2;;
EV4;25;EV3;;
EV5;20;18:00;3;active
pi@raspberrypi:~/piGardenSched $

in tal caso la nuova prima diventa la EV2 con lo stesso orario di partenza: EV1 h 16:00 + 20′ di durata = 16:20

E’ possibile lasciare una schedulazione inattiva all’interno del file:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh disable EV2
00:32:28-29/04/19 NORMAL: change done
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV2;15;16:20;1;inactive
EV3;20;EV2;;
EV4;25;EV3;;
EV5;20;18:00;3;active
pi@raspberrypi:~/piGardenSched $

Riattivabile successivamente:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh enable EV2
00:33:28-29/04/19 NORMAL: change done
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV2;15;16:20;1;active
EV3;20;EV2;;
EV4;25;EV3;;
EV5;20;18:00;3;active
pi@raspberrypi:~/piGardenSched $

Ovviamente non e’ possibile farlo per le EV all’interno di una sequenza:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh disable EV3
00:33:35-29/04/19 ERROR: cannot enable EV3 because it's part of a sequential irrigation
pi@raspberrypi:~/piGardenSched $

ESECUZIONE DELLE SCHEDULAZIONI


come abbiamo anticipato prima, tutte gli stati delle schedulazioni e delle irrigazioni vengono registrate nella sottodirectory state.
Lasciamo questa configurazione dello schedulatore attiva per le prossime 24 ore e vediamo cosa otterremo:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh show
EV1;2;10:00;1;active
EV2;2;EV1;;
EV3;2;EV2;;
EV4;2;EV3;;
EV5;5;16:00;1;inactive
EV6;1;09:00,18:00;1;inactive
pi@raspberrypi:~/piGardenSched $

Successivamente e’ stata attivata la EV6:

pi@raspberrypi:~/piGardenSched/log $ ../piGardenSched.sh enable EV6
pi@raspberrypi:~/piGardenSched/log $ ../piGardenSched.sh show
EV1;2;10:00;1;active
EV2;2;EV1;;
EV3;2;EV2;;
EV4;2;EV3;;
EV5;5;16:00;1;inactive
EV6;1;09:00,18:00;1;active
pi@raspberrypi:~/piGardenSched/log $

Questa l’output del comando con opzione history (dopo solo un’irrigazione , quella delle 10):

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh history

NORMAL: irrigation for ZONA1_pratoSud is at 10:00 every 1 day(s) - ACTIVE
this is an ACTIVE concatenated irrigation: ZONA1_pratoSud ZONA2_pratoSudOvest ZONA3_pratoNordOvest ZONA4_pratoNord
history of irrigations:
Mon Apr 29 10:00:00 CEST 2019
pi@raspberrypi:~/piGardenSched $

Questo l’output con l’opzione irrigation:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh irrigation

EV ZONA1_pratoSud history of effective irrigation
Mon Apr 29 10:00:02 CEST 2019 for 2 mins

EV ZONA2_pratoSudOvest history of effective irrigation
Mon Apr 29 10:02:04 CEST 2019 for 2 mins

EV ZONA3_pratoNordOvest history of effective irrigation
Mon Apr 29 10:04:06 CEST 2019 for 2 mins

EV ZONA4_pratoNord history of effective irrigation
Mon Apr 29 10:06:09 CEST 2019 for 2 mins
pi@raspberrypi:~/piGardenSched $

L’opzione stat per verificare le irrigazioni schedulate presenti e future:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh stat

NORMAL: irrigation for ZONA1_pratoSud is at 10:00 every 1 day(s) - ACTIVE
last irrigation was on Mon Apr 29 10:00:00 CEST 2019
next irrigation will be on Tue Apr 30 10:00:00 CEST 2019
this is an ACTIVE concatenated irrigation: ZONA1_pratoSud ZONA2_pratoSudOvest ZONA3_pratoNordOvest ZONA4_pratoNord

WARNING: irrigation for Fragole is at 16:00 every 1 day(s) - INACTIVE
no previous irrigation
next irrigation will be today/tomorrow at 16:00

NORMAL: irrigation for Aiuola is at 09:00 every 1 day(s) - ACTIVE
no previous irrigation
next irrigation will be today/tomorrow at 09:00

NORMAL: irrigation for Aiuola is at 18:00 every 1 day(s) - ACTIVE
no previous irrigation
next irrigation will be today/tomorrow at 18:00
pi@raspberrypi:~/piGardenSched $

E’ possibile effettuare un reset degli stati registrati con il seguente comando:

pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh reset
00:37:08-29/04/19 NORMAL: resetting irrigation status for all EVs
tar: Removing leading `/' from member names
/home/pi/piGardenSched/state/
/home/pi/piGardenSched/state/ZONA1_pratoSud-irrigationhistory
/home/pi/piGardenSched/state/ZONA3_pratoNordOvest-irrigationhistory
/home/pi/piGardenSched/state/ZONA1_pratoSud-10:00.lastrun
/home/pi/piGardenSched/state/ZONA1_pratoSud-10:00.history
/home/pi/piGardenSched/state/ZONA4_pratoNord-irrigationhistory
/home/pi/piGardenSched/state/ZONA2_pratoSudOvest-irrigationhistory
pi@raspberrypi:~/piGardenSched $ ll state
total 0
pi@raspberrypi:~/piGardenSched $

E automaticamente viene fatto un backup del contenuto della directory sotto piGardenSched/bck

pi@raspberrypi:~/piGardenSched $ ll /tmp/piGardenSched
total 28
-rw-r--r-- 1 pi pi 1058 Apr 28 15:20 crontab
-rw-r--r-- 1 pi pi 955 Apr 29 00:28 crontab.output
-rw-r--r-- 1 pi pi 0 Apr 29 00:37 piGarden.sched
-rw-r--r-- 1 pi pi 157 Apr 29 00:36 piGarden.sched_2
-rw-r--r-- 1 pi pi 551 Apr 29 00:36 piGarden.sched_3
-rw-r--r-- 1 pi pi 10240 Apr 29 00:37 state_32327.tar
pi@raspberrypi:~/piGardenSched $ tar tvf bck/state_32327.tar
drwxr-xr-x pi/pi 0 2019-04-28 00:22 home/pi/piGardenSched/state/
-rw-r--r-- pi/pi 52 2019-04-28 00:45 home/pi/piGardenSched/state/ZONA1_pratoSud-irrigationhistory
-rw-r--r-- pi/pi 52 2019-04-28 00:47 home/pi/piGardenSched/state/ZONA3_pratoNordOvest-irrigationhistory
-rw-r--r-- pi/pi 11 2019-04-28 00:33 home/pi/piGardenSched/state/ZONA1_pratoSud-10:00.lastrun
-rw-r--r-- pi/pi 22 2019-04-28 00:33 home/pi/piGardenSched/state/ZONA1_pratoSud-10:00.history
-rw-r--r-- pi/pi 52 2019-04-28 00:48 home/pi/piGardenSched/state/ZONA4_pratoNord-irrigationhistory
-rw-r--r-- pi/pi 52 2019-04-28 00:46 home/pi/piGardenSched/state/ZONA2_pratoSudOvest-irrigationhistory
pi@raspberrypi:~/piGardenSched $

IL LOG DELLO SCHEDULATORE – piGardenSched.log

Con l’opzione verbose=yes di /etc/piGardenSched.con vengono attivati ulteriori messaggi (tipicamente con NORMAL come prefisso), come il seguente ogni minuto in assenza di schedulazioni:

01:14:01-29/04/19 NORMAL: no irrigation run at 01:14

La schedulazione di EV5 e’ disattivata pertanto alle 16:00 il messaggio riportato nel log e’:

09:00:01-29/04/19 NORMAL: piGarden drv_rainsensorqty service active - integration with piGardenSched is available
Mon Apr 29 09:00:00 CEST 2019 - START IRRIGATION Aiuola after 1 days
WARNING: single irrigation for Aiuola EV ( scheduled EV is Aiuola ) is INACTIVE - irrigation skipped

Cosi’ come alle 10:

10:00:01-29/04/19 NORMAL: piGarden drv_rainsensorqty service active - integration with piGardenSched is available
Mon Apr 29 10:00:00 CEST 2019 - START IRRIGATION ZONA1_pratoSud after 1 days
NORMAL: multi irrigation for ZONA1_pratoSud ZONA2_pratoSudOvest ZONA3_pratoNordOvest ZONA4_pratoNord EV ( scheduled EV is ZONA1_pratoSud ) is running
EV ZONA1_pratoSud lastrun updated
10:00:01-29/04/19 running nohup command "/home/pi/piGardenSched/include/irrigating.sh ZONA1_pratoSud:2 ZONA2_pratoSudOvest:2 ZONA3_pratoNordOvest:2 ZONA4_pratoNord:2
check logfile /home/pi/piGardenSched/log/ZONA1_pratoSud-10:00.log"

IL LOG DELL’IRRIGAZIONE (es. ZONA1_pratoSud-10:00.log – tipo “MULTI IRRIGATION”):

Con l’opzione verbose=yes di /etc/piGardenSched.conf vengono attivati ulteriori messaggi con prefisso NORMAL.
Vediamo il contenuto di tale log per la prima EV:

called irrigating.sh ZONA1_pratoSud:2 ZONA2_pratoSudOvest:2 ZONA3_pratoNordOvest:2 ZONA4_pratoNord:2
----- STARTING MULTI IRRIGATION - 4 EVs CONCATENATED -----
10:00:02-29/04/19 NORMAL: piGarden drv_rainsensorqty service active - integration with piGardenSched is available
10:00:02-29/04/19 NORMAL: $RAIN_GPIO is "drv:rainsensorqty" and "$autostoprain" yes - raincheck
10:00:02-29/04/19 NORMAL: ${EVNORAINQTY[1]} is 0 (or null) - raincheck QTY for ZONA1_pratoSud is active
10:00:02-29/04/19 NORMAL: ${EVNORAINCLASSIC[1]} is 1 - classic raincheck for ZONA1_pratoSud is disabled
10:00:02-29/04/19 NORMAL: starting irrigation EV ZONA1_pratoSud
TEST flag "/home/pi/piGardenSched/include/TEST" found - piGarden.sh open ZONA1_pratoSud not executed
10:00:02-29/04/19 NORMAL: piGarden drv_rainsensorqty service active - integration with piGardenSched is available
waiting 2 minutes 10:00:02-29/04/19 NORMAL: $RAIN_GPIO is "drv:rainsensorqty" and "$autostoprain" yes - raincheck
10:00:02-29/04/19 NORMAL: ${EVNORAINQTY[1]} is 0 (or null) - raincheck QTY for ZONA1_pratoSud is active
10:00:02-29/04/19 NORMAL: ${EVNORAINCLASSIC[1]} is 1 - classic raincheck for ZONA1_pratoSud is disabled
.10:01:02-29/04/19 NORMAL: $RAIN_GPIO is "drv:rainsensorqty" and "$autostoprain" yes - raincheck
10:01:02-29/04/19 NORMAL: ${EVNORAINQTY[1]} is 0 (or null) - raincheck QTY for ZONA1_pratoSud is active
10:01:02-29/04/19 NORMAL: ${EVNORAINCLASSIC[1]} is 1 - classic raincheck for ZONA1_pratoSud is disabled
.
TEST - piGarden.sh close ZONA1_pratoSud not executed
10:02:02-29/04/19 NORMAL: end irrigation EV ZONA1_pratoSud after 2 mins
[…] rimosse alcune linee
TEST flag "/home/pi/piGardenSched/include/TEST" found - piGarden.sh close ZONA4_pratoNord not executed
10:08:09-29/04/19 NORMAL: end irrigation EV ZONA4_pratoNord after 2 mins
----- FINISHED MULTI IRRIGATION ----

La prima riga riporta gli argomenti con cui e’ stato lanciato lo script: un argomento per EV con il nome:durata.
Viene specificato che trattasi di MULTI IRRIGATION
Tutti i messaggi NORMAL sono visibili per via dell’opzione verbose attiva. Vedremo che se disattivata il log sara’ piu’ conciso.
le prime 4 righe, cioe’ le:

10:00:02-29/04/19 NORMAL: piGarden drv_rainsensorqty service active - integration with piGardenSched is available
10:00:02-29/04/19 NORMAL: $RAIN_GPIO is "drv:rainsensorqty" and "$autostoprain" yes - raincheck
10:00:02-29/04/19 NORMAL: ${EVNORAINQTY[1]} is 0 (or null) - raincheck QTY for ZONA1_pratoSud is active
10:00:02-29/04/19 NORMAL: ${EVNORAINCLASSIC[1]} is 1 - classic raincheck for ZONA1_pratoSud is disabled

Sono verifiche per l’opzione autostoprain attiva per via dell’integrazione con drv_rainsensorqty . Lo verifica della presenza della pioggia viene effettuata prima dell’apertura dell’EV e durante il periodo di attivazione – cioe’ il parametro tempo di apertura/durata. Motivo per il quale sono presenti due blocchi di tali verifiche.
Ogni . (punto) riportato e’ un minuto passato. Vedremo la maggior leggibilita’ del log con verbose=no
La presenza del file vuoto /home/pi/piGardenSched/include/TESTevita l’apertura/chiusura dell’EV al fine dei test dello schedulatore.

IL LOG DELL’IRRIGAZIONE (es. Aiuola-18:00.log – tipo “SINGLE IRRIGATION”):

Mettiamo quindi verbose=no in /etc/piGardenSched.conf editando il file.

Di seguito il log dell’irrigazione dell’EV6, ovvero Aiuola:

called irrigating.sh Aiuola:1
----- STARTING SINGLE IRRIGATION -----
18:00:01-29/04/19 NORMAL: starting irrigation EV Aiuola
TEST flag "/home/pi/piGardenSched/include/TEST" found - piGarden.sh open Aiuola not executed
waiting 1 minutes .
TEST flag "/home/pi/piGardenSched/include/TEST" found - piGarden.sh close Aiuola not executed
18:01:01-29/04/19 NORMAL: end irrigation EV Aiuola after 1 mins
----- FINISHED SINGLE IRRIGATION -----

INTEGRAZIONE CON DRV_RAINSENSORQTY

Con l’ultima versione di rainsensorqty, (0.2.5 e successive), piGarden e’ in grado:

  • valutare la quantità di acqua nelle periodi precedenti alla schedulazione 
  • non eseguire l’irrigazione se la valutazione nel punto precedente ha determinato l’evento pioggia
  • interrompere l’irrigazione se l’evento pioggia avviene durante l’irrigazione
  • eseguire l’irrigazione dinamica 

Rimane supportata la gestione classica della pioggia, ovvero lasciando a piGarden la decisione di non fare partire o annullare l’irrigazione in caso di evento pioggia.

Dettagli sulla valutazione della quantità d’acqua

l’integrazione tra piGardenSched e drv_rainsensorqty è più dinamica in quanto lo schedulatore non richiede lo stato della piogga come piGarden ogni minuto, ma verifica la quantità di acqua precipitata nelle ore precedenti alla schedulazione contando gli impulsi e determinando lo stato di pioggia se questi superano il valore della variabile $RAINSENSORQTY_LOOPSFORSETRAINING

Se la schedulazione è:

  • ogni giorno
    • viene verificata la quantità di pioggia nelle 24 ore precedenti
  • ogni due giorni
    • viene verificata la quantità di pioggia nelle 24 ore precedenti e tra le 24 e 48 ore precedenti
  • ogni tre giorni
    • viene verificata la quantità di pioggia nelle 24 ore precedenti, tra le 24 e 48 ore precedenti e tra le 48 e 72 ore precedenti
  • ogni quattro giorni
    • viene verificata la quantità di pioggia nelle 24 ore precedenti, tra le 24 e 48 ore precedenti, tra le 48 e 72 ore precedenti e tra le 72 e 96 ore precedenti
  • e così via

irrigazione dinamica

viene valutato solo il periodo delle 24 ore precedenti all’irrigazioni. Se gli impulsi sono inferiori al numero espresso nella variabile $RAINSENSORQTY_LOOPSFORSETRAINING, l’irrigazione dinamica consente la riduzione del tempo di irrigazione in modo proporzionale.

Ad esempio se vengono contati 12 impulsi dei 16 necessari a determinare l’evento pioggia, significa che è piovuto il 75% della pioggia; l’irrigazione si ridurrà del 75%; quindi se normalmente a schedulazione è di 30 minuti, l’irrigazione ridotta del 75% significa che sarà 8 minuti (7,5 minuti arrotondati al minuto superiore).

FUNZIONI SPECIALI

L’eventuale creazione del file vuoto /home/pi/piGardenSched/include/TEST impedisce l’effettiva esecuzione dell’apertura chiusura delle valvole. Modalità utile se si vuole testare il funzionamento del nuovo schedulatore prima di metterlo in produzione.

7 pensieri su “piGardenSched uno schedulatore alternativo per piGarden

  1. Ciao,
    non ho capito se questa parte del progetto si integra con quello precedente o se è una cosa a parte. In particolare gli script che si potevano inserire nella cartella events sono ancora funzionanti?

  2. Scusate, ho provato e per esempio gli script in ev_open_before vengono eseguiti prima dell’apertura. Però se inserisco uno script così fatto

    #!/bin/bash
    /home/pi/piGardenSched/piGardenSched.sh change_dur EV1_ALIAS 1
    exit 0

    La durata dell’apertura della valvola non cambia, con il comando show vedo la corretta durata (1min) però, nell’occorrenza corrente il comando non ha effetto, come se lo lanciassi durante l’esecuzione di un irrigazione e non prima.

  3. Ciao Tommaso
    piGardenSched.sh è uno schedulatore, cioè lancia piGarden.sh open/close secondo alcune regole (a che ora, per quanto tempo e ogni quanti giorni). Si differenzia dallo schedulatore di piGarden in quanto non fa uso di crontab. Schedulare l’attivazione di una elottrovalvola (in breve EV) con piGarden significa impostare un orario di apertura e la chiusura ad un altro orario facendo uso appunto di crontab.
    Il comando da te riportato:
    /home/pi/piGardenSched/piGardenSched.sh change_dur EV1_ALIAS 1
    modifica la durata all’interno del file di schedulazione di piGardenSched (/etc/piGarden.sched ) ad 1 minuto per la EV1 (per convenzione tutte le elettrovalvole all’interno del file vengono chiamate con l’alias e non con il nome effettivo). Non ha nulla a che vedere con gli eventi di piGarden.
    ciao
    A

  4. Ciao, grazie della tempestiva risposta!
    Allora, mi sono spiegato male, io ho lanciato prima di tutto questo comando (scrivo a memoria):
    /home/pi/piGardenSched/piGardenSched.sh add EV1_ALIAS 5 16:00 1 che ha correttamente inserito in /etc/piGarden.sched l’evento corrispondente. Poi ho messo in ev_open_before lo script di cui ho parlato sopra, ed effettivamente quando viene lanciato l’evento in /etc/piGarden.sched cambia la durata da 5 minuti a 1 minuto. Però poi nella realtà la valvola si spegne dopo 5 minuti e non dopo 1.
    Spero di essere stato più chiaro.

  5. Bel lavoro, complimenti.
    Per questa parte non è ancora presenta una GUI dedicata corretto? È nella lista delle prossime realizzazioni?

    Complimenti ancora!
    Marco

  6. Ciao Marco
    mi sono perso un po’ e solo adesso ti rispondo…
    No, non c’è ancora una GUI dedicata. Lejubila è un po’ occupato in questo periodo e io non ho competenze per sviluppare la parte web. C’è da dire che una volta attivata la schedulazione, tutto si ripete.
    Andrea

Lascia un commento

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

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.