Domus – Internet of Things per la domotica (parte 1)

Un (altro) progetto IoT basato su Arduino che implementa funzioni di telecontrollo, automazione, data logging e allarmi.


Per la realizzazione di un sistema di automazione e telecontrollo per la casa, si può contare oggi sui molti componenti disponibili nel mercato home automation che, nonostante la mancanza di standard definitivi, si avvia alla maturità. Dall’altra parte abbiamo tecnologie open source che, anche in questo campo, rappresentano una valida alternativa al buy.

Per comprendere meglio il fenomeno ho deciso di rispolverare le mie competenze di elettronica e realizzare un prototipo funzionante per il telecontrollo di una ambiente domestico basato su Arduino Uno: Domus.

Diapositiva1

Domus prevede una sezione attuatori per il comando dei sistemi di riscaldamento, irrigazione e illuminazione giardino e una sezione sensori che raccoglie e gestisce le varie sonde sul campo (tensione, corrente, flusso acqua, temperatura, umidità terreno, luce, pioggia) e allarmi (blocco caldaia, intrusione, incendio, allagamento, gas).

Screenshot_2015-02-19-12-07-16

Il telecontrollo del sistema è basato su un’applicazione Android (per il comando remoto degli attuatori), sviluppata con Tasker e su un PLC controller (basato su un Asus EEE-Box con Windows 7) che svolge funzioni di data logger, reporting e automazione di processo.

Negli articoli seguenti illustrerò le componenti del sistema hardware, software e le configurazioni di rete.

Domus parte2: Arduino

Domus Parte3: Networking

Domus parte4: App Android

Domus parte5: PLC Controller

Domus – Internet of Things per la domotica (parte 2)

La seconda parte dell’articolo illustra la scheda Arduino, lo sketch principale e le librerie utilizzate, gli shield Ethernet, Relè, i sensori e la board di adattamento.


Hardware

Il prototipo Domus si basa sui seguenti componenti:

  • Scheda Arduino Uno
  • Ethernet Shield W5100
  • Board a 4 Relay 250v – 10A
  • Scheda di adattamento realizzata con basetta millefori

Lo schema seguente rappresenta la scheda di adattamento. Nella parte superiore sono elencati i collegamenti agli ingressi analogici e digitali della scheda Arduino, mentre nella parte inferiore i collegamenti ai vari sensori. La basetta è stata dotata di due morsettiere saldate. Gli ingressi digitali 10-13 sono impegnati dall’Ethernet Shield W5100, mentre i 4-7 dalla scheda relè.

Diapositiva2

I sensori utilizzati sono facilmente reperibili a prezzi contenuti su eBay e Amazon:

  • Sonda di corrente (non invasiva) SCT-013-030
  • Alimentatore 220/9v AC/AC (corrente alternata in uscita)
  • Sonda liquidi FS-200°
  • Due sonde digitali di temperatura DS18820 (collegate in bus)
  • Una sonda Soil (umidità terreno)
  • Una sonda pioggia
  • Una fotoresistenza VT90N3
  • Il contatto digitale costituito da un relè presente nella caldaia a condensazione e programmabile per chiudersi quando è in blocco

Software

Lo sketch caricato su Arduino è il seguente:

Arduino Sketch

Il loop principale dello sketch Domus risponde a comandi REST sulla porta 85 del web server creato dalla libreria Ethernet. I comandi HTTP Get vanno lanciati da un browser o, come nel nostro caso, dall’app Android e restituiscono tipicamente il valore di risposta (esempio: 192.168.2.177:85/Lux).

I comandi supportati sono i seguenti:

