Progetto home Automation: miglioriamo la persistence e i grafici su openhab con influxDB e Grafana


Dopo aver collegato il Raspberry ad Openhab con mqtt vediamo di migliorare il nostro monitor dei consumi; uno dei problemi di Rdd come persistence per i consumi e la produzione dei pannelli è che è un database a dimensione fissa.. e quindi?
Quindi per mantenere la dimensione fissa tende a comprimere i dati raggruppando quelli più vecchi (nella nostra configurazione facendo la media tra tot) e questo non è un bel comportamento per noi che magari un domani vorremmo vedere cosa hanno prodotto i nostri pannelli un anno fa.
Inoltre permette di fare i grafici solo salvando i dati almeno ogni minuto e a me interesserebbe di più avere l’istantaneo ogni 5/7 secondi e salvare sul database per il grafico la media ogni 5 minuti… Vediamo come fare!

Installazione pacchetti

Dobbiamo installare la persistence di InfluxDB da PanelUI su openhab e da AUR influxdb; purtroppo Grafana non è disponibile per aarch64 e dovremmo procedere alla compilazione da sorgenti per il nostro ODROID-C2, procediamo:
# pacman -S nodejs git go
$ mkdir /home/user/.go
$ export GOPATH=/home/user/.go
$ go get github.com/grafana/grafana
$ cd $GOPATH/src/github.com/grafana/grafana
$ go run build.go setup
$ go run build.go build
# pacman -S phantomjs
# npm install -g yarn
$ yarn install --pure-lockfile
# npm install -g grunt-cli
# chmod 777 /home/user/.go
$ grunt
# nano /etc/systemd/system/grafana-server.service

e aggiungiamo

[Unit]
Description=Grafana instance
Documentation=http://docs.grafana.org
Wants=network-online.target
After=network-online.target
After=influxdb.service

[Service]
ExecStart=/home/user/.go/bin/grafana-server --config=/home/user/.go/src/github.com/grafana/grafana/conf/defaults.ini --homepath=/home/user/.go/src/github.com/grafana/grafana/

[Install]
WantedBy=multi-user.target

EDIT 31/7/18: È possibile (e consigliato) installare la build pre compilata per arm64:
$ wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.2.2.linux-arm64.tar.gz
$ tar -zxvf grafana-5.2.2.linux-arm64.tar.gz
# mv grafana-5.2.2 /opt/
# nano /etc/systemd/system/grafana-server.service

e aggiungete

[Unit]
Description=Grafana instance
Documentation=http://docs.grafana.org
Wants=network-online.target
After=network-online.target
After=influxdb.service

[Service]
ExecStart=/opt/grafana-5.2.2/bin/grafana-server --config=/opt/grafana-5.2.2/conf/defaults.ini --homepath=/opt/grafana-5.2.2

[Install]
WantedBy=multi-user.target

FINE EDIT

e ora attiviamo tutto con
# systemctl enable grafana-server
# systemctl start grafana-server
# systemctl enable influxdb
# systemctl start influxdb

Configuriamo Influxdb

Creiamo il database e gli utenti su Influx
$ influx
Connected to http://localhost:8086 version 0.13
InfluxDB shell version: 0.13
> CREATE DATABASE openhab_db
> CREATE USER admin WITH PASSWORD 'SuperSecretPassword123+' WITH ALL PRIVILEGES
> CREATE USER openhab WITH PASSWORD 'AnotherSuperbPassword456-'
> CREATE USER grafana WITH PASSWORD 'PleaseLetMeRead789?'
> GRANT ALL ON openhab_db TO openhab
> GRANT READ ON openhab_db TO grafana
> exit

Abilitiamo l’autenticazione http in /etc/influxdb/influxdb.conf:
[http]
enabled = true
bind-address = ":8086" # change to a specific interface if needed
auth-enabled = true # will enforce authentication
...

e riavviate il servizio di influxdb.
Da ora in poi se vorrete accedere alla console di influxdb dovrete utilizzare:
influx -username admin -password SuperSecretPassword123+ -host localhost
.

Configuriamo OpenHAB per lavorare con InfluxDB

Ora modifichiamo su openhab il file services/influxdb.cfg
# 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://127.0.0.1:8086

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

# The password of the database user.
password=AnotherSuperbPassword456-

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

# The retention policy to be used, needs to configured in InfluxDB
# Till v0.13: 'default', since v1.0: 'autogen'
retentionPolicy=autogen

e il file persistence/influxdb.persist:
Strategies {
everyMinute : "0 * * * * ?"
every5Minutes: "* */5 * * * ?"
everyHour : "0 0 * * * ?"
everyDay : "0 0 0 * * ?"
}

Items {
SecPowerAvg* : strategy = every5Minutes
PowerAvg* : strategy = everyChange
}

modifichiamo items/meter.items:
Group All
Group Meters (All)

Group Power "Energy Power Meters" (Meters)
Group MainPower (Power)
Group SecPower (Power)

