Smac - Smart Raspberry Clima System
Il progetto è ancora via fase di sviluppo pertanto alcune caratteristiche potrebbero essere modificate nel tempo.
Questo progetto si propone di implementare un sistema di monitoraggio e di controllo di un impianto di riscaldamento con caldaia usando un dispositivo Rasperry. Sono forniti gli schemi per Raspberry, dai quali possono essere facilmente ricavati quelli per Arduino.
A progetto terminato il repository conterrà tutto l'occorrente per poter installare l'applicativo direttamente sul dispositivo Rasperry.
Da alcuni test eseguiti il Raspberry 2 è in grado di gestire tranquillamente il webserver (quindi l'applicativo web), i demoni di controllo e il database (Postgres). Con modifiche minime sono tuttavia possibili configurazioni miste, per esempio: un server esterno per servire le pagine PHP e il database, e utilizzare il raspberry solo per i demoni di controllo sensori. L'unico requisito è che sia il rasbperry che il server che ospita l'applicativo web riescano a raggiungere il Database.
Queste possiblità rendono più semplice un eventuale porting su Arduino.
Il programma è progettato per essere installato il /opt/smac
. È possibile variare questo percorso modificando alcune definizioni usate nel codice PHP e nei vari demoni. Alcuni script e file di configurazioni non potendo usare definizioni comuni potrebbero avere questo percorso codificato, pertanto è necessario assicurarsi di modificare tutti i puntamenti cercandoli usando grep
nella directory del progetto.
La directory principale del progetto contiene:
Logicamente l'applicazione è suddivisa nei seguenti blocchi:
Un'interfaccia WEB, scritta in PHP. Lato client sono usate alcune librerie javascript (jquery, boostrap e alcuni plugin). Tutto l'occorrente è incluso nel repository.
L'interfaccia web consente di:
L'utilizzo di bootstrap dovrebbe garantire a progetto terminato di poter visualizzare correttamente l'interfaccia Web su qualsiasi dispositivo mobile.
È supportato esclusivamente il database Postgres versione 9.x.. Viene fornito uno script di importazione che contiene i dati di base che consentono il funzionamento dell'applicazione. Il database è parte fondamentale di Smac, non ha solo il compito - ovvio - di conservare tutte le informazioni provenienti dai sensori e dall'interfaccia grafica, ma ha anche quello di elaborazione dati e invio messaggi ai demoni che controllano l'hardware. Tali funizoni sono ottenute usando stored procedure e trigger.
Nello specifico grazie al supporto degli eventi di Posgresql, il Database viene usato come una sorta di IPC (Inter Process Communication), ciò permette di lasciare sul Raspberry solo i Demoni e gli script di Controllo e installare su sistemi diversi l'applicazione Web e il Database stesso.
Si tratta di un insieme di script per lo più in Python che si interfacciano con i sensori e relè. Sono usati sia per raccogliere i dati di temperatura e umidita dai sensori, sia per accedendere e spegnere la caldaia (Tramite il controllo di un Relè) in base alla programmazione impostata.
I componenti software più importanti che si preoccupano di gestire l'hardware sono i seguenti, per ciascuno sono forniti gli script init.d per l'avvio automatico:
La gestione della named pipe è delegata all'oggetto (switcher_command). Questo in effetti crea due named pipe, una è usata per inviare comandi allo switcher l'atra per riceverne messaggi.-
L'applicativo in sè non prevede alcun meccanismo di autenticazione/autorizzazione - non ritengo che per applicativi di questo tipo siano necessari.
Per l'accesso dall'esterno, può essere utile usare HTTPS con mutua autenticazione. Questo limita l'utilizzo dell'applicazione ai soli dispositivi che hanno certificati client validi.
Una particolarità dell'approccio allo sviluppo di questo applicativo è proprio il modo in cui viene usato il DB, che è considerato parte integrante dell'applicazione stessa e non solo come "mero" contenitore di dati. Il funzionamento stesso dell'applicazione è strettamente legato al DB, che tramite funzioni e trigger si occupa di elaborare i dati. Postgres è stato scelto proprio per la grande flessibilità di manipolazione dei dati in arrivo tramite regole, funzioni e trigger.
Durante la fase di installazione si suppone che i sorgenti siano stati scaricati da GitHub e copiati localmente in una directory del Raspberry. Con <smac>
viene indicata appunto questa directory.
Se, per esempio, i sorgenti del progetto sono stati scaricati nella home dell'utente standard pi
del Rasperry, (/home/pi
) sostituire <smac>
con /home/pi/smac
.
La procedura prevede l'installazione di un WebServer, del php dei driver pdo per postgresql e dello stesso database direttamente sul Raspberry. È tuttavia possibile separare i vari componenti installando sul Raspberry solo la parte degli eseguibili in Python.
Relativamente al webserver è possibile scegliere tra Apache (httpd) ed nginx, vengono infatti fornite le configurazioni di entrambi. Sicuramente Ngnix è più parco di risorse rispetto ad Apache pertanto sul Raspberry, si consiglia di installre il primo:
Tutti i file necessari vengono installati in
mkdir /opt/smac
Come anticipato vengono fornite le configurazioni di Ngnix e di Apache2. Se l'installazione è eseguita sul Raspberry si consiglia di installare il primo perchè è più leggero:
Ngnix
installazione webserver, php e librerie:
sudo apt-get install nginx php5-cli php5-fpm php5-pgsql
copia file di configurazione di Ngnix dalla directory del progetto:
copiare dalla directory del progetto in `/opt/smac` la directory `ngnix`
sudo cp -R <smac>/ngnix /opt/smac
installazione della configurazione:
sudo ln -s /opt/smac/ngnix/smac.conf /etc/ngnix/conf.d/smac.conf
Apache2
installazione webserver, php e librerie:
sudo apt-get install httpd php5 php5-cli libapache2-mod-php5 php5-pgsql
copia file di configurazione di Apache dalla directory del progetto:
sudo cp -R <smac>/apache2 /opt/smac
installazione della configurazione:
sudo ln -s /opt/smac/apache2/smac.conf /etc/apache2/conf.d/smac.conf
abilitazione del modrewrite:
sudo a2enmod rewrite
Passi in Comune
La creazione delle directory dei log sono in comune ad per entrambi i WebServer:
sudo mkdir -p /opt/smac/log/
Per il controllo dei pin sul connettore GPIO l'applicativo utilizza la libreria python:
sudo apt-get install python-rpi.gpio
Per la lettura dei valori rilevati dai sensori di temperatura DHT11 e DHT22 viene utilizza la libreria di Adafruit_Python_DHT:
cd <smac>/drivers/Adafruit_Python_DHT/
python setup.py build
python setup.py install
Copiare in /opt/smac
le seguenti directory da quella del progetto:
bin, ect, www
Assicurarsi che tutti i file nella directory bin
siano eseguibili e che i file della directory www
appartengano all'utente del webserver generalmente www-data
sudo chmod -R +x /bin
sudo chown -R www-data /opt/smac/www
sudo chown -R www-data /opt/smac/log
Installare i demoni ''SysVinit'': collector, actuator, switcher, collegando semplicemente collegare gli script di gestione dalla directory /opt/smac/etc/init.d/
in /etc/init.d
e quindi abilitarli usando il comando update-rc.d
:
for daemon in collector actuator switcher; do
sudo ln -s /opt/smac/etc/init.d/$daemon /etc/init.d/$daemon
sudo update-rc.d -f $daemon remove;
sudo update-rc.d -f $daemon defaults;
sudo update-rc.d -f $daemon enable;
done
Installare il database server Postgresql
sudo apt-get install postgresql
Abilitare l'utente smac
per la connessione locale con password su "Linux Socket" (localhost) modificando il file pg_hba.conf. Nell'installazione standard tale file dovrebbe trovarsi in /etc/postgresql/9.1/main
Usado l'editor vi
:
sudo vi /etc/postgresql/9.1/main/pg_hba.conf
Aggiungere la seguente riga:
# TYPE DATABASE USER METHOD
local smac smac password
Riaviare il database:
sudo /etc/init.d/postgresql restart
Usare l'utente postgresq per connettersi al database ed eseguire l'importazione dei dati.
su - postgresq
psql < "<smac>/postgres_database_schema.sql"
Uno script si occupa di generare le statistiche giornaliere relative alle misurazioni registrate dai sensori. È necessario che tale script venga pianificato giornalmente come job di cron affinchè le statiche vengano generate correttamente:
chmod +x /opt/smac/etc/cron.daily/update_stats
ln -s /opt/smac/etc/cron.daily/update_stats /etc/cron.daily/update_stats