Comando            Risposta

  • /Emon                  : tensione (V); corrente (A); potenza (W)
  • /Water                 : flusso acqua (L/Hour)
  • /Temp0               : Temperatura Zona Giorno (°C)
  • /Temp1               : Temperatura Zona Notte (°C)
  • /Soil                      : Umidità terreno (val)
  • /Rain                     : Pioggia (0=pioggia, 1=asciutto)
  • /Lux                      : Luminosità (Lux) aprox
  • /Alarm                 : Allarme blocco caldaia (0=blocco, 1=ok)
  • /01_on                 : Attiva relè01 e restiruisce stato di tutti (1000)
  • /01_off                : Disattiva relè01 e restiruisce stato di tutti (0000)

(vale per i relè 01-04)

Dopo l’inclusione delle librerie è necessario configurare i parametri: indirizzo ip, default gateway (il vostro router o, come vedremo più avanti l’indirizzo del gateway OpenVPN) e porta. Seguono le definizioni relative al BUS OneWire (per le sonde di temperatura DS18D20) e agli altri sensori e relè.

Le librerie utilizzate (che quindi devono essere installate nel vostro IDE Arduino) sono le seguenti:

  • Dallas Temperature Control
  • Emon Lib Master
  • OneWire
  • Webserver.h

Per informazioni su come installare le librerie consultate : http://arduino.cc/en/Guide/Libraries

Vai a Domus parte 3: Networking

Domus – Internet of Things per la domotica (parte 3)

La terza parte dell’articolo illustra le soluzioni di rete adottate per superare le limitazioni degli operatori di telefonia mobile italiani, che da qualche tempo forniscono solo IP privati.


Dopo aver realizzato e testato positivamente il prototipo Arduino sulla mia LAN, è venuto il momento di provare l’accesso via WAN, che rappresenta le normali condizioni di utilizzo. Con ADSL Alice, l’accesso remoto non costituisce un problema, in quanto registrando un account gratuito ad un servizio DNS dinamico (NO-IP, Dyndns, ecc.) si ottiene facilmente l’equivalente di un indirizzo statico.

I problemi sono iniziati quando ho provato l’accesso tramite un router connesso ad una chiavetta Vodafone. Questo scenario di utilizzo è tutt’altro che remoto: spesso la casa da controllare non dispone di connettività ADSL e l’unica soluzione è questa.

Ho eseguito la prova con un router TP-Link TL-MR3420 (Morgana) dopo aver inserito una vecchia chiavetta Huawei nella sua porta USB 3G/4G con sim dati Vodafone ed aver associato l’end point ad un account dyndns.  Niente. Nessuna risposta. Un trace con WireShark mi ha confermato quello che già la classe di indirizzi avrebbe dovuto suggerirmi: 10.128.224.10, indirizzo IP privato. NAT. Niente da fare.

Sembrava che TIM fornisse ancora IP “alti”, ma qualcuno lo smentiva. Sono andato allora a comprare una sim TIM per provare.  Risultato: 10.239.31.157. Anche da TIM un indirizzo privato.

E se stabilissi una VPN tra la LAN di casa (servita da ADSL) e la LAN di Arduino (servita da chiavetta TIM)?  Sarebbe come fossero sulla stessa LAN.

Camelot Net

Non essendo i miei router in grado di attivare autonomamente le VPN, ho ripiegato su una soluzione basata su OpenVPN, riciclando ancora una volta i miei due vecchi e fidati Asus EEE-Box, Excalibur e Dragonet. Saranno loro a sostenere la VPN, il primo come server, il secondo come client. Dopo qualche tentativo (occhio al famigerato firewall di windows), con questa configurazione sui due end point ho ottenuto i primi risultati.

Generare una chiave simmetrica key.txt, tramite l’apposita utility e copiarla nelle cartelle “config” di OpenVPN di entrambi gli host. Quindi scegliere una subnet diversa da entrambe quelle degli host coinvolti (es. 10.3.0), aggiungere sul default gateway della rete del server (il router) una rotta statica che inoltri tutto il traffico destinato alla rete 10.3.0 verso l’IP privato del server (10.3.0.2).

