Progetto Home Automation: visualizziamo i nostri consumi su HomeAssistant con MQTT, Grafana e InfluxDB


Dopo aver reinstallato ArchLinux ed HomeAssistant nel mio Odroid C2 e aver fatto il punto della situazione è arrivato il momento di monitorare nuovamente i nostri consumi e la produzione e aggiungerli come grafici su HomeAssistant.

Cercherò di riassumere tutti i passaggi (anche quelli che sono già presenti su altre guide) in modo da avere una panoramica generale dell’intero procedimento.
L’unico prerequisito è che si parte dal presupposto che i vostri dati siano già raccolti da un qualche dispositivo e mandati sulla rete via MQTT. Non entrerò nel merito su come configurare questo dispositivo (nel mio caso un RaspberryPi Zero) perchè io l’ho configurato anni fa (come passa il tempo!) e siccome funziona non ho intenzione di toccarlo; in ogni caso vi rimando alla guida che avevo fatto a riguardo.

Ora che abbiamo tutti i prerequisiti giusti, colleghiamoci al nostro Odroid e possiamo iniziare!

Installazione e configurazione del server MQTT

$ yay -S mosquitto
# mkdir -m 740 -p /var/run/mosquitto
# chown vostroutentecheusamosquitto: /var/run/mosquitto
# nano /etc/mosquitto/mosquitto.conf

e decommentiamo e modifichiamo le righe:

pid_file /var/run/mosquitto/mosquitto.pid

user vostroutentecheusamosquitto

listener 1883

allow_anonymous true

poi abilitiamo il server MQTT al solito modo (NOTA: se come me non avete creato l’utente mosquitto ma lo fate runnare come un altro utente ricordatevi di cambiare lo user sul file /lib/systemd/system/mosquitto.service)

# systemctl enable mosquitto
# systemctl start mosquitto

Ora possiamo verificare che il nostro client mandi correttamente i messaggi sottoscrivendoci a tutti i topic con

$ mosquitto_sub -v -h localhost -p 1883 -t '#'

Configurazione delle entità MQTT su HomeAssistant

Ora per prima cosa dobbiamo installare l’Integrazione MQTT su HomeAssistant. Viste le migliorie fatte in tutti questi anni la configurazione è molto più semplice.
Ci basta collegarci via web ad HomeAssistant (ipserver:8123), andare su Impostazioni->Integrazioni e clicchiamo sulla + in basso per installare l’integrazione.
Come configurazione dovrete mettere l’ip del vostro server (l’Odroid) sulla scritta Broker mentre come username e password lasciate pure bianco (a meno che non l’abbiate impostato nel vostro server MQTT).

Ora bisogna aggiungere le varie entity ad HomeAssistant.
Attualmente ci sono due metodi: uno farlo fare all’Integrazione MQTT tramite l’autodiscovery (scelta consigliata in quanto poi si potrà modificare tutto tramite la UI), oppure si può aggiungerli manualmente ma questo vi farà perdere la possibilità di editare le entità tramite UI, magari dandovi un maggiore controllo sul vostro sistema (valutate voi la strada che preferite).

Per abilitare l’autodiscovery è semplice e basta farlo tramite la configurazione dell’Integrazione MQTT, tuttavia io non son riuscito a farlo funzionare come volevo, proabilmente bisogna configurare delle cose lato client che ho preferito tralasciare (ma se qualcuno ha consigli su come fare in modo semplice son sempre bene accetti).
Per questo motivo ho preferito la strada della configurazione manuale.

Per configurare le entità manualmente, invece, bisogna prima aggiungere la seguente riga al file configuration.yaml nella cartella di configurazione di HomeAssistant

sensor: !include sensors.yaml

e poi editare il file sensors.yaml (o crearlo se non esiste) ed aggiungere:

#energy monitor 
    - platform: mqtt
      name: "Consumption"
      state_topic: "solarpi/cons"
      unit_of_measurement: 'W'
      value_template: "{{ value_json.totalCons | round(2)}}"
    - platform: mqtt
      name: "SelfConsumption"
      state_topic: "solarpi/cons"
      unit_of_measurement: 'W'
      value_template: "{{ value_json.selfCons | round(2)}}"
    - platform: mqtt
      name: "FetchedEnergy"
      state_topic: "solarpi/cons"
      unit_of_measurement: 'W'
      value_template: "{{ value_json.fetchPow | round(2)}}"
    - platform: mqtt
      name: "ImmissionEnergy"
      state_topic: "solarpi/cons"
      unit_of_measurement: 'W'
      value_template: "{{ value_json.immPow | round(2)}}"
    - platform: mqtt
      name: "Production"
      state_topic: "solarpi/solar/tot/power"
      unit_of_measurement: 'W'
      value_template: "{{ value_json.solarProductionTot | round(2)}}"

Se avete seguito la mia guida nella configurazione del client MQTT (il Raspberry che invia i dati) i topic dovrebbero essere già a posto, se no dovrete aggiustarli di conseguenza.

Ora basta riavviare HomeAssistant e dovrete vedere apparsi i sensori configurati come nuove entità.

Installiamo Grafana e InfluxDB e configuriamoli

Una volta configurati i sensori per ricevere i dati possiamo salvare questi dati su un database per poi visualizzarli su un grafico (invece di avere solamente i dati istantanei).

Nota: col tempo i pacchetti possono venire spostati nei repository di Arch (per esempio se usate Arch Linux x86_64 i pacchetti si possono installare direttamente da pacman)

