piGarden: gestione eventi

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:

EventoDescrizioneParametri passati
init_beforeViene innescato prima della chiamata di inizializzazione di piGarden (piGarden init)

$1 - nome evento
$2 - timestamp
init_afterViene innescato al termine della chiamata di inizializzazione di piGarden (piGarden init)

$1 - nome evento
$2 - timestamp
ev_open_beforeViene innescato prima dall'apertura di un'elettrovalvola

$1 - nome evento
$2 - alias elettrovalvola
$3 - force
$4 - timestamp
ev_open_afterViene innescato dopo dall'apertura di un'elettrovalvola

$1 - nome evento
$2 - alias elettrovalvola
$3 - force
$4 - timestamp
ev_close_beforeViene innescato prima della chiusura di un'elettrovalvola

$1 - nome evento
$2 - alias elettrovalvola
$3 - timestamp
ev_close_afterViene innescato al dopo la chiusura di un'elettrovalvola

$1 - nome evento
$2 - alias elettrovalvola
$3 - timestamp
ev_not_open_for_rainViene 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_onlineViene 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_sensorViene 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_beforeViene innescato prima del controllo meteo da parte del sensore

$1 - nome evento
$2 - state: rain | norain
$3 - timestamp
check_rain_sensor_afterViene innescato dopo ave eseguito il controllo meteo da parte del sensore

$1 - nome evento
$2 - state: rain | norain
$3 - timestamp
check_rain_sensor_changeViene 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_beforeViene innescato prima di eseguire il controllo meteo tramite servizio online

$1 - nome evento
$2 - state: rain | norain
$3 - timestamp
check_rain_online_afterViene innescato al termine dell'esecuzione del controllo meteo tramite servizio online

$1 - nome evento
$2 - state: rain | norain
$3 - timestamp
check_rain_online_changeViene 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.

22 pensieri su “piGarden: gestione eventi

  1. @lejubila
    ottimo lavoro, fra l’altro recepisce buona parte dei miei desiderata.
    Proverò queste nuove funzionalità al più presto.
    Ciao

  2. @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

  3. 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 ?

  4. @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

  5. 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

  6. 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 ?

  7. 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

  8. Ps chiedo perdono per gli accenti ho tastiera US e non so fare gli accenti

  9. @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).

  10. @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.

  11. 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 ?

  12. installato mosquitto su raspberry,se nel mio piccolo posso esserti di aiuto in qualche cosa ne sarei molto felice

  13. 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

  14. 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ò.

  15. @lejudila Felice di aiutarti ma dubito che tu avrai bisogno del mio aiuto

  16. 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

  17. 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.

  18. @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 ?

  19. @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.

  20. 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.

  21. Grande!!
    Lo aggiorno subito grazie !!!
    Ora sto giocando un po’ con gli esp8266 vorrei liberare un po’ di raspberry 🙂 vedo di integrarlo in pigarden.

  22. @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.

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.