Registrare su DynDNS e creareun hostname per il server (es: mioserver.dyndns.net). Installare sul server il client DynDNS e configurarlo per usare l’hostname appena creato.  Accertarsi che il relativo servizio parta automaticamente.

Installare OpenVPN su entrambi gli host, e inserire nelle cartelle “config” di OpenVPN i ripettivi file di configurazione, con estensione “ovpn”:

Dragonet Client.ovpn

Excalibur Server.ovpn

Sul server avviare il servizio “OpenVPN Server” e impostarne l’avvio automatico. Sul client, collegato ad internet con la connessione 3G,  eseguire “OpenVPN GUI” in modalità amministratore, cliccare col tasto destro sull’icona nella systray e scegliere “connect”.

Effettuare dei test di connettività. In caso di problemi, i log di OpenVPN sono molto esplicativi già a verb 3.

Il keep-alive ping garantisce la pronta connessione automatica della VPN ogni qualvolta le due macchine sono attive.

Rimane ancora da risolvere un problemino:  la creazione di una rotta statica verso la subnet  192.168.2.0 e l’inibizione del naturale percorso di ritorno di Morgana tramite Internet.

Per risolverlo, installare su Excalibur la comoda utility Passport per Windows, che permette il  forwarding di tutte le porte IP di Excalibur 192.168.0.200 su Dragonet  102.168.2.200 e configurare sul router  Taliesyn la rotta statica verso 192.168.2.0 tramite Excalibur 192.168.0.200.

Il risultato finale è la piena raggiungibilità di Arduino (mioserver.dyndns.net:85/cmd) da Internet (via Taliesyn, Excalibur, Dragonet ed infine Arduino 192.168.2.177:85).

Vai a Domus parte4: App Android 

Domus – Internet of Things per la domotica (parte 4)

La quarta parte dell’articolo illustra l’app Android per il telecontrollo di Domus.


Tasker è un’applicazione Android che permette la completa automazione dello smartphone. Per conoscere cosa fa, vi rimando direttamente a Google Play Store – Tasker.

Per lo sviluppo dell’app Android per Domus, mi sono basato sulla funzionalità “Editor di Scene”.

Screenshot_2015-02-19-12-07-16Una scena è una interfaccia grafica costituita da un insieme di elementi a cui possono essere collegati dei task in modo da essere eseguiti quando l’utente interagisce con essi, ad esempio toccandoli.

Tasker utilizza le scene per  le finestre di dialogo, i menu e per ottenere un input da parte dell’utente. Più in generale le scene possono essere visualizzate per  la creazione di semplici applicazioni o mostrando controlli aggiuntivi nella parte superiore delle applicazioni esistenti.

Le scene sono completamente personalizzabili dall’utente tramite un editor grafico drag-and-drop.

La funzione di export delle applicazioni, pur permettendone il salvataggio in formato XML, non fornisce un listato comprensibile, quindi non mi è possibile fornire, in questo articolo, il codice dell’app Domus. Tenete presente che, pur non essendo un programmatore, ho sviluppato senza difficoltà questa applicazione in poche ore di lavoro.

Il risultato si presenta a tutti gli effetti come una normale app Android che, utilizzando i servizi REST predisposti su Arduino, permette di effettuare il completo telecontrollo dei relè e l’elaborazione degli stati di ritorno, in modo da accendere i bottoni e rappresentare la condizione di ogni contatto. Inoltre il display superiore permette la visualizzazione dei valori dei sensori (temperatura, umidità, luce, corrente, flusso, condizioni di allarme, ecc.).

Vai a: Domus parte5: PLC Controller

Domus – Internet of Things per la domotica (parte 5)

La quinta e ultima parte dell’articolo, illustra le funzioni del PLC Controller, a supporto di Arduino, realizzato con l’EEE-Box.


