Impianto di irrigazione con Raspberry Pi: piGardenWeb, il pannello web di amministrazione (settima parte)

pigardenweb dashboard

Dopo molti mesi finalmente sono riuscito a rilasciare l’interfaccia web di gestione della centralina del nostro impianto di irrigazione basato su Raspberry Pi.

Il pannello di amministrazione ci permetterà di comandare tramite browser da pc o smartphone, le diverse zone del nostro impianto di irrigazione, di programmarne le schedulazioni e di tenere sotto controllo le condizioni atmosferiche rilevate dal servizio online Wunderground.

L’applicazione web è basata sul framework Laravel 5.2 ed alcuni componenti di Backpack for Laravel. Gira sia su apache che nginx ed ha bisogno di un database per gestire le credenziali di accesso al pannello.

Per motivi di leggerezza in questo post verrà indicato come installarlo su nginx utilizzando sqlite come base dati.

PiGardenWeb comunica con piGarden, grazie al socket server implementato dalla versione 0.2 di quest’ultimo.

Installazione

Per funzionare piGardenWeb necessita di alcuni pacchetti tra cui php 5.5.9 o superiore. L’installazione può essere eseguita come segue:

sudo apt-get install nginx php5-fpm php5-cli php5-mcrypt php5-sqlite git

Una volta installato i pacchetti php è necessario fare alcune modifiche al file /etc/php5/fpm/php.ini in modo da decommentare la linea relativa a cgi.fix_pathinfo al quale andrà assegnato il valore zero, come segue:

cgi.fix_pathinfo=0

Dobbiamo abilitare i moduli php sqlite e mcrypt:

sudo php5enmod mcrypt
sudo php5enmod sqlite3

A questo punto scarichiamo con git piGardenWeb nella propria home:

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

Configuriamo nginx prendendo il file di configurazione presente in piGardenWeb e personalizzandolo se necessario:

cd
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.original
sudo cp piGardenWeb/virtualhost/nginx/default /etc/nginx/sites-available/default

Creiamo adesso il file di configurazione di piGarden, creiamo e inizializiamo il database, generiamo l’application key (necessaria per laravel) e impostiamo i giusti permessi ai file:

cd 
cd piGardenWeb
cp .env.example .env
touch database/piGarden.sqlite
./artisan key:generate
./artisan migrate
sudo chown -R pi:www-data /home/pi/piGardenWeb/
sudo chmod -R g+w storage database database/piGarden.sqlite

Facciamo partire il server web nginx:

sudo service nginx restart

Adesso se non lo avete già fatto installiamo piGarden, lo script bash di gestione della centralina ed avviamo il socket server per farlo comunicare con piGardenWeb. Per maggiori sull’installazione e configurazione piGarden vi invito a leggere il post Impianto di irrigazione con Raspberry Pi: piGarden, lo script di gestione (quinta parte):

cd
git clone https://github.com/lejubila/piGarden.git
cd piGarden
./piGarden.sh start_socket_server force

A questo punto aprendo il browser e puntando a su http://indirizzo_ip_del_tuo_raspberry_pi dovresti visualizzare la home page di piGardenWeb:

Home - piGardenWeb

Cliccando sul link Registrati posto in alto a destra è possibile creare l’utente con cui loggarsi successivamente al pannello di amministrazione:

Registrazione - piGardenWeb

Creato il primo utente è possibile quindi loggarsi dall’apposita pagina di login:

Login - piGardenWeb

Una volta loggati ci troveremo sulla dashboard di piGardenWeb da dove potremo aprire e chiudere l’elettrovalvole delle varie zone, controllare lo stato dell’ultima pioggia e le attuali condizioni meteorologiche:

Dashboard - piGardenWeb

Una volta arrivati alla dashboard, dobbiamo eseguire il setup iniziale in modo che vengano creati i crontab necessari per l’inizializzazione della centralina all’avvio del sistema, per l’avvio automatico del socket server e per il monitoring delle condizioni meteorologiche. Per fare questo dovrete raggiungere il menu SETUP / Setup Iniziale e cliccare sul pulsante Esegui il setup (nel caso abbiate già installato piGarden in precedenza, prima di eseguire il setup iniziale dovrete rimuovere dal crontab tutte le eventuali schedulazioni già create relative alla centralina).

