Disclaimer

Prestare sempre attenzione a seguire le indicazioni fornite in questo blog, soprattutto se si tratta di apparecchiature elettriche collegate alla tensione di 220V. Non mi ritengo responsabile di danni causati dall'aver seguito i consigli qui pubblicati.
Grazie

sabato 25 novembre 2017

Home Automation System - I primi sensori...




Dopo aver fatto un pò di esperimenti e preso dimestichezza con OpenHAB è arrivato il momento di costruire il primo sensore da inserire nel nostro sistema di Home Automation.

Partiamo dalla cucina, dove voglio inserire un rilevatore di gas, un sensore di temperature e di umidità.

Il tutto verrà controllato da una scheda ESP8266 NodeMcu. Ho scelto questa scheda in quanto ha già il Wifi integrato, gestisce numerosi ingressi digitali più uno analogico, è programmabile come Arduino e soprattutto...costa molto poco...Su Banggood sono riuscito a portarne due a casa al costo di € 2,76 l'una, non male...

Per chi fosse interessato qui c'è il link del prodotto:

Geekcreit-Doit-NodeMcu-Lua-ESP8266 su Banggood.com


I sensori che andrò ad utilizzare sono i seguenti:

- Sensore di Gas MQ-4: sensibile principalmente al metano (quello che interessa a me...) e anche al propano e butano. Questo sensore lo avevo già utilizzato per qualche esperimento con Arduino qualche mese fa. Eccolo


Sensore Gas MQ-4 su Banggood.com

- Sensore di Temperatura / Umidità DHT11: è un sensore molto economico (con poco più di 5 euro ne ho acquistati 5) e il rilevamento della temperatura ha un errore di +/- 2°C e misura solo temperature positive. La temperatura viene rilevata con massima precisione di 1°C, quindi niente cifre decimali...A causa di queste limitazioni ho deciso di acquistare ed utilizzare i sensori della Dallas, i ds18b20 (sia per esterno che per interno...)...questo DHT11 lo utilizzerò solo per l'umidità


Pacco da 5 su Banggood.com

Pacco da 3 su Banggood.com

Sensore singolo su Banggood.com

- Sensore di Temperatura Dallas ds18b20: rispetto al precedente ha una precisione di mezzo grado e permette di misurare anche temperature negative, quindi è l'ideale per misurare temperature esterne (cosa che ho in progetto di fare...utilizzando la versione sonda da esterno)


Sensore singolo su Banggood.com

Pacco da 5 su Banggood.com

Sonda da esterno su Banggood.com

Faccio qualche prova con i diversi sensori utilizzando una breadboard...


...finchè non trovo la configurazione corretta...quindi mi creo una schedina "definitiva" in maniera un pò artigianale...



Oltre alla scheda ESP8266 e ai sensori, ho aggiunto un led di indicazione della trasmissione dei dati e un connettore per l'alimentazione esterna. La scheda infatti viene alimentata attraverso un piccolo alimentatore 5V 450mA, connesso alla morsettiera azzurra vicino alla scheda. In questo modo, oltre ad alimentare al scheda, alimento anche i diversi sensori.

Il led, il ds18b20 e il DHT11 sono connessi ad ingressi/uscite digitali mentre il sensore del gas MQ-4 è connesso all'unico ingresso analogico presente sulla scheda.

E' arrivato il momento di scrivere il software di gestione...come ambiente di sviluppo ho deciso di utilizzare Visual Studio Code, con estensione Platformio...lo trovo molto comodo e leggero, rispetto all'IDE di Arduino...La scelta è ricaduta su questo ambiente anche perchè esiste un plugin per OpenHAB, che permette di editare in maniera evoluta i file di configurazione (tipo Eclipse SmartHome Designer, ma molto più user-friendly...parere soggettivo...). In questo modo ho un unico ambiente per tutto.

Il software fa in modo che la schedina, tramite il wifi di casa, si connetta al broker MQTT di OpenHAB, acquisisca i dati dei sensori ed invii un messaggio in formato Json sul topic nodemcu/mainfloor/esp8266mcu11/temphumiditygas/state.

La campionatura dei sensori avviene ogni 5 secondi mentre ogni minuto la media delle campionature viene inviata al server. Al momento dell'invio dei dati al server, il led verde lampeggia 3 volte per indicare l'attività di rete in corso.

Ecco un esempio di messaggio inviato dal device al broker MQTT:

