PiGarden (il software che permette di trasformare il vostro Raspberry Pi in una centralina di irrigazione) dalla version 0.5.1 ha acquistato la gestione eventi: adesso sarà possibile fare eseguire i vostri script allo scaturire degli eventi innescati da piGarden. Per esempio sarà possibile eseguire l’invio di una mail all’apertura di un’elettrovalvola durante l’avvio dell’irrigazione, oppure sarà possibile non fare partire l’irrigazione in base a controlli che potrete inserire in un vostro script personalizzato. Ma andiamo con ordine e vediamo esattamente come funzione il tutto.
PiGarden permette di gestire diverse azioni, ognuna di queste fa innescare due eventi ai quali possono essere agganciati uno o più script da fare eseguire prima (eventi *_before) o dopo (eventi *_after) l’azione eseguita. Ad ogni script viene passato come primo argomento il nome dell’evento stesso, gli argomenti a seguire saranno diversi in base alla tipologia dell’evento innescato. Nella seguente tabella sono riportati gli eventi gestiti con relativa descrizione e argomenti passati agli script:
Evento | Descrizione | Parametri passati |
---|---|---|
init_before | Viene innescato prima della chiamata di inizializzazione di piGarden (piGarden init) | $1 - nome evento $2 - timestamp |
init_after | Viene innescato al termine della chiamata di inizializzazione di piGarden (piGarden init) | $1 - nome evento $2 - timestamp |
ev_open_before | Viene innescato prima dall'apertura di un'elettrovalvola | $1 - nome evento $2 - alias elettrovalvola $3 - force $4 - timestamp |
ev_open_after | Viene innescato dopo dall'apertura di un'elettrovalvola | $1 - nome evento $2 - alias elettrovalvola $3 - force $4 - timestamp |
ev_close_before | Viene innescato prima della chiusura di un'elettrovalvola | $1 - nome evento $2 - alias elettrovalvola $3 - timestamp |
ev_close_after | Viene innescato al dopo la chiusura di un'elettrovalvola | $1 - nome evento $2 - alias elettrovalvola $3 - timestamp |
ev_not_open_for_rain | Viene innescato quando all'attivazione di un'elettrovalvola questa non viene aperta a causa della pioggia | $1 - nome evento $2 - alias elettrovalvola $3 - timestamp |
ev_not_open_for_rain_online | Viene innescato quando all'attivazione di un'elettrovalvola questa non viene aperta a causa della pioggia rilevata dal servizio online | $1 - nome evento $2 - alias elettrovalvola $3 - timestamp |
ev_not_open_for_rain_sensor | Viene innescato quando all'attivazione di un'elettrovalvola questa non viene aperta a causa della pioggia rilevata dal sensore | $1 - nome evento $2 - alias elettrovalvola $3 - timestamp |
check_rain_sensor_before | Viene innescato prima del controllo meteo da parte del sensore | $1 - nome evento $2 - state: rain | norain $3 - timestamp |
check_rain_sensor_after | Viene innescato dopo ave eseguito il controllo meteo da parte del sensore | $1 - nome evento $2 - state: rain | norain $3 - timestamp |
check_rain_sensor_change | Viene innescato al cambio dello stato del sensore pioggia. L'evento verrà eseguito quando inizia o quando termina la pioggia | $1 - nome evento $2 - state: rain | norain $3 - timestamp |
check_rain_online_before | Viene innescato prima di eseguire il controllo meteo tramite servizio online | $1 - nome evento $2 - state: rain | norain $3 - timestamp |
check_rain_online_after | Viene innescato al termine dell'esecuzione del controllo meteo tramite servizio online | $1 - nome evento $2 - state: rain | norain $3 - timestamp |
check_rain_online_change | Viene innescato quando cambia lo stato meteorologico a seguito del controllo tramite servizio online. Verrà eseguito quanto inizia o termina la pioggia | $1 - nome evento $2 - state: rain | norain $3 - timestamp |
PiGarden adesso contiene una nuova sotto-cartella dal nome events che ha la seguente struttura:
events ├── check_rain_online_after ├── check_rain_online_before ├── check_rain_online_change ├── check_rain_sensor_after ├── check_rain_sensor_before ├── check_rain_sensor_change ├── cron_add_after ├── cron_add_before ├── cron_del_after ├── cron_del_before ├── ev_close_after ├── ev_close_before ├── ev_open_after ├── ev_open_before ├── ev_not_open_for_rain ├── ev_not_open_for_rain_online ├── ev_not_open_for_rain_sensor ├── exec_poweroff_after ├── exec_poweroff_before ├── exec_reboot_after ├── exec_reboot_before ├── init_after ├── init_before └── scripts ├── sendmail.sh ├── testeventbreak.sh └── testevent.sh
Ogni sotto directory, ad esclusione di scripts, identifica un evento specifico. Gli script da fare eseguire dovranno essere posizionati (o creato un link simbolico) nella relativa cartella che identifica l’evento. In presenza di più script, questi verranno eseguiti in ordine alfabetico.
Quando sono presenti più script per un singolo evento, uno di questi potrà interrompere l’esecuzione dei successivi uscendo con un exit code diverso da zero (es: exit 1).
Una nota particolare va fatta per l’evento ev_open_before. Gli script eseguiti da questo evento hanno la facoltà di impedire l’apertura dell’elettrovalvola che si appresta ad entrare in funzione. Basterà infatti fare terminare lo script con un codice di uscita diverso da zero (es: exit 1). Così facendo oltre a interrompere l’esecuzione di eventuali script successivi verrà anche impedita l’apertura dell’elettrovalvola.
Una nota particolare va fatta per la cartella scripts. Questa è adibita a contenere gli script da associare agli eventi. E’ infatti consigliabili posizionare gli script qui dentro e successivamente creare dei link simbolici nelle directory relative agli eventi a cui vogliamo che vengano associati.
Nella cartella scripts, sono presenti tre esempi da potere prendere come da campione. Tra questi vi è lo script sendmail.sh, che potete utilizzare questo come modello per crearne uno vostro (es: sendmail_custom.sh) personalizzandolo con i vostri dati e successivamente creare il link simbolico negli eventi che desiderate, in modo che venga inviata una mail al loro innesco.
Spero che questa nuova funzione possa essere utile a molti. Mi raccomando se create degli script interessanti da fare eseguire allo scaturire dei vari eventi, non mancate di condividerli in modo da poterli inserire nelle prossime versioni di piGarden.
@lejubila
ottimo lavoro, fra l’altro recepisce buona parte dei miei desiderata.
Proverò queste nuove funzionalità al più presto.
Ciao
@lejubila
sto provando la gestione eventi per l’invio di email tramite codice python, sinora ho un solo piccolo problema, sembra che il parametro $2 (timestamp) dell’evento init_after non venga valorizzato, comunque potrebbe essere un mio errore che ancora non invividuo.
A breve proverò, sempre con codice python, ad utilizzare la gestione eventi per popolare un database MySql (MariaDB), a tal proposito pensavo che potrebbe essere utile estendere questa nuova funzionalità anche alle opreazioni di schedulazione ed al setup iniziale. Pensi sia possibile?
Grazie.
Ciao
Ciao @Ivano,
per quanto riguarda gli eventi init_* è presente un bug per cui viene passato il timestamp come terzo parametro anziché secondo. A breve rilascerò il fix.
Per quanto riguarda gli eventi che proponi di aggiungere, se ho capito bene, vorresti che alla conferma di una schedulazione da interfaccia web venisse scaturito un’evento. Stessa cosa alla conferma del setup iniziale ?
Mi confermi quanto sopra ?
@lejubila,
hai capito bene, io credo che allargare la gestione degli eventi, con le stesse modalità utilizzate per quanto già fatto, a tutte le operazioni possa essere una cosa utile.
L’estensione, a mio avviso, consentirebbe di utilizzare lo strumento così ben fatto aumentando la flessibilità, già introdotta con le gestione dei driver, ciò potrebbe soddisfare un largo ventaglio di esigenze degli utilizzatori pur mantenendo il giusto livello di astrazione e generalità indispensabile per uno strumento non di nicchia e/o specializzato per la singola situazione.
Grazie.
Ciao
Complimenti ottimo lavoro con questi script finalmente riesco a controllare un elettrovalvola senza doverla collegare direttamente al raspberry, ma sempicemente usando un esp8266 via mqtt.
Grazie davvero
Ciao Stefano,
sarei interessato ad approfondire l’argomento esp8266.
Potresti condividere qualche spunto su come sei riuscito a controllare l’elettovalvola senza necessità di collegarla fisicamente ?
Ma guarda in modo molto semplice ho usato un elettrovalvola finta,nel senso che e impostata nel file di configurazione ma non esiste fisicamente il collegamento con il raspberry,mi serve semplicemente per gestire uno script inserito sulla directory ev_open_before, nello script valuto se l’evento e scatenato da quella elettrovalvola finta,se si semplicemente mi lancia un comando mosquitto_pub che viene elaborato dall’esp8266 e apre la valvola poi un altro script in ev_open_close per chiudere la valvola, nel mio caso e comodissimo per poter gestire le valvole in punti del giardino dove non posso portare il collegamento con il raspberry.
Spero di esser stato chiaro non sono bravo a spiegare le cose
Ps chiedo perdono per gli accenti ho tastiera US e non so fare gli accenti
@Stefano
Si avevo intuito che avevi definito una zona fittizia. Quello che volevo chiedere era come sei riuscito a interfacciare l’elettrovalvola con l’esp8266: hai eseguito qualche guida in particolare ? L’argomento mi interessa ma per ora ne sono completamente all’oscuro. Sarebbe interessante realizzare un driver per piGarden in modo da potere controllare l’elettrovalvola con l’esp8266 in modo nativo (le ultime versioni di piGarden supportano la realizzazione di driver per pilotare i sensori con strumenti di terze parti).
@lejubila ho visto la possibilità di usare i driver,ho semplicemente collegato un relay al esp quando tramite mqtt gli passo il topic apri l’esp apre quel contatto,la mia gestione attualmente e molto rudimentale uso due differenti topic apri/chiudi quando basterebbe un solo topic con il valore apri/chiudi ma sto facendo solo dei test,per scrivere il programma che gira sul esp ci sono molti tool compreso l’ÍDE di arduino, io ho usato B4R semplice e veloce.
Ciao @stefano,
grazie per i chiarimenti, solo un’ultima curiosità.
Leggendo riguardo il protocollo mqtt ho visto che questo per funzionare ha bisogno di un terzo elemento (il broker) che faccia da intermediario tra client e server. Hai usato un servizio esterno oppure hai installato mosquitto sul raspberry ?
installato mosquitto su raspberry,se nel mio piccolo posso esserti di aiuto in qualche cosa ne sarei molto felice
Un ulteriore utilizzo che ho intenzione di fare di un esp e il controllo di quando parte la pompa che gestisce l’irrigazione,per evitare che qualche rottura/perdita mi faccia partire la pompa quando non dovrebbe,penso di fare controllando l’accensione di una lampada con un sensore di luminosità,se PiGarden supportasse nativamente gli esp potrebbe esser più facile gestire il rispetto delle schedulazioni, e non dover gestire separatamente tutte le volte che la pompa parte e verificare se la partenza e un irrigazione programmata oppure una anomalia.
Ma non ho la più pallida idea della complessità a far gestire nativamente gli esp a PiGarden
Ciao @Stefano,
è da un anno che avevo un esp8266 da una parte a prendere polvere. Grazie al tuo commento mi hai fatto rivenire voglia di approfondire l’argomento. In questo fine settimana ho iniziato a dare un’occhiata alla documentazione. Sicuramente si avrò bisogno in seguito ti chiederò.
@lejudila Felice di aiutarti ma dubito che tu avrai bisogno del mio aiuto
ciao, se vi può interessare io ho aggiunto sotto scripts un sh dove vado a gestire gli eventi via telegram.
mi sono agganciato a questo servizio https://rpinotify.it e una volta recuperato il token ho creato lo scripts (serve il curl come pacchetto) e poi ho fatto dei link simbolici per gestire ev_open/close_after:
pi@pigarden:~/piGarden/events/scripts $ cat rpinotify.sh
#!/bin/bash
#definizione del token
TOKEN=””
#modifica della variabili che arrivano da pigarden
testonoti=”Elettrovalvola “$2
#trasformo lo unix timestamp in qualcosa di leggibile
moddata3=`date -d “@\$3″`
moddata4=`date -d “@\$4″`
case $1 in
ev_open_after) testonoti=${moddata4}” “${testonoti}” Aperta”;;
ev_close_after) testonoti=${moddata3}” “${testonoti}” Chiusa”;;
*) ;;
esac
#chiamata del servizio
curl -X POST -F “text=$testonoti” https://api.rpinotify.it/message/$TOKEN/
spero vi possa essere di aiuto
ciao
marco
Ciao @marco,
wow …. grazie per il tuo contributo.
Ho già provato lo script e funziona alla grande.
Vedo di ampliarlo perché possa gestire anche gli altri eventi e poi lo aggiungo aggiungo al a piGarden.
@lejubila
felice di aver dato una mano 🙂
quello che invece non riesco a gestire con gli eventi (per lo meno non ci sono ancora arrivato) è il messaggio che l’elettrovalvola non viene aperta in caso di pioggia, l’ho trovato nei log ma se metto lo scripts in qualsiasi evento check_rain_online_* mi messaggia più di mia moglie 🙂 se lo metto in ev_open_after invece non parte se piove, come giustamente gli ho detto di fare e quindi non scatena l’evento.
Questo è il log che ho trovato e che vorrei gestire negli eventi :
Sun Apr 29 21:00:03 CEST 2018 Solenoid ‘Giardino_Grande’ not open for rain (online check)
che tu sappia esiste un evento che gestisce quella unica apertura che ev_open_after non gestisce ?
@mark
purtroppo attualmente non è gestito un evento che viene innescato quando un’elettrovalvola non viene aperta in caso di pioggia. Lo posso comunque implementare ….. ti aggiorno appena l’ho aggiunto.
In alternativa potrebbero esserti utili gli eventi check_rain_online_change e check_rain_sensor_change che vengono innescato solo al cambio delle condizioni meteo.
Ciao @mark,
ho rilasciato una nuova versione (v0.5.6) che implementa tre nuovi eventi ev_not_open_for_rain, ev_not_open_for_rain_online e ev_not_open_for_rain_sensor. Con questi puoi farti notificare le mancate aperture delle elettrovalvole a causa della pioggia.
Grande!!
Lo aggiorno subito grazie !!!
Ora sto giocando un po’ con gli esp8266 vorrei liberare un po’ di raspberry 🙂 vedo di integrarlo in pigarden.
@mark
è un mesetto che ci sto sperimentando anche io con un esp8266.
Ho implementato una gestione per il controllo di un modulo relè.
I relè possono essere comandati tramite interfaccia web, mqtt e socket server compatibile con piGarden. Con questa ultima opzione possiamo comandare delle elettrovalvole monostabili senza che siano fisicamente collegate direttamente al raspberry.
Devo fare gli ultimi ritocchi e poi lo pubblico.
Ciao!
Innanzitutto complimenti per il progetto. Io ho scritto un piccolo script in python che mi fa una specie di stima sulle previsioni di pioggia in millimetri per i prossimi giorni. Mi piacerebbe poter variare il tempo di irrigazione odierno in base alle previsioni di pioggia future. Il problema è che non sono molto abile con i bash script.
Immagino che convenga mettere lo scritp in ev_open_before che dovrà essere composto dalle seguenti parti:
1- richiamare il mio script che mi restituisce un numero compreso fra 0 e bho(200-300 massimo immagino).
2-partendo da una base di irrigazione per 30 minuti, decidere se innaffiare per meno tempo o sospendere del tutto l’irrigazione. Pensavo di togliere 1 min ogni 5mm.
3-cancellare lo scheduling del close delle elletrovalvole.
4-inizializzare un nuovo scheduling close con il nuovo tempo di irrigazione.
Scusate se sono stato incomprensibile, nel mio caso la questione è più semplice perchè ho solo 1 zona da irrigare, e lo faccio sempre allo stesso orario.
Ciao Tommaso
ho visto che hai postato anche nella sezione di piGardenSched
Leggendo questo commento, capisco meglio la tua richiesta.
Puoi provare ad installare piGardenSched (segui tutte le istruzioni nel post relativo) e utilizzare solo l’esecutore di piGardenSched, cioè:
/home/pi/piGardenSched/include/irrigating.sh
lo puoi lanciare con un argomento EV:durata
dove EV è il nome della tua zona impostato in /etc/piGarden.conf – ad esempio PRATO
e durata il tempo che vuoi impostare in minuti (30 nell’esempio che segue) che varierai in base alle tue esigenze.
lo script sarà lanciato così:
/home/pi/piGardenSched/include/irrigating.sh PRATO:30
il vantaggio di usare irrigating.sh è quello di poter registrare l’effettiva irrigazione nel tempo con il comando a cui aggiungo l’output della mia configurazione:
pi@raspberrypi:~/piGardenSched $ ./piGardenSched.sh irrigation
EV Aiuola history of effective irrigation
Sun Jun 2 06:00:01 CEST 2019 for 30 mins
Tue Jun 4 06:00:02 CEST 2019 for 30 mins
Thu Jun 6 06:00:01 CEST 2019 for 30 mins
Sat Jun 8 06:00:01 CEST 2019 for 30 mins
Mon Jun 10 06:00:01 CEST 2019 for 30 mins
in alternativa potretsi provare ad usare una funzione diretta di piGarden (estratto da help):
piGarden.sh open_in minute_start minute_stop alias [force] open a solenoid in minute_start for minute_stop
non ho però esperienza né posso fare delle prove (sono in ferie…)
Magari David ti riesce a dare delle dritte, ma forse ti basta fare delle prove.
ciao
A
Mi potresti spiegare il parole poverissime come faccio a far spedire una mail quando si avvia e quando si chiude un elettrovalvola?
Purtroppo non conosco per niente Python o la programmazione in generale
Grazie mille
Ciao @Tommaso,
si puoi farlo dall’evento ev_open_before lanciando il tuo script python e da li gestire la cancellazione del del cron di chiusura e successivamente ridefinendola a tuo piacimento lanciando la creazione del nuovo cron di chiusura tramite lo script piGarden.sh.
Ciao @Fabio,
piGarden non è scritto in python quindi non serve conoscerlo 😉
Per inviare una mail ad apertura/chiusura elettrovalvola c’è già lo script bash che ti permette di farlo. Ti cito qui sotto la parte dell’articolo dove viene spiegato:
Questo ti fa capire quanto io ne capisca di programmazione.
Come faccio a creare il link simbolico?
Non so proprio da che parte iniziare
Vado a memoria:
cd
cd events\scripts
cp sendmail.sh sendmail_custom.sh
ln -s sendmail_custom.sh ../ev_open_after/sendmail_custom.sh
ln -s sendmail_custom.sh ../ev_close_after/sendmail_custom.sh
Fatto questo devi modificare sendmail_custom.sh e impostare i parametri
TO=”mail@destination.com”
FROM=”piGarden@your_domain.com”
Poi devi installare ssmstp per poter inviare la mail dal raspberry:
Che dirti??
Grazie mille e complimenti per tutto il lavoro fatto!!!
Non mi arrivano le mail
SSMTP funziona infatti da terminale riesco a spedire tranquillamente
I link li ho creati infatti nelle cartelle /events/ev_**** corrispondenti i link ci sono ma se lancio o stoppo l’irrigazione non mi arrivano le mail.
Cosa sbaglio?
Aiuto!!!!
Lo script sendmail_custom.sh ha permesso di esecuzione?
chmod +x sendmail_custom.sh
si . ma non vanno lo stesso.
Ciao lejubila, complimenti per il lavoro, ben fatto!
Vorrei integrare al tuo progetto la possibilità di poter leggere da dei sensori (temperatura, umidità del terreno, ph…) tramite l’utilizzo di una scheda esp8266 (una per per ogni sensore) e inviare i dati ricevuti al db sqlite di piGarden. Hai idea di come fare nello specifico? Ho letto nei commenti che avevi in cantiere questa possibilità…
Ciao @Andrea,
attualmente il progetto piGarden é abbastanza fermo per mancanza di tempo da parte mia.
Per implementare questa funzione devo mettere mano sia a piGarden (per la ricezione dei dati) che piGardenWeb (per la raccolta su db).
Terrò in considerazione questa nuova funzionalità ma sicuramente non arriverà a breve.
anche io ero qui a chiedere se si poteva installare piGarden su Home Assistant
al posto di usare un RPI per pigarden utilizzare un esp32 con scheda relay e collegare questa a HA
Ciao @ilgio,
piGarden è uno script bash per cui ha bisgno di raspberry o una macchina linux su cui girare. Le elettrovalvole però non è necessatrio che siano collegate direttamente al raspberru. Puoi utilizzare altri dispositivi che supportino Tasmota oppure è possibile scrivere un apposito driver con cui interfacciarsi con il nuovo disositivo.
ciao Lejubila,
sul mio RPi3, con debian buster aggiornata, sto cercando di attivare la notifica via mail e incontro dei problemi con ssmtp che, però, su debian buster risulta inefficiente, addirittura deprecato.
questo l’errore, pur avendo seguito le indicazioni:
SSMTP mail error : exited with a non-zero status
infatti qui https://www.raspberrypi.org/forums/viewtopic.php?t=252449 – in uno dei vari post che ne trattano – leggo:
“ssmtp will not work with raspbian buster, and as ssmtp is no longer maintained its unlikely that it ever will.
you need to switch to using msmtp in place of ssmtp on buster.”
Ti risulta lo stesso problema su buster?
Sto provando ad integrare il comando di sendEmail (con cui ho già avuto successo in altri scenari) nello script sendmail.sh, ma non ho ancora avuto successo.
La mail di notifica viene attivata anche quando avvio manualmente l’irrigazione o solo con gli avvi/spegnimenti programmati?
Comunque, continuerò lavorarci e a provare.
Nel caso ti interessi, fammelo sapere.
Mario
Ciao Lejubila e grazie ancora per il tuo lavoro!
Purtroppo rpinotify non è più disponibile (non so se qualcuno l’aveva già scritto da qualche parte…perdono) ma poco male! Con Telebot, e qualche oretta di lavoro ho sviluppato un bot per altri scopi che in realtà sarà facile far interagire direttamente con piGardenWeb, facendogli lanciare dei comandi via mqtt.
Ci sto ancora lavorando, ma x ora semplicemente con curl e l’api pubblica di telegram si riescono facilmente ad inviare messaggi!
Spero di aver tempo per continuare lo sviluppo e dare aggiornamenti!!
Ciao!
Ciao @Matteo,
si lo so… rpinotify non funziona più 🙁
Sarebbe veramente bello potere avere un bot Telegram su cui ricevere le notifiche di piGarden. Ancora più interessante sarebbe potere comandare piGarden tramite lo stesso bot.
Se riesci a fare qualcosa fammi sapere.
Ciao Andrea, posso suggerirti di sistemare meglio la parte dove spieghi i comandi da dare per installare il tuo schedulatore, in modo da dividere i comandi dal loro risultato?
“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 $”
In questo estratto il comando e il suo risultato risultano un po’ confusi e potrebbero confondere un neofita dell’argomento.