IoT Home Automation UNIBO
IoT Home Automation UNIBO
IoT Home Automation UNIBO
CAMPUS DI CESENA
SCUOLA DI INGEGNERIA E ARCHITETTURA
Tesi in
Sistemi Intelligenti Distribuiti LS
Relatore Presentata da
Sessione III
1 Introduzione 1
2 Internet of Things 5
2.1 Definizione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2 Principali standard . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3 Protocolli a livello applicativo . . . . . . . . . . . . . . . . . . . 19
2.4 IoT e WoT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4 Caso di Studio 71
4.1 Sistema domotico HomePLC . . . . . . . . . . . . . . . . . . . . 73
HomePLC.Linux . . . . . . . . . . . . . . . . . . . . . . . . . . 73
i
Indice
5 Conclusioni 139
Bibliografia 141
ii
Elenco delle figure
iii
Elenco delle figure
iv
Elenco delle figure
v
Elenco delle tabelle
4.1 Glossario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.1 Glossario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
4.2 Turn on/off Light Bulb use case . . . . . . . . . . . . . . . . . . 82
4.3 Move up/down Blind use case . . . . . . . . . . . . . . . . . . . 83
4.4 Sense Device Contacts use case . . . . . . . . . . . . . . . . . . 85
4.5 Control Device Relais . . . . . . . . . . . . . . . . . . . . . . . . 85
4.6 Registri Ragnetto Temperatura e Umidità . . . . . . . . . . . . 99
4.7 Item per HomePLCBinding . . . . . . . . . . . . . . . . . . . . 127
vii
Elenco degli algoritmi
ix
1 Introduzione
1
1 Introduzione
Dopo questa breve introduzione vediamo come è stato suddiviso il testo per for-
nire un quadro generale che possa aiutare la lettura e la ricerca di un eventuale
argomento.
La prima sezione riguarda Internet of Things dove verranno date le definizioni
del termine e si prenderanno in esame gli standard e i protocolli che risultano
di notevole importanza in questo contesto. Verranno inoltre forniti alcuni dati
2
interessanti per cercare di dare una idea delle dimensioni di questo fenomeno e
come venga percepito dall’industria.
Nella seconda sezione, riguardante il settore della Home Automation, ne pre-
senta il percorso nel tempo e i problemi che ne limitano l’adozione da parte dei
proprietari di appartamenti. Vengono illustrati alcuni degli standard che vengo-
no utilizzati in questo ambito e i principali sistemi che possono essere acquistati
in Italia esponendone le principali caratteristiche. Per concludere vengono pre-
sentate alcune soluzioni che si sono affacciate recentemente su questo mercato
che sfruttano le tecnologie proprie della IoT.
L’ultima sezione, la più corposa di tutte, è riservata alla progettazione di un
sistema di Home Automation che riuscisse a sfruttare le tecnologie della IoT
per ampliare le funzionalità di un reale sistema domotico in un reale conte-
sto abitativo. Viene presentato in parte il percorso seguito per raggiungere gli
obiettivi, superando alcune difficoltà incontrate, fino ad ottenere un sistema
completamente funzionante e realmente utilizzato che presenti buone caratte-
ristiche di apertura, flessibilità e performance. A conclusione vengono esposte
alcune valutazione su quanto realizzato.
3
2 Internet of Things
Secondo una stima di Cisco IBSG (Internet Business Solutions Group) la Inter-
net of Things sarebbe “nata” tra il 2008 e il 2009 quando il numero di dispositivi
connessi ad internet ha superato il numero della popolazione mondiale[11]. Nel
1
http://www.rfidjournal.com/articles/view?4986
2
https://en.wikipedia.org/wiki/Barcode
5
2 Internet of Things
L’Hype Cycle (vedi figura 2.2) è suddiviso in cinque fasi chiave il cui insieme
descrive il ciclo di vita a cui è destinata una tecnologia:
3
Fonti: Cisco IBSG, 2010; U.S. Census Bureau, 2010.
6
Technology Trigger. Una tecnologia potenzialmente innovativa ha inizio. Pri-
mi tentativi di progetto e l’interesse dei media genera significativa
divulgazione. Spesso non esistono prodotti utilizzabili e la fattibilità
per la commercializzazione non è certificata.
7
2 Internet of Things
Dalla figura 2.3 si nota come l’internet delle cose attualmente sia nella fase in
cui sta creando maggiori aspettative e nella legenda si può ricavare la stima del
tempo che impiegherà questa tecnologia a raggiungere la fase in cui diventerà
produttiva.
Nel presente capitolo si cercherà di dare una definizione di Internet of Things e
di illustrare le principali tecnologie e standard adottati in questo contesto.
2.1 Definizione
Inizialmente, in letteratura, potevano essere ritrovate molteplici definizioni del
termine Internet of Things e questo non era altro che il risultato del forte
interesse che la comunità di ricerca rivestiva in questo nuovo concetto e dalla
vivacità dei dibattiti su di esso [2]. La confusione era prodotta dal termine
stesso e dalle parole da cui è composto.
8
2.1 Definizione
Differenti visioni (vedi figura 2.4) dipesero da come enti di ricerca, standardiz-
zazione e alleanze commerciali approcciarono il problema: solitamente in base
ai loro interessi, finalità e background.
La prima definizione di IoT, come abbiamo visto all’inizio del capitolo, deriva
da una prospettiva “Thing oriented” dovuta allo sviluppo di semplici ogget-
ti: i tag Radio-Frequency IDentification (RFID). Il termine IoT però implica
una visione più ampia rispetto alla semplice identificazione degli oggetti co-
me, ad esempio, gli Smart Item, dotati di memoria, capacità di elaborazione e
comunicazione wireless. L’abilità di connettere questi dispositivi, permetterne
la comunicazione tra loro e internet, garantendo la possibilità di nuovi servizi
per le persone, rappresentava la congiunzione tra la visione “Thing oriented” e
la visione “Internet oriented” [2], che promuoveva Internet Protocol (IP) come
tecnologia per connettere tutti gli Smart Object del mondo.
A lato, non meno importante delle prime due, c’era la visione “Semantic orien-
ted” maturata dalla consapevolezza che in questa futura internet il problema
9
2 Internet of Things
sarebbe stato l’enorme mole di informazione che avrebbe creato un numero così
elevato di oggetti abilitati a comunicare.
Per comprendere meglio la portata di questa innovazione cerchiamo di elencare
i principali elementi che sono in grado di generare le funzionalità della IoT [1]:
Sensing: si intende ottenere informazione dagli oggetti di una rete per una
successiva elaborazione. In questo caso si tratta sia di sensori che di at-
tuatori ma anche di Single Board Computer (SBC) tipicamente utilizzati
per realizzare prodotti della IoT.
Communication: l’insieme delle tecnologie per collegare tra loro gli oggetti in
modo da fornire i servizi a loro richiesti.
Service: Al-Fuqaha [1] suddivide i servizi forniti dalla IoT in quattro classi.
10
2.2 Principali standard
11
2 Internet of Things
RFID e NFC.
Agli inizi del 2000 l’RFID era considerata la tecnologia più promettente a for-
nire un’accelerazione alla formazione della IoT. Fu realizzato anche un nuovo
standard chiamato UHF RFID in grado di automatizzare la lettura dei tag a
una distanza di 8-10 metri in modo da sostituire l’utilizzo dei Barcode ma, in
pratica, problemi nella rilevazione dovuti a un errato posizionamento del tag/-
prodotto limitarono l’adozione di questo nuovo standard da parte di grossisti
del calibro di Walmart e Tesco.
La Near-Field Communication (NFC) è una forma di RFID che ha fornito a
questo sistema un’ulteriore possibilità soprattutto legata al supporto dei pa-
gamenti elettronici. Sebbene non tutti gli smartphone comprendono questa
tecnologia grandi aziende come Apple (e la diffusione dei loro sistemi di pa-
gamento come ApplePay) potrebbe fornire una ulteriore spinta all’adozione di
questa tecnologia anche come abilitante per la IoT.
Il successo del Quick Response Code (QRCode) è legato direttamnete alla dif-
fusione dell’applicazoine che fa utilizzo della fotocamera ad alta risoluzione che
è possibile trovare oramai in tutti gli smartphone più recenti.
Sebbene si possano trovare esempi di QRcode in giornali, riviste, depliant, ecc.
la sua adozione è rallentata da una tiepida risposta da parte degli utenti. Il
motivo si può ricercare proprio nella necessità di pre-installare l’applicazione ri-
chiesta per leggere i QRcode e nella difficoltà di posizionamento della fotocamera
per la messa a fuoco e la decodifica accurata dell’immagine.
6LoWPAN
12
2.2 Principali standard
Ethernet (anche noto come IEEE 802.3) è lo standard risultato vincitore per la
realizzazione di LAN domestiche e aziendali, per cui può sembrare appropriato
13
2 Internet of Things
La scelta più ovvia come tecnologia di networking per un dispositivo per l’IoT
è il Wi-Fi perchè è molto diffuso. Purtroppo il Wi-Fi richiede una discreta
quantità di potenza che non tutti i dispositivi possono permettersi, ad esempio,
sensori posizionati in luoghi difficili da raggiungere dall’alimentazione di rete.
IEEE 802.15.4
Rilasciato nel 2003 lo standard radio IEEE 802.15.4 è una delle maggiori tecno-
logie abilitanti per l’IoT ed è stato concepito per regolamentare il livello livello
fisico (PHY) per Low-Rate Wireless Private Area Network (LR-WPAN) ed il
livello Medium Access Control (MAC) di reti in area personale (massimo 30
metri) e che lavorano con basse velocità di trasferimento dati.
Grazie alle sue caratteristiche come basso consumo di potenza, bassi data-rate,
prezzo basso e alto throughput è utilizzato da IoT, M2M e Wireless Sensor
Network (WSN). È in grado di fornire una comunicazione affidabile e può gestire
un elevato numero di nodi (circa 65k). Garantisce inoltre un alto livello di
14
2.2 Principali standard
Supporta due tipi di nodi di rete: Full e Reduced Function Device (FFD e RFD).
Un FFD può servire come coordinatore di una Personal Area Network (PAN)
o anche come nodo normale. Un coordinatore è responsabile della creazione,
controllo e gestione della rete. Gli RFD invece sono nodi molto semplici con
risorse limitate.
Si ottiene una rete quando due o più device comunicano sullo stesso canale
fisico. Per costruire una rete è necessario avere almeno un dispositivo FFD che
agisca come PAN Coordinator. Il PAN Coordinator oltre a iniziare e terminare
15
2 Internet of Things
ZigBee
16
2.2 Principali standard
Z-Wave
Bluetooth
17
2 Internet of Things
Rispetto alla precedente versione sfrutta una comunicazione radio a corto raggio
(massimo 100 metri) con una quantità minima di potenza in modo da poter
lavorare per tempi più lunghi. BLE può lavorare con potenze di trasmissione
tra i 0.01 mW e i 10 mW e risulta essere un buon candidato per le applicazioni
IoT [1].
Confrontato a ZigBee è più efficiente in termini di energia consumata e nel
rapporto tra energia trasmessa e bit. Permette ai dispositivi di lavorare come
master o come slave in una topologia a stella. Dotato di meccanismo di discovery
gli slave inviano annunci su uno o più canali dedicati a questo meccanismo
che vengono scannerizzati dal dispositivo master. A parte quando avviene lo
scambio dei dati rimangono in modalità sleep per il resto del tempo.
18
2.3 Protocolli a livello applicativo
CoAP
19
2 Internet of Things
20
2.3 Protocolli a livello applicativo
21
2 Internet of Things
MQTT
MQTT è un protocollo per il trasporto di messaggi per client e server del tipo
publish/subscribe. È leggero, aperto, semplice e progettato in modo da essere
semplice da implementare. Queste caratteristiche lo rendono ideale per l’utilizzo
in molti casi, incluso in contesti vincolati come per le comunicazioni Machine
to Machine (M2M e IoT dove è richiesto un footprint ridotto del codice e/o la
quantità di banda è limitata 4 .
MQTT è stato inventato da Andy Stanford-Clark (IBM) e Arlen Nipper (Ar-
com, ora Eurotech) nel 1999 quando lo scopo era quello di creare un protocollo
per ridotte capacità di banda e consumi di batteria per collegare tubazioni di
petrolio su connessione satellitare.
MQTT non ha un significato ufficiale anche se per ragioni storiche si potrebbe
usare l’acronimo di MQ Telemetry Transport dove per MQ potrebbe far rife-
4
specifiche MQTT 3.1.1 - http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html
22
2.3 Protocolli a livello applicativo
• nel tempo - publisher e subscriber non devono essere presenti allo stesso
istante
23
2 Internet of Things
24
2.4 IoT e WoT
• QoS 0 - at most once è il livello minimo che garantisce una consegna con
minor sforzo. Il ricevitore non darà un ACK ed è chiamato spesso “fire
and forget”
• QoS 2 - garantisce che ogni messaggio sia ricevuto solo una volta. È il
livello più sicuro ma anche il più lento.
25
2 Internet of Things
Qualche dettaglio in più può essere ricavato da Atzori [2] che spiega come molti
enti di standardizzazione e ricerca erano coinvolti nell’attività di sviluppo per
realizzare una maggiore interoperabilità possibile tra dispositivi fornendogli un
alto grado di adattamento e autonomia garantendo comunque sicurezza e pri-
vacy. Ad ogni modo era ancora difficile comprendere cosa si intendeva con il
termine IoT e il problema nasceva proprio dalle parole da cui era composto; dif-
ferenti visioni nacquero dal modo in cui enti di ricerca e alleanze commerciali,
basandosi sui propri interessi, finalità e background approcciavano il termine.
Per chi utilizzava una prospettiva “Internet oriented”, piuttosto che “Thing
oriented”, il web era diventato il principale mezzo di comunicazione in inter-
net e sempre più servizi erano forniti tramite applicazioni web[32]. L’idea di
accedere a dispositivi nelle immediate vicinanze tramite applicazioni web venne
chiamata Web of Thing [13].
Per applicare i concetti della Web of Thing occorre riuscire a inserire dei web
server in dispositivi con solo qualche centinaia di byte di RAM e pochi kbyte
di EEPROM. Fortunatamente, e diversamente dai web server per internet, non
è richiesto di gestire migliaia di richieste e connessioni simultanee, inoltre molti
sforzi sono stati fatti per ridurre la dimensione dello stack TCP/IP riducendolo
fino a richiedere pochi kbyte di RAM [13, 32].
Per integrare questi Smart Thing nel web si possono seguire due strade: Direct
e Indirect Integration. Tramite Direct Integration occorre che i dispositivi siano
indirizzabili e quindi che posseggano un indirizzo IP. Deve possedere un web
server in modo da consentire che una thing possa accedere e comunicare con
un’altra attraverso operazioni web stardard come, ad esempio GET e POST.
Non tutti i dispositivi però sono in grado di integrare un web server per colpa
delle ridotte risorse di cui dispone e, a dire il vero, non è necessario integrare
direttamente tutte le smart thing nel web (ad esempio i sensori di una sensor
network). In questo caso di Indirect Integration sono utilizzati degli Intermedia-
te Proxy posizionati tra le smart thing e il web. Questi proxy sono solitamente
chiamati Smart Gateway in quanto astraggono i protocolli proprietari o le API
native offrendo un accesso uniforme tramite web API [32].
26
2.4 IoT e WoT
Dopo aver integrato differenti dispositivi, con varie capacità, nel web il passo
successivo è quello di astrarre questi dispositivi in web services anzichè fornire
semplicemente delle pagine statiche o dinamiche. I Web Service, definiti dal
World Wide Web Consortium (W3C) come un sistema software progettato per
supportare le comunicazioni Machine to Machine (M2M), seguono due maggiori
paradigmi.
27
2 Internet of Things
28
3 Home Automation, Domotica
e Smart Home
29
3 Home Automation, Domotica e Smart Home
30
3.1 Passato, presente e futuro.
31
3 Home Automation, Domotica e Smart Home
32
3.1 Passato, presente e futuro.
• riduzione dei costi grazie a un mercato sempre più ricco di dispositivi elet-
tronici a costi sempre minori e sistemi con un grado maggiore di modula-
rità in modo da far crescere nel tempo il sistema anche successivamente
all’acquisto iniziale
33
3 Home Automation, Domotica e Smart Home
34
3.2 Domotica e Home Automation
35
3 Home Automation, Domotica e Smart Home
Ambiti funzionali
Dai vari manuali di domotica dei vari produttori di dispositivi o di elettroni-
ca per impianti elettrici è possibile ricavare molte informazioni su quelli che
vengono ritenuti da questi fornitori gli ambiti di applicazione di automatismi
appartenenti al contesto della home automation.
Illuminazione
Aperture motorizzate
Riscaldamento/Raffrescamento
36
3.2 Domotica e Home Automation
Temporizzazioni
37
3 Home Automation, Domotica e Smart Home
Scenari
Un sistema domotico può essere usato per eseguire una singola azione, (ad
esempio accendere una lampada o impostare una temperatura) o per esegui-
re automaticamente una sequenza ripetitiva di operazioni in diversi momenti
della giornata o provvedere autonomamente ad attivare le funzioni conseguenti
all’accadimento di un certo evento: questa “sequenza di operazioni” viene nor-
malmente definita “scenario”. Ad esempio si potrà programmare uno scenario
“buongiorno” contenente tutte le azioni che normalmente vengono eseguite al ri-
sveglio mattutino (accensione luci, riscaldamento, disinserimento allarme, ecc.).
Riguardo alle modalità di attivazione si possono distinguere:
38
3.2 Domotica e Home Automation
Videocitofonia
La citofonia, concepita in Italia nei primi anni ’60, costituì sin da subito un reale
miglioramento della qualità della vita nelle abitazioni. Fino a quel momento,
le chiamate si effettuavano con semplici pulsantiere ed un campanello interno
costringendo il proprietario ad aprire la porta per poter verificare l’identità del
visitatore.
Con l’avvento dell’elettronica, sono stati inseriti all’interno delle pulsantiere i
cosiddetti “gruppi fonici” (costituiti da microfono ed altoparlante) e sono stati
creati i primi “derivati citofonici” con i quali poter effettuare, stando all’interno
dell’abitazione, la conversazione con il posto esterno.
La successiva implementazione funzionale fu quella del comando per l’elettro-
serratura al fine di agevolare l’accesso soprattutto negli stabili condominiali. In
ultimo, la richiesta di avere un derivato citofonico in più stanze dell’abitazio-
ne, consentì lo sviluppo della funzione di “intercomunicazione”. Ancora oggi, a
distanza di decenni, le funzioni “base” di un impianto citofonico sono rimaste
sostanzialmente immutate.
Negli anni ’80, l’avvento di telecamere e tubi catodici di dimensioni ridotte
e di costo contenuto, ha portato alla conseguente aggiunta nel posto esterno
della telecamera stessa, ed alla realizzazione di derivati interni videocitofonici
39
3 Home Automation, Domotica e Smart Home
Irrigazione
40
3.2 Domotica e Home Automation
Sicurezza Antintrusione
41
3 Home Automation, Domotica e Smart Home
Controllo da remoto
La maggior parte degli individui trascorre gran parte della giornata al di fuori
delle mura domestiche sia per impegni di lavoro che per attività di “tempo
libero”. È quindi indispensabile che un sistema domotico sia dotato di strumenti
tramite i quali l’utilizzatore possa intervenire anche non essendo fisicamente
presente sull’impianto. La soluzione più semplice a questo tipo di esigenza,
è dare la possibilità di interagire con la propria abitazione tramite i telefoni
cellulari su rete GSM.
42
3.2 Domotica e Home Automation
che presto potrebbero diventare alla portata di tutti. Predisporre oggi significa
avere la consapevolezza che le necessità di chi usufruisci dell’abitazione variano
nel tempo e che realizzare o adeguare gli impianti in futuro potrebbe essere
impossibile o diventare complicato e soprattutto molto costoso.
Protocolli principali
X-10
Il protocollo X-10, nato nel 1976, è lo standard storico della domotica. X-10 è
basato su una semplice architettura centralizzata, in cui un singolo dispositivo
di controllo può controllare fino a 256 tipi di periferiche (è possibile assegnare
uno stesso indirizzo a più periferiche per far eseguire a tutte gli stessi comandi).
È inoltre possibile controllare i vari dispositivi sfruttando dei telecomandi a
onde radio. Il dispositivo di controllo è gestibile anche mediante un personal
computer. Per consentire la diffusione del protocollo sono state scelte come
mezzo di comunicazione le power-line. Il protocollo è molto semplice e prevede
che a ogni periferica venga assegnato un indirizzo statico di 8 bit (i primi quattro
tipicamente rappresentati da una lettera da A a P e i secondi quattro da un
numero da 1 a 16) a tempo di installazione. L’invio di un comando da parte del
controllore o di un telecomando prevede l’invio in broadcast sul bus utilizzato
di 12 bit, i primi 8 rappresentanti l’indirizzo della periferica che deve eseguire
il comando, e i restanti 4 rappresentanti il comando stesso. È evidente quindi
come tramite X-10 sia possibile l’automazione solamente di semplici funzionalità
domestiche. L’estrema semplicità e il basso costo di installazione e realizzazione
di prodotti compatibili hanno fatto sì che le aziende realizzassero molti prodotti
idonei allo standard e quindi, ancora oggi, lo X-10 è molto diffuso.
BACnet
43
3 Home Automation, Domotica e Smart Home
44
3.2 Domotica e Home Automation
45
3 Home Automation, Domotica e Smart Home
KNX/Konnex
• onde radio nella banda degli 868 MHz, frequenza interna alla banda ISM
(Industrial Scientific Medical) con velocità di 16,38 kbit/s. I dispositivi
KNX RF dialogano in maniera peer to peer.
• infrarosso
46
3.2 Domotica e Home Automation
47
3 Home Automation, Domotica e Smart Home
2. gruppo centrale per la funzione particolare del livello considerato (es. in-
terruttore o dimmer per il livello di illuminazione, automazione tapparelle,
ecc.)
I tre campi sono separati dal carattere slash (/) e possono essere assegnati a
piacimento (gruppo principale/gruppo centrale/sottogruppo).
Lo standard è completamente aperto e dispone di funzionalità Plug & Play e di
un efficace metodo di correzione degli errori, allo scopo di assicurare un’alta af-
fidabilità al sistema. Il sistema è inoltre in grado di autoconfigurarsi eliminando
autonomamente apparecchi non funzionanti o inserendone di nuovi.
48
3.2 Domotica e Home Automation
Lonworks
49
3 Home Automation, Domotica e Smart Home
50
3.2 Domotica e Home Automation
51
3 Home Automation, Domotica e Smart Home
Konnex
52
3.2 Domotica e Home Automation
Vimar e Gewiss
Aziende che si sono inserite nel mercato successivamente, come le italiane Vimar
o Gewiss, hanno provato ad adottare una terza via, che potremo definire inter-
media, tra le due: l’easy-konnex [28]. Il konnex infatti è nato in due versioni,
lo standard mode, quello di cui abbiamo parlato sopra e che si programma con
ETS, e l’easy mode, una versione semplificata in cui la programmazione dei di-
spositivi avviene attraverso una centralina dedicata. Questa soluzione dovrebbe
unire i vantaggi del protocollo aperto konnex con il minor costo di un sistema
proprietario come bTicino. Inoltre, non essendo necessaria la programmazione
con ETS, non c’é il costo a parte del programmatore.
Entrambe le aziende citate, Gewiss e Vimar, hanno poi affiancato a questa li-
nea di prodotti una più ristretta gamma di prodotti in Konnex “puro”. L’idea è
quella di poter realizzare un impianto domotico a minor costo, che possa essere
poi “upgradato” in un sistema konnex completo. Sembrerebbe la quadratura
del cerchio, ma l’upgrade non è del tutto scontato anche perchè al momento
di realizzarlo sarà necessario riprogrammare in ETS anche i componenti ini-
zialmente programmati in easy mode. Inoltre contemporaneamente i prezzi dei
componenti Konnex standard scendono, e i sistemi easy sentono la concorrenza
dei loro cugini evoluti.
53
3 Home Automation, Domotica e Smart Home
54
3.3 IoT e Smart Home
55
3 Home Automation, Domotica e Smart Home
litamente sono nella forma di piccole scatole al cui interno sono implementati
diversi apparati radio che trasmettono a specifiche frequenze utilizzando va-
ri protocolli oppure connettori per ulteriori standard in modo da connettere
ulteriori dispositivi. Includono tra possibili nuovi standard: Zigbee, Z-wave,
Bluetooth, Bluetooth Low Energy, WiFi e molti altri.
Gli approcci di questi nuovi sistemi si possono riassumere in due categorie. Da
un lato chi realizza un tale sistema tenta di incorpare il più possibile dispositivi
di altri produttori sfruttando i loro protocolli di connessione (se aperti) oppure
utilizzando protocolli web ed eventuali gateway nel caso di protocolli proprietari.
Dall’altro grandi nomi dell’ICT tentano di realizzare una propria infrastruttura
e nuovi protocolli che altri produttori saranno obbligati ad utilizzare per inte-
grare i loro dispositivi nella speranza di maggior visibilità garantita di grossi
nomi come Apple e Google e dal fatto che già un grosso pubblico utilizza i loro
prodotti.
Tra tutti i produttori Apple ha fissato i propri criteri per come la Smart Home
Automation dovrebbe lavorare spesso vincolando chi desidera far parte del loro
sistema. Apple HomeKit richiede che i dispositivi lavorino esclusivamente con
Bluetooth o Wi-Fi tralasciando gli altri protocolli ma richiede anche forti requi-
siti di cifratura (per fornire un ambiente sicuro) e particolari requisiti hardware
(specialmente per ottenere la sua certificazione).
HomeKit di Apple e Brillo di Google sono piattaforme nuove e l’idea di fondo è
quella di acquistare un certo numero di dispositivi compatibili, aggiungerli alla
propria rete e controllarli con il proprio smartphone.
Per entrambi sarà possibile anche includere dispositivi non supportati diretta-
mente utilizzando dei bridge, che si occuperanno di tradurre tra HomeKit/Brillo
e dispositivi non compatibili.
Gli Hub sono invece elementi essenziali per aziende come Wink o SmartThings
di Samsung dato che il loro scopo è quello di incorpare dispositivi differenti che
utilizzano standard differenti.
Apple HomeKit
56
3.3 IoT e Smart Home
1
www.apple.com/ios/homekit
57
3 Home Automation, Domotica e Smart Home
58
3.3 IoT e Smart Home
3
https://www.getstructure.io/blog/everything-i-learned-about-googles-brillo-and-weave-at-
ubiquity-dev-summit
59
3 Home Automation, Domotica e Smart Home
Cloud APIs
Local APIs
4
http://www.forbes.com/sites/janakirammsv/2015/10/29/google-brillo-vs-apple-homekit-
the-battleground-shifts-to-iot/
60
3.3 IoT e Smart Home
Core Application
Application Framework
Linux Kernel
Bootloader
lavorando con i partner per certificare le schede compatibili con Brillo: saran-
no schede verificate e testate per lavorare con le versioni correnti e future del
sistema operativo.
I servizi principali della piattaforma includono Weave che permette ai dispo-
sitivi di connettersi in sicurezza alla rete. I dispositivi che utilizzano Weave
possono scambiare dati tra loro. Il componente Metrics fa parte dei servizi di
base e colleziona i dati di utilizzo del dispositivo in base ai permessi impostati
dall’utente.
Ogni dispositivo che utilizza Weave è automaticamente connesso ai servizi cloud
e i dispositivi che non appartengono alla stessa rete utilizzano il cloud per
comunicare con tuti gli altri. Non è ancora chiaro se Weave sarà in grado di
lavorare con gli standard già esistenti come BACNet, Bluetooth Low Energy,
ZigBee, and Z-Wave.
Come esposto al DevFest MN 20165 da Dave Smith nello stack software di
Brillo tutto ciò che era legato a Java nell’Android stack non c’è più. Niente
più Application Framework e Core Applications e anche nei Native Services
5
https://www.youtube.com/watch?v=ig9GKAFzDxQ
61
3 Home Automation, Domotica e Smart Home
parte degli elementi sono stati rimossi: elementi necessari per supportare il
Java Framework. Android non è l’unica piattaforma inclusa in Brillo: c’è anche
parte del codice di Chrome OS all’interno del pacchetto Native Services in modo
da fornire alcuni servizi per la connettività e altri elementi che le applicazioni
possono utilizzare per lavorare in quanto non dipendono dal Java Runtime.
Anche gran parte del Bootloader è stato preso da Chrome OS.
Weave è un protocollo di comunicazione tra device e non è specifico per Brillo
ed è stato pensato per essere implementato su un vasto numero di device; Brillo
comunque ha Weave al suo interno di default. Weave fornisce alcuni mobile sdk
che permettono Android, iOS e Web Device di interagire con embedded device,
fornisce apposite librerie per embedded device (di cui quelle incluse con Brillo
sono una possibilità - ma non l’unica) e fornisce uno strato di servizi Cloud per
connettere dispositivi remoti a dispositivi locali. Queste librerie consentono che
tutto accada automaticamente e nella maniera più sicura e sono disposibili sia
per le Cloud API che per le Local API.
Per quanto riguarda i dispositivi Weave è disponibile in due versioni: libweave
disponibile per dispositivi MMU-Enabled, cioè processori o SoC (system on
chip) in grado di supportare Linux (con presenza di Brillo o meno) e libuweave
per dispositivi pensati direttamente per la Iot in cui Linux non può essere
installato o per microcontroller tipo Cortex o altro. Queste librerie sono già
disponibili e anche se non si vuole partecipare al programma ufficiale di supporto
(ad invito) sono completamente opensource e liberamente scaricabili per fare i
propri esperimenti6 .
Quando viene realizzato un dispositivo che utilizza Weave è necessario che venga
definito uno schema di quello che lo stato del dispositivo rappresenta, dichiarare
i comandi accettati e gli stati in cui può trovarsi un dispositivo: per i pulsanti
lo stato può essere ON e OFF, oppure ON, OFF e Brightness per le lampadine.
Lo schema di un dispositivo può essere utilizzato da altri dispositivi per scoprire
le funzionalità del primo.
Weave automaticamente si preoccupa che lo stato di un dispositivo sia sincro-
6
https://weave.googlesource.com/
62
3.3 IoT e Smart Home
nizzato e propagato a tuti gli altri dispositivi connessi e il concetto è che i vari
dispositivi possono registrarsi gli uni con gli altri.
Brillo fornisce, oltre a Weave, altri servizi ereditati da Chrome OS come Metrics
& Crash Report che fornisce informazioni sui dispositivi che sono stati posizio-
nati in campo, quale versione del firmware hanno e quali comandi gli ha inviato
l’utente. Inoltre restituisce informazioni sullo stato di salute dei dispositivi in
modo da poterli riparare o controllare per primi se c’è qualcosa che non va. I
dati possono essere visualizzati e analizzati nella console per capire i pattern di
utilizzo. Possono anche essere analizzati i crash report per effettuare il debug
dei dispositivi impiegati sul campo.
OTA è un altro servizio di Brillo che consente di preparare una nuova immagine,
postarla sulla Google Developer Console e automaticamente di essere propagata
a tutti i dispositivi connessi. Anche questa funzione è stata ereditata da Chrome
OS e la procedura di update avviene in background senza arrestare il servizio
del dispositivo. Per evitare che il dispositivo si blocchi nella fase di installazione
e riavvio viene sfruttata la struttura del bootloader di Chrome OS che possiede
due porzioni parallele del sistema in esecuzione nello stesso momento e mentre
una sta eseguendo il suo compito la seconda è disponibile sulla quale si può
applicare un aggiornamento. Quando l’update è pronto per essere mandato in
esecuzione l’unica cosa che rimane da fare è il reboot del dispositivo e il tempo
di disservizio del dispositivo è ridotto al minimo. Inoltre è l’utente che può
scegliere quando è più opportuno applicare l’update.
Per quanto riguarda la sicurezza Google ha fatto notevoli sforzi per applicarla
a tutti i livelli. Su Brillo sono presenti elementi come sandboxing e process
isolation che gli sviluppatori già utilizzano quando sviluppano app per Android
e quindi tutte le separazioni per i processi utilizzate per evitare che un processo
possa causare problemi all’intero sistema. E’ presente anche un meccanismo
nel bootloader che assicura che le immagini scaricate siano firmate in modo
opportuno e che non possano essere state manomesse; in questo modo se qualche
problema viene rilevato il sistema semplicemente non lo carica in memoria ma
riavvia la vecchia versione del firmware. E nella developer console è possibile
63
3 Home Automation, Domotica e Smart Home
essere avvisati di quanto è accaduto per risolvere nel modo opportuno i vari
problemi.
La sicurezza è presente anche ai livelli di comunicazione così che quando ho
un dispositivo abilitato da Weave l’accesso a tale dispositivo è gestito da un
account Google così che tutti i meccanismi di sicurezza forniti da Google siano
presenti ed è fornito un maggior controllo su chi può vedere lo stato, chi può
aggiornarlo, ecc. Inoltre tutto il traffico dati che viene inviato tra due device
e tra device e cloud è criptato su TLS e anche i dati che sono presenti su un
dispositivo o sul Cloud sono criptati.
Google ha presentato Brillo e Weave al Google I/O nel giugno del 2015.
64
3.3 IoT e Smart Home
65
3 Home Automation, Domotica e Smart Home
66
3.3 IoT e Smart Home
un quadro chiaro sugli aspetti legali che l’utilizzo di software di terze parti
implica. Attualmente la prima versione di openHAB è arrivata alla release
1.8.x che si prevede sia l’ultima della sua serie mentre è in sviluppo la versione
2, attualmente giunta alla fase di beta release, che introduce alcune novità e
migliorie.
La filosofia dietro al progetto openHAB/SmartHome nasce dalla constatazione
che esistono già sul mercato molte soluzioni di home automation e dispositivi
per l’Internet of Things e che tutte hanno sicuramente una loro utilità prese
singolarmente. Tutti i sistemi di automazione e i dispositivi per la IoT hanno
un proprio modo di installazione e configurazione e sono ben progettate per
gli usi per i quali sono state pensate ma il problema è che spesso un utente
vorrebbe utilizzare questi dispositivi in un modo totalmente nuovo sfruttando
l’interazione con sistemi differenti che non era stato previsto inizialmente dal
costruttore. Qui entra in gioco SmartHome che viene concepito come punto di
integrazione permettendo ai vari sistemi di dialogare l’uno con l’altro superando
i confini imposti da costruttori o protocolli.
Gli elementi principali su cui si basa il framework SmartHome8 sono le Thing,
gli Item e i Channel.
SmartHome definisce Thing come quelle entità che fisicamente aggiunte al si-
stema possono potenzialmente fornire nuove funzionalità. Le Thing non devono
essere per forza dispositivi ma anche web service o qualsiasi altra sorgente di
informazioni e funzionalità. Bridge è un tipo particolare di Thing che è neces-
saria quando è richiesto che l’entità permetta l’accesso ad altre Thing connesse
ad essa. Un esempio tipico è un IP gateway per un sistema di automazione che
internamente non è basato su IP ma su protocollo proprietario.
Diversi invece sono gli Item, entità dotate di stato che rappresentano funziona-
lità usate all’interno dell’applicazione (generalmente per popolare le interfacce e
la logica di attuazione) e, dato il loro ruolo, possono ricevere update e generare
eventi.
Tra le Thing e gli Item ci sono i Channel che rappresentano le funzionalità
8
http://www.eclipse.org/smarthome/documentation/index.html
67
3 Home Automation, Domotica e Smart Home
fornite dalle Thing e connesse agli Item. I Channel, che vengono percorsi dagli
eventi del sistema di automazione, rappresentano il collante tra il livello fisico,
rappresentato dalle Thing, e il livello virtuale dove risiedono gli Item.
Il cuore del framework SmartHome è formato da un event bus per la comunica-
zione tra i componenti. Gli eventi, che vengono veicolati all’interno dell’event
bus, possono essere inviati e ricevuti in maniera asincrona e sono raggruppati in
diverse categorie: Core Event, Item Event, Thing Event e altri secondo a quale
entità si riferisce l’evento. Queste categorie di eventi sono tutte osservabili in
modo da poter generare comportamenti e scenari anche molto complessi.
Considerazioni
Uno dei pericoli maggiori con queste nuove tecnologie è quello di rimanere legati
e spesso abbracciare un particolare standard significa rimanere vincolati ad
esso per sempre; è poco probabile che Apple investa nello sforzo di rendere
compatibili standard di altre ditte con HomeKit - ad esempio lasciando che
altri dispositivi si possano connettere tramite WiFi, citando possibili problemi
di sicurezza. Questo sicuramente manterrà intatta la visione di Apple ma è
probabile che manterrà alti i prezzi e limiterà le possibili scelte.
C’è anche da considerare la privacy. Apple ha un forti politiche orientate alla
privacy dei propri utenti ma Google ha basato il proprio business sul data mining
mentre su altri produttori non ci sono molte informazioni su questi aspetti.
Inoltre molto spesso occorre necessariamente connettere il proprio ecosistema
ad internet, aspetto che non libera questi nuovi prodotti da possibili attacchi,
e più dispositivi sono connessi e più punti da difendere ci saranno.
Un vantaggio dei sistemi di Apple e di Google è quello riservato a chi ha inten-
zione di creare un nuovo dispositivo o un nuovo software per le loro piattaforme.
Si tratta di documentazione e linee guida ben realizzate e molto spesso di par-
ti intere di codice a disposizione da prendere come spunto e che consente di
ridurre, e non di poco, il tempo necessario a rilasciare un nuovo prodotto.
Eclipse SmartHome è un sistema software e quindi non comprende la necessità
di sottoscrivere contratti per la realizzazione di prodotti compatibili. Dato che
68
3.3 IoT e Smart Home
69
4 Caso di Studio
Come è stato scritto più volte l’Home Automation fa parte dell’ecosistema IoT
e il caso di studio riguarda proprio la costruzione di un sistema di HA aperto
e non proprietario. Con aperto si vuole intendere la possibilità nel futuro di
poter espandere il sistema integrando nuove tecnologie e dispositivi in grado
di aggiungere funzionalità, mentre con non proprietario si vuole evitare il più
possibile di legarsi a protocolli o sistemi ai quali non si possa all’occorrenza
apportare modifiche; proprio per non rimanere vincolati ad una particolare
tecnologia.
L’utilizzo di framework e protocolli opensource ha permesso di ridurre il tempo
di sviluppo di una soluzione software in grado di controllare l’intera abitazione
ma soprattutto di risparmiare sui costi di acquisto in prodotti di aziende in
grado di fornire le stesse funzionalità. Non tutti i sistemi domotici hanno a
catalogo prodotti che lasciano all’utente la possibilità di intervenire sulla logi-
ca di controllo limitando di fatto a una semplice configurazione dei dispositivi
l’operazione finale dell’installazione. Men che meno hanno la fornitura di un
dispositivo programmabile con linguaggi di alto livello e in grado di persona-
lizzare fino nel minimo dettaglio il controllo dell’intero sistema di automazio-
ne. Spesso viene fornito un dispositivo che posizionato a bordo del sistema
ne espone in parte la programmabilità trasformando il protocollo proprietario
di comunicazione interno in uno esterno di tipo aperto; si tratta generalmente
di gateway che forniscono un accesso tramite rete ethernet e protocolli web al
sistema domotico.
Come vedremo un dispositivo completamente programmabile ma privo di qual-
siasi logica di funzionamento preinstallata richiede che uno sviluppatore debba
71
4 Caso di Studio
72
4.1 Sistema domotico HomePLC
è scelto di orientarsi in quanto non tutti i sistemi sul mercato accettano una posa
distribuita per tutto l’appartamento obbligando a centralizzare completamente
la logica di controllo in un unico punto. Sebbene per chi deve intraprendere gli
interventi di manutenzione possa essere visto come un vantaggio per il tecnico
che deve effettuare la posa delle canalizzazioni non è sicuramente un compito
semplice.
HomePLC.Linux
L’HomePLC.Linux è un embedded formato da processore e scheda di espansio-
ne. Il modulo principale è realizzato dalla Engicam e si tratta di un modulo
SODIMM basato sul processore i.MX53 della Freescale™ il cui core è un ARM
Cortex™-A8 la cui frequenza raggiunge 1GHz.
73
4 Caso di Studio
74
4.1 Sistema domotico HomePLC
il periodo del ciclo principale sia fissato a 100 msec i tempi con cui arrivano le
informazioni al controller dipendono dal particolare device e su quale area sono
mappate le sue risorse. Abbiamo quindi:
Caratteristiche
75
4 Caso di Studio
Ligica distribuita
76
4.2 Sistema domotico di test
condizioni dei relè di uscita o quando un qualsiasi parametro, dei dispositivi con-
nessi al sistema, subisce una variazione (il caso più semplice è una variazione di
temperatura).
Come spunto per iniziare realizzare un primo sistema domotico di test ho consi-
derato le logiche già presenti all’interno dei moduli HomePLC. Come abbiamo
già avuto modo di illustrare alcuni moduli del sistema HomePLC sono dotati
di micro programmazione consentendo ad essi di operare anche in caso di pro-
blemi sul bus o quando si interrompe la comunicazione con il modulo di livello
superiore.
Ad esempio i moduli adibiti all’input/output digitale sono mappati nella parte
iniziale della tabella dei registri di HomePLC di conseguenza alla variazione di
un ingresso vedrò variare un bit in una delle word (da 16bit) nella zona che
comprende i primi 400 registri. I moduli da guida din gestiscono internamente
logiche passo-passo tra ingressi e uscite e almeno una logica tapparelle che si
preoccupa di interfacciare due ingressi e due uscite gestendo anche il caso di
interblocco fra le due uscite.
77
4 Caso di Studio
78
4.2 Sistema domotico di test
79
4 Caso di Studio
System
User
<<Include>>
<<Include>>
Move up/down
Rollershutter
Control Device
<<Include>>
Relais
Come si può vedere dal modello il controller HomePLC può disporre di più
80
4.2 Sistema domotico di test
Glossario
Light Bulb Fonte luminosa artificiale che può essere basata su tecnologie
molto diverse tra loro. Collegata all’impianto elettrico di un
appartamento produce luce quando alimentata da corrente elettrica.
Roller Shutter Tipo di porta o finestra formata da barre orizzontali unite tra
loro. Nel nostro caso è dotato di motore elettrico che permette di
movimentarla in una direzione o nell’altra aprendo o chiudendo il
varco dove è montata.
Switch Pulsante basculante montato in scatole a parete. Premuto chiude un
contatto elettrico presente al suo interno e una volta rilasciato
torna nel suo stato di riposo aprendo il contatto presente al suo
interno.
Relay Dispositivo elettrico comandabile che apre e chiude un contatto in
grado di abilitare o inibire il flusso di corrente in un cavo a cui
è connesso. Il comando avviene facendo scorrere corrente in una
spirare che producendo un campo magnetico aziona il contatto
principale.
Contact Sensore di ingresso che rileva quando viene fatta scorrere corrente
nel cavo ad esso collegato. Solitamente utilizzato congiuntamente
con uno Switch.
81
4 Caso di Studio
Scenari
82
4.2 Sistema domotico di test
L’utente entra nella stanza e osserva la quantità di luce presente. Notando che la
quantità non è sufficiente e la lampadina è spenta preme e rilascia il pulsante a
parete.
--> include(Sense Device Contacts)
Il sistema, rilevato l’evento di pressione del pulsante, applica la logica
passo-passo e invia i comandi per far chiudere i contatti del relè corrispondente al
cavo di alimentazione della lampadina.
--> include(Control Device Relais)
Il dispositivo effettua le azioni corrispondenti ai comandi richiesti.
Il dispositivo completata l’azione di comando aggiorna di conseguenza lo stato logico
interno della lampadina.
Scenario alternativo
L’utente nota che la luce nella stanza è sufficiente e la lampadina è accesa. Preme
e rilascia il pulsante a parete.
--> include(Sense Device Contacts)
Il sistema, rilevato l’evento di pressione del pulsante, applica la logica
passo-passo inviando i comandi per far aprire i contatti del relè corrispondente al
cavo di alimentazione della lampadina.
--> include(Control Device Relais)
Il dispositivo effettua le azioni corrispondenti ai comandi richiesti.
Il dispositivo completata l’azione di comando aggiorna di conseguenza lo stato logico
interno della lampadina.
83
4 Caso di Studio
L’utente entra nella stanza e osserva la posizione della tapparella. Notando che la
tapparella è alzata decide di abbassarla e preme e rilascia il pulsante a parete che
comanda l’abbassamento.
--> include(Sense Device Contacts)
Il sistema, rilevato l’evento di pressione del pulsante di abbassamento e applicando
la logica Blind invia i comandi per fare abbassare la tapparella.
--> include(Control Device Relais)
Il dispositivo effettua le azioni corrispondenti ai comandi richiesti.
Il sistema completata l’azione di comando aggiorna di conseguenza lo stato logico
della Tapparella.
Subito dopo attiva un timer per il tempo Tdown impostato.
Trascorso il tempo Tdown la logica Blind invia i comandi per togliere l’alimentazione
al motore della tapparella.
--> include(Control Device Relais)
Il dispositivo effettua le azioni corrispondenti ai comandi richiesti.
Il dispositivo completata l’azione di comando aggiorna di conseguenza lo stato logico
della Tapparella.
Scenario alternativo
L’utente entra nella stanza e osserva la posizione della tapparella. Notando che la
tapparella è alzata decide di abbassarla e preme e rilascia il pulsante a parete che
comanda l’abbassamento.
--> include(Sense Device Contacts)
Il sistema, rilevato l’evento di pressione del pulsante di abbassamento e applicando
la logica Blind invia i comandi per fare abbassare la tapparella.
--> include(Control Device Relais)
Il dispositivo effettua le azioni corrispondenti ai comandi richiesti.
Il dispositivo completata l’azione di comando aggiorna di conseguenza lo stato logico
della Tapparella.
Subito dopo attiva un timer per il tempo Tdown impostato.
L’utente non attende il completamento del tempo Tdown e preme e rilascia nuovamente
il pulsante a parete.
--> include(Sense Device Contacts)
Il sistema, rilevato l’evento di pressione del pulsante di abbassamento applica la
logica Blind e invia i comandi per far arrestare la tapparella.
--> include(Control Device Relais)
Il dispositivo azzera timer Tdown precedentemente impostato.
Il dispositivo effettua le azioni corrispondenti ai comandi richiesti.
Il dispositivo completata l’azione di comando aggiorna di conseguenza lo stato logico
della Tapparella.
I due casi d’uso seguenti, sebbene non vengano avviati dall’interazione con l’u-
tente, sono di fondamentale importanza per il corretto avanzamento degli scena-
ri precedenti. Senza questi due casi d’uso le azioni dell’utente non potrebbero
essere rilevate dal sistema e non sarebbe possibile effetturare gli azionamenti
delle logiche appena descritte.
Come vedremo più avanti, anche se lo scenario indicato risulta molto breve,
molte saranno le implicazioni che una corretta progettazione e implementazione
avranno sull’intero sistema.
84
4.2 Sistema domotico di test
Seque anche l’ultimo caso d’uso che riguarda gli azionamenti effettuati dalla
logica di controllo.
85
4 Caso di Studio
livello. Questo si traduce nella possibilità di utilizzare librerie per l’accesso alle
risorse della tabella dei registri HomePLC.
Anziché accedere mediante polling le singole risorse nella tabella dei registri
risulta preferibile realizzare un componente dedicato in grado di rilevare ogni
possibile variazione nelle risorse HomePLC e notificare in modo opportuno il
sistema; questo per evitare che il sistema resti impegnato inutilmente nel caso
nulla di importante accada nell’ambiente o nessuna richiesta venga effettuata
da parte dell’utente.
Chiameremo Event Generator il componente che leggerà la tabella dei regi-
stri e in base alle variazioni rilevate confezionerà un oggetto contenete tutte le
informazioni necessarie a risalire all’occorrenza che è avvenuta nel sistema.
loop
1 : readRegister
[end of table = false]
2 : registerValue
3 : compareValue
4 : result
opt
[result=true]
5 : sendEvent
86
4.2 Sistema domotico di test
par
1 : sentEvent
loop
2 : get Event
loop
3 : toObserver
[more observer?]
87
4 Caso di Studio
HomePLC interface
È giusto notare che anche in questo caso abbiamo considerato solo una piccola
parte delle specifiche che può avere un DigitalOutput; l’azionamento di un Di-
gitalOutput potrebbe essere ritardato mediante un opportuno Tdelay , avere un
tempo massimo Tof f dopo il quale resettarsi e, in entrambi i casi, ricominciare il
88
4.2 Sistema domotico di test
Logica Passo-Passo
pressed
OFF ON
pressed
Logica Blind
Nella logica blind, leggermente più complessa della passo-passo, gli ingressi sono
due e compaiono anche Tup e Tdown che sono rispettivamente i tempi di salita e
i tempi di discesa che indicano dopo quanto tempo va tolta l’alimentazione al
89
4 Caso di Studio
HomePLC interface
Tup | up | down
WAIT MOVE_UP
down up
Tdown | up | down
MOVE_DOWN
90
4.2 Sistema domotico di test
Digital Input Up
Digital Output Up
Digital Output Down
HomePLC interface
91
4 Caso di Studio
In questo scenario tra gli eventi che il sistema invia al DigitalInput viene scelto
di inoltrare all’handler solo quello relativo alla pressione del pulsante trascuran-
do il successivo rilascio. L’handler informa la logica Blind che è stato premuto
il pulsante down. La logica Blind in base allo stato interno invia la richie-
sta all’handler relativo alla movimentazione di abilitare la chiusura del relè
corrispondente per il motore della tapparella.
Quando DigitalOutput risponde alla logica di controllo tramite l’handler rela-
tivo, la logica Blind aggiorna lo stato interno in accordo al comando inviato.
Nel caso l’evento sia quello relativo a una delle due movimentazioni viene atti-
vato un timer, al termine del quale, la logica Blind (previo controllo dello stato
interno) invia il segnale di aprire il relè corrispondente alla movimentazione in
atto.
Questo scenario mostra come la logica Blind attenda un tempo Tdown prima di
togliere alimentazione al relè. Lo scenario alternativo, ma ce ne sarebbero altri,
prevede che l’utente prema nuovamente il pulsante prima del tempo di arresto;
in questo caso ci sarebbe un altro ramo parallelo al timer in cui, una volta che la
logica Blind ha ricevuto l’informazione che è stato ripremuto il pulsante, viene
cancellato il timer ma viene comunque inoltrata la richiesta di aprire il contatto
del relè per arrestare la tapparella.
92
4.2 Sistema domotico di test
: Digital Input Down : DIDown Handler : Blind Logic : Roller Shutter state : DODown Handler : Digital Output Down
pressed
signal(pressed)
execute(down)
get
released
wait
signal(enable)
enable
update
get
{ t .. t + Tdown }
moving_down
signal(disable)
disable
update
93
4 Caso di Studio
di controllo e una coda di eventi dalla quale estrarre l’evento da gestire. Alla
stessa maniera come è stato pensato per l’EventDispatcher e l’EventGenerator.
Il problema che potrebbe sorgere in questo caso è legato all’alto numero di ele-
menti digitali che corrisponderebbe a un alto numero di thread nel sistema. La
gestione multi-thread da parte di un sistema potrebbe richiedere lo spreco di
molte risorse e nuovamente subire rallentamenti inattesi. Se il dispositivo che
ospita il sistema inoltre è dotato di un unico processore l’utilizzo di un elevato
numero di thread contemporaneamente potrebbe far degradare le prestazioni.
Piano di collaudo
Per collaudare i componenti software che verranno realizzati contestualmente al
progetto del sistema verrà sfruttato anche l’ambiente domestico in cui è instal-
lato il sistema domotico. Fortunatamente avendo già installato i componenti
principali e collegati i carichi ai rispettivi relè di azionamento si potrà sfrutta-
re l’osservazione diretta del comportamento del sistema per avere una idea dei
tempi e della correttezza della logica di controllo. Un risultato più dettagliata
si può ottenere sfruttando opportune istruzioni di debug che generino output
verso la console del sistema HomePLC in moda da ricavare i tempi reali di
azionamento e di esecuzione di alcune logiche.
La parte più importante da collaudare è indubbiamente il sistema di genera-
zione degli eventi in quanto se non opportunamente ottimizzato può causare
fastidiosi rallentamenti di tutto il sistema causando una fastidiosa sensazione
di inefficienza.
Ci si aspetta che i tempi richiesti per la scansione di tutti i registri della tabella
HomePLC non siano particolarmente rapidi di conseguenza sarà probabilmente
necessario trovare un opportuno metodo di ottimizzazione se non addirittura
prevedere, in caso di miglioramenti modesti, di impiegare parte del tempo a
modificare la libreria nativa.
94
4.2 Sistema domotico di test
Piano di lavoro
Le fasi di progetto seguiranno la seguente sequenza dovuta alla priorità rilevate
nella precedente analisi:
1. uso della Java Reflection per la soluzione al problema del default package.
L’introduzione di questo punto nel piano di lavoro è stato reso necessario
a seguito di quanto emerso in fase progettuale e implementativa.
95
4 Caso di Studio
una libreria scritta in linguaggio nativo ma della quale esistono diverse versioni:
una per ogni linguaggio di programmazione che il progettista potrebbe utiliz-
zare. In questa fase quindi è possibile fare i nostri ragionamenti mantenendoci
sufficientemente distanti da aspetti implementativi.
Mediante la libreria nativa è possibile richiedere il valore di un particolare regi-
stro tramite una istruzione opportuna. Il valore restituito dipenderà dallo stato
dei bit da cui e composto e quindi dallo stato degli ingressi a cui fanno riferi-
mento quei bit. Un registro HomePLC è formato da 16 bit e quindi tramite un
solo accesso sono in grado di leggere lo stato di 16 ingressi oppure 16 uscite.
A questo punto una possibilità è quella di leggere i registri della tabella e
successivamente rilevare quali di questi registri sono variati rispetto al passo
precedente.
Tra un ciclo di lettura e l’altro dobbiamo provvedere a valutare quali bit sono
variati rispetto all’ultima lettura. Valutare bit per bit tutta la tabella potrebbe
richiedere un tempo eccessivamente lungo quindi si decide di valutare registro
per registro le possibili variazioni. Nel momento in cui avviene una variazione
su un registro viene generato quello che nel sistema verrà chiamato evento.
HomePLCEvent
+time {readOnly}
+register {readOnly}
+newValue {readOnly}
+oldValue {readOnly}
96
4.2 Sistema domotico di test
• il vecchio valore
• il nuovo valore
Generatore di eventi
HomePLCEvent
+time {readOnly}
+register {readOnly}
+newValue {readOnly}
+oldValue {readOnly}
«interface»
EventGenerator
«interface»
GeneratorListener
+start()
+stop()
+onGeneratorEvent(event)
+setGeneratorListener(listener)
+removeGeneratorListener(listener)
Per ogni processore domotico sono definite diverse aree di memoria che rappre-
sentano la mappatura delle risorse del sistema HomePLC: in particolare area
I/O, area System Flag, area Extended Address, System area ed altre. Quan-
do un utente preme un pulsante il modulo a cui è connesso fisicamente rileva
la pressione e inoltra l’informazione, risalendo l’architettura HomePLC, fino
al modulo principale che la registra come variazione in un bit di un registro
corrispondente al modulo rilevatore. Quanti registri sono associati a ciascun
modulo dipende dal suo numero di ingressi, dalle uscite, dai sensori connessi
o dalle attuazioni per cui è predisposto; inoltre ogni modulo viene impostato
con un indirizzo univoco che quindi determina l’indirizzo del registro all’interno
della tabella.
Per realizzare il nostro generatore di eventi non dobbiamo far altro che rilevare
i cambiamenti all’interno della tabella delle risorse in quanto siamo sicuri che
rispecchia costantemente lo stato dei moduli in campo: questa certezza è data
97
4 Caso di Studio
I registri delle zone real-time ed estesa della tabella di memoria del sistema
domotico sono divisi in due sottoinsiemi: registri in ingresso e registri di uscita.
I registri di ingresso possono solamente essere letti tramite le istruzioni della
libreria nativa e ogni tentativo di scrittura non porta ad alcuna variazione del
loro contenuto. I registri di uscita, oltre ad essere letti, possono anche essere
modificati generando di conseguenza opportuni azionamenti in campo.
L’unico modo per poter accedere al contenuto della tabella dei registri è tramite
le istruzioni della libreria nativa e di conseguenza occorre risolvere il problema
di accesso alla libreria nativa da un package qualunque. Si rimanda alla sezione
implementativa per la soluzione a questo problema.
98
4.2 Sistema domotico di test
Una volta risolto il problema del default package possiamo finalmente progettare
un generatore di eventi basato sul componente di interfaccia con la libreria
nativa che è stato appena realizzato.
Utilizzando l’attuale componente di interfaccia possiamo leggere solamente un
registro alla volta quindi l’unica possibilità è quella di realizzare un opportu-
no loop per leggere tutta una lista di registri e inoltrare l’evento qualora sia
avvenuta una variazione nel registro corrente.
Resa da considerare come consegnare gli eventi generati e il Pattern Observer
pare la scelta naturale dato che in questo momento non vengono fatte consi-
derazioni legate ad una possibile natura distribuita del sistema e nemmeno ri-
spetto alla possibilità che l’EventDispatcher possa entrare o uscire dal sistema
dinamicamente.
Event Dispatcher
99
4 Caso di Studio
0..1
GeneratorListener EventGenerator
GeneratorProxy
TestEventGenerator2 +getInstance()
+setGeneratorListener(listener)
+onGeneratorEvent(event) +removeGeneratorListener(listener)
+start()
+stop()
HomePLCEvent
«interface»
GeneratorListener +time {readOnly}
+register {readOnly}
+onGeneratorEvent(event) +newValue {readOnly}
+oldValue {readOnly}
«interface»
EventDispatcher
«interface»
DispatcherListener
+start()
+stop()
+onDispatcherEvent(event)
+addDispatcherListener(register, listener)
+removeDispatcherListener(listener)
100
4.2 Sistema domotico di test
Implementazione
In base a quanto analizzato risulta che la libreria di interfaccia fornita assieme
al controller HomePLC può essere acceduta esclusivamente dal default package
di Java e questo pone diverse limitazioni al suo utilizzo. Inoltre non presenta di
suo un meccanismo in grado di generare eventi al variare dei valori dei registri
della tabella di sistema.
Prima di poter realizzare le logiche di più alto livello associate agli use cases
del nostro caso di studio siamo costretti a risolvere questi limiti implementativi;
dapprima sfruttando il meccanismo Java della Reflection e successivamente mo-
dificando in maniera più consistente la libreria nativa di interfaccia aggiungendo
parte del codice per la generazione degli eventi.
In particolare uso della Java Reflection per la soluzione al problema del default
package è una delle priorità senza la quale il progetto non può proseguire e quindi
richiede una variazione del piano di lavoro per includere questo argomento.
101
4 Caso di Studio
Il Default Package
102
4.2 Sistema domotico di test
non visibilità della classe Hplc. Questo limite è dovuto direttamente alle Java
language specifications che testualmente asseriscono «It is a compile time error
to import a type from the unnamed package».
Il motivo di questo approccio probabilmente è da ricercarsi nella mentalità ma-
turata nell’utilizzo del linguaggio grafico di programmazione chiamato Ladder
Diagram (standard internazionale IEC 61131-3) impiegato da tutti gli installa-
tori del sistema HomePLC. Il linguaggio Ladder, come abbiamo visto, utilizza
un sistema grafico per definire un programma di controllo sequenziale e, sebbe-
ne siano presenti qualche forme di controllo di flusso, sicuramente non ha quella
espressività che ha un linguaggio di programmazione di alto livello come Java.
L’idea di chi ha rilasciato questi esempi di programmazione era sicuramente
quella di definire un unico loop principale dove, una volta rilevate determinate
condizioni, venivano intraprese azioni più o meno elaborate a seconda dello
scopo che si voleva ottenere. L’approccio è molto simile quindi a quello, rule
based, utilizzato anche dal linguaggio Ladder.
L’idea, fin da subito, è stata quella di risolvere questo vincolo iniziale per con-
sentire di realizzare sistemi software dotati di una struttura più complessa. Gli
approcci utilizzabili erano la Java Reflection e la riscrittura della libreria nati-
va. La riscrittura della libreria nativa inizialmente è stata scartata in quanto
la difficoltà non era tanto nel tempo dedicato a ripassare un linguaggio quale
il c/c++ ma la necessità di predisporre tutto l’ambiente di sviluppo adatto
alla cross compilazione di software per processori ARM quali quelli installati
nell’embedded in nostro possesso.
103
4 Caso di Studio
104
4.2 Sistema domotico di test
Dalla figura si può vedere il meccanismo utilizzato per chiamare un metodo del-
la classe Hplc: dopo una parte iniziale in cui vengono creati gli oggeti dal fra-
mework Reflection ogni successiva richiesta viene soddisfatta chiamando il me-
todo invoke() dell’oggetto rappresentativo associato al rispettivo metodo della
classe Hplc.
105
4 Caso di Studio
106
4.2 Sistema domotico di test
Event Generator
Set <<datastore>>
condition done
false
Test
[done] Check
condition
Body
true
S top A c tivity
Set
Condition
Reassert
interrupt flag
Send Interrupt continue
107
4 Caso di Studio
protected SmartObject () {
stopRequested = false ;
}
108
4.2 Sistema domotico di test
per la variabile flag: evenienza non certa dato che Java permette ai thread di
mantenere i valori delle variabili in una memoria locale e inoltre può avvenere
anche nel caso di macchine con più processori. Per essere sicuri di questo una
possibile soluzione è di dichiarare volatile la variabile booleana assicurando al
thread di leggere il dato sempre aggiornato.
Initialize
Registers List
Interruption
<<structured>>
Loop
Setup
Test
has next
[changed]
Check if value
Request all <<datastore>> changed
Registers values Old Registers
activity table Send HomePLC
[not changed] Event
109
4 Caso di Studio
Event Dispatcher
Come abbiamo potuto vedere l’utilizzo di Java per realizzare il loop generatore
di eventi e del framework Reflection richiede un tempo abbastanza elevato per
elaborare tutto quello che è richiesto. Inoltre, inevitabilmente, all’aumentare del
110
4.2 Sistema domotico di test
Receive Event
Take Event
Interrupted
from Queue
{Blocking Queue}
A dd L is tener A c tivity
Test
Send Event
to listener
numero di eventi generati (caso in cui sia avvenuta una variazione nel contenuto
dei registri) il ritardo dovuto al dispatch dell’evento potrebbe compromettere
la reattività di tutto il sistema.
Per ottimizzare questa parte di codice abbastanza onerosa l’idea è quella di
realizzare l’intero generatore di eventi in codice nativo inoltrando il risultato dei
confronti verso opportuni metodi callback di una classe Java e successivamente
eseguire il dispaching dell’evento come sempre fatto. Oltre ad aumentare le
performances l’idea è anche quella di eliminare completamente la noia dovuta
all’accesso al default package consentendo l’eliminazione della Java Reflection
per accedere alle classi, e ai rispettivi metodi, contenute al suo interno.
Uno degli aspetti critici di questa operazione è la necessità di cross-compilare
tutto il codice nativo: cosa che richiede di avere sulla propria macchina tutta una
111
4 Caso di Studio
Come mostrato in figura Java permette di generare gli header file per le classi
che contengono dichiarazioni di metodi nativi.
Viene mantenuto il file sorgente originale per garantire compatibilità con le
vecchie implementazioni ma vengono aggiunti gli header file e i sorgenti per le
nuove classi Java contenute nel subpackage privato al bundle.
La classe di test ottiene il riferimento all’implementazione dell’interfaccia Ho-
mePLC mentre la classe HomePLCProxy si preoccupa di caricare in memoria
la classe Hplc con i metodi nativi e la shared library nativa con i file necessari.
112
4.3 openHAB come sistema di automazione
113
4 Caso di Studio
114
4.3 openHAB come sistema di automazione
Spesso è necessario accedere allo stato corrente degli Item come nel caso della
logica di automazione e dell’interfaccia grafica che deve mostrare all’utente sem-
pre lo stato aggiornato degli Item. Il componente che svolge questo compitò è
l’openHAB Repository che è anch’esso connesso all’event bus e tiene traccia di
tutti i cambiamenti di stato degli Item. L’utilizzo di questo componente dedi-
cato evita che ogni binding debba mantenere internamente una cache degli stati
a cui è interessanto per un suo proprio utilizzo e automaticamente mantenendo
sincronizzati e disponibili questi stati per tutti i restanti bundle.
Items
Uno dei concetti principali di openHAB è quello di Item. Un Item è un mattone
importante alla base del sistema che basa la sua natura sul concetto di dato e non
è legato a un particolare dispositivo fisico, una sorgente virtuale quale potrebbe
115
4 Caso di Studio
116
4.3 openHAB come sistema di automazione
«interface»
Item
GenericItem «interface»
EventPublisher
«constructor»+GenericItem(name: String)
+getState(): State +sendCommand(itemName: String, command: Command): void
+getStateAs(typeClass: Class): State +postCommand(itemName: String, command: Command): void
+initialize(): void +postUpdate(itemName: String, newState: State): void
+dispose(): void
+getName(): String
+getGroupNames(): String[*]
+setEventPublisher(eventPublisher: EventPublisher): void
+setState(state: State): void
+toString(): String *
«interface»
+addStateChangeListener(listener: StateChangeListener): void StateChangeListener
+removeStateChangeListener(listener: StateChangeListener): void
+hashCode(): int +stateChanged(item: Item, oldState: State, newState: State): void
+equals(obj: Object): boolean +stateUpdated(item: Item, state: State): void
DimmerItem ColorItem
L’Item può anche pubblicare comandi sull’event bus sempre che un oggetto di
tipo EventPublisher venga registrato all’Item.
Stranamente il motodo internalSend() non è richiamato da tutte le implementa-
zioni di Item. Solo SwitchItem, DimmerItem, ContactItem e ColorItem imple-
mentano il metodo send() che internamente richiama internalSend(). Il metodo
send() non appartiene ad alcuna interfaccia implementata dagli Item così è
probabile che sia una parte di codice che è stata dimenticata e mai revisionata.
Prima di dettagliare i tipi di Item definiti in openHAB è giusto introdurre
l’entità Type e tutte le classi derivate in modo da comprendere come venga
gestito lo stato interno di ogni Item.
Types
Il modello dei Types è composto sia da interfacce che fungono da markers sia
da classi concrete.
117
4 Caso di Studio
for ( S t a t e C h a n g e L i s t e n e r listener : c lo ne d Li st e ne r s ) {
listener . stateUpdated ( this , newState ) ;
}
Ci sono casi in cui lo stato degli Item non possiede un valore definito e può
accadere perchè non sono ancora stati inizializzati (non hanno ancora ricevuto
un update dello stato) oppure perchè è ambiguo (una luce dimmerabile trattata
come Switch Item e impostata a un valore ad esempio del 50%) e quindi, per
questi casi viene definito UnDefType che può avere due valori UNDEF e NULL
(non ancora inizializzato).
La quasi interezza dei Type definiti appartengono alla categoria dei Primiti-
veType tra i quali ci sono classi enum che possono accettare solo due valori
(OnOffType, OpenClosetype, UpDownType e StopMoveType) e altre più com-
plesse come DecimalType, derivata dalla classe Java Number e Comparable,
che internamente utilizza un Java BigDecimal e quindi può essere utilizzata
indistintamente per valori integer, long e di tipo floating point.
Direttamente da DecimalType deriva PercentType (utilizzata ad esempio per
esprimere grandezze tipo il volume di uno stereo) che può assumere valori tra 0 e
118
4.3 openHAB come sistema di automazione
«interface» «enumeration»
Type EventType
«enumeration»
UnDefType
«interface»
PrimitiveType «interface»
«interface» State
«interface»
ComplexType
Command
+getConstituents(): SortedMap
temp
PointType StringType «enumeration»
OnOffType
DateTimeType «enumeration»
OpenClosedType
«enumeration»
StopMoveType
Number
Comparable
119
4 Caso di Studio
osservo “<item> ON” intendo che il suo stato è cambiato in ON oppure che
deve essere azionato a ON? Per decidere si invia questa informazione aggiuntiva
sull’event bus per ogni messaggio.
static {
acceptedDataTypes . add ( OnOffType . c l a s s ) ;
acceptedDataTypes . add ( UnDefType . c l a s s ) ;
acceptedCommandTypes . add ( OnOffType . c l a s s ) ;
}
Quindi, sebbene sembri quasi che ad ogni particolare Item sia associato un
particolare Type, in realtà la situazione è un pò più articolata e si può notare
come lo stato di un Item possa variare liberamente in un range di valori definito
dal particolare Type associato al valore che si intende memorizzare.
EventPublisher
120
4.3 openHAB come sistema di automazione
org.openhab.binding.homeplc
OSGi
HomePLCGenericBindingProvider HomePLCBinding
HomePLCBindingProvider
EventHandler
org.openhab.core
org.openhab.core.library
EventPublisher
BindingConfigReader
EventPublisherImpl
CoreItemFactory ItemRegistryImpl
EventAdmin
ItemUpdater
SitemapProvider
EventHandler
org.openhab.model.core
ModelRepository
ModelRepositoryImpl FolderObserver
ManagedService
• openhab/command/<item-name>
121
4 Caso di Studio
// ...
• openhab/update/<item-name>
Inserendo sia il tipo di evento che il nome dell’Item che ha generato il comando
(o a cui è destinato l’aggiornamento di stato) è facile immaginare che, da qualche
parte, ci sia del codice che applica opportune regole di filtraggio.
ItemRegistry
L’ItemRegistry è il luogo centrale in cui gli Item vengono memorizzati e il loro
stato viene continuamente monitorato. Qualsiasi parte di codice che richiede lo
stato corrente di un Item dovrebbe utilizzare questo servizio anzichè mantenere
una propria copia locale.
I vari Item vengono registrati tramite gli ItemProvider, elemento che può gene-
rarli ricavandoli da una una opportuna sorgente (ad es. un file esterno) e inoltre
possono aggiungerli e rimuoverli dinamicamente dall’ItemRegistry.
122
4.3 openHAB come sistema di automazione
«interface» «interface»
EventConstants EventSubscriber
+TOPIC_PREFIX: String = "openhab" {readOnly} +receiveCommand(itemName: String, command: Command): void
+TOPIC_SEPERATOR: String = "/" {readOnly} +receiveUpdate(itemName: String, newStatus: State): void
«interface» AbstractEventSubscriber
EventPublisher
+sendCommand(itemName: String, command: Command): void +handleEvent(event: Event): void
+postCommand(itemName: String, command: Command): void +receiveCommand(itemName: String, command: Command): void
+postUpdate(itemName: String, newState: State): void +receiveUpdate(itemName: String, newState: State): void
EventPublisherImpl «interface»
EventHandler
+setEventAdmin(eventAdmin: EventAdmin): void
+unsetEventAdmin(eventAdmin: EventAdmin): void
+sendCommand(itemName: String, command: Command): void
«interface»
+postCommand(itemName: String, command: Command): void
EventAdmin
+postUpdate(itemName: String, newState: State): void
«interface» «interface»
ItemRegistry ItemsChangeListener
+getItem(name: String): Item +allItemsChanged(provider: ItemProvider, oldItemNames: String[*]): void
+getItemByPattern(name: String): Item +itemAdded(provider: ItemProvider, item: Item): void
+getItems(): Item[*] +itemRemoved(provider: ItemProvider, item: Item): void
+getItems(pattern: String): Item[*]
+isValidItemName(itemName: String): boolean
+addItemRegistryChangeListener(listener: ItemRegistryChangeListener): void
+removeItemRegistryChangeListener(listener: ItemRegistryChangeListener): void
«interface»
ItemProvider
+addItemChangeListener(listener: ItemsChangeListener): void
ItemRegistryImpl +removeItemChangeListener(listener: ItemsChangeListener): void
123
4 Caso di Studio
ItemProvider
openHAB permette di definire gli Item in file di testo contenuti all’interno di
una particolare directory del runtime. In tali file sono contenute le definizioni
degli Item e la stringa di configurazione del binding che si vuole integrare con
openHAB. Queste definizioni devono rispettare le specifiche definite da delle
grammatiche espresse in EMF.
La classe GenericItemProvider realizza l’interfaccia ItemProvider.
Quando tramite il servizio ConfigAdmin di OSGi viene rilevato che uno dei file
*.items è stato modificato il contenuto del ModelRepository viene aggiornato
e successivamente viene inviata una notifica alla classe GenericItemProvider
per ogni modello che è stato modificato. Come modello si intende l’intero file
*.items.
Ricevuto il nome del modello che è stato modificato GenericItemProvider rimuo-
ve le configurazioni contenute nel modello da tutti i BindingConfigReader che
conosce e successivamente genera dal nuovo modello preso dal ModelRepository
una nuova istanza di tutti gli Item.
Creati i nuovi Item, per ognuno di essi, viene chiesto ai BindingConfigReader
corrispondenti di validare il tipo di Item e processarne la configurazione. Nel
caso che venga rilevato qualche problema di incompatibilità o di configurazione
l’Item viene scartato.
Per concludere vengono notificati tutti gli ItemChangeListener. Tra i listener
ovviamente c’è ItemRegistry che provvede a rimuovere tutti gli Item vecchi
inseriti dall’ItemProvider e li sostituisce con tutti quelli nuovi appena processati.
Si conclude notificando tutti gli ItemRegistryChangeListener.
BindingConfigReader
BindingConfigReader è una interfaccia che viene implementata dai vari Bin-
dingProvider che possono essere realizzati da chiunque voglia integrare il proprio
sistema in openHAB.
124
4.3 openHAB come sistema di automazione
«interface» «interface»
ItemProvider ModelRepositoryChangeListener
«interface»
ModelRepository
GenericItemProvider
+getModel(name: String): EObject
«constructor»+GenericItemProvider() +addOrRefreshModel(name: String, inputStream: InputStream): boolean
+setModelRepository(modelRepository: ModelRepository): void +removeModel(name: String): boolean
+unsetModelRepository(modelRepository: ModelRepository): void +getAllModelNamesOfType(modelType: String): Iterable
+addItemFactory(factory: ItemFactory): void +addModelRepositoryChangeListener(listener: ModelRepositoryChangeListener): void
+removeItemFactory(factory: ItemFactory): void +removeModelRepositoryChangeListener(listener: ModelRepositoryChangeListener): void
+addBindingConfigReader(reader: BindingConfigReader): void
+removeBindingConfigReader(reader: BindingConfigReader): void
+getItems(): Item[*]
+addItemChangeListener(listener: ItemsChangeListener): void *
«interface»
+removeItemChangeListener(listener: ItemsChangeListener): void ItemFactory
+modelChanged(modelName: String, type: EventType): void
+createItem(itemTypeName: String, itemName: String): GenericItem
* +getSupportedItemTypes(): String[*]
*
«interface»
«interface» BindingConfigReader
ItemsChangeListener
+getBindingType(): String
+allItemsChanged(provider: ItemProvider, oldItemNames: String[*]): void +validateItemType(item: Item, bindingConfig: String): void
+itemAdded(provider: ItemProvider, item: Item): void +processBindingConfiguration(context: String, item: Item, bindingConfig: String): void
+itemRemoved(provider: ItemProvider, item: Item): void +removeConfigurations(context: String): void
«interface»
BindingConfigReader
+getBindingType(): String
+validateItemType(item: Item, bindingConfig: String): void
+processBindingConfiguration(context: String, item: Item, bindingConfig: String): void
+removeConfigurations(context: String): void
125
4 Caso di Studio
com.netba.homeplc
HomePLC
EventGenerator
126
4.3 openHAB come sistema di automazione
mando) occupano un bit all’interno dei registri ed ecco spiegato perchè si può
arrivare ad avere Master o Slave I/O anche da 16 ingressi e 16 uscite.
ContactItem UnDefType
OpenCloseType
SwitchItem UnDefType OnOffType
OnOffType
NumberItem UnDefType DecimalType
DecimalType
DimmerItem UnDefType OnOffType
OnOffType IncreaseDecreaseType
PercentType PercentType
RollershutterItem UnDefType UpDownType
UpDownType StopMoveType
PercentType PercentType
127
4 Caso di Studio
com.netba.homeplc
HomePLCImpl EventGeneratorImpl
HomePLC EventGenerator
org.openhab.binding.homeplc OSGi
HomePLCGenericBindingProvider HomePLCBinding
EventHandler
EventPublisher
HomePLCBindingProvider
EventPublisherImpl
EventAdmin
BindingConfigReader
128
4.3 openHAB come sistema di automazione
vider cerca di validare tutti gli Item per il binding homeplc e successivamente
memorizza la configurazione di ognuno. Questa configurazione è importantis-
sima per il componente HomePLCBinding perchè determina con esattezza le
trasformazioni che vengono applicate sui Command e sugli Update da e per il
binding homeplc.
Quando verrà inviato un Command verso il sistema di automazione tra i para-
metri comparirà anche lo stato che vogliamo attivare per quel particolare Item.
Il tipo di Item, il tipo del nuovo Stato richiesto e la configurazione ricavata dal-
l’HomePLCBindingProvider determineranno le operazioni fatte sull’interfaccia
HomePLC.
Analogamente quando viene ricevuto un nuovo evento gli Item dell’HomePLC-
BindingProvider interessati a quel particolare evento riceveranno uno stateUp-
date con un valore determinato dalla particolare natura dell’Item stesso e dalle
informazioni ricavate dalla configurazione ottenuta sempre da HomePLCBin-
dingProvider.
129
4 Caso di Studio
org.osgi.service.event
EventProperties Event
+...() +getTopic()
+getProperty()
+matches()
«interface»
EventHandler
+handleEvent()
«interface»
«interface»
EventSubscriber
Type
+receiveCommand()
+format()
+receiveUpdate()
«interface»
Item
+getState()
+getStateAs() «interface»
+getName() «interface» «interface» EventPublisher
+getAcceptedDataTypes() State Command
+sendCommand() AbstractEventSubscriber
+getAcceptedCommandTypes()
+getGroupNames() +postCommand()
+postUpdate()
org.openhab.model.item.binding org.openhab.core.binding
AbstractBinding
AbstractGenericBindingProvider «interface»
BindingChangeListener +setEventPublisher()
+bindingChanged() +unsetEventPublisher()
+allBindingsChanged() +activate()
+deactivate()
+addBindingProvider()
+removeBindingProvider()
«interface» +bindingsExist()
BindingConfigReader
+getBindingType()
+validateItemType()
+processBindingConfiguration()
+removeConfigurations()
«interface»
BindingProvider
+addBindingChangeListener() AbstractActiveBinding
+removeBindingChangeListener()
+providesBindingFor()
«interface» +execute()
+providesBinding()
BindingConfig +getItemNames()
org.openhab.binding.homeplc
HomePLCBindingConfig
HomePLCBinding
«interface» +bindHomePLC()
HomePLCGenericBindingProvider HomePLCBindingProvider +unbindHomePLC()
+bindEventGenerator()
+getHomePLCResource() +unbindEventGenerator()
com.netbuildingautomation.homeplc
«interface» «interface»
HomePLC GeneratorListener
«interface»
+initPicDrv() EventGenerator +onGeneratorEvent()
+closePicDrv()
+getRunningStatus() +setGeneratorListener()
+setRunningStatus() +removeGeneratorListener()
+...() +start() HomePLCEvent
+stop()
+getEventsStatus()
130
4.4 Ambiente di prova e valutazioni
Per dare un idea più chiara del risultato ottenuto vediamo di illustrare una
parte del sistema in uso come indicato nella figura.
Un router centrale all’abitazione fornisce connettività TCP/IP su cavo ethernet
e Wi-Fi a diversi dispositivi sparsi per la casa. A questo router sono collega-
ti con cavo ethernet l’HomePLC (per il sistema domotico), un Raspberry Pi
e l’Hub Philips HUE. Sul Raspberry Pi è installato openHAB che controllerà
tutto l’impianto di Home Automation mentre l’Hub Philips HUE fa da bridge
tramite rete ZigBee per alcune luci sparse nelle varie stanze. Il controller Home-
PLC è connesso con bus proprietario a tutti i dispositivi attualmente acquistati
che permettono di rilevare le pressioni dei pulsanti, il comando della tappa-
rella, il comando della Ventilazione Meccanica Controllata (Wolf CWL-F-150
excellent), le sonde di temperatura e umidità, il dimmer per alcune luci.
131
4 Caso di Studio
Tramite rete wireless sono connessi un ulteriore Raspberry Pi con una in-
stallazione di Mosquitto MQTT Broker e alcuni dispositivi Particle Photon
programmati per la rilevazione di temperatura e umidità tramite sonde DHT22.
Sia l’impiando domotico su rete proprietaria HomePLC che il bridge Philips
sono integrati in openHAB mediante i binding relativi di cui quello per Home-
PLC sviluppato in precedenza. Il broker Mosquitto serve per connettere tramite
protocollo MQTT i due Photon che rilevano la temperature in alcuni punti ad
openHAB su cui è installato un bundle apposito con client MQTT.
Inizialmente questa era la configurazione utilizzata in cui openHAB e l’Home-
PLC.Linux erano connessi tramite protocollo CoAP in quanto la memoria flash
sul dispositivo era limitata e c’erano alcuni problemi ad eseguire openHAB sul
dispositivo stesso.
Tutto l’impianto è comandabile tramite i pulsanti a parete oppure tramite bro-
wser web che con app per smartphone e tablet (android e iOS) connessi tramite
Wi-Fi oppure da remoto su rete cellulare.
132
4.4 Ambiente di prova e valutazioni
133
4 Caso di Studio
Valutazioni
Prima di scegliere il fornitore dell’impianto domotico è stata fatta una disami-
na dei sistemi di Home Automation presenti sul mercato e disponibili presso
i fornitori di zona. La prima cosa che val la pena di notare è che quasi tutti
gli elettricisti contattati hanno opposto una certa resistenza all’installazione di
un impianto domotico. Questo purtroppo rappresenta una situazione ancora
abbastanza diffusa in quanto gli artigiani, che normalmente realizzano impianti
elettrici, difficilmente investono parte del loro poco, e prezioso, tempo a dispo-
sizione per questo tipo di aggiornamento. Il motivo è da ricercare anche nella
ridotta domanda di questo genere di installazioni sintomo, come abbiamo vi-
sto, di una certa diffidenza da parte dei proprietari degli appartamenti e molto
spesso dei costi generalmente molto elevati.
La scelta, alla fine ricaduta sul sistema HomePLC, è dovuta alle particolari
caratteristiche che questo sistema domotico fornisce e, non da ultimo, per la
realtà interamente italiana di questa azienda. Il sistema HomePLC garantisce,
oltre ai dispositivi programmabili in standard IEC 1131-3, anche un controller
embedded con sistema operativo Linux sufficientemente potente da far girare
senza problemi una macchina virtuale Java.
Peculiarità del sistema HomePLC è la possibilità di molti moduli slave di la-
vorare autonomamente dovesse mai interrompersi la connessione su bus RS485
oppure dovesse bloccarsi il sistema sul controller Linux. Grazie al microcodice
programmabile la logica locale del modulo entra in funzione appena rilevata
l’interruzione e, se viene mantenuta una cerca corrispondenza fra la cablatura
e la programmazione sul controller, permette di raggiungere una modalità di
sicurezza tale da garantire quasi una funzionalità completa.
134
4.4 Ambiente di prova e valutazioni
Installazione di openHAB
135
4 Caso di Studio
Solo sostituendo i pacchetti con le versioni più aggiornate non è sufficiente, oc-
corre far capire al framework OSGi equinox che sono stati sostituiti dei bundles.
Per fare questo non resta che modificare i files
< openhab_dir >/ runtime / server / artifacts . xml
< openhab_dir >/ runtime / server / configuration / config . ini
dove il parametro size deve essere modificato da 141 a 140 in quanto le librerie
logback di versione 1.0.13 non comprendono più il bundle
ch.qos.logback.slf4j_1.0.13 e
...
osgi . bundles = reference \: file \: logback - classic_1 .0.13. jar@1 \: start , reference \:
file \: logback - core_1 .0.13. jar@1 \: start ,... , reference \: file \: slf4j - api_1
.7.5. jar@4 , reference \: file \: jcl - over - slf4j_1 .7.5. jar@4 , reference \: file \:
jul - to - slf4j_1 .7.5. jar@4 , reference \: file \: log4j - over - slf4j_1 .7.5. jar .
jar@4
...
dove i punti di sospensione indicano che potrebbero esserci altre righe di codice
(trascurabili).
Problemi iniziali
La libreria nativa per l’interazione del linguaggio Java con il sistema domotico
presentava una limitazione dovuta probabilmente alla poca dimestichezza con
questo linguaggio in quanto l’unica possibilità di richiamare i metodi nativi
della classe di interfaccia era inserendo tutte le classi nel default package.
136
4.4 Ambiente di prova e valutazioni
Come è possibile notare dal progetto si è dovuto ricorrere allo strumento della
Java Reflection per accedere alle classi del default package e creare una classe
proxy per nascondere il problema al resto del sistema che finalmente poteva
essere strutturato al meglio.
Generatore di eventi
137
4 Caso di Studio
138
5 Conclusioni
139
5 Conclusioni
140
Bibliografia
[1] Ala Al-Fuqaha, Mohsen Guizani, Mehdi Mohammadi, Mohammed Ale-
dhari, and Moussa Ayyash. Internet of Things: A Survey on Enabling
Technologies, Protocols and Applications. IEEE Communications Surveys
& Tutorials, PP(99):1–1, 2015.
[2] Luigi Atzori, Antonio Iera, and Giacomo Morabito. The Internet of Things:
A survey. Computer Networks, 54(15):2787–2805, 2010.
[4] Len Bass, Paul Clements, and Rick Kazman. Software Architecture in
Practice Third Edition. Addison-Wesley Professional, 2012.
[5] Simon Bennet, John Skelton, and Ken Lunn. UML. McGraw-Hill
Education, 2001.
[9] Kirk Chen and Li Gong. Programming Open Service Gateways with Java
Embedded Server(TM) Technology. Addison-Wesley Professional, 2001.
141
Bibliografia
[11] Cisco and Dave Evans. Internet of Things L ’ Internet delle cose Tutto
cambierà con la prossima era di Internet. 2011.
[12] Ian Darwin. Java Cookbook, 3rd Edition. O’Reilly Media, Inc., 2014.
[14] Ira R. Forman, Nate Forman, Dr John Vlissides Ibm, Ira R. Forman, and
Nate Forman. Java Reflection in Action. Manning Pubns Co, 2004.
[15] David Gann, James Barlow, and Tim Venables. Digital Futures: making
homes smarter. 1999.
[17] Software Guide. Java NIO, volume 8. O’Reilly Media, Inc., 2009.
[18] Dominique Guinard, Vlad Trifa, Friedemann Mattern, and Erik Wilde.
5 From the Internet of Things to the Web of Things : Resource Oriented
Architecture and Best Practices. Architecting the Internet of Things, pages
97–129, 2011.
142
Bibliografia
[22] Kirk Knoernschild. Java Design: Objects, UML, and Process. Addison-
Wesley Professional, 2001.
[25] Francesco Luciani. Analisi delle tecnologie di supporto alla domotica e alla
localizzazione in un contesto di utenti mobili, 2006.
[26] Jeff McAffer, Paul VanderLei, and Simon Archer. OSGi And Equinox.
Addison-Wesley Professional, 2010.
[30] Robert Simmons. Hardcore Java. Number 0. O’Reilly Media, Inc., 2004.
[32] Deze Zeng, Song Guo, and Zixue Cheng. The Web of Things: A Survey
(Invited Paper). Journal of Communications, 6(6):424–438, 2011.
143