{"gas":{"error":"","sensorValue":46.33333,"ppm":0.431016,"percentage":0.000043,"realValue":829.0371},"tempHum":{"error":"","humidity":63.66667,"tempC":22,"tempF":71.59999,"heatIndexC":21.91774,"heatIndexF":71.45234},"temp":{"error":"","tempC":21.66667,"tempF":70.99999}}


Il blocco gas è relativo al sensore MQ-4, il blocco tempHum al DHT11 e il blocco temp al ds18b20

Per adesso ho deciso di mantenere i dati di temperatura di entrambi i sensori per metterli a confronto e vedere come si comportano.

Bene, sembra tutto funzionare...metto quindi il dispositivo al suo posto in cucina


Adesso tocca ad OpenHAB...devo configurarlo per permettere di ricevere i dati e pubblicarli sulla sitemap. Una volta fatto questo, posso anche configurare una nuova dashboard su Grafana, per valutare l'andamento nel tempo dei dati acquisiti.

In OpenHAB non devo far altro che aggiungere i nuovi items per ricevere le informazioni da MQTT. Creo allora un nuovo file chiamato esp8266mcu11.items (esp8266mcu11 è l'identificativo univoco che ho assegnato al dispositivo appena nato...) nella cartella /etc/openhab2/items e aggiungo le seguenti linee:

Number MainFloor_KitchenTemperature "Kitchen Temperature [%.1f °C]" <temperature>
(gPersistence)
{mqtt="<[openhabianpi-mqtt:nodemcu/mainfloor/esp8266mcu11/temphumiditygas/state:state:JSONPATH($.tempHum.tempC)]" }

Number MainFloor_KitchenTemperatureNew "Kitchen Temperature NEW [%.1f °C]" <temperature>
(gPersistence)
{mqtt="<[openhabianpi-mqtt:nodemcu/mainfloor/esp8266mcu11/temphumiditygas/state:state:JSONPATH($.temp.tempC)]" }

Number MainFloor_KitchenHumidity "Kitchen Humidity [%.1f %%]" <humidity>
(gPersistence)
{mqtt="<[openhabianpi-mqtt:nodemcu/mainfloor/esp8266mcu11/temphumiditygas/state:state:JSONPATH($.tempHum.humidity)]" }

Number MainFloor_KitchenGasPpm "Kitchen Gas [%.2f ppm]" <carbondioxide>
(gPersistence)
{mqtt="<[openhabianpi-mqtt:nodemcu/mainfloor/esp8266mcu11/temphumiditygas/state:state:JSONPATH($.gas.ppm)]" }

Number MainFloor_KitchenGasValue "Kitchen Value [%.2f]" <carbondioxide>
(gPersistence)
{mqtt="<[openhabianpi-mqtt:nodemcu/mainfloor/esp8266mcu11/temphumiditygas/state:state:JSONPATH($.gas.realValue)]" }

Tocca poi alla sitemap...aggiungo le seguenti righe:

Frame label="Gas Detection" {
Text item=MainFloor_KitchenGasPpm valuecolor=[>800="red",>600="orange",<=600="green"]

}

Frame label="Kitchen" {
Text item=MainFloor_KitchenTemperatureNew
Text item=MainFloor_KitchenHumidity
}



E questo è il risultato:


Ottimo, ho aggiunto un altro mattoncino...adesso creiamo la nuova dashboard in Grafana con i dati di temperatura, umidità e gas in cucina:


Ultimo step è quello di aggiungere il dispositivo al monitoraggio della rete...in modo tale che OpenHAB mi notifichi nel caso vada offline. Allora tramite PAPERUI aggiungo il dispositivo di rete utilizzando il Network Binding e ne creo i relativi items, linkando i channels. L'item relativo alla presenza online del dispositivo lo aggiungo al gruppo gNetworkCheck e da adesso in poi il suo stato di presenza in rete sarà monitorato da OpenHAB.

giovedì 16 novembre 2017

Home Automation System - Dashboard con Grafana




La scelta di InfluxDB come motore di persistenza dei dati di OpenHAB è stata dettata anche dal fatto che è facilmente integrabile in Grafana, una piattaforma opensource per la creazione di dashboard web interattive.

Grafana lo installo sempre sul Raspberry PI3, dove girano OpenHAB e InfluxDB, utilizzando lo strumento di configurazione di OpenHAB (openhabian-config), selezionando l'opzione "optional components"


Dopo l'installazione e l'avvio del servizio, la piattaforma risulta raggiungibile sulla porta 3000 via http.

Qui c'è un'ottima guida per la configurazione di Grafana e InfluxDB

https://community.openhab.org/t/influxdb-grafana-persistence-and-graphing/13761#grafana-setup

La creazione delle dashboard e veramente molto facile...una volta definito il data source che punta alla nostra istanza di InfluxDB


Ogni dashboard è un insieme di righe e oggetti; per recuperare i dati si seleziona la grandezza che interessa e via...magicamente appaiono i dati nel grafico, in base all'intervallo temporale selezionato.

Ecco la mia dashboard di esempio dove ho inserito:

- in alto a sinistra i tempi di ping di due dispositivi in rete
- in alto a destra i dati dello speedtest (upload e download su due assi indipendenti)
- in basso i dati di temperature e umiditià del mio paese, ottenuti dal servizio OpenWeatherMap (su due assi indipendenti)


lunedì 6 novembre 2017

Home Automation System - Persistenza dei dati con InfluxDB





Negli ultimi giorni ho introdotto il concetto di "persistenza" dei dati in OpenHAB v.2 in modo da storicizzare i dati acquisti e preparare delle dashboard di consultazione.

Come sempre la documentazione ufficiale è abbastanza esaustiva:


Come motore di persistenza ho scelto InfluxDB, un motore database ottimizzato per memorizzare serie di dati basate su data/ora. La mia scelta è stata dettata anche dal fatto che InfluxDB si integra benissimo con Grafana, una piattaforma web per la creazione di dashboard interattive.

Per prima cosa installo InfluxDB su RPI3 (lo stesso su cui gira OpenHAB) seguendo la documentazione ufficiale https://docs.influxdata.com/influxdb/v1.3/introduction/installation/

Successivamente bisogna abilitare il motore di persistenza su OpenHAB v.2, utilizzando PaperUI, sezione Add-ons, tab Persistence


A questo punto bisogna configurare OpenHAB con le informazioni di connessione al database InfluxDB appena creato, modificando il file services/influxdb.cfg nella solita cartella di configurazione di OpenHAB. Nel mio caso, avendo lasciato le opzioni suggerite, ho dovuto solo inserire la password dell'utente, il resto è tutto lasciato ai valori di default.

Questo è il mio file di configurazione:

# The database URL, e.g. http://127.0.0.1:8086 or https://127.0.0.1:8084 .
# Defaults to: http://127.0.0.1:8086
# url=http(s)://<host>:<port>

# The name of the database user, e.g. openhab.
# Defaults to: openhab
# user=<user>

# The password of the database user.
password=XXXXXXX

# The name of the database, e.g. openhab.
# Defaults to: openhab
# db=<database>

Sulla guida ufficiale si trovano tutte le opzioni: http://docs.openhab.org/addons/persistence/influxdb/readme.html

Adesso occorre configurare le strategie di persistenza che OpenHAB utilizzerà per memorizzare i dati su InfluxDB; in sostanza devo decidere, item per item, quando memorizzare il dato sul database. Si può decidere di persistere il dato ogni volta che esso cambia, ogni volta che viene aggiornato (anche se non cambia...) oppure ad intervalli regolari di tempo, utilizzando la modalità di schedulazione di Quartz. Per fare questo si deve creare un file di configurazione della persistenza, nella cartella /etc/openhab2/persistence, chiamato influxdb.persist. In questo file andiamo a definire le modalità di persistenza che vogliamo usare (sezione Strategies...) per assegnarle ai vari items / gruppi (sezione Items...).

Documentazione ufficiale

La mia sezione Strategies è la seguente:

Strategies {
everyMinute: "0 * * * * ?"
everyHour: "0 0 * * * ?"
everyDay: "0 0 0 * * ?"
default = everyUpdate, restoreOnStartup
}

Per l'assegnazione di "classi di persistenza" degli items ho trovato molto utile utilizzare i gruppi; ho quindi definito dei nuovi gruppi nel solito file /etc/items/groups.items

Group gPersistence (gAll)
Group gPersistence1m (gAll)
Group gPersistence1h (gAll)
Group gPersistence1d (gAll)
Group gPersistenceChange (gAll)

a cui andrò ad assegnare le classi di persistenza sopra definite, nella sezione Items del file influxdb.persist

Items {
gPersistence* :
gPersistence1d* : strategy = everyDay, restoreOnStartup
gPersistence1h* : strategy = everyHour, restoreOnStartup
gPersistence1m* : strategy = everyMinute, restoreOnStartup
gPersistenceChange* : strategy = everyChange, restoreOnStartup
.........
}

A questo punto per decidere quale item persistere e come, mi basterà assegnare i gruppi corretti.

Nel prossimo post parlerò di Grafana, ottimo strumento per la creazione di dashboard.