Progetto home Automation: usiamo MQTT per ricevere dati su openhab e disegnarli su un grafico


Dopo tanto tempo son riuscito a prendermi un weekend libero da poter dedicare al questo progetto; l’obiettivo che mi ero prefissato era di creare una pagina con Openhab dove potevo vedere in tempo reale la produzione, i consumi e dei semplici storici (non sono granchè ma punto a migliorarli in seguito).
Avendo dovuto sostituire il Raspberry Pi 3 con un Pi Zero W, diciamo che ne hanno risentito un po’ le performance; a dire il vero pensavo sostenesse openhab, e infatti lo fa, solo che in modo parecchio lento e diventa quindi non troppo usabile.

In questo modo ho deciso di installare Openhab sull’Odroid C2 che ho come TV Box e NAS (tanto è un quad core, potenza ne ha) e far inviare i dati dal Pi Zero tramite MQTT; vediamo come fare!
Nota prima di iniziare: Io sul Pi zero avevo già installati i software necessari cioè aurora e sdm120c; se non li avete trovate come installarli sulle guide precedenti.

Configurazione “Server”

Per server in questo caso intendo l’Odroid, dove è installato Openhab

Installiamo Mosquitto e altri pacchetti necessari

$ yaourt -S mosquitto
# pacman -S ttf-dejavu xorg-fonts-type1
# nano /etc/mosquitto/mosquitto.conf

e decommentiamo e modifichiamo le righe “pid_file” e “user” come dai commenti (attenzione che l’utente che esegue mosquitto deve avere i permessi sulla cartella dove viene scritto il pid file).

Infine abilitiamo e avviamo il servizio:

 # systemctl enable mosquitto
 # systemctl start mosquitto

Configurazione “Client”

Per client in questo caso intendo il Pi Zero, che ci manderà i dati

Installiamo Mosquitto

$ yaourt -S mosquitto
$ yaourt -S python-paho-mqtt

Adesso io ho creato una cartella (chiamata mqtt) nella home dove metterò tutti i file necessari al corretto invio dei dati ad OpenHAB.
Ora nella cartella creiamo i seguenti file:

  • send_data.py
  • send_data.sh

Successivamente ho creato un servizio di Systemctl, send_data.service, che avvia send_data.sh, il quale manda dati ad openHAB in loop:

[Unit]
Description=send_data_mqtt
After=network.target 

[Service]
ExecStart=/bin/sh /home/pi/mqtt/send_data.sh
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

Nota: siccome si tratta di una reinstallazione pulita non ho installato 123solar e metern, quindi se l’avete installato potreste avere dei conflitti coi miei script nella lettura dei valori, la soluzione sarebbe disattivare 123solar e metern, oppure adattare gli script qui sopra per pescare i dati direttamente da metern (tramite le comapps)… insomma vedete voi in base anche alle vostre competenze.
Nota/2: se qualcuno più competente di me ha delle idee su come migliorare l’implementazione di tutto questo, sarò molto felice di ascoltarlo; soprattutto se avete dei miglioramenti per i miei script (che sono in versione decisamente alpha).

Configuriamo OpenHAB

Ora torniamo sul server e spostiamoci sulla cartella dove abbiamo installato OpenHAB:
Installiamo dal pannello Persistence di PaperUI->Add-ons MQTT-persistence, MQTT-bindings e RDD4J-persistence.
Ora è il momento di sistemare a mano i vari script di configurazione:
In services/mqtt.cfg aggiungiamo

 mosquitto.url=tcp://localhost:1883
 mosquitto.clientId=openhab
 mosquitto.retain=true
 mosquitto.async=false

Creiamo ora il file items/meter.items

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

Number SolarPowerTot "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]"}
 

Modifichiamo services/rrd4j.cfg

 powermeter.def=ABSOLUTE,60,-6000,12000,10
 powermeter.archives=AVERAGE,0.5,5,365:AVERAGE,0.5,9,300
 powermeter.items=Power*

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=Consumption period=D refresh=30000 visibility=[chart_period==0, chart_period=="Uninitialized"]
Chart item=Consumption period=w refresh=30000 visibility=[chart_period==1]
Chart item=Consumption period=M refresh=30000 visibility=[chart_period==2]
Chart item=Consumption period=Y refresh=30000 visibility=[chart_period==3]
Chart item=SolarPowerTot period=D refresh=30000 visibility=[chart_period==0, chart_period=="Uninitialized"]
Chart item=SolarPowerTot period=w refresh=30000 visibility=[chart_period==1]
Chart item=SolarPowerTot period=M refresh=30000 visibility=[chart_period==2]            Chart item=SolarPowerTot 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]
}
}


Nota: per la data vi rimando a questo articolo.

Modifichiamo persist/rrd4j.persist

Strategies {
 // for rrd charts, we need a cron strategy
         everyMinute : "0 * * * * ?"
         everyHour   : "0 0 * * * ?"
         everyDay    : "0 0 0 * * ?" 
        default = everyChange
 }

Items {
         Power* : strategy = everyMinute
         * : strategy = everyChange, restoreOnStartup
 }

E infine items/stuff.items

 DateTime Date  "Date [%1$tA, %1$td.%1$tm.%1$tY %1$tH:%1$tM]"  { channel="ntp:ntp:local:dateTime" }
 Number chart_period "Graph period"
 

Ora direi che abbiamo finito e dovreste avere la vostra sitemap funzionante come la mia!
Ho utilizzato per la persistence rrd4j perchè è il più semplice da configurare e far funzionare ma… ben poco personalizzabile e la bellezza dei grafici sono un’altra cosa!
Tuttavia appena riesco se ho tempo lo rimpiazzerò con InfluxDB e Grafana (ho già addocchiato come fare… manca il tempo di provare!).
Alla prossima!

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

2 risposte a Progetto home Automation: usiamo MQTT per ricevere dati su openhab e disegnarli su un grafico

  1. Leonardo Lacchini ha detto:

    ciao,
    ma perchè non hai interrogato direttamente i due sw che leggono da inverter ed sdm usando il binding exec di openhab ? senza quindi passare da mttq
    puoi compilarti i due sw su direttamente su odroid
    io oggi uso 123solar e metern + domotiz e sto portando tutto su openhab, stavo per partire quando ho trovato il tuo articolo, magari hai già affrontato il problema
    grazie

    "Mi piace"

    • danse94 ha detto:

      Ciao Leonardo, sinceramente non conoscevo il binding exec di openhab e non sapevo funzionasse anche via rete, infatti PC che legge i sensori e PC dov’è installato openhab sono diversi e mqtt mi pareva la scelta più semplice, in fondo si trattava solo di far un piccolo script in python. Sinceramente ora non uso neanche più openhab ma sono passato ad homeassistant per diversi motivi, quindi non saprei neanche dirti il perché vero di quella scelta (se perché fosse la prima cosa che ho trovato, oppure perché l’altra non mi andava bene o boh mille altri motivi potrebbero essere).

      "Mi piace"

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...