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:

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 cui total_energy_day_f1 ed total_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!