Il controllo dei consumi elettrici di casa è un tema molto diffuso tra chi si affaccia sul mondo delle case intelligenti. Sapere quali sono gli elettrodomestici (e non solo) che pesano di più nella bolletta elettrica è il primo passo per capire dove agire per alleggerire il conto, ma meglio ancora sarebbe avere un sistema in grado di segnalare, o meglio ancora intervenire, nel caso si superino soglie di guardia.
Nota La maggior parte delle utenze domestiche dispone di un contatore con una potenza impegnata pari a 3KW, e di una potenza disponibile (ovvero la massima nominale che il contatore può gestire) di 3.3KW. Per chi avesse richiesto un innalzamento della potenza, la disponibile è sempre il 10% in più di quella impegnata. Questi valori sono disponibili in bolletta.
Cosa vogliamo fare
In condizioni di operatività regolare, senza malfunzionamenti sulla linea, il contatore provvede automaticamente al distacco se si supera la soglia di potenza disponibile per più di 3 ore. Questa situazione è certamente sconveniente perchè in grado potenzialmente di arrecare danni seri ai dispositivi collegati alla rete, ma anche causare inconvenienti diversi, ad esempio connessi al mondo della refrigerazione e conservazione dei cibi. Il nostro hub di domotica ci può venire in aiuto in queste situazioni critiche, anche proattivamente.
Per quanto appena descritto quindi, il package per la gestione dei consumi lavora su due livelli:
- misurazione della potenza assorbita mediante uno o più dispositivi connessi
- notifica (e/o azione) in caso di superamento di soglie di guardia
Cosa ci serve
Nel nostro esempio, costruiremo la parte di monitoraggio partendo dalla misura del consumo istantaneo totale mediante uno Shelly EM: questo dispositivo supporta la lettura di uno o anche due carichi mediante pinza amperometrica la cui installazione risulta poco invasiva, in quanto non necessita interventi sull’impianto. Tra quelle disponibili, la pinza da 50A (11KW) è generalmente largamente sufficiente in ambito domestico.
Ricapitoliamo l’elenco della spesa:
- Shelly EM con pinza amperometrica 50A - necessario
- pinza amperometrica nel caso si avesse già a disposizione lo Shelly EM - opzionale
- Una pinza crimpatrice con adeguati terminali per un corretto e più sicuro e duraturo cablaggio dello Shelly - opzionale ma fortemente consigliata
- Supporto per guida DIN per tenere in ordine il quadro elettrico - opzionale
La logica
Partendo dalla potenza istantanea totale misurata, andremo a implementare dei contabilizzatori, in grado di calcolare i consumi totali su base giornaliera e mensile ed anche di gestire eventuali fasce di consumo (nel nostro caso tariffazione bioraria F1-F23). A ciascuno di questi totali andremo poi ad associare i relativi costi, che possiamo recuperare dalla bolletta. Opportune automazioni gestiranno le fasce di consumo, la notifica in caso di superamento di soglie e l’eventuale conseguente spegnimento di carichi critici, se anch’essi dotati di alimentazione gestita da dispositivi smart.
Scriviamo il file yaml
Come sempre in testa al nostro package posizioniamo la necessaria sezione di personalizzazione:
homeassistant:
customize:
sensor.home_total_w:
friendly_name: Potenza istantanea
icon: mdi:home-alert
sensor.home_total_w_filtered:
friendly_name: Potenza istantanea
icon: mdi:desk
sensor.home_total_kwh:
friendly_name: Casa
icon: mdi:desk
sensor.home_total_energy_day:
friendly_name: Casa
icon: mdi:counter
sensor.home_total_energy_mth:
friendly_name: Casa
icon: mdi:counter
Parametri configurabili
Per adeguare il package alle esigenze di ognuno, alcuni dei parametri utilizzati nell’implementazione della logica sopra descritta, sono personalizzabili mediante apposite entità di tipo input
. Possiamo infatti impostare gli orari di inizio di ciascuna fascia di tariffazione ed i relativi costi. Queste informazioni sono recuperabili dalla bolletta o dal contratto di fornitura elettrica.
# Orari inizio F1 ed F23
input_datetime:
energy_f1_start:
name: "Orario Inizio F1"
has_date: false
has_time: true
initial: '08:00'
energy_f23_start:
name: "Orario Inizio F23"
has_date: false
has_time: true
initial: '19:00'
# Costo di ciascuna fascia oraria
input_number:
energy_cost_f1:
name: Costo KWh Energia F1
min: 0.0001
max: 0.5000
unit_of_measurement: '€'
initial: 0.05758
mode: box
icon: mdi:currency-eur
energy_cost_f23:
name: Costo KWh Energia F23
min: 0.0001
max: 0.5000
unit_of_measurement: '€'
initial: 0.07242
mode: box
icon: mdi:currency-eur
energy_cost_gross:
name: Costo KWh Energia
min: 0.01
max: 1.50
unit_of_measurement: '€'
initial: 0.20
mode: box
icon: mdi:currency-eur
Dalla potenza istantanea all’energia
Procediamo con la definizione dei sensori chiave di questo package: il misuratore della potenza istantanea assorbita, ovvero i Watt, e la corrispondente energia consumata nel tempo, ovvero i KWh, ricavabile mediante un apposito sensore di integrazione disponibile nativamente su Home Assistant, la cui configurazione è piuttosto semplice.
sensor:
# Power Monitoring sensor (Shelly EM)
- platform: mqtt
name: home_total_w
state_topic: "shellies/shellyem-ABCDEF/emeter/0/power"
unit_of_measurement: 'W'
force_update: true
# Power to Energy Integration
- platform: integration
source: sensor.home_total_w
name: total_kWh
unit_prefix: k
unit_time: h
method: left
Non scendiamo in questo post nel dettaglio dell’integrazione dello Shelly, ma ci limitiamo ad indicare quella che è solo una delle tante possibili modalità con cui questi ormai diffusi dispositivi si possono integrare nel nostro hub di domotica, ovvero mediante MQTT.
Gestione a fasce orarie: totalizzatori Utility_Meter
Abbiamo quindi la misura del nostro consumo energetico nel tempo, non ci resta che contabilizzare nei periodi con cui siamo abituati ad osservarli: consumo giornaliero e consumo mensile. Volendo lasciarci la possibilità di un controllo più puntuale, almeno visuale, definiamo anche un totale orario.
Completiamo però prima la sezione sensor
con la definizione dei totali, madiante piattaforma template, pari alla somma delle singole fasce contabilizzate:
# Totale consumi KWh (F1+F23)
- platform: template
sensors:
total_energy_day:
friendly_name_template: " Consumo giornaliero"
icon_template: mdi:counter
value_template: "{{((states.sensor.total_energy_day_f1.state | float) + (states.sensor.total_energy_day_f23.state | float)) | round(3) }}"
unit_of_measurement: 'KWh'
- platform: template
sensors:
total_energy_mth:
friendly_name_template: "Consumo mensile"
icon_template: mdi:counter
value_template: "{{((states.sensor.total_energy_mth_f1.state | float) + (states.sensor.total_energy_mth_f23.state | float)) | round(3) }}"
unit_of_measurement: 'KWh'
Ed arriviamo infine ai contabilizzatori, specificando le fasce di consumo:
utility_meter:
total_energy_hour:
source: sensor.total_kWh
cycle: hourly
total_energy_day:
source: sensor.total_kWh
cycle: daily
tariffs:
- f1
- f23
total_energy_mth:
source: sensor.total_kWh
cycle: monthly
tariffs:
- f1
- f23
Attenzione Il nome dei sensori generati da questa sezione Utility_Meter sono ottenuti mediante concatenazione tra il nome da noi indicato (ad esempio
total_energy_day
) e ciascuna tariffa (per cuitotal_energy_day_f1
edtotal_energy_day_f23
). Questi sono esattamente i sensori che abbiamo utilizzato in precedenza per il calcolo dei totali complessivi.
Automazioni
Il passaggio del contabilizzatore dalla fascia F1 a quella F23 e viceversa viene gestita da apposite automazioni. Per alimentare questo meccanismo, oltre agli orari di inizio fascia definiti in precedenza, andiamo a creare anche un binary_sensor
che ci dice se siamo in un giorno festivo (secondo il calendario italiano) o meno: questo perchè in questi giorni l’unica fascia applicata è F1. Ricordiamo che la tariffa del nostro esempio è bioraria.
# sensore per giorni feriali e festivi
binary_sensor:
- platform: workday
name: giorni lavorativi
country: IT
Abbiamo ora tutto quanto necessario per scandire il ciclo di tariffazione:
automation:
# F1 giorni lavorativi
- alias: Energy__Tariffa_F1
initial_state: on
trigger:
platform: template
value_template: >-
{{ states('sensor.time') == (states.input_datetime.energy_f1_start.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}
condition:
- condition: state
entity_id: binary_sensor.giorni_lavorativi
state: 'on'
action:
- service: utility_meter.select_tariff
data:
entity_id: utility_meter.total_energy_day
tariff: f1
- service: utility_meter.select_tariff
data:
entity_id: utility_meter.total_energy_mth
tariff: f1
# F23 tariffa serale
- alias: Energy__Tariffa_F23_sera
initial_state: on
trigger:
platform: template
value_template: >-
{{ states('sensor.time') == (states.input_datetime.energy_f23_start.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}
condition:
- condition: state
entity_id: binary_sensor.giorni_lavorativi
state: 'on'
action:
- service: utility_meter.select_tariff
data:
entity_id: utility_meter.total_energy_day
tariff: f23
- service: utility_meter.select_tariff
data:
entity_id: utility_meter.total_energy_mth
tariff: f23
# F23 giorni festivi
- alias: Energy__Tariffa_F23_festivi
initial_state: 'on'
trigger:
platform: state
entity_id: binary_sensor.giorni_lavorativi
to: 'off'
action:
- service: utility_meter.select_tariff
data:
entity_id: utility_meter.total_energy_day
tariff: f23
- service: utility_meter.select_tariff
data:
entity_id: utility_meter.total_energy_mth
tariff: f23
Risultato finale e prossimi passi
Il monitoraggio è pronto. Il codice completo è disponibilie qui.
Su questa base, andremo a implementare una dashboard lovelace per la visualizzazione di tutti i dati.
Ed ancora:
- Rapporto giornaliero dei consumi mediante notifica su smartphone
- Salvataggio dei consumi su file per consultazione
- Allarme per superamento soglie di guardia
- Azioni su carichi controllati in caso di superamento prolungato
Enjoy!