Number SolarPowerAll "Production [%.1f W]" (MainPower) {mqtt="<[mosquitto:solarpi/solar/tot/power:state:default]"}
Number Consumption "Consumption [%.1f W]" (MainPower) {mqtt="<[mosquitto:solarpi/cons/power:state:default]"}
Number Immission "Immission Energy [%.1f W]" (SecPower) {mqtt="<[mosquitto:solarpi/cons/immpower:state:default]"}
Number SelfConsumption "Self-consumption [%.1f W]" (SecPower) {mqtt="<[mosquitto:solarpi/cons/selfpower:state:default]"}
Number FetchEnergy "Fetched Energy [%.1f W]" (SecPower) {mqtt="<[mosquitto:solarpi/cons/fetchpower:state:default]"}

//average

Group PowerAvg "Energy Power Meters" (Meters)
Group MainPowerAvg (PowerAvg)
Group SecPowerAvg (PowerAvg)

Number SolarPowerAvg "Production [%.1f W]" (MainPowerAvg)
Number ConsumptionAvg "Consumption [%.1f W]" (MainPowerAvg)
Number ImmissionAvg "Immission Energy [%.1f W]" (SecPowerAvg)
Number SelfConsumptionAvg "Self-consumption [%.1f W]" (SecPowerAvg)
Number FetchEnergyAvg "Fetched Energy [%.1f W]" (SecPowerAvg)

Creiamo una nuova rules in rules/meteravg.rules
rule "Power average"
when
Time cron "0 0/5 * * * ?"
//Time cron "0 * * * * ?" //for debug
then
var Number PowerAverage = Consumption.averageSince(now().minusMinutes(5)) as Number
ConsumptionAvg.postUpdate(PowerAverage) // assumes values are still in rrd4j
// logDebug("consumptionAvg", "Cons average {}", ConsumptionAvg.state)
PowerAverage = SolarPowerTot.averageSince(now.minusMinutes(5)) as Number
SolarPowerAvg.postUpdate(PowerAverage) // assumes values are still in rrd4j
// logDebug("SolarAvg", "Solar average {}",SolarPowerAvg.state)

end

rule "SecPower average"
when
Item ConsumptionAvg changed or
Item SolarPowerAvg changed
then
if(SolarPowerAvg.state as Number > ConsumptionAvg.state as Number ) {
var Number diff = SolarPowerAvg.state as Number - ConsumptionAvg.state as Number
ImmissionAvg.postUpdate(diff)
SelfConsumptionAvg.postUpdate(ConsumptionAvg.state as Number)
FetchEnergyAvg.postUpdate(0)
}
else if (SolarPowerAvg.state as Number < ConsumptionAvg.state as Number ) {
ImmissionAvg.postUpdate(0)
SelfConsumptionAvg.postUpdate(SolarPowerAvg.state as Number)
var Number diff = ConsumptionAvg.state as Number - SolarPowerAvg.state as Number
FetchEnergyAvg.postUpdate(diff)
}
end

Configuriamo Grafana

Andiamo sulla dashboard di Grafana (http://ip:3000), Data Source e configuriamo come nell’immagine

Grafana to InfluxDB


Una volta collegato Grafana a InfluxDB dovrete creare una Dashboard e personalizzare i vostri grafici; siccome è una parte molto personale vi rimando alla guida che ho seguito io.
Nell’immagine (ho ancora pochi dati) vedete il risultato finale

Importiamo Grafana su openHAB

Per fare ciò dovrete trovarvi i link ai vostri pannelli da Grafana (su share) e metterli da parte pronti ad essere inseriti nei prossimi file.
Creiamo il file html/chartDay.html


e il file html/charts.css
.container iframe {
width: 100%;
height: 400px;
}

.container {
width: 98%;
margin: 0 auto;
}

h2 {
text-align: center;
}

Infine modifichiamo sitemaps/default.sitemap
sitemap default label="House Energy Monitor"

{
Frame label="Date"{
Text item=Date
}

Frame label="Production and consumption instant values" {
Text item=SolarPowerTot
Text item=Consumption
Text item=Immission
Text item=SelfConsumption
Text item=FetchEnergy
}

/* Frame label="Production and consumption graphs" {
Switch item=chart_period mappings=[0="Day", 1="Week", 2="Month",3="year"]

Chart item=MainPower period=D refresh=30000 visibility=[chart_period==0, chart_period=="Uninitialized"]
Chart item=MainPower period=w refresh=30000 visibility=[chart_period==1]
Chart item=MainPower period=M refresh=30000 visibility=[chart_period==2]
Chart item=MainPower period=Y refresh=30000 visibility=[chart_period==3]

Chart item=SecPower period=D refresh=30000 visibility=[chart_period==0, chart_period=="Uninitialized"]
Chart item=SecPower period=w refresh=30000 visibility=[chart_period==1]
Chart item=SecPower period=M refresh=30000 visibility=[chart_period==2]
Chart item=SecPower period=Y refresh=30000 visibility=[chart_period==3]

}*/

Frame label="Charts" {
Webview url="/static/chartDay.html" height=33 //visibility=[weatherChartPeriod=="1"]
}
//height varies based on number of graphs and dimensions of them.
}

È tutto, ora dovreste avere il vostro centro di misurazione funzionante!

Questa voce è stata pubblicata in Arch Linux, Home automation, raspberry pi e contrassegnata con , , , , , , , , , , , , , , , , , , , , , , , . Contrassegna il permalink.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...