Blog migrato su nuova piattaforma

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
Visualizzazione post con etichetta groups. Mostra tutti i post
Visualizzazione post con etichetta groups. Mostra tutti i post

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.

martedì 24 ottobre 2017

Home Automation System - OpenHAB v.2 Piccolo miglioramento per il monitoring della rete




Dopo l'introduzione dei gruppi nel mio setup di OpenHAB v.2 ho migliorato leggermente la configurazione del monitoring di rete.

Ho infatti aggiunto un gruppo chiamato gNetworkCheck, che verrà assegnato a tutti i dispositivi che verranno tenuti sotto monitoraggio. Questo gruppo assumerà il valore ON quando tutti gli item contenuti saranno in stato ON, altrimenti OFF.

La regola che gestisce il monitoraggio a questo punto non viene definita per ogni dispositivo, ma direttamente sul gruppo; in questo modo ogni volta che aggiungo un dispositivo da monitorare, è sufficiente che esso venga assegnato anche al gruppo gNetworkCheck, senza dover scrivere una "rule" a lui dedicata.

Ho quindi modificato il mio file /etc/openhab2/rules/checks.rules, eliminando tutte le regole associate ai singoli "item" ed inserendone una sola relativa al gruppo:

rule "network check"
when
Item gNetworkCheck changed
then
val lastItem = gNetworkCheck.members.sortBy[lastUpdate].last
logInfo("rules", "NETWORK CHECK -> " + lastItem.name + " changed to " + lastItem.state)
sendNotification([user_to_be_notified], "NETWORK CHECK -> " + lastItem.name + " changed to " + lastItem.state)
end


Seguendo un suggerimento di un thread del forum di OpenHAB (https://community.openhab.org/t/determining-the-triggering-item-in-the-body-of-a-rule/2654/4?u=alex73) sono riuscito ad identificare l'elemento che ha scatenato il cambio di valore del gruppo. In questo modo lo posso indicare nel testo della notifica.

Ecco la sitemap aggiornata con l'indicazione del gruppo


mercoledì 18 ottobre 2017

Home Automation System - Usiamo i gruppi di OpenHAB v.2




Altro passo in avanti con OpenHAB v.2...parliamo di "gruppi"; leggendo la documentazione ufficiale (http://docs.openhab.org/configuration/items.html#groups) e dopo averli studiati un pochino mi sono reso conto che non sono delle semplici etichette per categorizzare gli items gestiti da OpenHAB, ma possono servire anche come "aggregatori di informazioni" nelle sitemap, essere utilizzati nelle "rules" ed avere un loro valore puntuale, derivato dai valori dei singoli items ad essi associati. Possono anche ricevere dei comandi che saranno inviati agli oggetti contenuti.

Il "gruppo" non è nient'altro che un item con delle particolarità. Esso infatti viene definito in un file .items presente nella cartella degli items. Ho quindi creato un file dedicato, chiamato groups.items, nella cartella /etc/openhab2/items ed ho iniziato a definire alcuni gruppi che mi potranno tornare utili nel proseguio della configurazione del sistema.

I gruppi possono essere annidati e quindi è possibile creare una vera e propria struttura gerarchica.

La sintassi la trovate nella documentazione ufficiale ed è molto semplice.

I gruppi che ho iniziato a creare mi serviranno per raggruppare gli item secondo i piani e le stanze della casa (main floor, first floor, kitchen, garden...), la tipologia di item (sensor, switch, network, etc etc...), l'utilizzo (lights, temperature etc etc...) e man mano che mi serviranno ulteriori categorizzazioni le andrò ad aggiungere...

Ho fatto in modo che alcuni di questi gruppi possano avere un loro valore, dipendente dai valori degli item / gruppi contenuti. Alcuni esempi:

- il gruppo gTemperatureFirstFloor conterrà tutti i sensori di temperatura presenti al primo piano e il suo valore sarà definito come la media dei valori di tutti i sensori;

- il gruppo gEnergyConsumer conterrà tutti i sensori di misurazione potenza consumata e il suo valore ne sarà la somma;

- il gruppo gLightSwitchGarden conterrà tutti gli switch delle luci del giardino ed il suo valore sarà un ON se almeno uno switch sarà in stato ON altrimenti OFF

Questi gruppi potranno essere inseriti anche nelle sitemap dove si potrà vedere il relativo valore (se lo hanno...) e, tramite un click, vedere tutti gli item / gruppi in esso contenuti, creando una vera e propria visualizzazione gerarchia.

Ad esempio, riprendiamo il gruppo delle luci esterne ed affianchiamogli i gruppi delle luci dei vari piani della casa: gLightSwitchFirstFloor, gLightSwitchMainFloor, gLightSwitchGroundFloor (all'interno di essi inseriremo gli items relativi agli switch delle luci...). Creiamo un nuovo gruppo chiamato gLightSwitch ed inseriremo al suo interno tutti i gruppi delle luci definiti prima.

Inserendo in una sitemap il gruppo gLightSwitch avremo a disposizione una navigazione gerarchica fino ad arrivare ai singoli items, passando dai gruppi intermedi, ognuno con il proprio valore riassuntivo; inviando comandi a gLightSwitch potremmo comandare, tramite un solo oggetto, l'accensione e lo spegnimento di tutte le luci di casa.


Ecco un video di esempio per la gestione delle luci