Installiamo InfluxDB e Grafana (Nota: siccome il link col tempo può diventare obsoleto, usate la pagina ufficiale di download per trovare l’ultima versione di Grafana):

$ yay -S influxdb wget influx-cli
$ wget https://dl.grafana.com/oss/release/grafana-6.6.2.linux-arm64.tar.gz
$ tar -xvzf grafana-6.6.2.linux-arm64.tar.gz
# mkdir /opt/grafana
# cp -rf grafana-6.6.2/* /opt/grafana/

Nota: i comandi appena descritti (eccetto l’installazione di influxdb e wget) possono essere utilizzati anche per aggiornare Grafana con le nuove release.

Ora creiamo il servizio di grafana-server:

# 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=/opt/grafana/bin/grafana-server --config=/opt/grafana/conf/defaults.ini --homepath=/opt/grafana

[Install]
WantedBy=multi-user.target

Ora configuriamo InfluxDB (EDIT 21/04/22)

Siccome dalla prima versione della guida c’è stato il rilascio della versione 2.0 che cambia parecchio le cose, per configurare InfluxDB bisogna creare il file /etc/influxdb/influxdb.yaml coi relativi parametri che si vogliono cambiare rispetto al default.
Personalmente ho cambiato le directory in modo che non scriva sulla scheda SD ma su una partizione in un disco dedicato.

Il file /etc/influxdb/influxdb.yaml quindi diventa:

engine-path: /path/to/influxdb/engine
bolt-path: /path/to/influxdb/influxd.bolt

NOTA: nel file /lib/systemd/system/influxdb.service la riga di esecuzione deve diventare ExecStart=/usr/bin/influxd, se no i parametri appena settati verranno sovrascritti. In alternativa i parametri di cui sopra possono essere messi direttamente nel comando in ExecStart.

Inoltre va creato l’utente influxdb

# useradd -rm influxdb

Infine abilitiamo tutti i servizi per averli avviati al prossimo riavvio:

# systemctl --system daemon-reload
# systemctl enable grafana-server
# systemctl enable influxdb

Ora bisogna creare il database InfluxDB quindi accediamo con:

$ influx
> CREATE DATABASE home_assistant
> CREATE USER admin WITH PASSWORD 'SuperSecretPassword123+' WITH ALL PRIVILEGES
> CREATE USER homeassistant WITH PASSWORD 'AnotherSuperbPassword456-'
> CREATE USER grafana WITH PASSWORD 'PleaseLetMeRead789?'
> GRANT ALL ON home_assistant TO homeassistant
> GRANT READ ON home_assistant TO grafana
> exit

Una volta configurato il database possiamo attivare l’autenticazione http su Influxdb editando in /etc/influxdb/influxdb.conf

[http]
enabled = true
bind-address = ":8086" # change to a specific interface if needed
auth-enabled = true # will enforce authentication
...

Configuriamo HomeAssistant per salvare i dati ricevuti sul database

Una volta installato e creato il database bisogna aggiungerlo ad HomeAssistant, per farlo editiamo il file configuration.yaml aggiungendo:

influxdb:
 host: IPDatabase
 username: homeassistant
 password: AnotherSuperbPassword456-
 max_retries: 10
 override_measurement: state
 include:
     entities:
         - sensor.consumption
         - sensor.fetchedenergy
         - sensor.immissionenergy
         - sensor.production
         - sensor.selfconsumption

In questo modo abbiamo configurato HomeAssistant per salvare tutti i dati ricevuti nelle entities selezionate nel database di Influx.

Configuriamo Grafana per graficare i dati salvati

Ora configuriamo Grafana aggiungendo il database come data source, impostando le impostazione come in figura.
Successivamente creiamo una nuova dashboard coi dati presi dal database appena configurato. Su questa parte non metterò nessuna guida perchè è ognuno lo configurerà a modo suo.

Aggiungiamo i grafici di Grafana su HomeAssistant

Ultimo passo di questa guida è aggiungere i grafici appena generati in modo da visualizzarli direttamente su HomeAssistant.

Per fare questo bisogno prima di tutto abilitare embedding su Grafana, quindi fermiamo il servizio e digitiamo:

$ cp /opt/grafana-6.6.2/conf/defaults.ini /opt/grafana-6.6.2/conf/defaults.ini.bak
$ nano /opt/grafana-6.6.2/conf/defaults.ini

Ora nel file appena aperto bisogno modicare le seguenti righe come segue, una per abilitare l’accesso embedded, l’altra per abilitare l’accesso anonimo (facoltativo).

[security]
...
# set to true if you want to allow browsers to render Grafana in a <frame>, <iframe>, <embed> or <object>. default is false.
allow_embedding = true 
...
[auth.anonymous]
# enable anonymous access
enabled = true 

Ora possiamo riavviare il servizio e integrarlo su HomeAssistant.

Per integrarlo in HomeAssistant per prima cosa bisogna entrare nella dashboard e ottenere il link per condividerla (attraverso share), poi incolliamo il link appena copiato in una Web Card di Lovelace e… ora avrete i vostri grafici direttamente su HomeAssistant! 😉

Piccolo trucchetto: per avere i grafici a piena larghezza della pagina bisogna attivare la modalità pannello e mettere tutte le vostre cards in una singola vertical stack card (riferimento questa discussione).

Questa voce è stata pubblicata in Arch Linux, Home automation, Uncategorized 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...