Sebbene Arduino permetta la realizzazione di web servers e l’esecuzione di task complessi, per la mia sperimentazione ho deciso di limitarne l’uso a quello di attuatore relè e data-logger. Ho invece delegato le funzioni di raccolta, campionamento, storicizzazione e reporting dei dati, provenienti della rete di sensori, ad un piccolo server basato su EEE-Box con sistema operativo Windows 7.

Le componenti software utilizzate sono le seguenti:

Python 3.4.3 for Windows

EasyPHP for Windows

La libreria PHP pChart per I grafici

La piccola utility Tail

Le funzioni di raccolta, campionamento e storicizzazione sono affidate ad uno script Python che viene attivato ogni 15’ dallo scheduler di windows (l’intervallo di tempo può essere adattato alle effettive esigenze di controllo). Lo script invoca le chiamate REST, relative ai vari sensori, su Arduino e memorizza i dati raccolti in un set di file in formato csv nella directory c:\Domus.

Questo è lo script: Domus.py

Per farlo girare è necessario installare le librerie: smtplib, httplib2, datetime e os. La prima parte dello script interroga le sonde di temperatura, corrente, tensione, potenza, luminosità e condizione di allarme caldaia (sostituite gli indirizzi: mioserver.miodominio.net:85 con quelli a cui avete associato Arduino).

Alla fine, lanciando i file di comandi: Tail-Temp.batTail-Temp1.batTail-Emon.bat vengono regolate (a max 100 elementi nel mio caso) le lunghezze dei file dati csv, in modo da favorirne una comoda rappresentazione in forma di grafico.

La condizione di blocco caldaia è rilevato da Arduino mediante lettura di un ingresso digitale a cui è collegato un contatto della caldaia a condensazione, che viene chiuso in questo caso. Nell’ultima parte dello script Domus.py viene inviata una mail con soggetto ‘Caldaia in blocco!’, grazie alla libreria smtplib.

Il PLC è controllabile mediante il web server Apache messo a disposizione dal WAMP EasyPHP. Con l’aggiunta della comoda libreria PHP pChart sono riuscito a produrre facilmente grafici a partire dai file dati csv (opportunamente accorciati).

Temperature

Dopo aver installato e configurato pChart, provate ad eseguire da un browser lo script PHP: Temperature.php

Conclusioni

Tre mesi di test hanno dimostrato una discreta stabilità ed affidabilità del prototipo Domus. In particolare la soluzione scelta per ovviare all’indisponibilità di indirizzi ip privati, da parte dei provider di connettività mobile HSPA, si è rivelata solida e implicitamente sicura, grazie all’uso di VPN. Spero possa essere d’aiuto in generale a chiunque necessiti di un accesso remoto a siti non serviti da connettività ADSL.

La scheda Arduino Uno si è rivelata straordinariamente solida, perdonando le saldature fredde che non ho potuto evitare, nella realizzazione della Board di Adattamento con la basetta millefori. Anche i sensori, economici e facilmente reperibili, si sono risultati molto stabili e precisi.

Per lo sviluppo dello sketch, ho utilizzato alcune librerie, integrando porzioni di codice reperiti in rete da progetti open-source diversi, come Emon (Open Energy Monitor). Talvolta, considerato il carattere prototipale della realizzazione, mi sono concesso qualche approssimazione, come nel caso della trasformazione in Lux dei valori di output (assolutamente non lineari e difficilmente linearizzabili) della fotoresistenza VT90N3. Per la finalità di rilevare se c’è poca o tanta luce, mi è stato sufficiente così.

La scelta di relegare Arduino al ruolo di data-logger e di attuatore, è stata inizialmente dovuta alla mia scarsa conoscenza dell’ambiente di sviluppo della scheda, ma alla fine si è rivelata razionale e coerente con le limitate caratteristiche hardware di Arduino Uno. Ho considerato una possibile evoluzione del prototipo con l’adozione della scheda Arduino  Yún (che, grazie al sistema operativo Linux, permetterebbe di evitare il PLC).

Naturalmente qualunque suggerimento sarà ben accetto.

Dan