POLITECNICO DI TORINO
III Facoltà di Ingegneria dell’Informazione
Corso di Laurea in Ingegneria Informatica
Tesi di Laurea Specialistica
Z-Wave portable energy profiler
Relatori:
prof. Fulvio Corno
ing. Dario Bonino
Candidato:
Davide Aimone
matricola: 167138
Dicembre 2013
This work is subject to the Creative Commons Licence
A mia mamma e mio
papà che prima di
chiunque altro mi
hanno spinto a
realizzare i miei sogni
Sommario
Questa tesi di Laurea tratta la progettazione e lo sviluppo di un sistema portatile di
monitoraggio dei consumi tramite dispositivi Z-Wave. La soluzione qui proposta
si basa sul gateway domotico Dog e sulla piattaforma hardware Raspberry Pi.
Verranno illustrate le soluzioni adottate per lo sviluppo del sistema completo: dalla
stesura dei driver per la comunicazione con i sensori fino all’interfaccia utente per
la visualizzazione e l’analisi dei dati raccolti, passando per la definizione di un
sistema ad hoc per la memorizzazione degli stessi. Al momento della stesura di
questo documento parte del lavoro svolto è stato integrato nel progetto Dog stesso.
vi
Ringraziamenti
Grazie Papà, per tutto quello che hai fatto e che mi hai permesso di fare. Non so
come tu abbia fatto a sopportare me e mio fratello e a renderci ciò che siamo. Sei
sempre stato presente nonostante tutte le difficoltà che abbiamo dovuto affrontare
e non mi hai mai fatto mancare nulla. Senza il tuo aiuto e il tuo affetto non sarei
la persona che sono oggi.
Grazie ai miei nonni: fin da piccolo mi avete donato un affetto incondizionato
e siete sempre stati pronti a spronarmi e ad indicarmi la strada da seguire. Starei
giorni interi ad ascoltare i vostri racconti dai quali ho sempre tratto grande ispirazione. Grazie nonna Anna: da te ho imparato che non è mai troppo tardi e ancora
riesci a stupirmi con le tue mille risorse. Grazie nonno Piero e nonna Sarina per
avermi insegnato ad essere così determinato, anche nei momenti più duri.
Grazie a mio fratello Alessandro, che sto imparando a conoscere davvero solo
adesso, benché io ti voglia bene da sempre.
Grazie zio, da te ho preso la passione per la tecnologia e per tutto ciò che la
circonda, il sapermi arrangiare e che esiste sempre ‘un altro modo’. Grazie per il
primo PC e per i primi insegnamenti.
Grazie Monica, Santa Monica sostengono in molti, per come mi sopporti, per
come mi hai aiutato e per tutte le emozioni che mi hai regalato in questi anni. E
grazie per le nottate passate a correggere la mia tesi: se ha un filo logico è solo
merito tuo e delle tue pagine evidenziate (quasi del tutto, a dire il vero) per segnalarmi gli errori. Ho condiviso con te paure, tensioni e momenti tristi, ma non ti sei
mai tirata indietro. Per te, che con una parola riesci a farmi toccare il cielo con un
dito o farmi sprofondare all’inferno, non esistono parole per ringraziarti abbastanza.
Grazie Bea, perché sei stata paziente anche tu: adesso posso tenere fede alle
mille promesse che ti ho fatto in questi mesi. Niente più scuse! Ma soprattutto
vii
grazie per l’affetto sincero che mi doni tutti i giorni con i tuoi piccoli gesti.
Grazie Giuliana, unica ed insostituibile. Il tuo sorriso e la tua allegria sono un
punto fermo del mio mondo ed è inutile dirti quanto tu sia stata importante per
me e per mio fratello in tutti questi anni. Adesso sarà più semplice organizzare di
mangiare una pizza, credo.
Grazie Val, dove sarei senza di te? Le nostre mille nottate a parlare dei nostri
‘trip’ mentali, quasi mai ripetibili e spesso frutto delle mie paranoie. Grazie perché sei sempre riuscita a tirarmi su il morale e a strapparmi un sorriso anche nei
momenti più difficili.
Grazie Francesca, per avermi preso per i capelli tanti anni fa. Senza il tuo intervento non credo che oggi sarei qui a festeggiare il raggiungimento di questo mio
obiettivo. Senza contare il fatto che ogni volta che coniugo un verbo al congiuntivo
è solo grazie a te!
Grazie Davide e Francesco, compagni di vita ormai da tanti anni. Siamo cresciuti insieme e tra un litigio ed una ‘primizia’ mi avete dato molto più di quanto
possiate immaginare.
Grazie Luca e Silvano. Per me siete stati come una seconda famiglia in questi
anni di studi e tutta la mia esperienza lavorativa la devo a voi, ma prima di essere
colleghi siete stati amici e quello che ho vissuto con voi difficilmente si potrà ripetere.
Grazie Alessio e Luca, non posso scrivere ciò che penso di voi perché è pur sempre un documento ufficiale, ma grazie per l’amicizia che ci lega da sempre, siete stati
compagni di mille avventure e da voi ho imparato a prendere la vita con leggerezza.
Grazie Nonno Mauro: vorrei poterti dire quanto i tuoi insegnamenti siano stati
importanti e sono sicuro che se avessi potuto raccontarti dei miei studi saresti stata
la persona più entusiasta ed avresti studiato insieme a me.
Grazie Mamma, mille volte grazie. Tante volte ho desiderato tu fossi vicina a
me, ma oggi vorrei poter incrociare il tuo sguardo più di ogni altra cosa al mondo.
Semplicemente, grazie.
viii
Indice
Sommario
vi
Ringraziamenti
vii
1 Introduzione
1.1 Stato dell’arte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Scopo del progetto . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 Tecnologie utilizzate
2.1 Principi generali . . . .
2.2 Definizione componenti
2.3 Dog . . . . . . . . . . .
2.3.1 Architettura . .
2.3.2 spChains . . . .
2.4 Z-Wave . . . . . . . . .
2.4.1 RaZberry . . . .
2.5 H2 . . . . . . . . . . . .
2.6 AngularJS . . . . . . . .
2.6.1 HighChart . . . .
1
5
8
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
11
11
12
13
14
17
18
20
25
27
28
3 Sviluppo progetto
3.1 Introduzione . . . . . . . . . . . . .
3.2 Driver . . . . . . . . . . . . . . . .
3.2.1 Device Access Specification
3.2.2 Driver Z-Wave . . . . . . .
3.2.3 Network driver . . . . . . .
3.2.4 Gateway driver . . . . . . .
3.2.5 Driver dispositivi . . . . . .
3.3 Database . . . . . . . . . . . . . .
3.4 UI . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
31
31
31
31
34
34
37
38
39
45
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
ix
4 Risultato finale
4.1 Possibili sviluppi futuri . . . . . . . . . . . . . . . . . . . . . . . . .
53
54
A Guida all’uso
A.1 Aggiunta di un nuovo sensore . . . . . . . . . . . . . . . . . . . . .
A.2 Uso della UI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A.3 Grafico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
57
60
61
Bibliografia
63
x
Capitolo 1
Introduzione
Con il continuo aumento dei costi dell’energia elettrica, risparmiare sui consumi
è diventato di fondamentale importanza. A motivazioni di carattere prettamente economico, si vanno ad aggiungere anche questioni di tutela e salvaguardia
dell’ambiente.
Il tenore di vita è in stretta correlazione con l’energia utilizzata, tuttavia esistono numerose tecniche per ridurre i consumi senza dovervici rinunciare. Alcune
di esse prevedono semplici accortezze pratiche legate a cattive abitudini, altre riguardano, invece, un investimento in quegli impianti che gli studi e la tecnologia
mettono oggi a disposizione e che consentono di avere una riduzione delle spese,
come l’adozione di pannelli solari o un miglior isolamento dell’edificio. In questo
secondo caso occorre naturalmente studiare e trovare la soluzione, in rapporto alle
possibilità economiche di ciascuno, più adatta alle esigenze di ogni abitazione: un
investimento maggiore, se ben pianificato, porterà a risultati migliori, ma potrebbe
non essere accessibile a chiunque.
Per poter concretizzare un progetto di risparmio energetico, prima dell’installazione di pannelli solari o del cambio di gestore, è consigliabile valutare in modo
oculato il consumo energetico degli elettrodomestici casalinghi ed eventualmente
provvedere alla loro sostituzione con nuovi modelli, che presentino una migliore
efficienza energetica.
La classificazione energetica degli elettrodomestici si basa sui valori dell’Indice
di Efficienza Energetica (Energy Efficiency Index: EEI ), che rappresenta in percentuale il rapporto tra il consumo annuale dell’apparecchio ed il consumo standard
di un modello analogo di riferimento. Tale valore viene riassunto tramite una scala
che va dalla A+++, nel caso di apparecchi molto efficienti, alla G e viene riportata
sull’etichetta energetica. Quest’ultima nasce per offrire all’acquirente una serie di
informazioni sulle caratteristiche essenziali, funzionalità offerte e consumi energetici dell’elettrodomestico. Inoltre, essa è uniforme per tutti gli elettrodomestici della
1
1 – Introduzione
stessa categoria, così da facilitare la comparazione tra i prodotti: in questo modo il
consumatore avrà tutti gli strumenti per fare la scelta migliore in base alle proprie
esigenze. [1].
Secondo un’indagine condotta dall’Istituto ISPO per ANIE Confindustria sul
territorio italiano [2], emerge che gli italiani siano molto sensibili al prezzo dell’energia e preoccupati dai continui rincari. Essi sono coscienti della necessità di mettere
in atto misure per giungere ad un vero risparmio energetico, ma al contempo poco
informati sulle tecnologie disponibili per diminuire la spesa.
La quasi totalità degli intervistati ha la percezione che negli ultimi 12 mesi le
bollette siano aumentate: il 79% ha notato una variazione al rialzo della bolletta del
gas, mentre l’81% lamenta una crescita del costo dell’elettricità. Le dichiarazioni
degli intervistati denotano anche un’elevata consapevolezza sull’importanza del
contributo personale al risparmio energetico. Per l’87% del campione, infatti, ogni
persona può contribuire con il proprio comportamento ad evitare sprechi di energia,
realizzando così una notevole riduzione dei consumi. In particolare, l’80% dichiara
di utilizzare sempre lampadine a risparmio energetico, il 76% di provvedere con
regolarità alla pulizia e manutenzione della caldaia, il 71% di usare lavatrici o
lavastoviglie a basse temperature, il 67% di contenere i consumi di acqua calda ed
il 66% di mantenere d’inverno la temperatura entro i 20 gradi. Molti affiancano ad
uno stile di vita sostenibile anche l’acquisto di prodotti efficienti dal punto di vista
energetico, in particolar modo elettrodomestici (72%) e/o climatizzatori a minor
consumo (46%).
Il tema dell’efficienza energetica si accompagna spesso a quello delle energie
rinnovabili: le più conosciute risultano essere la solare (il 78% afferma di sapere
bene di cosa si tratta) e l’eolica (73%). Sono, invece, meno note l’idroelettrica
(45%), la geotermica (28%), l’energia prodotta dalle biomasse (28%) e la marina
(24%).
Il quadro è un po’ diverso se si prendono in considerazione il grado di conoscenza ed il livello di informazione degli intervistati sul funzionamento del mercato
e sulle soluzioni tecnologiche da adottare. Innanzitutto le famiglie dimostrano ancora una conoscenza piuttosto limitata o distorta del primo, che ai loro occhi pare
concentrarsi solo su alcune delle soluzioni per l’efficienza energetica oggi disponibili: quelle basate sull’impiego dell’energia da fonti rinnovabili (specialmente solare
e eolica) e quelle legate al mercato degli elettrodomestici (frigoriferi, lavatrici, climatizzatori). Su altre soluzioni, come la domotica, si registra un interesse elevato,
in particolar modo quando il consumatore, attraverso esempi concreti, comprende
come applicarle al proprio ambiente domestico. Una comunicazione basata sulla
varietà e l’utilità delle soluzioni di efficienza energetica oggi disponibili potrebbe
dunque essere un elemento valorizzante sul quale si giocherà la futura competitività
dell’offerta di mercato. Un intervistato su 2 dichiara di conoscere bene la normativa sulla Dichiarazione di Conformità degli impianti elettrici domestici, tuttavia
2
quasi 1 su 4 ammette che il proprio non soddisfa nessuno dei requisiti di sicurezza
richiesti.
Sempre per quanto concerne la Dichiarazione di Conformità, gli intervistati ne
ricavano una percezione ‘a doppio taglio’: sebbene l’81% ritenga la sua presenza un’opportunità in un mondo in cui la riduzione dei consumi e degli sprechi è
sempre più importante, per il 60% del campione tale Dichiarazione non fa altro
che aumentare inutilmente la documentazione richiesta negli atti di compravendita
immobiliare. La stragrande maggioranza (81%), tuttavia, la considera anche una
buona occasione per incrementare il valore dell’intero immobile.
Il livello di conoscenza degli intervistati si abbassa quando s’introduce il tema della domotica, intesa come soluzione per rendere efficiente dal punto di vista
energetico la propria casa. Il 71% del campione non ha mai sentito parlare della
normativa che introduce il livello ’domotico’ degli impianti elettrici; tuttavia, la
percezione che si ha di essa è positiva. In particolare, ben il 77% degli intervistati
ritiene che possa essere considerata un aiuto per anziani o disabili. Il 74% del
campione riconosce poi alla domotica la possibilità di rendere più sicura la propria abitazione, mentre per il 69% rappresenta propriamente il futuro e crede che
sempre più persone vi faranno ricorso. Il 67% degli intervistati coglie tra i benefici riconoscibili dei sistemi domotici il fatto di consentire di risparmiare energia e
quindi di ridurre sprechi e consumi. Per il 60% del campione la domotica è comoda
ed aiuta a risparmiare tempo, di questi il 32% la considera una tecnologia fruibile e
facile da utilizzare. Entrando più nel dettaglio, gli intervistati esprimono curiosità
in particolare per quei sistemi di allarme che segnalano perdite d’acqua o fughe
di gas (85%), per i dispositivi che gestiscono il consumo energetico, spegnendo in
modo autonomo gli elettrodomestici che rischiano di far saltare la corrente (79%) e
per quei sistemi in grado di riattivare l’impianto elettrico saltato (80%). Suscitano
interesse anche il sistema che consente la gestione della termoregolazione differenziando gli ambienti in base al reale utilizzo degli spazi (70%) ed i dispositivi in
grado di gestire varie funzioni quando si è fuori casa (68%). Infine, per il 61%
degli intervistati è interessante poter controllare con un unico gesto più comandi
in contemporanea.
Una recente ricerca realizzata dall’Università di Oxford [3] su 1627 abitazioni
ha portato alla luce che solo il 9% delle variazioni sul consumo elettrico è attribuibile alle caratteristiche dell’edificio, il 17% è legato all’ambiente esterno, il 36% a
variabili di carattere sociale, mentre la parte rimanente, il 39%, è legato all’unione
degli elementi precedenti. Una soluzione che miri al contenimento dei consumi
elettrici deve quindi obbligatoriamente prevedere il coinvolgimento da parte degli
utenti: soluzioni puramente tecniche non possono determinare da sole un risparmio. Nell’immagine 1.1 sono mostrati i consumi elettrici di 11 abitazioni identiche,
costruite secondo i più recenti standard energetici: nonostante l’impiego degli stessi
elettrodomestici e delle stesse tecnologie costruttive, il consumo elettrico varia in
3
1 – Introduzione
maniera evidente da un’abitazione all’altra, denotando che il il nodo centrale del
risparmio energetico è l’utente stesso.
Figura 1.1.
Risultati di uno studio condotto nel 2004 in Sacramento, California
Uno dei problemi maggiori è che il consumo di corrente elettrica è ‘invisibile’: in un’automobile l’utente si accorge dell’indicatore che segnala un livello di
carburante via via più basso, nel caso di riscaldamento a legna o pellet sarà lo
svuotamento del magazzino a dare un feedback della quantità utilizzata, ma per
l’energia elettrica non c’è nulla di simile. Secondo un campione di 1219 intervistati,
le bollette elettriche sono le più complicate da capire e spesso non forniscono un
livello di dettaglio tale da attuare delle politiche di risparmio, rivelando che il 54%
sarebbe interessato all’adozione di un sistema di monitoraggio per poter conoscere
i consumi, i costi e le emissioni.
Una ricerca condotta in Nord Europa ed in Nord America ha portato alla luce
che un sistema di feedback adeguato può portare a risparmi del 5-15% nel caso
vengano utilizzati sistemi diretti, come un display con indicatore, ed un ulteriore
0-10% nel caso di quelli indiretti, quale un maggior dettaglio nella bolletta elettrica
o siti web dove è possibile effettuare un’analisi approfondita del proprio consumo.
4
1.1 – Stato dell’arte
L’adozione di tali sistemi porta inoltre ad un aumento ‘dell’alfabetizzazione elettrica’, con la creazione di nuove abitudini ed all’investimento in tecnologie efficienti
e sostenibili.
Per concludere, un sistema di monitoraggio energetico, per essere considerato
efficace, deve essere:
• basato sul consumo attuale;
• utilizzato frequentemente dall’utente finale;
• mostrare dati disaggregati per singolo elettrodomestico o gruppo di essi;
• utilizzato costantemente, non solo per un breve periodo;
• permettere confronti con periodi precedenti e con altre abitazioni;
• di facile comprensione ed utilizzo.
1.1
Stato dell’arte
Il termine ‘domotica’ indica l’integrazione nella vita domestica di diverse tecnologie quali l’elettrotecnica, l’elettronica, l’informatica, la comunicazione e, più in
generale, l’automazione.
Scopo della domotica è principalmente quello di migliorare le condizioni di esistenza dell’abitante della casa offrendogli comfort, sicurezza e benessere. Il comfort
si ottiene grazie a dispositivi, quali attuatori, telecomandi, sistemi di comunicazione, automatismi pre-programmati, che rendono più semplice la fruizione dei servizi,
degli elettrodomestici e degli apparecchi tecnologici. La sicurezza può essere assicurata da dispositivi o servizi attivi quali la chiusura automatica degli accessi ed il
loro controllo, i dispositivi antintrusione, segnalazioni che permettono di conoscere
lo stato della casa e dei suoi abitanti e di intervenire quando necessario.
Un altro concetto è il benessere degli abitanti, al quale si può ricondurre, ad
esempio, l’alleviamento delle condizioni di debilitazione di un malato, di un anziano
o di un disabile, realizzato sia con strumenti che ne riducano la fatica fisica ed
aumentino la mobilità, sia facilitandone l’accesso a mezzi di comunicazione. In
questa categoria si possono far rientrare anche i dispositivi che predispongono la
casa ad un uso più consapevole ed efficiente dell’ambiente e permettono ai suoi
abitanti un risparmio energetico.
La casa diventa intelligente non solo perché sono installati prodotti domotici,
ma perché dotata di un sistema attivo in grado di gestire e controllare facilmente
il funzionamento degli impianti presenti. Il bisogno e la convenienza del controllo
di climatizzazione, illuminazione ed automazione nascono dal continuo aumento
5
1 – Introduzione
delle attività connesse alla vita domestica ed alle loro funzioni. Attualmente gli
apparati tecnologici sono poco integrati tra loro ed il controllo di essi è ancora
ampiamente manuale. In una casa automatica gli apparati sono guidati da un
unico sistema centralizzato, che realizza un controllo intelligente di tutte le forme
di energia applicate all’abitazione attuando, ad esempio, interventi di termoregolazione domestica, in funzione dei mutamenti ambientali, e la verifica costante dei
consumi [4].
L’elevato numero di funzionalità che possono essere realizzate da un impianto
domotico ha portato i produttori ad approcciare il loro sviluppo in modi differenti,
proponendo delle soluzioni spesso estremamente diverse tra di loro. Alcuni hanno
fatto dell’economicità il requisito fondamentale del loro sistema, spesso rinunciando all’implementazione di caratteristiche che avrebbero aumentato la soddisfazione
dell’utente finale. Altri, invece, hanno sviluppato sistemi capaci di integrare un numero molto elevato di applicazioni, mettendo in secondo piano l’aspetto economico.
La conseguenza è che il prodotto di un’azienda è spesso incompatibile con quello di
una concorrente, dando vita ad uno scenario di mercato estremamente eterogeneo.
Questa discrepanza di vedute è, inoltre, una delle cause principali del mancato affermarsi di uno standard nel settore, nonostante si parli di automazione domestica
ormai da circa vent’anni. Una delle differenze sostanziali risiede nel metodo di
comunicazione adottato. Attualmente sul mercato esistono, infatti, differenti tecnologie di trasmissione: onde convogliate su linee di alimentazione, radiofrequenza
e sistemi BUS.
Le onde convogliate su linee di alimentazione permettono di sfruttare l’impianto
preesistente senza doverne installare di nuovi; l’inconveniente di questo sistema è
che possono verificarsi problemi relativi a rumori elettrici, interferenze, attenuazione, variazioni di impedenza e quindi riflessioni per disadattamento di impedenza.
Tali problemi possono essere risolti attraverso un buon progetto ed un’attenta
opera di rilevazione e correzione degli errori. Tecniche che prevedano la semplice
ritrasmissione del segnale risultano in questo caso non idonee ed occorrono delle
metodologie capaci di introdurre delle ridondanze nel pacchetto trasmesso, in modo da poter correggere eventuali errori. Una limitazione è, invece, la bassa velocità
di trasmissione, legata alla banda passante del cavo. Per questi motivi l’utilizzo
delle onde convogliate sui cavi di alimentazione è limitato ai casi in cui si voglia
controllare e monitorare apparecchiature, in particolare se collegate alla linea di
alimentazione, anche se ultimamente si stanno sviluppando delle tecnologie che
cercano di superare questi limiti.
La radiofrequenza è la tecnologia maggiormente utilizzata poiché fornisce una
soluzione conveniente ed economica per la realizzazione di una rete domestica o
in piccoli uffici. Questo mezzo copre facilmente l’intera casa senza bisogno di
ripetitori, ma occorre evitare di trasmettere segnali indesiderati alle abitazioni
adiacenti. Si incontra il medesimo problema delle onde convogliate, ma in questo
6
1.1 – Stato dell’arte
caso non si può adottare la soluzione del filtro. Si aggiunge, inoltre, una difficoltà
di standardizzazione poiché le bande di frequenza consentite variano da paese a
paese.
Nei sistemi BUS il mezzo di trasmissione delle informazioni tra i vari dispositivi
è costituito da un doppino telefonico intrecciato che provvede contemporaneamente
all’alimentazione ed allo scambio delle informazioni tra i vari dispositivi collegati
in parallelo [5].
Questo documento si concentrerà solamente sul monitoraggio del consumo elettrico dell’abitazione, nonostante la domotica si occupi, come accennato in precedenza, di numerose altre funzionalità.
Anche limitando lo studio a questo singolo campo, si trovano numerose soluzioni
commerciali dalle prestazioni e dai costi molto diversi tra di loro. Ad un estremo
troviamo dispositivi stand-alone che offrono funzionalità piuttosto limitate, come le
prese elettriche che, attraverso un display, informano l’utente del consumo attuale.
I modelli più avanzati forniscono anche la media delle misurazioni ed il costo, previo
inserimento dei dati di tariffazione ed il loro prezzo varia tra i 20 e i 40e. Nella
medesima categoria rientrano anche alcuni dispositivi che possono essere collegati
al quadro elettrico per fornire una lettura del consumo totale dell’abitazione invece
che di una singola presa. Le versioni più evolute possono fornire informazioni sotto
forma di grafici più o meno dettagliati, mentre altre hanno un semplice display che
mostra informazioni basilari similmente alle prese viste in precedenza. In questo
caso il costo può variare tra i 60 e i 200e in base alle funzionalità offerte.
Spostando l’attenzione su modelli più complessi, troviamo i sistemi di domotica vera e propria che permettono di utilizzare un numero arbitrario e variabile
di dispositivi. L’elemento che maggiormente distingue un sistema da un altro
è l’implementazione del gateway, ovvero il centro elaborativo del sistema. Alcuni
produttori privilegiano l’economicità, offrendo funzionalità limitate e compatibilità
solamente con i loro prodotti, altri invece implementano metodi di gestione avanzate e numerose feature. Per questo motivo i prezzi di questi componenti variano
moltissimo: dai 100e circa, fino ad oltre 500e per alcune tipologie di gateway
che implementano anche il supporto a più protocolli di comunicazione. I servizi offerti all’utente passano dal semplice comando remoto dei dispositivi tramite
telecomando, alla gestione intelligente dell’ambiente in cui si trovano.
Alcuni gateway prevedono, inoltre, la possibilità di definire un set di regole da
applicare al verificarsi di determinate condizioni e, in alcuni casi, l’utente stesso è
avvisato tramite un SMS o una mail. Anche l’interfaccia offerta varia molto in base
al prezzo: alcuni modelli economici non prevedono una UI accessibile ma fungono
solo da ‘ripetitori’ per i comandi ricevuti tramite telecomando, mentre versioni
più costose offrono interfacce grafiche rifinite attraverso cui è possibile monitorare
costantemente lo stato dell’abitazione, visualizzare statistiche e comandare i dispositivi. Spesso questi ultimi modelli sono accompagnati anche da un software
7
1 – Introduzione
compatibile con i più comuni modelli di smartphone e tablet, così da aumentare
maggiormente l’interazione da parte dell’utente.
Per quanto riguarda i sensori disponibili, le prestazioni ed i costi sono più o
meno comparabili tra i diversi produttori analizzati, in questo caso la differenza
di prezzo è principalmente dettata dal design. Oltre al consumo istantaneo, alcuni
modelli offrono anche la lettura dei kWh consumati dall’ultimo reset o degli indicatori luminosi che permettono di conoscere a colpo d’occhio il consumo attuale
senza accedere alla UI. E’ bene notare che vengono qui presi in considerazione solo
dispositivi facilmente installabili, mentre esiste una gamma completa di rilevatori
che possono essere integrati nell’abitazione che richiedono però l’installazione da
parte di utenti qualificati.
1.2
Scopo del progetto
Da questo contesto nasce l’idea di realizzare un sistema di monitoraggio dei consumi che non richieda nessun intervento invasivo, ma che, al contrario, possa essere
installato in pochi minuti e trasportato facilmente, dando la possibilità all’utilizzatore di cambiare la configurazione iniziale per poter modificare la granularità delle
misurazioni effettuate. Avendo come obiettivo finale il risparmio sulla fornitura
di energia elettrica, tale sistema dovrà avere dei costi contenuti ed esser facilmente fruibile: un costo troppo elevato o una difficile consultazione vanificherebbero,
infatti, il senso stesso della sua esistenza.
Il primo obiettivo da raggiungere è quindi la portabilità della soluzione e la semplicità di installazione: nessuno dei dispositivi utilizzati dovrà, pertanto, richiedere
l’intervento di un tecnico specializzato. Buona parte di essi possono essere visti
come semplici adattatori da collegare alle prese di corrente preesistenti, altri (i
sensori ambientali) sono auto-alimentati e possono essere posizionati a piacimento all’interno dell’ambiente da misurare. Da notare come anche questo aspetto si
traduca nuovamente in un contenimento dei costi, mentre i lati negativi si traducono perlopiù in fattori estetici e dalla copertura di più prese elettriche nel caso di
utilizzo di alcune tipologie adattatori dalle dimensioni poco contenute.
Altro target è la semplicità d’uso: per poter essere realmente fruibile dalle
masse, un sistema di questo tipo deve essere il più semplice possibile e richiedere una
conoscenza minima dei sistemi informatici. L’interfaccia finale dovrà quindi essere
il più intuitiva possibile evitando configurazioni complesse. Per questo motivo si è
scelto di orientarsi ad un’interfaccia web, tramite l’implementazione di un piccolo
server, così da rendere facilmente accessibili i dati misurati.
Da un punto di vista più tecnico, il sistema dovrà essere flessibile e facilmente
estendibile, permettendo un controllo fine del funzionamento tramite file di configurazione modificabili da utenti più esperti e lasciando spazio ad eventuali sviluppi
futuri.
8
1.2 – Scopo del progetto
Benché esistano già attualmente altre soluzioni per il monitoraggio dei consumi,
esse sono basate su software proprietario ed ogni gateway, il cui costo è tipicamente
molto elevato, può dialogare solo ed unicamente con dispositivi della stessa marca
(fatta eccezione per alcuni modelli molto costosi). Al contrario la soluzione qui
proposta si basa sul gateway domotico Dog, progetto open source del Politecnico
di Torino, tramite il quale è possibile utilizzare dispositivi di marche diverse, operanti su protocolli eterogenei. Benché in questo scritto vengano analizzati solo i
dispositivi operanti su protocollo Z-Wave, l’infrastruttura e le soluzioni adottate
sono assolutamente compatibili con qualsiasi altro protocollo o tipologia di device
rispetto a quelli qui trattati.
La parte successiva di questo scritto illustra lo sviluppo del progetto, ed in
particolare:
• nel capitolo 2 vengono analizzate nel dettaglio le tecnologie utilizzate ed i
motivi che hanno spinto a tali adozioni;
• nel capitolo 3 viene illustrata la parte di sviluppo e di design del sistema;
• il capitolo 4 presenta i risultati ottenuti;
• il capitolo 5 raccoglie le conclusioni alle quali si è arrivati ed elenca i possibili
sviluppi futuri.
9
10
Capitolo 2
Tecnologie utilizzate
2.1
Principi generali
In questo capitolo vengono presentate le principali tecnologie utilizzate per realizzare il progetto; contestualmente a queste vengono utilizzate numerose altre librerie
che saranno presentate più nel dettaglio nel prossimo capitolo dove verrà affrontato lo sviluppo. Prima di proseguire con l’analisi è bene definire alcuni parametri
comuni che sono stati presi in considerazione durante la selezione.
In primo luogo, per seguir la filosofia del gateway domotico Dog, rilasciato sotto
licenza Apache 2.0, e per contenere i costi, ogni software o tecnologia utilizzata
è fruibile gratuitamente, almeno in ambito non commerciale. In alcuni casi, in
particolare per la visualizzazione dei grafici, l’utilizzo di software licenziati avrebbe
aumentato la qualità delle rappresentazioni, ma proprio per i motivi sopra citati,
sono stati scartati.
Il progetto è pensato per essere integrato in Dog ed esteso con il passare del
tempo, ci si è quindi orientati verso soluzioni costantemente aggiornate ed in evoluzione poiché scegliere librerie poco mantenute o sviluppate da singoli soggetti
avrebbe potuto comportare la sostituzione di queste tecnologie in futuro. Diverse
soluzioni tra quelle prese in esame, benché interessanti ad una prima analisi, sono
state escluse per questo motivo.
Altro fattore preso in considerazione il sistema di elaborazione sul quale il sistema deve basarsi: il Raspberry Pi. Benché le sue caratteristiche tecniche siano
analizzate nel dettaglio successivamente, è bene notare fin da ora che la scelta di
un’unità di elaborazione dalle dimensioni e costi così contenuti porta inevitabilmente ad una limitazione nelle prestazioni. L’adozione di un altro sistema avrebbe
permesso di utilizzare software per la business intelligence più evoluti, ma avrebbe fatto lievitare i costi e l’ingombro del sistema inficiando quindi uno dei punti
11
2 – Tecnologie utilizzate
fondamentali.
Al termine di questa premessa possiamo analizzare i singoli componenti utilizzati.
2.2
Definizione componenti
La definizione del set di rilevatori utilizzati parte dall’analisi di un’abitazione composta da 3 camere, cucina e bagno ed abitata da una famiglia di 4 persone. E’
bene notare che questa è una stima di massima e dovrebbe essere adattata alle singole esigenze; non viene, inoltre, presa in considerazione una particolare marca o
modello, poiché tutte offrono caratteristiche analoghe da un punto di vista tecnico
(precisione misure, durata batterie, facilità di utilizzo e configurazione) e la scelta
è dettata, quindi, solo dal design e dal prezzo.
In primo luogo, poiché il monitoraggio di ogni singola presa e lampadina all’interno dell’abitazione non è possibile se non con un esborso esagerato, si è scelto di
adottare un misuratore da applicare al quadro elettrico che sia in grado di rilevare
il consumo totale dell’impianto. Il modello qui utilizzato è assimilabile ad una
pinza amperometrica: per la sua installazione è sufficiente posizionare le pinze del
sensore intorno ai cavi che arrivano al quadro elettrico, senza bisogno di lavorare
con fili scoperti. Analizzando le singole stanze questo è lo scenario che ne deriva:
• bagno: lavatrice e boiler elettrico;
• cucina: frigorifero, forno e presa per utensili da cucina;
• sala: impianto audio/video, postazione PC;
• 2 camere da letto: impianto audio/video;
In una configurazione del genere, si hanno quindi 9 prese monitorate, arrivando ad
avere una buona granularità.
Come detto in precedenza, questo è uno schema di massima: ad esempio il
boiler elettrico potrebbe non essere presente o essere collegato direttamente alla
linea elettrica, così come potrebbero esistere altre prese con un elevato assorbimento elettrico che potrebbe valer la pena monitorare, ad esempio in presenza di
riscaldamento elettrico.
A questo insieme potrebbe essere interessante affiancare altri tipi di sensori
come quelli per la temperatura, l’umidità ed i movimenti. Il sistema qui sviluppato
supporta tali sensori senza bisogno di alcuna modifica, a patto che esista un driver
compatibile con l’interfaccia di Dog.
Definito il set di sensori, è possibile spostare l’attenzione verso il cuore del
sistema ovvero il Raspberry Pi. Il Raspberry è un single-board computer, cioè un
calcolatore implementato su una sola scheda elettronica dal costo molto contenuto.
12
2.3 – Dog
Il sistema ruota attorno a un System-on-a-chip (SoC) Broadcom BCM2835, che
incorpora un processore ARM1176JZF-S a 700 MHz, una GPU VideoCore IV e
512 Megabyte di memoria. Non sono presenti né hard disk né unità a stato solido
ed il boot e la memoria non volatile sono affidati ad una scheda SD. Nella versione
utilizzata (modello B), si hanno inoltre: 2 prese USB, un ingresso ethernet, un
connettore RCA ed un’uscita HDMI. I consumi per questa versione sono di 700
mA (3,5 W).
L’anello di congiunzione tra il Raspberry Pi e i device Z-Wave è il RaZberry:
una piccola scheda di espansione collegata al connettore GPIO del Raspberry. La
comunicazione, che avviene tramite UART (Rx/Tx), è basata sul ricetrasmettitore
Z-Wave Sigma Design 3102 a cui si affiancano 32K di memoria flash per il traffico
di rete ed un’antenna PCBA. Il consumo della scheda è tipicamente di 18 mA @
3,3 V, ma può arrivare fino a 40 mA durante le fasi di trasmissione. Si rimanda
al paragrafo relativo al protocollo Z-Wave per una spiegazione più dettagliata del
suo funzionamento.
2.3
Dog
Dog (Domotic OSGi Gateway) nasce dal gruppo di ricerca del Politecnico di Torino e-Lite ed è un gateway in grado di esporre differenti network domotici come un
unico sistema neutro da un punto di vista tecnologico. Il framework su cui si basa,
OSGi, è definito dal consorzio Open Services Gateway Initiative nato nel 1999,
che raggruppa le più importanti società impegnate nel campo dell’Home Automation, con l’intento di definire le specifiche Service-Oriented Architecture (SOA) 1
per la diffusione e l’amministrazione dei servizi tipici di un Residential Gateway
(RG). L’architettura risultante ha preso il nome di OSGi Service Platform e, dalla
domotica, si è ora diffusa in molteplici campi. OSGi è quindi una piattaforma
Java-based che, secondo un approccio microkernel a plug-in, fornisce le specifiche
per sviluppare applicazioni che implementano servizi, permettendo di registrarne
di nuovi e di aggiornare o rimuovere gli esistenti on-the-fly. Il modello di cooperazione tra componenti prevede la possibilità di ricercare, individuare ed usare in
maniera condivisa i servizi forniti da diverse applicazioni nell’ambito della stessa
virtual machine, con conseguenti vantaggi in termini di prestazioni e consumo delle
risorse.
Tecnicamente, le specifiche della piattaforma OSGi introducono il concetto di
servizio, inteso come semplice interfaccia, e di bundle (componente), come archivio
1 Con Service-Oriented Architecture (SOA) si indica generalmente un’architettura software
adatta a supportare l’uso di servizi Web per garantire l’interoperabilità tra diversi sistemi così
da consentire l’utilizzo delle singole applicazioni come componenti del processo di business e
soddisfare le richieste degli utenti in modo integrato e trasparente.
13
2 – Tecnologie utilizzate
(JAR) contenente l’implementazione dei servizi e le direttive di distribuzione ed
installazione all’interno della piattaforma, oltre che le dipendenze da altri package
e servizi. Il framework OSGi è di fatto l’ambiente di esecuzione dei bundle.
La scelta di utilizzare un framework come OSGi, insieme ad una sofisticata
tecnica di modellazione (DogOnt), derivata dalla ‘Semantic Web research community’, permette a Dog di andare oltre il semplice controllo domotico e di gestire
l’ambiente in maniera intelligente tramite dispositivi eterogenei che si comportano
come un unico sistema attivo.
In questo progetto, ci concentreremo sulla sua capacità di fornire un’interfaccia
comune e neutra per qualsiasi dispositivo domotico e sull’interoperabilità tra i
dispositivi stessi. In altre parole, tramite Dog, avremo da una parte un’unica
interfaccia tramite la quale i dispositivi comunicheranno e, dall’altra, un unico set
di dati e comandi, astratti dall’architettura dei device, utilizzabile per controllare
i dispositivi stessi. La versione qui utilizzata è la 2.6.
Figura 2.1.
2.3.1
Rappresentazione schematica del sistema Dog
Architettura
L’architettura di Dog è basata sulla specifiche OSGi e i suoi bundle possono essere
divisi in tre gruppi: core, driver ed add-on.
14
2.3 – Dog
Core Bundle
Sono i bundle necessari al funzionamento del sistema stesso ed implementano le
funzionalità di base; ne fanno parte tutti quelli riportati in figura 2.2, vengono qui
di seguito dettagliati i principali.
Figura 2.2.
Componenti del core di Dog
• Dog REST EndPoint: implementa un’interfaccia REST, tramite JSON o
messaggi XML, che può essere utilizzata per interrogare Dog sullo stato del
sistema. In fase di sviluppo.
• Dog XML EndPoint: fornisce un’accesso XML-RPC a Dog tramite una
connessione bidirezionale tra client e server.
• DogStateMonitor: mantiene una fotografia dello stato di tutti i device, permettendo, inoltre, la registrazione dei vari listener sul cambio di stato.
• DogDeviceManager: implementa le specifiche OSGi di accesso ai driver e
gestisce la procedura di attachment tra driver e device.
• DogNotificationManager: implementa l’Event Admin Service Specification
v1.2 ed inoltra le notifiche ed i cambi di stato.
• DogConfigurator: gestisce le configurazioni dei singoli bundle.
• Dog2Library: espone classi di utility agli altri bundles.
• MeasureLibrary: esporta la libreria JScience e definisce altre unità di misura
non supportate dalla stessa.
15
2 – Tecnologie utilizzate
Driver Bundle
Sono l’anello di congiunzione tra il device fisico ed il core di Dog; possono essere
divisi a loro volta in tre tipologie distinte in base al ruolo svolto.
Figura 2.3.
Tipologie dei driver bundle di Dog
• Network Driver: si occupa della comunicazione a livello di rete e definisce le
API di accesso per tutti i driver con la stessa tecnologia.
• Gateway Driver: gestisce l’associazione tra device e gateway fisici consentendo il caricamento del driver solo se il corrispondente network gateway
è presente. Permette quindi di interfacciare reti domotiche controllate da
gateway diversi.
• Device Driver: implementa le feature di un singolo device, trasformando le
funzionalità e gli stati disponibili in messaggi di rete.
Add-on Bundle
Rientrano in questa categoria tutti i bundle che arricchiscono il core di Dog implementando funzionalità specifiche, come, ad esempio, DogRulesBundle che realizza
una rule-engine per la gestione automatica di alcuni scenari predeterminati.
Per meglio comprendere l’interazione tra questi elementi è possibile prendere
in esame il procedimento di start-up del sistema. In Dog non è definito un ordine
di avvio preciso per i bundle (eccetto che per il bundle DogAutoStart): ognuno di
essi attende che i servizi richiesti siano disponibili prima di iniziare la registrazione
sul framework OSGi, questo fa si che i primi ad essere avviati siano quelli che non
hanno dipendenze da altri bundle.
16
2.3 – Dog
Quando un House Model 2 provider diventa attivo vengono istanziati tutti i
Device in esso contenuti e il device manager si occupa di eseguire la procedura
di attachment tra Device e Driver. Se un Driver non può essere risolto il Device
viene messo in stato di idle e non è possibile usare quel dispositivo finché un driver compatibile non viene trovato. Tipicamente i Network driver vengono avviati
non appena viene istanziato il DogConfigurator, successivamente vengono inizializzati i corrispondenti Gateway driver ed infine i driver dei singoli sensori. Questa
procedura verrà spiegata in maniera esaustiva nel capitolo successivo.
2.3.2
spChains
Per il calcolo dei valori aggregati delle misure dei sensori è stato utilizzato l’add-on
bundle spChains. SpChains è uno stream-processing framework che supporta l’elaborazione, la combinazione e l’astrazione dei dati ambientali provenienti da più
fonti (ad esempio sensori) attraverso catene di elementi modulari e riconfigurabili, chiamati blocchi di stream-processing, di cui ne è fornito un set standard ed
estensibile.
Figura 2.4.
Schema di funzionamento di spChains
2 Un House Model è un provider che fornisce l’elenco dei dispositivi collegati a Dog. Esiste
un sistema di discovery automatico e molto potente all’interno di Dog, ma tale processo è molto
pesante da un punto di vista computazionale e non è possibile utilizzarlo in questo progetto. Al
suo posto sarà invece utilizzato un file xml che elenca i device collegati.
17
2 – Tecnologie utilizzate
Da un lato (figura 2.4, a destra) le applicazioni pervasive, che ascoltano gli
eventi forniti dai drain (ovvero i blocchi posti al fondo della catena), non devono occuparsi del peso del trattamento dei dati, ma hanno solo bisogno di definire
l’aggregazione e i modelli di rilevazione in forma di catene di stream-processing.
Dall’altro (figura 2.4, a sinistra), spChains può eseguire la correlazione e l’elaborazione di dati eterogenei derivanti dall’infrastruttura di comunicazione astratta
sottostante (in genere le reti di sensori wireless) in forma di eventi.
Ogni componente (filtro) ha un set di ingressi ed uscite e legge il flusso di
dati sui suoi ingressi fornendo uno stream di dati sulle sue uscite . Un connettore
(pipe) trasmette i dati da un’uscita del blocco ad un altro ingresso. Il flusso di dati
complessivo parte da una sorgente (event source) e raggiunge un collettore(event
drain) attraverso una serie di filtri e pipe, formando così un grafo aciclico (evitando
questioni relativi al trattamento ciclico).Gli event source e i drain astraggono quindi
i dati in ingresso, fornendo la definizione di un metodo standard (tramite interfacce
Java) per inserire ed estrarre gli eventi da spChains, mentre i blocchi e le catene
realizzano il core per il trattamento dei dati.
2.4
Z-Wave
Z-Wave è un protocollo di comunicazione wireless operante su una radiofrequenza
a bassa potenza creata specificatamente per il controllo remoto in ambito residenziale ed utilizzato da circa 250 produttori diversi nel mondo. Tale protocollo è
ottimizzato per essere affidabile ed offrire una bassa latenza nell’invio di piccoli
pacchetti ad una velocità di circa 100Kbps. Z-Wave è uno dei protocolli più affidabili in ambito wireless: ogni comando inviato è confermato dal destinatario tramite
ACK. Questo non garantisce che il messaggio sia trasmesso correttamente, ma il
mittente è in grado di sapere se la situazione è cambiata o se si è verificato un
errore. Un mittente prova ad inviare il suo messaggio fino a tre volte, prima di
restituire un messaggio di errore. Il numero delle trasmissioni fallite è anche un
buon indicatore della qualità della rete.
La frequenza di lavoro è intorno ai 900 Mhz, in questo modo viene garantito il
fatto che non ci siano interferenze con le reti Wi-Fi o Bluetooth che tipicamente
operano alla frequenza di 2.4 Ghz. Tale protocollo è inoltre stato progettato nell’ottica di essere facilmente incorporato in prodotti di elettronica di consumo anche
se alimentati tramite batterie, le quali, in condizioni normali, possono durare fino
ad un anno.
Ogni network basato su Z-Wave può includere fino a 232 nodi che sono divisibili
in controller e slave, a loro volta i controller possono essere primari (sempre e solo
18
2.4 – Z-Wave
uno) e secondari. La topologia adottata è di tipo source-routed3 mesh network4 , i
device possono cioè comunicare tra di loro utilizzando altri nodi intermedi, permettendo di aumentare l’area coperta dal segnale stesso e l’aggiramento di eventuali
ostacoli. Questa funzione però, per poter permettere un risparmio sui consumi, non
è offerta dai device alimentati a batteria . Se una route non è disponibile vengono
automaticamente selezionati altri percorsi per la consegna del messaggio. Proprio
per questa feature è necessario che i device rimangano nella stessa posizione dopo
il riconoscimento o che venga avviata una procedura per rimappare le route una
volta rimosso/spostato un device.
Ogni network Z-Wave è identificato da un Network ID (4 byte) assegnato al
controller primario in fase di costruzione e non modificabile dall’utente, così come
ogni nodo è identificato da un Node ID (1 byte) che gli viene assegnato dal controller
primario all’atto di inclusione di un nuovo device all’interno della rete. Da notare
che nodi con diversi Network ID non possono comunicare tra di loro a meno che
non venga eseguito un bridging tra le due reti.
Il protocollo Z-Wave è formato da tre layers:
• Radio Layer: definisce come il segnale è scambiato tra il livello network e
l’hardware fisico; include la frequenza, la codifica, ecc.
• Network Layer: stabilisce come i dati sono scambiati tra due nodi. Include
l’indirizzamento, l’organizzazione del network, il routing, ecc. Si divide in tre
sotto livelli:
– Media Access Layer (MAC): gestisce l’utilizzo dell’hardware wireless
tramite funzioni non visibili all’utente finale.
– Transport Layer: tratta il trasferimento dei messaggi, implementando
le logiche di gestione degli errori, tra due nodi. L’utente finale non può
modificare il funzionamento di questo layer, ma il suo risultato finale è
visibile.
– Routing Layer: si occupa di gestire la rete ‘Mesh’ di Z-Wave, massimizzando il range del segnale ed assicurandosi che il messaggio venga
consegnato, modificando eventualmente le route di consegna.
3 L’architettura di rete source routing permette a chi invia il pacchetto di specificare parzialmente o totalmente il percorso da seguire attraverso la rete per la consegna dello stesso. In
contrasto a questa esistono i protocolli non-source routing, dove il percorso è stabilito dai routers
di rete.
4 Mesh networking è un tipo di topologia di rete dove ogni nodo non si occupa solo di gestire
i suoi pacchetti, ma ha funzioni di relay per gli altri nodi, per i quali propaga i dati all’interno
della rete.
19
2 – Tecnologie utilizzate
Figura 2.5.
I tre layer del protocollo Z-Wave
• Application Layer: definisce quali messaggi devono essere processati da particolari applicazioni al fine di rendere possibile il funzionamento di determinati
task quale l’accensione di una lampadina.
2.4.1
RaZberry
Il RaZberry è composto da una scheda hardware equipaggiata con il proprio firmware ed una parte software che viene eseguita sul Raspberry Pi, denominata Z-Way.
Z-Way implementa lo stack del protocollo ed una API per lo sviluppo di interfacce
di terze parti, oltre che un’interfaccia utente di demo.
Il sistema di comunicazione può essere diviso in 6 componenti.
1. Il Raspberry Pi con il sistema operativo Raspbian, precedentemente installato.
2. La scheda RaZberry connessa al connettore GPIO del Raspberry Pi.
3. Il firmware di basso livello Z-Wave che viene eseguito sul ricetrasmettitore. Esso è compatibile con il firmware standard Sigma Design, ma contiene
numerosi miglioramenti.
4. Il server Z-Way, che implementa lo stack del protocollo di comunicazione ZWave, gestendo la comunicazione con i nodi e l’esecuzione dell’engine interno.
20
2.4 – Z-Wave
Figura 2.6.
Il sistema nel suo insieme
5. L’interfaccia utente dimostrativa di Z-Way, basata su JSON, permette di
avere una panoramica completa di tutte le funzionalità.
6. Applicazioni di terze parti.
Architettura software
La porzione software di Z-Way è fornita come eseguibile Linux e permette di:
• includere ed escludere nuovi device, modificare la loro configurazione e gestire
quella di rete;
• modificare lo stato degli attuatori come ad esempio: interruttori elettrici,
dimmers, attuatori per la chiusura di porte e finestre, termostati, ecc;
• accedere ai dati dei sensori quali sensori di movimento, temperatura, sensori
di fumo, ecc;
• visualizzare tutte le funzionalità disponibili nella rete analizzata;
• creare regole logiche tra gli eventi per permettere l’attuazione di determinate
azioni in conseguenza al verificarsi di un determinato scenario;
• accedere alle funzionalità per l’internazionalizzazione.
Z-Way comunica (southbound) con il firmware del ricetrasmettitore ZM3102
attraverso l’interfaccia seriale e offre (northbound) un’interfaccia che aderisce alle
specifiche JSON, che è utilizzata dalle applicazioni o dalle pagine web che operano
21
2 – Tecnologie utilizzate
Figura 2.7.
Architettura software Z-Way
sulla rete Z-Wave. E’ possibile che diverse applicazioni richiedano in parallelo l’uso
di tale interfaccia e questo non rappresenta un problema a meno che le due applicazioni non inviino messaggi contraddittori tra di loro (il primo invia il comando
per accendere una lampadina, il secondo per spegnerla). In questo caso il risultato
è impredicibile.
Z-Way consiste di diversi blocchi funzionali.
• Job Queue: è il core di Z-Way e tiene traccia di tutte le istruzioni da eseguire
e prende in carico le eventuali ritrasmissioni in caso di errore.
• Function Classes: definiscono tutti i comandi disponibili per controllare e
configurare la rete Z-Wave e il chip di trasmissione.
• Command Classes: implementano tutti i comandi a livello applicativo utilizzati per controllare i devices.
• JSON Web Server: specifica l’interfaccia di comunicazione per gli sviluppatori.
• Translation Functions: aiuta a tradurre i dati dal formato machine-readable
a quello human-readable.
• Automation and Scripting engine: gestisce il set di regole intelligenti per
comandare il sistema.
22
2.4 – Z-Wave
Il modello dati Z-Way
Z-Way mantiene tutti i dati del network Z-Wave in memoria, la cui struttura è
organizzata in un albero gerarchico. Seguendo il paradigma object-oriented i differenti comandi eseguibili su un dato device sono inglobati all’interno della struttura
stessa: ogni elemento, nella forma devices[id].data.id, è gestito come un oggetto
separato nella gerarchia e ad ognuno di essi sono associati alcuni dati accessori che
possono essere così divisi:
• value: il valore stesso;
• name: il nome dell’oggetto;
• updateTime: timestamp che indica l’ultimo update eseguito;
• invalidateTime: timestamp che indica quando il valore è stato invalidato a
seguito di una richiesta di aggiornamento, tramite get;
• updated: booleano che indica se il valore è valido o meno, lavora in combinazione con invalidateTime. E’ particolarmente utile dopo un’azione di set,
dopo la quale il valore presente nella struttura dati potrebbe non rispecchiare
il reale stato del device.
La root del data tree ha due nodi figli:
• controller: mantiene tutti i dati ed i comandi relativi al controller primario;
• devices: è l’array dei device installati, come il precedente mantiene tutte le
informazioni ed i comandi disponili su di essi.
Esempio di esecuzione di un comando dalla GUI al device fisico
La comunicazione tra i device reali e l’interfaccia utente coinvolge numerosi attori
e fasi. Si assuma che la GUI stia visualizzando lo stato di un interruttore e che
ne permetta la modifica. Quando l’utente cambia lo stato di tale interruttore si
aspetta di avere un feedback visivo sull’interfaccia stessa. Il primo step è l’invio di
un comando (SET) dall’interfaccia utente a Z-Way tramite le API JSON. Z-Way
riceve il comando e conferma la ricezione alla GUI e riconosce che tale comando
produrrà una variazione del valore, invalidando quello attualmente memorizzato,
poiché per il momento il device non è ancora stato contattato.
A questo punto Z-Way si occupa di inserire nella coda di esecuzione il comando,
processando eventuali priorità o logiche definite in precedenza. Inoltre, viene anche
schedulata una richiesta di update per il device in oggetto (GET), subito dopo la
richiesta di cambio di stato. Quando il comando è in cima alla coda di esecuzione
viene inviato al chip per la trasmissione, il quale manda conferma dell’avvenuta
23
2 – Tecnologie utilizzate
Figura 2.8.
Modello dati Z-Way
ricezione che viene annotata nella coda. Questa conferma indica semplicemente
che il chip ha accettato il comando, non che questo sia stato spedito al device.
A questo punto il comando viene effettivamente recapitato al nodo. Una conferma della ricezione è l’unico valido indicatore che il device abbia ricevuto il comando
(il che non vuol dire sia stato eseguito). Subito dopo viene inviato il secondo comando (GET) seguendo la medesima logica: questo farà si che il device risponda
con un REPORT command a Z-Way, indicando il suo stato che sarà registrato
da Z-Way, tramite la porta seriale, andando ad aggiornare il campo value e il flag
updated. Da questo momento in poi la GUI riceverà il valore aggiornato ad ogni
richiesta.
24
2.5 – H2
Figura 2.9.
2.5
Esempio di comunicazione tra la GUI ed il dispositivo fisico
H2
H2 è un ‘Relational Database Management System’ (RDBMS) sviluppato in Java
che può essere integrato all’interno di altre applicazioni o essere eseguito in modalità
client-server. In questo progetto il suo ruolo sarà quello di rendere persistenti i
dati raccolti dal sistema di monitoraggio oltre a permettere alcune customizzazioni
relative alla visualizzazione dei dati stessi.
H2 implementa un subset dei comandi SQL, mettendo a disposizione degli sviluppatori API SQL e JDBC. E’ possibile creare sia tabelle in-memory sia disk-based
e queste possono essere a loro volta persistenti o temporanee. Uno degli aspetti più
interessanti di H2 è la grandissima velocità di esecuzione delle query nonostante
il suo footprint su disco sia solamente di circa 1 MB. Sono possibili tre tipi di
connessione diverse.
• Embedded Mode: in questa modalità l’applicazione apre una connessione
JDBC verso il database all’interno della stessa JVM. Questo tipo di connessione offre la maggiore semplicità di implementazione e velocità. Lo
svantaggio è che è possibile avere il database aperto in una sola JVM alla
volta.
• Server Mode: è la modalità di funzionamento standard dei database. Il server, che può accettare diverse connessioni contemporaneamente, deve essere
avviato prima dell’esecuzione dell’applicazione e le performance sono inferiori
al metodo precedente poiché tutti i dati vengono trasferiti tramite TCP/IP.
• Mixed Mode: è la combinazione dei due metodi precedenti. La prima applicazione che si collega al database acquisirà una connessione di tipo embedded
25
2 – Tecnologie utilizzate
ed avvierà il server al quale si potranno collegare altri processi. Questa è la
modalità utilizzata per questo progetto: il sistema di monitoraggio avrà una
connessione veloce e di tipo embedded, ma al tempo stesso sarà possibile
collegarsi al database dall’esterno per eventuali future implementazioni.
Un veloce paragone con altre possibili tecnologie può essere eseguito esaminando
la tabella sottostante.5
Pure Java
Memory Mode
Encrypted Database
ODBC Driver
Fulltext Search
Multi Version Conc.
Footprint (jar/dll size)
H2
Si
Si
Si
Si
Si
Si
∼1 MB
Derby
Si
Si
Si
No
No
No
∼2 MB
HSQLDB
Si
Si
Si
No
No
Si
∼1 MB
MySQL
No
No
No
Si
Si
Si
∼4 MB
PostgreSQL
No
No
No
Si
Si
Si
∼6 MB
Eliminando le tecnologie che non supportano l’embedded mode, è possibile
concentrarsi sulle performance delle rimanenti.
Test Case
Simple: Init
Simple: Query (random)
Simple: Query (sequential)
Simple: Update (random)
Simple: Delete (sequential)
Simple: Memory Usage
BenchA: Init
BenchA: Transactions
BenchA: Memory Usage
BenchB: Init
BenchB: Transactions
BenchB: Memory Usage
BenchC: Init
BenchC: Transactions
BenchC: Memory Usage
Executed statements
Total time
Statements per second
Unit
ms
ms
ms
ms
ms
MB
ms
ms
MB
ms
ms
MB
ms
ms
MB
#
ms
#
H2
241
193
89
406
155
7
200
1071
8
787
465
17
348
1382
12
322929
5337
60507
HSQLDB
431
267
179
772
266
13
251
1458
14
1584
875
13
225
865
20
322929
7173
45020
Derby
1027
748
658
12175
6281
16
1075
8142
12
4163
2744
10
922
3527
11
322929
41462
7788
5 Le versioni prese in esame sono: H2 1.3, Apache Derby version 10.8, HSQLDB 2.2, MySQL
5.5, PostgreSQL 9.0
26
2.6 – AngularJS
Altro database preso in esame è SQLite. La sua esclusione dipende principalmente dal fatto che, sebbene fornisca prestazioni solitamente migliori rispetto
ad H2, impone alcuni forti vincoli in ottica futura: dimensioni massime inferiori,
nessuna criptazione dei dati, outer join non utilizzabili, funzioni e procedure non
disponibili.
In opposizione a queste feature troviamo un problema legato alla possibile perdita di dati di transazioni committate in caso di mancanza di corrente elettrica se
viene utilizzata la configurazione standard di H2. Bisogna in primo luogo notare che
molti database che avrebbero potuto rappresentare un’alternativa valida soffrono
dello stesso problema (HSQLDB, PostgreSQL e Derby), inoltre, in un’applicazione
come questa, la mancanza di corrente farebbe non solo perdere gli ultimissimi dati
raccolti, ma anche tutti i dati generati durante il blackout (derivanti ovviamente
solo dai device alimentati a batterie). Benché esistano delle opzioni per limitare
tale problema, si è deciso di non ricorrere al loro uso anche a causa del grosso
degrado di prestazioni che queste comportano.
2.6
AngularJS
AngularJS è un framework per la creazione di applicazioni web dinamiche sviluppato da Google; all’interno di questo progetto verrà utilizzato per la creazione
dell’interfaccia web tramite la quale sarà possibile visualizzare i dati raccolti. La
principale caratteristica di tale framework risiede nel fatto che permette l’utilizzo di
un pattern MVC6 tramite il solo utilizzo di codice JavaScript. AngularJS è costruito
seguendo una filosofia secondo cui la programmazione dichiarativa dovrebbe essere
utilizzata per la costruzione delle UI, mentre la programmazione imperativa è ottima per la definizone della business logic. Il framework adatta ed estende l’HTML
tradizionale per meglio realizzare la creazione dinamica di contenuti tramite un
data-binding a due vie, che permette la sincronizzazione della vista e del modello.
Come risultato AngularJS de-enfatizza la manipolazione del DOM e migliora la
testabilità. Tramite l’utilizzo della dependency injection, AngularJS permette di
spostare servizi tipicamente server-side sul client, come ad esempio la gestione dei
controller, permettendo la creazione di applicazioni web molto più leggere.
Una delle caratteristiche più interessanti è il two-way data binding che permette
di scrivere meno codice per ottenere lo stesso risultato: il template è renderizzato
6 Model-view-controller (MVC) è un pattern di architettura del software che separa la rappresentazione delle informazioni dall’interazione dell’utente con esse. Il modello consiste nei dati
dell’applicazione, la logica e le funzioni. Una vista è qualsiasi output che rappresenti tali dati.
Sono possibili diverse viste sullo stesso model. Il controller fa da link tra il model e la view,
traducendo i comandi da una parte all’altra.
27
2 – Tecnologie utilizzate
come plain HTML, in base ai dati contenuti nel model. Lo scope service, un componente di AngularJS, rileva le modifiche al model e le riflette sull’HTML della view
tramite il controller. Allo stesso modo, ogni modifica della view viene riportata nel
modello. In questo modo si ha uno sviluppo più veloce delle applicazioni e si evita
di dover lavorare direttamente sul DOM.
Figura 2.10. Rappresentazione schematica del funzionamento del TwoWay Data Binding
Il compilatore AngularJS compila il DOM, non le stringhe del template: questo
si traduce in una funzione di linking che, combinata allo scope model, crea una
view dinamica che lo sviluppatore non ha bisogno di aggiornare esplicitamente.
Inoltre AngularJS permette di aumentare il livello di astrazione nella scrittura di
applicazioni web, gestendo in automatico la manipolazione del DOM, il setup di
listener e notifier e la validazione dell’input, grazie a ciò gli sviluppatori possono
concentrarsi sulla logica dell’applicazione invece che su task ripetitivi e ad alto
rischio di errore.
Il risultato di tutto questo è una buona velocità di programmazione e la possibilità di concentrarsi più sugli aspetti critici che sulla programmazione di basso
livello. Inoltre, grazie alla sua struttura ed al fatto che quasi tutta l’elaborazione
venga eseguita client-side, si dimostra la scelta migliore per l’implementazione su
Raspberry Pi, permettendo di occupare meno risorse possibili. Bisogna però considerare che la curva di apprendimento è piuttosto ripida nel momento in cui ci si
sposta verso comportamenti più complessi e fuori dagli standard.
2.6.1
HighChart
HighChart è la libreria utilizzata per la creazione dei grafici che mostrano l’andamento dei consumi e, più in generale, degli eventi avvenuti nel sistema. A differenza
di altre librerie simili, HighChart permette di avere una vastissima gamma di grafici utilizzabili tramite delle API che permettono la customizzazione di qualsiasi
28
2.6 – AngularJS
aspetto. E’ inoltre possibile disegnare grafici con valori temporali non costanti ed
in generale diversi tra una serie di dati e l’altra, feature molto spesso assente in
altri software concorrenti. Questa scelta, fatta anche in ottica futura, è stata dettata anche dal fatto che le prestazioni rimangono molto buone anche in presenza di
una elevatissima quantità di dati da visualizzare e dalla possibilità di avere grafici
real-time, senza cioè la necessità di renderizzare nuovamente tutto il grafico, ma
solo aggiungere i nuovi valori.
L’immagine 2.11 riassume quanto presentato in questo capitolo.
Figura 2.11. Le componenti principali del sistema: 1 - i device Z-Wave utilizzati,
nella configurazione preferita; 2 - il RaZberry che si occupa di fare da interprete tra
Dog ed i device fisici; 3 - i driver Z-Wave sviluppati per ogni singolo dispositivo; 4
- il bundle spChains, usato per calcolare le medie dei dati raccolti; 5 - il database
H2, usato per rendere persistenti tutti i dati e le configurazioni; 6 - l’interfaccia
utente; 7 - i dispositivi utilizzati per accedere alla UI.
29
30
Capitolo 3
Sviluppo progetto
3.1
Introduzione
Dopo la panoramica sulle tecnologie utilizzate, viene qui illustrato lo sviluppo del
progetto, che è possibile dividere in tre fasi tra loro indipendenti. Una prima parte
analizzerà l’implementazione dei driver dei dispositivi Z-Wave per l’interfacciamento con Dog, la seconda tratterà lo sviluppo di un bundle atto a registrare su un
database gli eventi provenienti dal sistema, mentre l’ultima darà una spiegazione
sullo sviluppo del bundle relativo all’interfaccia utente.
3.2
Driver
Prima di analizzare la creazione dei Driver è necessario specificare il loro funzionamento all’interno del framework OSGi.
3.2.1
Device Access Specification
La Device Access Specification indica come un dispositivo si agganci alla piattaforma OSGi e come quest’ultima provveda a rilevarlo in modo automatico. Un Driver
può controllare un dispositivo se entrambe le entità rispettano le caratteristiche
definite nella device category cui appartiene il dispositivo stesso.
Una DeviceCategory specifica le regole e le interfacce che devono essere obbligatoriamente implementate per consentire la comunicazione tra Driver e Device.
Queste due ultime entità possono quindi dialogare tra loro soltanto se entrambe
appartengono a una stessa DeviceCategory. Inoltre, se un Device appartiene a una
DeviceCategory, allora vi è interoperabilità con tutti i Device conformi alle caratteristiche di quella categoria. Questo rappresenta l’unico vincolo e permette di
31
3 – Sviluppo progetto
disaccoppiare lo sviluppo del Driver da un particolare costruttore di dispositivi. Le
specifiche OSGi definiscono solo il processo di attachment (definito in seguito) tra
Driver e Device e sono quindi necessarie altre specifiche che definiscano la tecnologia
e i protocolli di comunicazione.
Il servizio Device
Un Device è un servizio della piattaforma che può rappresentare diverse forme di
dispositivi, non necessariamente fisici, potrebbe, infatti, essere usato per rappresentare un’intera rete.
Il processo di registrazione di un Device è uguale a quello di un normale servizio
nel framework OSGi; tuttavia è necessario compiere i seguenti passi per fare in
modo che il servizio aggiunto venga riconosciuto come Device e, quindi, possa
essere agganciato a un Driver:
1. registrare il servizio sotto l’interfaccia org.osgi.service.device.Device
2. impostare la proprietà DEVICE_CATEGORY che definisce il nome della device
category a cui appartiene il dispositivo.
Ogni servizio nel framework, quindi anche un Device, deve possedere un Service Persistent ID (PID o service.pid), che deve essere univoco tra tutti i servizi
registrati; nel caso dei Device tale ID viene assegnato direttamente dal framework.
Il servizio Driver
Il servizio Driver è responsabile del processo di aggancio ad un Device e deve essere
implementato in un bundle che prende il nome di ‘driver bundle’. Al momento
dell’associazione il device manager sceglie il Driver ‘più adatto’ al controllo del dispositivo, questo vuol dire che, prima di potersi associare ad un Device, il Driver
deve eventualmente competere con altri servizi dello stesso tipo. Ciascun Driver
può essere associato a più servizi Device anche appartenenti a categorie diverse.
L’interfaccia org.osgi.service.device.Driver definisce i seguenti metodi:
• match(ServiceReference): questo metodo viene invocato dal device manager
per sapere quanto il Driver sia adatto al servizio Device, indicato dall’argomento ServiceReference. Il valore ritornato dipende dall’affinità tra Device e
Driver; quando Device e Driver appartengono a due device category diverse
viene restituito Device.MATCH_NONE.
• attach(ServiceReference): questo metodo viene chiamato se il device manager
decide che un determinato Driver deve essere agganciato al Device referenziato
32
3.2 – Driver
mediante l’argomento ServiceReference. Se l’attachment va a buon fine, il metodo restituisce null ed il Device viene considerato come controllato soltanto
da quel particolare Driver.
Un servizio viene riconosciuto come Driver dal driver manager, soltanto se durante la registrazione viene definita la proprietà DRIVER_ID; il valore associato a
tale proprietà deve identificare in modo univoco il Driver, per evitare di installare
duplicati di uno stesso servizio. Il DRIVER_ID deve:
• dipendere soltanto dal particolare comportamento del Driver;
• iniziare con la forma inversa del dominio dell’azienda (o organizzazione) che
implementa il Driver;
• essere univoco e differente anche per ogni revisione dello stesso bundle.
Quando viene registrato un nuovo Driver, si attiva la contesa con altri eventuali
Driver per l’associazione di Device idle. Per poter essere agganciato a un dispositivo,
il Driver riceve delle chiamate ai suoi metodi match e attach. Una volta che un Driver
è stato agganciato a un Device, solo quest’ultimo può rilasciarlo.
Associazione di un Driver a un Device
Quando un Device viene registrato nel framework, il device manager, che è responsabile di attivare i processi opportuni in risposta alla registrazione, cerca di
individuare un Driver che sia adatto al dispositivo e lo associa al Device considerato. In questo processo il Device è passivo: registrato il servizio, rimane in attesa di
essere chiamato, poiché è compito del Driver scelto dal driver manager collegarsi al
dispositivo. Nel caso in cui il device manager non trovi un Driver adatto, il Device
rimane ‘unattacched’ e può compiere una delle seguenti azioni:
• rimanere in attesa che un nuovo Driver venga installato e ripetere la procedura
appena vista;
• de-registrarsi dal service registry ed eventualmente registrarsi nuovamente
con proprietà diverse che gli permettano di essere agganciato da un Driver.
Un Device è definito idle quando non è associato a nessuno dei Driver registrati dai
bundle.
L’interfaccia ManagedService
L’interfaccia org.osgi.service.cm.ManagedService è implementata da tutti i servizi
che devono ricevere una configurazione dal Configuration Admin service, che è
un particolare servizio che si occupa di registrare la configurazione dei bundle in
maniera persistente.
33
3 – Sviluppo progetto
Quando il ConfigurationAdmin rileva la registrazione di un nuovo ManagedService, verifica se ha a disposizione una configurazione il cui PID sia uguale a
quello del servizio. In caso affermativo viene attivata la funzione di callback updated(Configuration) che viene eseguita in maniera asincrona; altrimenti il parametro del metodo sarà null. Il ManagedService potrà a questo punto registrarsi
come servizio disponibile all’interno del framework e nel caso dei Driver sarà disponibile per iniziare la procedura di attachment quando richiesto. Il metodo
updated(Configuration) viene anche chiamato ogni volta che l’oggetto Configuration viene modificato, in modo tale da mantenere sincronizzato il servizio con la
configurazione stessa.
3.2.2
Driver Z-Wave
La realizzazione dei driver ha richiesto lo studio delle API del server Z-Way. Prima del rilascio di tale server era piuttosto complicato riuscire ad elaborare i dati
provenienti dai dispositivi operanti su protocollo Z-Wave, potendo lavorare solo a
livello di pacchetti di rete tramite l’interfaccia seriale. Al contrario, Z-Way mette a
disposizione un comodo set di comandi tramite i quali è possibile comandare tutti
gli aspetti dei dispositivi collegati al sistema.
In questo progetto sono state prese in considerazione solo le funzionalità di base
offerte dalle API: vengono quindi trattate solo quelle legate alla lettura dei sensori.
Si rimanda all’interfaccia web offerta dallo stesso Z-Way per tutte le funzioni di
configurazione dei singoli dispositivi e della rete che sono state intenzionalmente
ignorate. Questa scelta è stata dettata sia dalla necessità di limitare l’ambito di
lavoro sia dal fatto che l’implementazione di alcune di queste funzionalità avrebbe
richiesto una modifica anche al core di Dog per il loro supporto.
3.2.3
Network driver
Lo scopo del network driver è comunicare con il server Z-Way presente sul RaZberry tramite protocollo HTTP e gestire la comunicazione tra Dog ed i device
fisici. Il server Z-Way può essere interrogato tramite richieste POST nella forma
http://IPRaspberry:8083/<URL> dove <URL> si differenzia in base alla richiesta
eseguita e può essere diviso in tre categorie diverse.
• /ZWaveAPI/Run/<command>: questo tipo di comando può essere utilizzato per eseguire un’azione su un determinato dispositivo, come ad esempio
l’accensione o spegnimento di un interruttore. Command è nella forma devices[x].instances[y].commandClasses, dove x indica l’id del device all’interno
del sistema, y indica l’istanza di riferimento e commandClasses è specifico a
seconda dell’azione da eseguire e dal device in oggetto.
34
3.2 – Driver
• /ZWaveAPI/InspectQueue: utilizzato solo per scopi di debug, permette di
visualizzare la coda delle istruzioni del server.
• /ZWaveAPI/Data/<timestamp>: restituisce un flusso di dati in formato JSON
contenente le modifiche al sistema avvenuto dopo timestamp. Se viene utilizzato 0 come valore, il server restituisce l’intero albero rappresentante il
sistema.
Il network driver dipende solo da bundle che fanno parte del core di Dog e per
questo sarà il primo ad essere processato ed avviato all’interno di questo progetto. Nella fase di avvio, il bundle rimane in attesa di ricevere la configurazione
necessaria, nella quale è contenuto l’url del server Z-Way al quale collegarsi. Se la
connessione ha avuto esito positivo, il bundle viene registrato e diventa disponibile all’intero sistema. Contestualmente viene avviato un nuovo thread, denominato
ZWavePoller, che si occuperà di interrogare i dispositivi ad intervalli di tempo regolari, definiti nel file di configurazione, secondo le specifiche che saranno analizzate
successivamente.
A questo punto il Driver è registrato nel framework OSGi e le funzioni definite
nell’interfaccia ZWaveNetwork diventano disponibili per altri bundle che ne vogliono
fare uso. Le funzionalità esposte sono le seguenti.
• read(...): aggiorna lo stato interno del Device desiderato sincronizzandolo con
i dati contenuti nell’albero JSON proveniente da Z-Way. Questa funzionalità
è ottenuta tramite l’uso del metodo newMessageFromHouse(...) disponibile
su tutti i Driver.
• readAll(...): esegue le medesime operazioni della funzione precedente, ma su
tutti i Device.
• updateSensor(...): forza il sensore fisico ad aggiornare il suo stato presso il
server Z-Way.
• write(...) e controllerWrite(...): eseguono un comando specifico su un device
o sul controller. Sono equivalenti a /ZWaveAPI/Run/<command>
• addDriver(...) e removeDriver(...): aggiunge o rimuove un Driver dalla lista dei
driver installati.
La comunicazione a livello di chiamate POST viene fatta dalla classe ConnectionManager per mezzo delle librerie client Jersey, mentre tramite le librerie Jackson, viene effettuato il parsing dei dati JSON ricevuti dal server. La prima volta
che viene richiesto lo stato di un Driver (tramite read(...))viene usato il comando
/ZWaveAPI/Data/0 per ottenere lo stato dell’intero sistema che viene caricato in
memoria. Successivamente verrà utilizzato un valore diverso da 0, per ottenere
35
3 – Sviluppo progetto
solo le variazioni dall’ultima richiesta e minimizzare le elaborazioni e la quantità
di dati trasmessi.
Nel bundle del network driver si trova anche la classe astratta ZWaveDriver, che
deve essere implementata da tutti i Driver Z-Wave e che contiene alcune funzioni
di inizializzazione comuni ed un set di metodi astratti che devono successivamente
essere sviluppati in base alla natura del driver che si sta realizzando. In particolare,
ogni Device dovrà implementare un metodo ad hoc per gestire i messaggi provenienti dal device fisico newMessageFromHouse(...) ed un altro metodo per la creazione
del ZWaveNodeInfo ad esso associato, createNodeInfo(...). Lo ZWaveNodeInfo verrà
poi utilizzato dal poller per conoscere quali CommandClasses sono disponibili per
il device analizzato.
ZWavePoller
Il motore che mette in relazione tutte le funzioni fin qui definite è lo ZWavePoller.
Esso si occupa, secondo la cadenza definita dal file di configurazione del network
driver, di forzare l’update dei dispositivi fisici verso Z-Way.
Bisogna distinguere due tipi di comportamento tra i dispositivi collegati alla linea elettrica e quelli alimentati a batteria, che a loro volta si distinguono in
ambientali e triggerati dall’esterno. I primi sono sempre in ascolto sulla linea di
comunicazione con il server Z-Way e l’aggiornamento del loro valore può essere
considerato semi-istantaneo. I device della seconda categoria, al contrario, entrano
nello stato di sleep per limitare il consumo delle batterie e si svegliano ad intervalli
di tempo regolari. Questo tipo di comportamento fa si che una richiesta di update
non venga effettivamente mai eseguita fin tanto che il dispositivo non si sveglia e
risponde al server. Il periodo di sleep può essere definito tramite l’interfaccia web
di Z-Way, tenendo conto che minore è tale periodo, maggiore sarà il consumo delle
batterie. Per la terza categoria, invece, il problema non si pone poiché essi comunicheranno repentinamente a Z-Way ogni cambio di stato, rendendo la funzione di
update inutile.
Per ogni Driver caricato il poller terrà traccia dell’ultima richiesta di update
effettuata e dell’ora a cui rischedulare una nuova richiesta: ad ogni ciclo di polling,
se tale orario sarà stato superato, verrà effettuato un nuovo update verso quel
sensore. Poiché ogni singolo Driver ha definito ogni quanto tempo deve essere
forzato l’update, il caso peggiore viene dato da:
tempoSleepDispositivo + sleepThread + tempoUpdate.
Nella figura 3.1 viene riassunto il processo in inizializzazione del NetworkDriver.
Nella prima fase il bundle viene avviato dal framework (1), il quale riceve il file di
configurazione necessario per registrarsi come servizio disponibile (2). Prima che
questo avvenga, il bundle stabilisce una connessione con il server Z-Way, disponibile
sul RaZberry (3) e solo successivamente avvia il poller (4). A questo punto il bundle
36
3.2 – Driver
può registrarsi sul framework, esponendo i servizi e i metodi definiti nell’interfaccia
pubblica (5).
Figura 3.1.
3.2.4
Processo di inizializzazione del network driver
Gateway driver
Il gateway driver implementa le funzionalità specifiche del RaZberry. In questo
contesto ci si è limitati a creare le funzioni necessarie per l’associazione e la disassociazione di un nuovo dispositivo ed il reset del controller. Le prime due funzionalità sono state realizzate avviando un thread separato che comunica al controller
di entrare nello stato di pairing per 20 secondi. Al termine di questo periodo il
controller ritorna a funzionare nella sua modalità normale.
37
3 – Sviluppo progetto
Benché si occupi di comunicare con un nodo particolare del sistema, la sua
struttura è molto simile a quelli dei driver generici analizzati più avanti. Si hanno
prevalentemente due classi: la prima, ZWaveGatewayDriver, implementa l’interfaccia OSGi Driver, mentre la seconda, ZWaveGatewayDriverInstance, le funzionalità
specifiche del nodo trattato. Come visto nella sezione precedente, l’interfaccia
Driver deve essere implementata da tutti i servizi che desiderano effettuare una
procedura di attachment con un Device. Ogni volta che il sistema rileva un nuovo
Device viene infatti avviata tale procedura, al cui termine viene istanziato l’oggetto che si occuperà di gestire le funzionalità specifiche del nodo, che in questo caso
prende il nome di ZWaveGatewayDriverInstance.
3.2.5
Driver dispositivi
I Driver dei dispositivi fisici seguono tutti lo stesso schema del gateway driver: si ha
una prima classe che implementa l’interfaccia org.osgi.service.device.Driver di OSGi
ed una seconda che implementa una o più interfacce di Dog di tipo DeviceCategory.
Le DeviceCategory sono l’anello di congiunzione tra il Driver specifico ed il core di
Dog, che in questo modo può conoscere quali funzioni sono utilizzabili per un dato
Device. E’ immediato notare che, in base a questa struttura, Dog potrebbe non
poter accedere a tutte le funzioni reali del dispositivo: ad esempio molti dispositivi
Z-Wave hanno delle funzioni per controllare il livello delle batterie, ma le interfacce
utilizzate, che devono essere più generiche possibile, non hanno nessuna funzione
a questo proposito.
Ogni Driver di questa categoria implementa anche l’interfaccia ManagedService,
necessaria per poter configurare in maniera dinamica e separata il tempo che deve
intercorrere tra due update forzati dello stato del dispositivo. Poiché non per tutti
i device è sensato un comportamento simile è possibile impostare tale valore a 0.
I Driver si differenziano tra di loro prevalentemente per la gestione dei messaggi
provenienti dal device fisico: la funzione newMessageFromHouse(...) è responsabile di aggiornare lo stato della struttura dati interna in base ai valori ricevuti
dall’esterno. Questa particolare operazione ha creato diversi problemi in fase di
implementazione: dato che non tutti produttori seguono alla lettera le specifiche
del protocollo, in alcuni casi, la lettura dei dati dei sensori ha richiesto dei workaround per ottenere correttamente tali valori. Per questo motivo, benché in linea
teorica sia possibile collegare qualsiasi device di cui esista già un Driver, non è
possibile assicurare il corretto funzionamento con alcuni modelli.
Per lo sviluppo di questo progetto sono stati implementati i seguenti Driver:
• DimmableDevice: per controllare device dimmerabili, come lampade alogene;
• DoorWindowSensor: per l’utilizzo dei sensori di apertura e chiusura di porte
e finestre;
38
3.3 – Database
• LightSensor: per la misurazione della luminosità;
• MeteringPowerOutlet: per le prese che forniscono la lettura dei kW istantanei
e dei kWh;
• MovementSensor: per i sensori di movimento;
• OnOffDevice: per ogni dispositivo che abbia la funzionalità di acceso /
spento: lampadine, interruttori, ecc;
• SinglePhaseElectricityMeter: per l’utilizzo dei misuratori monofase;
• TemperatureAndHumiditySensor: per la rilevazione della temperatura ed
umidità di un ambiente.
Nell’immagine 3.2 viene mostrato lo schema completo del funzionamento di
un Driver. Dopo l’esecuzione di match e attach, Dog istanzia il Driver che ha
restituito il valore maggiore (1). Prima di essere registrato sul sistema, il Driver
deve ricevere il proprio file di configurazione (2), creare l’oggetto NodeInfo che lo
rappresenta e fornirlo allo Z-Wave Network Driver (3). Successivamente il NodeInfo
verrà registrato tra i dispositivi disponibili dello ZWavePoller (4).
Durante le fasi successive, quando il sistema sarà operativo, lo ZWavePoller
utilizzerà il Network Driver per chiedere al server Z-Way di aggiornare lo stato
del dispositivo(5). Z-Way aggiornerà il proprio stato interno in funzione della
risposta del dispositivo (6). Contestualmente il poller forzerà il Network Driver ad
aggiornare la struttura dati rappresentante il sistema, chiedendo al server Z-Way
i dati appena raccolti (7). Questo aggiornamento verrà poi propagato al Driver
bundle con il metodo newMessageFromHouse(...) (8) e, se necessario, l’evento sarà
propagato a Dog tramite la notifyEvent(...) (9).
3.3
Database
Dopo la creazione dei Driver il sistema è in grado di comunicare con i device in
maniera autonoma: il cambio dello stato di uno di loro verrà processato dai Driver
permettendo all’utente di sapere in ogni momento lo stato del sistema.
Poiché ciò che si vuole realizzare è una storicizzazione degli eventi per poterne
permettere un’analisi ed una visualizzazione a posteriori, è necessario introdurre
l’uso di un database per il salvataggio dei dati. Tale database non conterrà solo
il log degli eventi, ma verrà utilizzato anche per permettere la memorizzazione di
alcune preferenze dell’utente relative all’interfaccia grafica.
Per evitare di introdurre un legame forte tra i bundle dei driver e del database,
quest’ultimo è stato implementato come modulo a sé stante, solo ed unicamente
dipendente dal core di Dog. Il framework OSGi mette a disposizione un’interfaccia tramite la quale è possibile registrare un listener su un determinato insieme di
39
3 – Sviluppo progetto
Figura 3.2.
Funzionamento di un Driver bundle
eventi: org.osgi.service.event.EventHandler. In questo modo il suo funzionamento è
completamente astratto dalle tipologie di device presenti nel sistema ed il design
utilizzato permetterà di registrare qualsiasi tipo di evento proveniente da un dispositivo reale. Il file di configurazione necessario al suo funzionamento permette
40
3.3 – Database
inoltre di definire un sub-set di device che si desidera monitorare o lasciare che il
bundle registri tutti gli eventi.
Figura 3.3.
Diagramma ER del database
Nella figura 3.3 è illustrata la struttura del database, mentre qui di seguito
vengono analizzate in dettaglio le tabelle.
Nella tabella Event sono memorizzati tutti gli eventi generati dal sistema.
• Event ID: chiave primaria della tabella.
• Created: data ed ora dell’evento.
• Notification: il tipo di notifica ricevuta. Indica la tipologia dell’evento registrato come potenza, temperatura, ecc.
• State: lo stato del dispositivo. Popolato solo nel caso di dispositivi binari
come interruttori o sensori di movimento.
• Unit: l’unità di misura associata alla misurazione, se presente.
• Value: il valore della misurazione.
• Time Measure ID: indica l’intervallo di tempo a cui si riferisce la misurazione.
Real-time, valore accorpato degli ultimi 10 minuti, ecc.
• Device ID: indica il dispositivo che ha generato l’evento.
La tabella TimeMeasure memorizza le unità di tempo disponibili nel sistema e la
loro definizione è fortemente legata alla configurazione di spChains.
41
3 – Sviluppo progetto
• Time Measure ID: chiave primaria della tabella.
• Code: codice univoco utilizzato nella configurazione del bundle per mappare
gli eventi generati da spChains con l’unità di tempo stessa.
• Delete After: indica dopo quanti minuti gli eventi che ne fanno riferimento
possono essere eliminati.
• Name: nome user-friendly utilizzato nell’interfaccia del grafico.
• Sequence: indica l’ordinamento tra le voci della tabella stessa ed è usato nel
processo di cancellazione degli eventi.
Ogni record nella tabella Device identifica la singola tipologia di notifica che un
dispositivo può generare.
• Device ID: chiave primaria della tabella. In questo caso non è un valore numerico, ma la concatenazione dell’URI del dispositivo con una delle notifiche
che può generare. Per un sensore di temperatura ed umidità, ad esempio, si
avranno quindi due record separati.
• Description: campo di testo liberamente utilizzabile.
• Device URI: URI univoco all’interno del sistema.
• Name: nome user-friendly utilizzato nell’interfaccia del grafico
• Chart Type: permette di definire come devono essere disegnati i dati relativi
al record in oggetto.
• Graph Panel ID: riferimento al pannello nel quale i dati devono essere disegnati.
Infine, nella tabella GraphPanel, vengono memorizzati i dati necessari a definire le
zone del grafico, permettendo di avere aree separate a seconda della tipologia di
sensore visualizzato.
• Graph Panel ID: chiave primaria della tabella.
• Name: nome user-friendly utilizzato come label per l’area del grafico.
• Sequence: ordinamento di visualizzazione delle zone.
• Proportion: definisce la dimensione dell’area stessa.
42
3.3 – Database
Quando è disponibile un nuovo evento, questo viene passato come parametro
alla funzione handleEvent(Event). Gli eventi ricevuti si suddividono in quelli realtime, inviati dai dispositivi, e quelli generati da spChains, che rappresentano le
medie delle misurazioni precedenti. La prima categoria si divide a sua volta in
due casi particolari: eventi di tipo parametrico e non parametrico. Quelli di tipo
parametrico sono eventi che hanno al loro interno i valori delle misurazioni dei
sensori, mentre quelli non parametrici sono legati al cambio di stato di un dispositivo, ad esempio l’accensione di un interruttore o la rilevazione di un movimento.
Indipendentemente dalla loro natura vengono processati in maniera simile: viene
risolto il Device che ha generato l’evento, creandolo se non esiste già nel database
ed il suo valore è salvato, insieme agli altri dati necessari, nella tabella relativa.
La creazione del Device nel database non ha un vero e proprio scopo in questa
fase, ma permetterà l’associazione di un alias nell’interfaccia grafica più semplice
da riconoscere per l’utente.
Gli eventi generati da spChains hanno invece la necessità di essere elaborati in
maniera completamente diversa rispetto a quelli real-time. Ciò è dovuto al fatto
che spChains genera eventi che hanno come source spChains stesso e non il Device
che li ha generati, inoltre è necessario anche poter riconoscere se la misurazione
ricevuta è relativa, ad esempio, all’ultima ora o alla giornata passata. Poiché
anche spChains deve rimanere un bundle astratto rispetto al resto del sistema, è
necessario definire nel file di configurazione di H2 una serie di parametri che ne
permettano la decodifica.
Come si può vedere nella figura 3.4 sono definiti differenti punti di drain per
ogni catena. Quando un set di dati viene generato da un drain (il cui nome deve
essere univoco), questo è a tutti gli effetti un oggetto di tipo Event, intercettato dal
bundle di H2, che ha come source il nome del drain definito nell’XML. E’ quindi
necessario definire una mappatura tra:
• il drain ed il device relativo;
• il drain ed il tipo di notifica generato (lo stesso device può misurare umidità
e temperatura, ad esempio);
• il drain e l’unità di misura alla quale si riferisce il valore contenuto nell’oggetto
Event, tramite la quale sarà possibile riconoscere se i dati aggregati sono la
media degli ultimi 10 minuti o dell’ultima ora.
Quando il bundle di H2 riceverà un evento da spChains sarà a questo punto in
grado di decodificarlo ed inserirlo nel database insieme a tutti i dati accessori. E’ da
notare che, a differenza degli eventi real-time, che verranno salvati in automatico
senza nessun intervento da parte dell’utente, quelli legati al calcolo delle medie
richiedono un setup che deve essere ragionato per poter funzionare correttamente.
Inoltre l’aggiunta di un nuovo tipo di raggruppamento temporale richiede anche la
definizione della voce relativa nella tabella TimeMeasure.
43
3 – Sviluppo progetto
Figura 3.4.
Una catena di elaborazione definita in spChains
Poiché l’intero sistema sarà elaborato su una piattaforma dalla limitata disponibilità di memoria è stato introdotto un metodo, facilmente configurabile dall’utente
finale, per permettere la cancellazione degli eventi quando questi sono antecedenti
ad una certa data. I campi DeleteAfter e Sequence, nella tabella TimeMeasure, hanno esattamente questo scopo. All’inserimento di un nuovo Event rappresentante
una media di valori, vengono eliminati tutti gli eventi legati ad una TimeMeasure con sequenza minore di una unità rispetto alla TimeMeasure dell’evento che si
sta inserendo, registrati da più di DeleteAfter minuti. In questo modo, anche se
il sistema viene lasciato online per lunghi periodi, l’utilizzo della memoria viene
limitato. E’ comunque possibile disabilitare questa funzionalità inserendo 0 come
valore della colonna DeleteAfter.
Poiché non sarebbe stato corretto da un punto di vista dell’architettura del sistema permettere che bundle esterni possano lavorare direttamente sul database, si
è definita l’interfaccia it.polito.elite.dog.addons.h2eventstore.api.H2Store che espone
all’esterno tutti i metodi per recuperare i dati offerti dal bundle . Ovviamente
tali metodi saranno sviluppati in base alle esigenze dei bundle esterni, ma si evita di esporre all’intero sistema le primitive per accedere al db, cosa che avrebbe
facilmente portato ad una cattiva gestione delle transazioni e dei dati stessi. Per
facilitare la realizzazione di questa parte si è utilizzato il framework JPA che permette di lavorare con le entità, e quindi a livello più alto, senza doversi occupare
direttamente dell’architettura del database. Inoltre JPA consente di annotare le
44
3.4 – UI
entità create con una serie di parole chiave, grazie alle quali è possibile passare da
oggetto Java a stringa JSON senza nessun lavoro addizionale.
Figura 3.5. Rappresentazione schematica del bundle H2. Dog (1) e SpChains
(2) generano una serie di eventi che vengono intercettati dal bundle e inseriti nel
database (3). I dati vengono resi disponibili al resto del sistema tramite l’interfaccia
registrata sotto forma di modelli JPA (4)
3.4
UI
Grazie al lavoro svolto fino a questo punto il sistema è in grado di comunicare
con i device Z-Wave registrando gli eventi da loro generati. L’ultima parte di
questo capitolo riguarda l’implementazione di un’interfaccia grafica che permetta
all’utente la visualizzazione di quanto è stato registrato dal sistema. Oltre alla
semplice visualizzazione dei dati raccolti è stata anche prevista la possibilità da
parte dell’utente finale di personalizzare la stessa, implementando funzionalità ad
hoc.
45
3 – Sviluppo progetto
La base di partenza è un server Jetty che sarà raggiungibile da qualsiasi dispositivo facente parte della rete locale. Nell’ottica di poter utilizzare tale interfaccia
anche su dispositivi con schermo ridotto, si è deciso di ricorrere all’uso del framework Twitter Bootstrap, che è una collezione di diversi elementi grafici che
possono essere facilmente utilizzati per la composizione di pagine web. Inoltre,
dalla versione 2.0, esso permette di realizzare pagine web fluide, ovvero in grado di
adattarsi automaticamente alla dimensione dello schermo, agendo sulla posizione
dei singoli elementi.
Il server, già presente nell’architettura di Dog, è di tipo REST (REpresentational State Transfer). Tale tipo di architettura, a differenza di quella SOAP (Simple
Object Access Protocol), permette di ricevere come risposta uno stream in formato
sia XML sia JSON. In base al metodo HTTP utilizzato è possibile accedere alle
azioni tipiche dei modelli CRUD.
REST
POST
GET
PUT
DELETE
CRUD(Create, Read, Update, Delete)
Create
Read
Update or Create
Delete
Grazie all’utilizzo della libreria client di Jersey, è stata create un’interfaccia,
it.polito.elite.dog.admin.system.powermonitor.api.PowerMonitorInterface, nella quale
sono registrati una serie di metodi associati ad un URL. Quando il server rileva
una richiesta del client mappata sul metodo, si occupa di invocare il metodo stesso
e restituire i dati nel formato prefissato che in questo caso deriva dalla definizione
del model utilizzato nel bundle del database. Grazie alle notazioni JPA utilizzate
nella definizione del modello, è sufficiente restituire l’oggetto stesso: sarà la libreria ad occuparsi di trasformare tale oggetto nella stringa JSON che lo rappresenta,
senza nessun intervento da parte del programmatore.
L’anello di congiunzione tra il codice Java e la pagina HTML è rappresentato da
AngularJS. Grazie a questo framework è possibile implementare il pattern MVC,
dove i Model sono gli stessi utilizzati a livello di database, le View sono le pagine
web, mentre i Controller sono implementati tramite Javascript seguendo le logiche
di AngularJS stesso. Al suo interno sono inoltre disponibili diversi comandi per
la validazione dei dati, che non devono quindi essere definite a parte, ma possono
essere incluse nel file HTML stesso, limitando di molto gli errori tipici di questa fase.
Tramite questi strumenti è stato quindi possibile definire facilmente le tre pagine
utilizzate per leggere e modificare le tabelle Device (figura 3.7 e 3.8), GraphPanel
(figura 3.9) e TimeMeasure (figura 3.10).
Nella pagina relativa ai Device viene mostrato un elenco di tutti i dispositivi
monitorati. La loro creazione avviene in automatico dopo il primo evento, ma qui
46
3.4 – UI
Figura 3.6. I dati, registrati sul database (1) sono esposti nel framework dal
bundle H2 tramite modelli JPA (2). Tali modelli sono utilizzati da AngularJS per
popolare l’interfaccia utente basata su Bootstrap (3).
è possibile definire un nome più significativo per l’utente, il tipo di grafico che si
vuole realizzare per questo Device ed in quale zona tale grafico deve essere posizionato (GraphPanel). Anche le TimeMeasure non possono essere create direttamente
dall’utente (per quanto visto nella capitoletto precedente non avrebbe senso se non
viene modificata anche la parte relativa ad spChains), ma anche qui è possibile
definire un nome più significativo per l’utente e per quanto tempo i dati devono
essere conservati (DeleteAfter). L’ultima pagina è quella dei GraphPanel: qui è
possibile creare e definire le varie zone del grafico dove verranno riportati i dati.
Oltre al nome è necessario specificare l’ordinamento e la sua dimensione espressa
47
3 – Sviluppo progetto
in multipli di 100px. Tale struttura rende facilmente configurabile l’eventuale aggiunta di un nuovo device, benché si traduca in un’elaborazione più complessa in
fase di realizzazione del grafico.
Figura 3.7.
Finestra per la gestione dei Device
Figura 3.8.
Finestra per la modifica dei Device
48
3.4 – UI
Figura 3.9.
Figura 3.10.
Finestra per la gestione dei Graph Panel
Finestra per la gestione delle Time Measure
A questo punto è possibile analizzare la creazione del grafico vero e proprio.
A differenza delle pagine web analizzate fino ad ora, dove era sufficiente restituire
l’oggetto Java per avere il JSON corrispondente, qui è necessario costruire manualmente la stringa desiderata in base alla libreria utilizzata per la creazione del
grafico stesso, in questo caso HighCharts. Tramite l’interfaccia è possibile filtrare i risultati per data e tipo permettendo così un maggior controllo sull’output
finale. Bisogna notare che, come detto in precedenza, non tutti i dispositivi restituiscono un valore numerico, per questo è prevista la possibilità di mappare tale
valore nel file di configurazione del bundle powerMonitor. Il bundle fornisce quindi
un JSON che rappresenta completamente il grafico: dai valori delle singole serie
filtrate secondo interfaccia, all’aspetto grafico finale.
La libreria HighCharts mette a disposizione numerose funzionalità di default,
come lo zoom su una zona del grafico e la scelta di quali dispositivi visualizzare. Più
in generale, permette di customizzare ogni singolo aspetto del grafico visualizzato,
ma si è preferito focalizzarsi sugli aspetti più inerenti all’obiettivo del progetto,
lasciando tali valori inalterati rispetto alle configurazione base.
49
3 – Sviluppo progetto
Figura 3.11.
Dettaglio del filtro per la selezione del range temporale.
Al termine dello sviluppo di quest’ultimo bundle il sistema è pronto per entrare
in funzione: i bundle dei driver si occuperanno di comunicare con i dispositivi fisici,
creando eventi ogni qualvolta il loro stato cambierà. Il bundle di H2 intercetterà tali
eventi e si occuperà di salvarli in una base dati insieme alle medie delle misurazioni
derivanti dalle elaborazione del bundle spChains; infine il bundle powerMonitor,
grazie al server Jetty, alle librerie Jersey ed ai framework utilizzati, permetterà
all’utente di analizzare i dati raccolti in maniera semplice ed intuitiva.
50
Figura 3.12.
Esempio di grafico visualizzato.
3.4 – UI
51
52
Capitolo 4
Risultato finale
Lo sviluppo di questo progetto ha portato ad ottenere degli ottimi risultati ed il
raggiungimento di tutti gli obiettivi prefissati. Se si guarda al sistema nel suo
complesso, si sono unite diverse tecnologie per arrivare ad avere una struttura utilizzabile effettivamente come sistema di monitoraggio energetico portatile, anzi si è
andati oltre integrando nello sviluppo la scrittura dei driver per alcuni dispositivi
non direttamente collegati al concetto di monitoraggio energetico, ma che possono
dare un’idea più precisa dell’ambiente in cui gli stessi dispositivi operano. Tali
driver sono completamente indipendenti dal resto del sistema e vanno a colmare
l’assenza di driver per i dispositivi Z-Wave all’interno di Dog, anche grazie all’impiego di un’interfaccia semplice come quella messa a disposizione da Z-Way. Per
questo i driver qui sviluppati sono già stati inglobati all’interno di Dog stesso e
sono attualmente oggetto di ulteriori sviluppi per aderire alle specifiche di Dog 3.0.
Anche il modulo del database, grazie alla sua definizione indipendente dal resto
del sistema, può essere utilizzato fin da subito per catalogare e loggare gli eventi
del sistema, non solo quelli derivanti da dispositivi Z-Wave, ma qualsiasi device
che disponga dei driver Dog, senza alcuna modifica. La scelta di un database come
H2 si è rivelata vincente per il suo utilizzo su un sistema embedded: le prestazioni
si sono rilevate assolutamente soddisfacenti anche quando il sistema opera a pieno
regime, sia per quanto riguarda la scrittura sia per la lettura dei dati.
Infine, il modulo relativo all’interfaccia si rivela efficace e di facile utilizzo anche
da parte di coloro hanno poca dimestichezza con i sistemi informatici, permettendo
in maniera semplice ed intuitiva la modifica di alcuni parametri di visualizzazione.
AngularJS ha consentito inoltre di sviluppare un’interfaccia snella sia da un punto
di vista pratico sia da quello di sviluppo informatico.
53
4 – Risultato finale
4.1
Possibili sviluppi futuri
Il sistema permette la raccolta di un elevato numero di dati che al momento vengono visualizzati all’utente finale tramite una sola tipologia di grafico. Parte di
questa scelta ricade sul fatto che il Raspberry Pi ha una potenza di calcolo limitata e difficilmente sarebbe stato possibile sviluppare una vera e propria logica di
Business Intelligence su un dispositivo simile. Si potrebbe quindi pensare di affiancare ad un sistema così configurato un centro di elaborazione più performante
per il calcolo e la visualizzazione di grafici più complessi e talvolta più significativi.
Ad esempio, potrebbe essere molto interessante vedere l’andamento dei consumi
per fasce orarie o per giorni della settimana nel lungo periodo. Anche continuando
ad utilizzare il Raspberry Pi come centro di elaborazione, si potrebbe pensare di
aggiungere un set di grafici per fornire informazioni più complete e fruibili.
Altro punto che potrebbe essere sviluppato e migliorato è l’aggiunta di un nuovo
dispositivo al sistema. Benché la sua installazione sia semplice se eseguita seguendo
la procedura fornita (vedi Appendice A), questa è senza ombra di dubbio complicata per una persona non abituata all’utilizzo di certi sistemi. A questo proposito
bisogna però distinguere la differenza presente tra Dog, spChains ed il modulo del
database. In Dog esiste già un processo che genera in automatico tutti i file necessari quando si installa un nuovo dispositivo, ma è una procedura molto pesante da
un punto di vista elaborativo e non è quindi adatta a funzionare sul Raspberry Pi.
Al contrario spChains ed il modulo del database non hanno una funzionalità simile
al momento, benché per il primo sia probabile che venga sviluppata un’interfaccia
user-friendly nel prossimo futuro. Più in generale l’interfaccia qui sviluppata rappresenta un primo tentativo di rendere facilmente fruibile le enormi potenzialità di
Dog, finora gestibili solo tramite file o interfacce piuttosto complicate.
Nei sistemi attualmente in commercio spesso si ha la possibilità di definire il
costo dell’energia in base alle diverse fasce orarie. Un indicatore di questo tipo
renderebbe ancora più chiara la lettura dei consumi, con un feedback di maggiore
impatto soprattutto su soggetti non abituati alla lettura di grafici o indicatori.
D’altra parte l’implementazione di un sistema simile avrebbe richiesto la necessità
di uno studio approfondito delle tipologie di contratto disponibili nel mondo.
Nel primo capitolo si è accennato anche al fatto che diverse ricerche hanno evidenziato come una parte importante del sistema sia quella ‘sociale’. La possibilità
di comparare i propri consumi con quelli di abitazioni simili o di avere accesso a
dati di altri utenti, può essere vista come un’aggiunta sostanziale al sistema. Sviluppare un sistema simile è tutt’altro che banale, ma può essere molto interessante
per il futuro.
54
4.1 – Possibili sviluppi futuri
Un tema non affrontato a nessun livello durante questo progetto è quello relativo
alla sicurezza informatica del sistema: l’interfaccia fornita è accessibile a chiunque
conosca l’indirizzo IP del Raspberry Pi. Questo potrebbe non rappresentare un
problema nel caso di una rete privata, ma non sarebbe sicuramente adatta ad
un’infrastruttura pubblica.
55
56
Appendice A
Guida all’uso
A.1
Aggiunta di un nuovo sensore
Per aggiungere un nuovo elemento al sistema di monitoraggio occorre:
1. Avviare la procedura di pairing tra Z-Way ed il device, seguendo le istruzioni
specifiche del dispositivo. Se necessario collegarsi all’interfaccia di demo di
Z-Way per impostare un valore di sleep corretto.
2. Modificare il file zwave.xml o, in generale, il file che rappresenta l’House Model
inserendo la definizione del device da aggiungere. Si raccomanda di copiare
una delle definizioni già presenti nel file andando a modificare il valore della
proprietà name, gli id dei comandi ed il valore del parametro NodeID. Si
riporta come esempio la definizione di un MeteringPowerOutlet
<dhc : d e v i c e domoticSystem ="ZWave " name="ZW_MeteringPowerOutlet_8 "
c l a s s =" M e t e r i n g P o w e r O u t l e t " gateway ="zwave−gateway">
<dhc : d e s c r i p t i o n ></dhc : d e s c r i p t i o n >
<dhc : i s I n >s t o r a g e r o o m </dhc : i s I n >
<dhc : param v a l u e ="13" name="NodeID " />
<dhc : param v a l u e ="0" name=" I n s t a n c e I D " />
<dhc : c o n t r o l F u n c t i o n a l i t y c l a s s =" O n O f f F u n c t i o n a l i t y ">
<dhc : commands>
<dhc : command i d ="OffCommand_ZW8" name="OffCommand_ZW8"
c l a s s ="OffCommand">
<dhc : param v a l u e =" o f f " name="realCommandName"/>
</dhc : command>
<dhc : command i d ="OnCommand_ZW8" name="OnCommand_ZW8"
c l a s s ="OnCommand">
<dhc : param v a l u e ="on " name="realCommandName"/>
</dhc : command>
</dhc : commands>
</dhc : c o n t r o l F u n c t i o n a l i t y >
<dhc : c o n t r o l F u n c t i o n a l i t y
c l a s s =" A c t i v e P o w e r M e a s u r e m e n t F u n c t i o n a l i t y ">
<dhc : commands>
<dhc : command i d ="GetActivePowerCommand_ZW8 "
57
A – Guida all’uso
name="GetActivePowerCommand_ZW8 "
c l a s s ="GetActivePowerCommand">
<dhc : param v a l u e =" g e t A c t i v e P o w e r " name="realCommandName " />
<dhc : param v a l u e ="Measure " name=" r e t u r n T y p e " />
</dhc : command>
</dhc : commands>
</dhc : c o n t r o l F u n c t i o n a l i t y >
<dhc : c o n t r o l F u n c t i o n a l i t y
c l a s s =" A c t i v e P o w e r M e a s u r e m e n t F u n c t i o n a l i t y ">
<dhc : commands>
<dhc : command i d ="GetActiveEnergyValueCommand_ZW8 "
name="GetActiveEnergyValueCommand_ZW8 "
c l a s s ="GetActiveEnergyCommand">
<dhc : param v a l u e =" g e t A c t i v e E n e r g y V a l u e "
name="realCommandName " />
<dhc : param v a l u e ="Measure " name=" r e t u r n T y p e " />
</dhc : command>
</dhc : commands>
</dhc : c o n t r o l F u n c t i o n a l i t y >
<dhc : n o t i f i c a t i o n F u n c t i o n a l i t y
c l a s s =" S t a t e C h a n g e N o t i f i c a t i o n F u n c t i o n a l i t y ">
<dhc : n o t i f i c a t i o n s >
<dhc : n o t i f i c a t i o n name=" S t a t e C h a n g e N o t i f i c a t i o n _ Z W 8 "
c l a s s =" S t a t e C h a n g e N o t i f i c a t i o n ">
<dhc : param v a l u e =" s t a t e C h a n g e d " name=" n o t i f i c a t i o n N a m e " />
<dhc : param t y p e =" S t a t e " v a l u e =" n e w S t a t e "
name=" n o t i f i c a t i o n P a r a m N a m e " />
</dhc : n o t i f i c a t i o n >
</dhc : n o t i f i c a t i o n s >
</dhc : n o t i f i c a t i o n F u n c t i o n a l i t y >
<dhc : n o t i f i c a t i o n F u n c t i o n a l i t y
c l a s s =" A c t i v e P o w e r M e a s u r e m e n t N o t i f i c a t i o n F u n c t i o n a l i t y ">
<dhc : n o t i f i c a t i o n s >
<dhc : n o t i f i c a t i o n name=" ActivePowerMeasurementNotification_ZW8 "
c l a s s =" A c t i v e P o w e r M e a s u r e m e n t N o t i f i c a t i o n ">
<dhc : param v a l u e ="2" name="nParams " />
<dhc : param v a l u e =" newActivePowerValue "
name=" n o t i f i c a t i o n N a m e " />
<dhc : param name=" u n i t O f M e a s u r e " v a l u e ="W" />
<dhc : param t y p e ="Measure " v a l u e =" v a l u e "
name=" n o t i f i c a t i o n P a r a m N a m e " />
</dhc : n o t i f i c a t i o n >
</dhc : n o t i f i c a t i o n s >
</dhc : n o t i f i c a t i o n F u n c t i o n a l i t y >
<dhc : n o t i f i c a t i o n F u n c t i o n a l i t y
c l a s s =" A c t i v e E n e r g y M e a s u r e m e n t N o t i f i c a t i o n F u n c t i o n a l i t y ">
<dhc : n o t i f i c a t i o n s >
<dhc : n o t i f i c a t i o n
name=" A c t i v e E n e r g y M e a s u r e m e n t N o t i f i c a t i o n _ Z W 8 "
c l a s s =" A c t i v e E n e r g y M e a s u r e m e n t N o t i f i c a t i o n ">
<dhc : param v a l u e ="2" name="nParams " />
<dhc : param v a l u e =" ne wAct ive Ene rgy Val ue "
name=" n o t i f i c a t i o n N a m e " />
<dhc : param name=" u n i t O f M e a s u r e " v a l u e ="Wh" />
<dhc : param t y p e ="Measure " v a l u e =" v a l u e "
name=" n o t i f i c a t i o n P a r a m N a m e " />
</dhc : n o t i f i c a t i o n >
</dhc : n o t i f i c a t i o n s >
</dhc : n o t i f i c a t i o n F u n c t i o n a l i t y >
<dhc : s t a t e c l a s s =" O n O f f S t a t e ">
<dhc : s t a t e v a l u e s >
<dhc : s t a t e v a l u e name=" o f f " c l a s s =" O f f S t a t e V a l u e "/>
58
A.1 – Aggiunta di un nuovo sensore
<dhc : s t a t e v a l u e name="on " c l a s s =" OnStateValue "/>
</dhc : s t a t e v a l u e s >
</dhc : s t a t e >
<dhc : s t a t e c l a s s =" EnergyMeasurementState ">
<dhc : s t a t e v a l u e s >
<dhc : s t a t e v a l u e name="" c l a s s =" A c t i v e E n e r g y S t a t e V a l u e " />
</dhc : s t a t e v a l u e s >
</dhc : s t a t e >
<dhc : s t a t e c l a s s =" A c t i v e P o w e r M e a s u r e m e n t S t a t e ">
<dhc : s t a t e v a l u e s >
<dhc : s t a t e v a l u e name="" c l a s s =" A c t i v e P o w e r S t a t e V a l u e " />
</dhc : s t a t e v a l u e s >
</dhc : s t a t e >
</dhc : d e v i c e >
3. Aprire il file sourceDeviceMapping.xml ed inserire i riferimenti al nuovo device.
Questo file definisce quali device vengono presi in considerazione da spChains
per la creazione degli eventi aggregati; nel caso in cui non sia necessaria questa
funzionalità è possibile saltare alla sezione sull’uso della UI.
Inserire le righe seguenti per ogni tipo di notifica che si vuole far intercettare
a spChains. Il sensorURI deve essere uguale al campo name del dhc:device
definito in precedenza.
<sdm : s e n s o r sensorQFParams =""
s e n s o r Q F u n c t i o n a l i t y =" A c t i v e P o w e r M e a s u r e m e n t N o t i f i c a t i o n "
s ens or U R I ="ZW_MeteringPowerOutlet_8 " u i d ="zwave−8−ActivePower " />
4. Definire, nel file spProcessor.xml, la catena di elaborazione per spChains
legata al nuovo sensore inserito (una per ogni notifica). Si rimanda alla
documentazione di spChains stesso per le istruzioni dettagliate.
5. Nel file di configurazione di H2, h2.config, definire il mapping tra i vari blocchi
della catena di elaborazione e gli elementi di sistema. Con la parola chiave
‘map.’ si definiscono le mappatura tra il campo blockId di ogni blocco e
l’unità di misura contenuta nella tabella TimeMeasure. Tali chiavi devono
iniziare con ‘map.’. Ad esempio:
map . 8 _ActivePower_15m=15m
map . 8 _ActivePower_30m=30m
map . 8 _ActivePower_1h=1h
map . 8 _ActivePower_4h=4h
map . 8 _ActivePower_1g=1g
Con la parola chiave ‘drain.’ si definiscono, invece, le mappature tra ogni
drain ed il corrispondente device:
drain
drain
drain
drain
drain
. ZW_8_ActivePowerDrain#1=ZW_MeteringPowerOutlet_8
. ZW_8_ActivePowerDrain#2=ZW_MeteringPowerOutlet_8
. ZW_8_ActivePowerDrain#3=ZW_MeteringPowerOutlet_8
. ZW_8_ActivePowerDrain#4=ZW_MeteringPowerOutlet_8
. ZW_8_ActivePowerDrain#5=ZW_MeteringPowerOutlet_8
Infine con ‘notification.’ si indica la corrispondenza tra un drain e il suo tipo
di notifica:
59
A – Guida all’uso
n o t i f i c a t i o n . ZW_8_ActivePowerDrain#1=
ActivePowerMeasurementNotification
n o t i f i c a t i o n . ZW_8_ActivePowerDrain#2=
ActivePowerMeasurementNotification
n o t i f i c a t i o n . ZW_8_ActivePowerDrain#3=
ActivePowerMeasurementNotification
n o t i f i c a t i o n . ZW_8_ActivePowerDrain#4=
ActivePowerMeasurementNotification
n o t i f i c a t i o n . ZW_8_ActivePowerDrain#5=
ActivePowerMeasurementNotification
6. Nel caso di sensori binari, se non è già stato definito in precedenza, aggiungere al file powermonitor.config la mappatura tra il valore del sensore binario
espresso in parole ed il valore numerico per la visualizzazione nel grafico.
Deve essere utilizzato il prefisso ‘value.’:
v a l u e . on=1
v a l u e . o f f =0
A.2
Uso della UI
Collegandosi all’indirizzo http://IPRaspberry:8080 si accede all’interfaccia grafica
del sistema. Allo stato attuale sono disponibili 5 finestre di gestione diverse.
Nel tab ‘Status’, vengono riportate alcune informazioni sullo stato del sistema: la
memoria disponibile e quella utilizzata, i dispositivi collegati e lo stato dei bundle.
Il tab ‘Devices’ elenca i dispositivi che hanno generato almeno un evento;
la loro creazione è infatti automatica ed avviene in concomitanza con la prima
registrazione. I campi modificabili sono:
• name: usato nel grafico per identificare facilmente il device;
• description: campo di testo libero;
• chart type: definisce come i dati di questo device devono essere visualizzati
nel grafico; se non viene definito un valore viene assunto il tipo ‘lines’;
• graph panel: stabilisce dove devono essere tracciati i dati di questo dispositivo; questo campo deve essere obbligatoriamente definito prima di poter
visualizzare il grafico;
Il tab ‘Time Measure’ mostra i vari livelli di aggregazione per i dati disponibili.
I dati modificabili in questo caso sono solamente:
• name: usato nel grafico per identificare facilmente il livello di raggruppamento;
• delete after: dopo quanti minuti gli eventi che ne fanno riferimento possono
essere cancellati dal sistema;
60
A.3 – Grafico
Per la modifica degli altri valori o la creazione di nuovi livelli di aggregazione
bisogna agire direttamente sul database. Questo processo è stato volutamente reso
più complesso poiché l’aggiunta di nuovi record in questa tabella deve essere seguita
dalla revisione della definizione di spChains e dei file di configurazione collegati e
non è quindi un’operazione eseguibile da utenti senza le necessarie conoscenze del
sistema.
Il tab ‘Graph Panel’ permette la definizione di nuove aree del grafico e la loro
modifica. E’ possibile modificare i seguenti dati:
• name: usato nel grafico come label della zona;
• proportion: definisce la dimensione della zona di visualizzazione;
• sequence: l’ordinamento dei pannelli nel grafico;
A.3
Grafico
L’ultimo tab disponibile,‘Graph’, è quello per la visualizzazione dei dati raccolti.
In alto a sinistra si trova un menù a tendina per la scelta della tipologia dei dati
che si desiderano visualizzare. Nel caso si stiano visualizzando i dati in realt-time,
il grafico si aggiornerà automaticamente, mentre per gli altri raggruppamenti è
necessario agire manualmente tramite il tasto ‘Update’.
A destra è disponibile un filtro per selezionare un range di date da visualizzare:
alcuni intervalli sono predefiniti, ma è possibile agire manualmente e selezionare
qualsiasi orario e data.
Nella parte dedicata al grafico si trova la legenda ed i vari pannelli definiti nella
sezione ‘Graph Panel’: cliccando su uno dei nomi dei dispositivi nella legenda è
possibile nascondere la serie relativa. E’ inoltre possibile esportare il grafico in vari
formati tra cui JPG e PDF, oppure procedere alla stampa diretta dello stesso.
Infine, selezionando una particolare misurazione verrà mostrato un tooltip con
le informazioni dettagliate, mentre evidenziando una sezione del grafico è possibile
effettuare uno zoom sullo stesso.
61
62
Bibliografia
[1] ENEA.
L’etichetta energetica, 2013.
http://www.enea.it/it/
produzione-scientifica/pdf-opuscoli/OpuscoloEtichettaEnergetica.
pdf.
[2] Industria Energia. Italiani: attenti al risparmio energetico, ma poco informati
sulle soluzioni, Maggio 2013. http://www.industriaenergia.it.
[3] Sarah Darby. Demand response: the effectiveness of feedback on energy
consumption, Settembre 2009.
[4] Voltimum. Domotica: stato dell’arte, terminologia, protocolli, 2013. http:
//www.voltimum.it/techarea.php?dyntype=gie&hsid=66.
[5] Simone Pecchenino. Standard domotico z-wave nel gateway dog2.0: Integrazione e sperimentazione.
Master’s thesis, Politecnico di Torino,
2010.
[6] Dario Bonino, Fulvio Corno, Luigi De Russis. Home energy consumption
feedback: A user survey, Dicembre 2011.
[7] FindTheBest.
Compare h2 vs sqlite,
2013.
http://
database-management-systems.findthebest.com/compare/16-53/
H2-vs-SQLite.
[8] Google. Angularjs, 2013. http://angularjs.org/.
[9] Gruppo e-Lite. Dog, 2012. http://elite.polito.it/dog-tools-72.
[10] Gruppo e-Lite. spchains: A declarative framework for data stream processing
in pervasive applications, 2012. http://elite.polito.it/spchains.
[11] H2 Group. H2 database engine, 2013. http://www.h2database.com.
[12] Highsoft. Highcharts, 2013. http://www.highcharts.com/.
[13] Gianluca Moretti. Osgi platform, 2008. http://www.programmazione.it/
index.php?entity=eitem&idItem=39127.
[14] Vesternet Ltd.
Understanding z-wave networks, nodes & devices, 2012. http://www.vesternet.com/resources/technology-indepth/
understanding-z-wave-networks.
[15] Wikipedia. Angularjs, 2013. http://en.wikipedia.org/wiki/AngularJS.
[16] Wikipedia. H2 (dbms), 2013. http://en.wikipedia.org/wiki/H2_(DBMS).
63
Bibliografia
[17] Wikipedia. Model-view-controller, 2013. http://en.wikipedia.org/wiki/
Model-view-controller.
[18] Wikipedia. Service-oriented architecture, 2013. http://it.wikipedia.org/
wiki/Service-oriented_architecture.
[19] Wikipedia. Z-wave, 2013. http://en.wikipedia.org/wiki/Z-Wave.
[20] Z-Wave.Me Team. Razberry, 2013. http://razberry.z-wave.me/.
[21] Z-Wave.Me Team. Razberry user and developers documentation, 2013. http:
//razberry.z-wave.me/docs/razberry.pdf.
[22] Z-Wave.Me Team.
Z-way developers documentation, 2013.
http://
razberry.z-wave.me/docs/zwayDev.pdf.
64
Scarica

Z-Wave portable energy profiler - e-Lite