Abbiamo visto in questo post come implementare un monitoraggio semplice ma puntuale dei consumi elettrici della nostra casa. Sulla base di questo, come promesso alla fine del post, andiamo a costruire una dashboard che ci consenta di vedere a colpo d’occhio come stanno andando le cose.
Cosa vogliamo fare
Lo scopo di questo post è quindi quello di implementare una schermata che sia capace di veicolare tutte le informazioni raccolte dal monitoraggio dei consumi, che ci permetta in sostanza di avere sotto controllo:
- la potenza istantanea assorbita dalla nostra casa, per capire se siamo a ridosso delle soglie critiche, ed il trend delle ultime 24h
- l’andamento orario dei consumi, per individuare anomalie durante la giornata
- l’andamento giornaliero dei consumi, per analizzare l’impatto dei nostri comportamenti giorno dopo giorno
- la fascia tariffaria corrente e le tariffe applicate in ciascuna fascia, informazione utile per ricordarci quando possiamo osare di più senza eccedere nei costi
- il dettaglio dei consumi di eventuali dispositivi connessi - non incluso nel package
- la previsione di spesa mensile per prepararci all’arrivo della fattura
Cosa ci serve
L’hardware minimo necessario per implementare il monitoraggio è riepilogato nel post dedicato al package. Qui invece elenchiamo i mattoncini con cui abbiamo costruito la nostra dashboard, scaricabili da HACS:
- Bar-Card per visualizzare la potenza istantanea in formato barra
- Button-card per l’indicazione e la gestione delle fasce orarie
- Layout-card per organizzare il contenuto della dashboard
- Mini-Graph-Card per il trend istantaneo ed i grafici orario e giornaliero
- Multiple-entity-row per il dettaglio dei consumi e dei costi
Nota Per la realizzazione dei grafici in questa dashboard, in alternativa alla card sopra indicata, è stata valutato l’utilizzo della card Apexcharts-card, che è davvero molto potente, ma al contempo complessa. Non è escluso che in futuro possa fare delle prove che senz’altro troverete in un nuovo post.
Scriviamo il file yaml
Partiamo quindi con il codice della nostra dashboard. Si tratta ovviamente di una view
lovelace, che possiamo definire, come da documentazione ufficiale:
#views:
- title: Consumi
path: energy
icon: 'mdi:flash'
panel: true
badges: []
cards:
Layout
L’organizzazione della dashboard è semplice e schematica: nella parte di sinistra tutti i grafici in colonna, ordinati secondo il riferimento temporale (valore puntuale e trend della potenza istantanea, consumo orario e giornaliero); nella parte destra, in testa le informazioni sulle tariffe e nella colonna tutti i dettagli disponibili sulle voci di consumo e costo. Le dimensioni di queste aree possono essere cambiate all’occorrenza in base alla superficie disponibile per la visualizzazione.
Che tradotto in codice yaml
diventa:
- type: custom:layout-card
layout_type: custom:grid-layout
layout:
grid-template-columns: 350px 600px
grid-template-rows: 60px auto
grid-template-areas: |
"charts tariff"
"charts info"
cards:
# AREA GRAFICI
- type: vertical-stack
view_layout:
grid-area: charts
cards:
...
# AREA TARIFFE
- type: horizontal-stack
view_layout:
grid-area: tariff
cards:
...
# AREA DETTAGLI
- type: vertical-stack
view_layout:
grid-area: info
cards:
...
I grafici
Andiamo ora a costruire il contenuto dell’area grafici, ovvero della card vertical-stack
. Partiamo con la potenza istantanea: l’informazione che ci interessa è il valore in questo momento, con una indicazione rispetto alle soglie di controllo mediante codice colore:
- verde se il valore è sotto la soglia di 2500 watt (75% del massimo di 3.3KW)
- giallo se si entra in zona critica, tra il 75% ed il 90% del massimo
- rosso se si supera la soglia dei 3000 watt, oltre la quale sono possibili distacchi
Useremo ovviamente queste soglie in entrambi i grafici sulla potenza istantanea: sia sul valore puntuale, come appena esposto, sia sul trend dell’assorbimento delle ultime 24h, in modo da poter riconoscere velocemente eventuali anomalie.
#Potenza istantanea, valore puntuale
- type: custom:bar-card
name: Potenza istantanea
entity: sensor.home_total_w
animation: 'off'
height: 20px
positions:
icon: 'off'
indicator: 'off'
min: 0
max: 3500
severity:
- from: 0
to: 2000
color: green
- from: 2000
to: 2500
color: Orange
- from: 2500
to: 4500
color: red
#Potenza istantanea, trend 24h
- type: custom:mini-graph-card
entities:
- sensor.home_total_w
name: Potenza 24h
icon: mdi:flash
hours_to_show: 24
points_per_hour: 60
hour24: true
smoothing: false
upper_bound: 3500
lower_bound: 0
line_width: 1
height: 170
show:
name: false
icon: false
points: false
labels: true
state: false
extrema: false
color_thresholds_transition: smooth
color_thresholds:
- value: 0
color: green
- value: 2500
color: yellow
- value: 3000
color: red
Procediamo con i grafici dell’energia, ovvero dei consumi veri e propri con cui siamo abituati a ragionare, in termini di KWh. Sempre nella pila verticale, implementiamo due grafici: consumo orario e consumo giornaliero. Per fare questo, utilizziamo la proprietà aggregate_func: max
della card, che ci permette di mostrare il massimo valore dell’entità nel range di punti specificato. Ricordiamo, infatti, che i valori dell’energia sono totalizzatori, per cui hanno un andamento crescente nel relativo periodo di calcolo.
# Consumo orario
- type: custom:mini-graph-card
entities:
- sensor.total_energy_hour
name: Consumo orario
icon: mdi:history
hours_to_show: 24 # 24 ore
points_per_hour: 1 # Un valore ogni ora
hour24: true
lower_bound: 0
aggregate_func: max
group_by: hour
show:
graph: bar
labels: true
state: true
# Consumo giornaliero
- type: custom:mini-graph-card
entities:
- sensor.total_energy_day
name: Consumo giornaliero
icon: mdi:history
hours_to_show: 168 # 7 giorni
points_per_hour: 0.04167 # Un valore al giorno, quindi 1/24 ogni ora
hour24: true
lower_bound: 0
aggregate_func: max
group_by: date
show:
graph: bar
labels: true
state: true
Informazioni sulle tariffe
Nella definizione dei nostri totalizzatori, abbiamo indicato due fasce di contabilizzazione F1 ed F23. Nella dashnoard quindi, vogliamo visualizzare in tempo reale la fascia in utilizzo, con relativo costo, ma anche fornire una funzionalità di aggiornamento di quest’ultimo. Per far questo, per ciascuna delle fasce definite, implementiamo una custom:button-card
come l’esempio che segue:
# Esempio Fascia F1 - Sostituire F1 con F23 per la relativa card
- type: custom:button-card
entity: input_number.energy_cost_f1
name: F1
tap_action:
action: more-info
show_icon: false
show_state: false
show_label: true
label: >
[[[
return states['input_number.energy_cost_f1'].state + ' €/kWh';
]]]
styles:
card:
- height: 50px
- font-weight: bold
name:
- color: >
[[[
if (states['utility_meter.total_energy_day'].state == 'f1')
return 'lime';
return 'gray';
]]]
label:
- color: var(--accent-color)
- font-size: 13px
Infine, per mostrare un valore di costo complessivo che vada oltre il costo dell’energia, che ci dica cioè il costo in bolletta comprensivo di tutte le spese accessorie, completiamo l’area con la card seguente:
- type: custom:button-card
entity: input_number.energy_cost_gross
name: Totale
tap_action:
action: more-info
show_icon: false
show_state: false
show_label: true
label: >
[[[
return states['input_number.energy_cost_gross'].state + ' €/kWh';
]]]
styles:
card:
- height: 50px
- font-weight: bold
label:
- color: var(--accent-color)
- font-size: 13px
Nota Per migliorare il codice della dashboard, si potrebbe utilizzare il meccanismo dei template. Tuttavia, essendo poche le card da istanziare, al netto di una pulizia ed ottimizzazione del codice, non vi sarebbe un grande guadagno.
Dettagli dei consumi
Completiamo la dashboard con un approfondimento sui consumi ed i costi. Realizziamo una tabella di entities
ed utilizzando la card custom:multiple-entity-row
possiamo inserire in ciascuna riga più informazoni inerenti la voce principale. Quindi, riepiloghiamo per il giorno ed il mese: consumo, costo di ciascuna fascia e costo lordo in bolletta:
- type: entities
title: Riepilogo Consumi
show_header_toggle: false
view_layout:
grid-area: info
entities:
#Consumi e costo giornalieri
- type: custom:multiple-entity-row
entity: sensor.energy_cost_day_gross
secondary_info:
entity: sensor.total_energy_day
name: "Consumo: "
state_color: true
state_header: Bolletta
name: Costo giornaliero Energia
icon: mdi:home
entities:
- entity: sensor.energy_cost_day_f1
name: F1
- entity: sensor.energy_cost_day_f23
name: F23
- entity: sensor.energy_cost_day
name: F1+F23
#Consumi e costo mensili
- type: custom:multiple-entity-row
entity: sensor.energy_cost_mth_gross
secondary_info:
entity: sensor.total_energy_mth
name: "Consumo: "
state_color: true
state_header: Bolletta
name: Costo mensile Energia
icon: mdi:home
entities:
- entity: sensor.energy_cost_mth_f1
name: F1
- entity: sensor.energy_cost_mth_f23
name: F23
- entity: sensor.energy_cost_mth
name: F1+F23
Per chiudere, nella sezione Dettaglio si possono aggiungere, con la stessa card vista sopra per i totali, tante righe di dettaglio quante sono le voci di consumo eventualmente calcolate mediante altri oggetti smart integrati (come ad esempio plug, interruttori o lampadine smart). Di seguito il consumo della lavatrice rilevato mediante Smart Plug:
#Separatore
- type: section
label: Dettaglio
#Consumo Lavatrice calcolato con Smart Plug
- type: custom:multiple-entity-row
entity: sensor.plug_lavatrice_w
state_color: true
state_header: Attuale
name: Lavatrice
icon: mdi:washing-machine
entities:
- entity: sensor.plug_lavatrice_energy_mth
name: Mensile
- entity: sensor.plug_lavatrice_energy_day
name: Giornaliero
Risultato finale
La dashboard implementata assume l’aspetto mostrato nella cover di questo post. Il codice è disponibile a questo link.
Di seguito un breve video ne mostra il funzionamento:
Enjoy!