Setup iniziale - piGardenWeb

Una volta eseguito il setup iniziale potremo disabilitare la registrazione pubblica degli utenti andando a variare il file .env impostando la variabile REGISTRATION_OPEN con il valore false:

REGISTRATION_OPEN=true

Dal file .env sarà possibile anche variare i parametri smtp utilizzati per l’invio delle notifiche via mail e in particolare quelle per eseguire il reset della password:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=your_address@gmail.com
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=your_address@gmail.com
MAIL_FROM_NAME=piGardenWeb

Oltre a quanto visto sopra da piGardenWeb potremo anche forzare l’apertura delle varie elettrovalvole in caso di pioggia e di gestire le schedulazioni di apertura e chiusura di ogni elettrovalvola:

Zona - piGardenWeb

Schedulazione - piGardenWeb

Possiamo anche gestire, aggiungere o rimuovere gli utenti che potranno accedere al pannello di amministrazione:

 

Utenti - piGardenWeb

Bene, per ora è tutto.

Nel caso troviate difficoltà a configurare l’ambiente oppure problemi di funzionamento fatemi sapere nei commenti.

A presto.

65 pensieri su “Impianto di irrigazione con Raspberry Pi: piGardenWeb, il pannello web di amministrazione (settima parte)

  1. @lejubila, ho terminato l’installazione seguendo le istruzioni fornite, spero di non aver dimenticato o sbagliato nulla, l’avvio del server piGarden non restituisce alcun errore ed correttamente registrato nel file di log, ma quando accedo al sito tramite il browser apache viene restituito il seguente errore:

    ErrorException in Filesystem.php line 111: file_put_contents(/home/pi/piGardenWeb/bootstrap/cache/services.php): failed to open stream: Permission denied

    Aggiungo che ho dato in permessi a www-data come indicato, inizialmente me ne ero dimenticato ed infatti veniva restituito un altro errore, di fatto non riusciva a scrivere il file di log nel folder piGardenWeb/storage/logs.
    Ciao

  2. Devi applicare i giusti permessi alle cartelle.
    Posizionati dentro la cartella piGardenWeb e impartisci i seguenti comandi:

    sudo chown -R pi:www-data /home/pi/piGardenWeb/
    sudo chmod -R g+w storage database database/piGarden.sqlite

    Fatto questo dovrebbe funzionare

  3. @lejubila operazione già eseguita, ti ricordo che io uso MySql( mariadb) per cui il file database/piGarden.sqlite non l’ho creato.
    Grazie.
    Ciao

  4. Posizionati nella cartelle piGardenWeb e prova impostare i permessi con i seguenti comandi

    sudo chown -R pi:www-data bootstrap/cache
    sudo chmod -R g+w bootstrap/cache

  5. @lejubila ti ringrazio per il supporto e mi scuso se torno a disturbarti.
    I comandi che mi hai suggerito hanno risolto il problema segnalato, quindi mi sono accorto di avere un problema sulla chiave di cifratura in qaunto mi ero dimenticato di eseguire i comandi “./artisan key:generate” e “./artisan migrate”.
    Finalmente sono arrivato alla home page, ma ora quando provo ad accedere alla pagine “Accedi” o “Registrati” mi voene restituito l’errore “Not Found” – “The requested URL /admin/register was not found on this server”.
    Ciao

  6. Ti ricordo che sto usando apache, per cui ho utilizzato il file da te predisposto disponibile in “/home/pi/piGardenWeb/virtualhost/apache/”
    Di nuovo

  7. Assicurati che esista il file
    /home/pi/piGardenWeb/public/.htaccess
    e che abbia i permessi di lettura per tutti gli utenti.
    Dopo di che verifica se il modulo rewrite è abilitato su apache, eventualmente abilitalo con
    sudo a2enmod rewrite
    e riavvia apache con
    sudo service apache2 restart

    Fammi sapere

  8. @lejubila ottimo, il modulo rewrite non era abilitato.
    Preciso solo che i servizi sono gestiti tramite systemd, per cui il comando che ho utilizzato è “sudo systemctl restart apache2”.
    Registrazione effettuata, sono state create 8 tabelle nel database MySql (MariaDB), molte di queste al momento sono vuote.
    Spero di aver risolto tutti i problemi di installazione e proseguire con il resto.

    Solo per promemoria (molto sintetico), magari può essere utile ad altri:
    Ambiente:
    Raspberry Pi 3 model B con Debian Strech (ultimo s.o. rilasciato), Apache, MySql (MariaDB), PHP7.

    Installazioni:
    piGarden
    ———–
    – git clone https://github.com/lejubila/piGarden.git
    – sudo apt-get install curl gzip grep sed ucspi-tcp #di fatto solo ucspi-tcp, gli altri già erano presenti
    – Jq come descritto nella guida (anche in questo caso alcuni moduli già erano presenti)
    – wiringPI è già installato di default (è necessario modificare il path nel file di configurazione di piGarden ==> GPIO=”/usr/bin/gpio”)

    piGardenWeb
    —————
    – git clone https://github.com/lejubila/piGardenWeb.git
    – sudo apt-get install php7.0-fpm php7.0-cli php7.0-mcrypt
    – sudo phpenmod mcrypt
    – modificato il file /etc/php/7.0/fpm/php.ini come indicato sulla guida
    – cd /home/pi/piGardenWeb/ ==> sudo ./artisan key:generate ==> sudo ./artisan migrate
    – sudo chown -R pi:www-data /home/pi/piGardenWeb/
    – cd /home/pi/piGardenWeb/
    – sudo chown -R pi:www-data bootstrap/cache
    – sudo chmod -R g+w storage database bootstrap/cache
    – sudo a2enmod rewrite ==> sudo systemctl restart apache2
    – creato utente (piGarden) e database (piGarden) in MySql
    – sudo cp /home/pi/virtualhost/apache/piGarden.conf /etc/apache2/sites-available/000-default.conf (nel mio caso potevo farlo in quanto al momento non erano presenti altri siti, altrimenti si devono seguire modalità diverse)

    P.S. ovunque ho modificato il contenuto di un file ho sempre fatto una copia della versione originale.

    Grazie di nuovo.
    Ciao

  9. @lejubila a seguito delle prime prove ho notato quanto segue:
    – viene tentato l’accesso al foglio di stile “/vendor/adminlte/plugins/daterangepicker/daterangepicker-bs3.css”, ma questo non esiste per cui HTTP 404
    – avviando una zona, p.e. subito per un minuto, l’immagine “sprinkler-pause.gif” viene sostituita con l’immagine “sprinkler-play.gif”, ma al termine del periodo di irrigazione non avviene l’inverso a meno che non si forzi l’aggiornamento della pagina.

    Con l’occasione aggiungo che nel mio ambiente jq può essere semplicemente installato “sudo apt-get install jq”, per cui sembra non siano necessarie tutte le operazioni indicate nel caso dell’installazione manuale.

    Infine, vorrei sapere se quando vengono inviate delle email utilizzando i parametri indicati nel file di configurazione .env

    Grazie.

    Ciao

  10. Riguardo al mancato ripristino dell’icona quando l’irrigazione di una zona termina, è strano che non funzioni. Ogni 20 secondi viene eseguita una chiamata ajax che recupera lo stato delle zone è imposta le relative icone.
    Potresti verificare nella console del browser se si verificano errori proprio durante queste chiamate ajax.

    Fammi sapere

  11. @lejubila, si avevo già notato, infatti, avendo utilizzato Firefox funziona correttamente, mentre con IE 11 si verifica il problema segnalato.
    Di seguito l’output della console , credo che il problema sia dovuto al metodo ‘startsWith’
    HTML1300: Navigation occurred.
    192.168.0.222
    SCRIPT438: Object doesn’t support property or method ‘startsWith’
    dashboard (4690,11)
    SCRIPT1006: Expected ‘)’
    backend.js (7,42)

    Ciao

  12. @lejubila sto continuando ad esplorare il sistema, confermo i complimenti per l’ottimo lavoro.
    Ovviamente le sigenze personali sono diversificate, inoltre, anche i desiderata si differenziano, per cui provo a segnalare alcune proposte, ovviamente solo per un confronto di idee.
    – Schedulazione irrigazione:
    1) a mio avviso potrebbe essere semplificata l’operazione lasciando un unico pannello ed intrducendo la possibilità di definire la durata (in minuti, ore), in questo modo con un’unica impostazione il sistema può aggiungere le entry di open e close nel crontab
    2) allo stato, se non erro, non è possibile effettuare schedulazioni con frequenza fissa, mi spego meglio p.e. volendo schedulazione una irrigazione ogni 2 giorni (48 ore) mi sembra che le uniche possibilità siano di selezionare i giorni (lunedì, mercoledì, venerdì, domenica), ma in questo modo si avrebbe una ripetizione dopo 24 ore fra domenica e lunedì, o di selezionare i giorni del mese (1, 3, 5, ecc.), ma in questo modo l’operazione diventa piuttosto onerosa; se non erro crontab consente di definire auesto tipo di schedulazioni (step)
    – Invio email:
    dato che il sistema già gestisce l’invio di email, al momento mi sembra utilizzata per il reset della password, credo sarebbe utile avere la possibilità di configurare l’invio di email anche per altri eventi, p.e. avvio di una irrigazione, termine si una irrigazione, apertura del rain sensor, ecc.
    – Refresh tramite chiamata Ajax:
    potrebbe essere utile avere un parametro di configurazione (nel file .env) che consenta di impostare la frequenza in secondi o di disattivarla con il valore zero
    – Eventi del server piGarden
    al momento, se non erro, tutti gli eventi vengono registrati nel file di log piGarden.log, potrebbe essere utile a fini statistici, inserire alcuni di tali eventi (p.e. inizio e fine di una irrigazione, apertura e chiusura del rain sensor, ecc.) anche in una apposita tabella del database; questi dati potrebbero poi essere utilizzati per diversi scopi da che ne ha interesse
    – Interrogazione del rain sensor
    mi sembra di aver capito che impostando a zero i due parametri NOT_IRRIGATE_IF_RAIN_ONLINE e NOT_IRRIGATE_IF_RAIN_SENSOR viene disabilitata considerazione dello stato del rain sensor nella gestione delle irrigazioni , ma controllando il file piGarden.log vedo che il sistema comunque continua a controllarlo (“Rain sensor initialized”, “check_rain_sensor – now is not raining”).

    Ribadisco che, ovviamente, non c’è alcuna pretesa e alcuna volontà di “giudicare” il lavoro svolto, che ribadisco ancora una volta è ottimo, è solo un confronto di idee. Probabilmente hai già analizzato i temi elencati, ed il risultato ti ha portato a fare le tue scelte.

    Grazie.
    Ciao

  13. Ciao @Ivano,
    rispondo alle tue richieste.
    – Semplificazione schedulazioni: concordo con te che attualmente che fare inserire la durata dell’irrigazione al posto della schedulazione di chiusura semplificherebbe l’esperienza utente infatti ci avevo già pensato anche io. Il problema è che mantenendo l’attuale struttura (cron di avvio e cron di chiusura) non è semplice calcolare il cron di chiusura in base alla durata di irrigazione che verrebbe inserita. A meno di non cambiare sistema di chiusura mi diventa difficile implementare questa funzione. In futuro vedrò se riesco a inventarmi qualcosa per riuscire ad intraprendere questa strada.
    – Schedulazioni con frequenza fissa: cron nativamente permette di impostare degli step ma il problema rimane. Se definisco un cron tipo questo “0 22 * * 1/2”, indico di fare partire alle ore 22:00 del lunedì/mercoledì/venerdì/domenica. Come vedi anche con il parametro di step (1/2) il problema rimane. Per attenuare questo mal funzionamento è possibile impostare lo step nel campo dei giorni del mese anziché di quello della settimana: “* 22 1/2 * *”. Così parto il primo del mese poi passo al terzo giorno, al quinto e così via. In base al numero di giorni che il mese ha il problema persiste (spero di essermi spiegato).
    – Invio mail: l’invio delle mail sul reset password viene eseguito dall’interfaccia web, che teoricamente potrebbe stare anche su un’altro raspberry rispetto allo script che piGarden che fa da server (sono due componenti nettamente separati che comunicano tra loro tramite socket). L’invio delle mail in base a determinati eventi dovrebbe essere eseguita direttamente da piGarden. Sarà possibile eseguire questa funzione nella prossima versione che rilascerò nella quale sarò implementata appunto la gestione degli eventi, dove per ognuno di questi potranno essere lanciati degli script custom tra cui uno che preveda l’invio di una mail ( https://github.com/lejubila/piGarden/issues/2 ).
    – Refresh tramite ajax: me la segno, eventualmente la implemento in futuro.
    – Inserimento log eventi in un db: non sei il primo a chiedere questa cosa, il fatto è che piGarden era stato ideato per rimanere abbastanza leggero ed essendo uno script bash diventa un po difficile interagire un db. Sempre per lo stesso discorso di leggerezza ho impostato come predefinito un db sqlite per l’interfaccia web in modo da non appesantire troppo il raspberry con un server mysql sempre attivo. Vedrò in futuro cosa posso fare.
    – Controllo pioggia: impostando a zero i due parametri NOT_IRRIGATE_IF_RAIN_ONLINE e NOT_IRRIGATE_IF_RAIN_SENSOR non viene interrotta l’irrigazione in caso di pioggia ma il controllo su i sensori e/o il servizio meteo online viene eseguito comunque, da qui l’inserimento dei log. Se vuoi disabilitare completamente il check devi togliere le relative schedulazioni nel crontab. Lo puoi fare manualmente oppure con i seguenti comandi:
    ./piGarden.sh del_cron_check_rain_online
    ./piGarden.sh del_cron_check_rain_sensor
    ./piGarden.sh del_cron_close_all_for_rain

    Se hai altri suggerimenti per modifiche o nuove implementazioni puoi, per ognuna di queste, aprire una issue su github
    da qui per piGarden https://github.com/lejubila/piGarden/issues
    e da qui per piGardenWeb https://github.com/lejubila/piGardenWeb/issues

  14. @lejubila ti ringrazio per l’attenzione e la dettagliata risposta fornita, mi permetto solo qualche considerazione premettendo che, pur avendo un’esperienza piuttosto lunga, purtroppo le mie conoscenze nel mondo linux sono scarse per cui ciò che dico potrebbero essere “castronerie”, in tal caso non avere timore nel segnalarmelo.
    – Semplificazione schedulazioni: pur mantenendo l’attuale struttura, non chiedo di modificarla, ho l’impressione che non sia particolarmente complicato calcolare l’ora di chiusura partendo dall’ora di apertura e dalla durata dell’irrigazione, p.e. nel caso l’ora di apertura fosse 22:00 e la durata fosse 15 minuti si potrebbe utilizzare date -d “22:00 today + 15 minutes” +’%d/%m/%Y %H:%M’, ovviamente la stringa ‘today’ serve solo per determinare l’ora di chiusura è in un giorno successivo a quello di apertura
    – Schedulazioni con frequenza fissa: credo che volendo, per esempio, effettuare una irrigazione che parte alle ore 22:00 ogni due giorni si potrebbe definire un cron “0 22 */2 * *”, questo dovrebbe essere valido anche per gli altri parametri, p.e. esempio ogni due ore “0 */2 * * *”
    – Invio mail: sono coscente che piGraden e piGardenWeb sono due componenti separati, anche io, come te, li ho installati su due diversi raspberry, comunque mi sembra ottima la soluzione individuata
    – Inserimento log eventi in un db: fermo restando le difficoltà di cui parli, io utilizzo un Raspberry PI 3 model B con MySql piuttosto impegnato e non ho particolari problemi di performance, inoltre, sull’adeguatezza di avere un db su SD credo che questo potrebbe essere tranquillamente spostato su un disco esterno, comunque credo che queste sia tutte scelte (db, hd, ecc.) che potrebbero essere lasciate all’utente finale
    – Controllo pioggia: scusa avevo capito male, comunque avevo già provveduto a rimuovere le entry indicate dal cron, magari la funzione init potrebbe essere modificata in modo da individuare le schedulazione dei controlli tenendo conto delle impostazioni dei parametri nel file .env.

    Nel caso di necessità per il futuro, come giustamente mi hai indicato, utilizzerò github.

    Grazie.

    Ciao

Lascia un commento

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