Quando si mette in piedi un hub domotico, la smania di integrare tutto quanto ci capiti a tiro è enorme. Non fanno eccezione gli elettrodomestici che nativamente non sono smart, come ad esempio lavatrice o la lavastoviglie, per i quali può essere comodo monitorare il consumo e lo stato e scatenare di conseguenza eventi, come ad esempio notifiche di fine programma.

Cosa vogliamo fare

Obiettivo di questo package è proprio di riuscire a dedurre e monitorare,attraverso il nostro hub, lo stato di operatività di una lavatrice non smart, sia fornendo una indicazione visiva dello stato rilevato, sia notificando, attraverso i canali disponibili, i cambi di stato e la fine del programma.

Cosa ci serve

Tutto quanto vedremo in questo package si basa sull’utilizzo di un dispositivo intelligente in grado di passare ad Home Assistant la lettura della potenza istantanea assorbita dalla lavatrice. Esistono numerosi dispositiv di questo tipo, più o meno pronti all’uso. Quello che andremo ad utilizzare in questo esempio è la Shelly Plug-S.

Si tratta di una delle smart plug prodotte dalla bulgara Allterco, la piccola di casa. La Plug-S infatti è adatta a gestire carichi con assorbimento massimo nominale di 2500W, e quindi di sopportare una corrente di 10A. Con queste caratteristiche tecniche risulta essere adeguata allo scopo di gestire una lavatrice/asciugatrice.

La logica

Come detto, l’unica informazione in tempo reale di cui disponiamo è la lettura dell’assorbimento della lavatrice, raccolto ed inviato ad HA mediante la Smart Plug. Incrociando questa info con dei dati empirici, frutto di osservazioni durante le varie fasi di funzionamento della lavatrice, possiamo stabilire, in modo più o meno univoco, la corrispondenza tra il consumo e lo stato. In questo modo definiremo le soglie di entrata ed uscita dei vari stati operativi e scriveremo i nostri sensori su questa base.

Ad esempio, per la mia lavatrice le soglie che è stato possibile stabilire sono:

Assorbimento Tempo minimo Tempo uscita Stato / Fase
0 W n.a. n.a. Spenta
< 3 W 5 s 15 s Accesa, pronta
> 3 W 5 s 15 s Programma attivo
3 - 200 W 5 s 15 s Fase: lavaggio
> 1500 W 2 s 2 s Fase: riscaldamento
> 200 W 15 s 5 s Fase: centrifuga

Ovviamente il numero di stati e relative soglie riscontrabili è legato a ciascun modello di macchina che andiamo ad osservare. Adattare questo esempio al proprio caso è abbastanza semplice, una volta capita la logica di base.

Scriviamo il file yaml

Come al solito, in testa al nostro package posizioniamo la sezione di personalizzazione:

# Package LAVATRICE
# 
homeassistant:
  customize:
    sensor.lavatrice_fase_programma:
      friendly_name: Stato lavatrice   
      icon: mdi:home-alert
    sensor.plug_lavatrice_w:
      friendly_name: Consumo lavatrice   
      icon: mdi:home-alert
    sensor.plug_lavatrice_energy_day:
      friendly_name: Lavatrice   
      icon: mdi:counter
    sensor.plug_lavatrice_energy_mth:
      friendly_name: Lavatrice   
      icon: mdi:counter       
    switch.plug_lavatrice:
      friendly_name: Plug lavatrice   
      icon: mdi:home-alert

Parametri configurabili

Continuiamo con le entità che ci soncentono di regolare il funzionamento del package, ovvero le soglie di passaggio da uno stato all’altro. Questo potrà essere fatto anche a runtime (attenzione ai riavvii!!) qualora riscontrassimo incongruenze.

Per immettere i parametri necessari, utilizziamo altrettanti input_number quanti sono gli stati operativi che abbiamo osservato ed intendiamo tracciare:

# Soglie fasi programma     
input_number:
  lavatrice_soglia_programma:
    name: Lavatrice soglia Programma
    min: 1
    max: 10
    unit_of_measurement: 'w'
    initial: 3
    mode: box
  lavatrice_soglia_lavaggio:
    name: Lavatrice soglia Lavaggio
    min: 5
    max: 300
    unit_of_measurement: 'w'
    initial: 200
    mode: box
  lavatrice_soglia_riscaldamento:
    name: Lavatrice soglia Riscaldamento
    min: 1000
    max: 2000
    unit_of_measurement: 'w'
    initial: 1500
    mode: box
  lavatrice_soglia_centrifuga:
    name: Lavatrice soglia Centrifuga
    min: 100
    max: 500
    unit_of_measurement: 'w'
    initial: 200
    mode: box

Lettura degli stati operativi

In ogni momento, lo stato della lavatrice sarà disponibile in opportuni sensori che assumono valore on/off in base al valore dell’assorbimento istantaneo. Per fare questo, definamo dei binary_sensor di tipo template, come segue:

binary_sensor:
  - platform: template
    sensors:
      # Accesa / Spenta
      lavatrice_stato:
        value_template: >-
                    {{ states('sensor.plug_lavatrice_w')|int > 0 }}
        device_class: power
        delay_on:
          seconds: 5
        delay_off:
          seconds: 15
      # Programma attivo
      lavatrice_programma:
        value_template: >-
                    {{ states('sensor.plug_lavatrice_w')|int > states('input_number.lavatrice_soglia_programma')|int }}
        device_class: power
        delay_on:
          seconds: 5
        delay_off:
          seconds: 15
      # Riscaldamento in corso
      lavatrice_riscaldamento:
        value_template: >-
                    {{ states('sensor.plug_lavatrice_w')|int > states('input_number.lavatrice_soglia_riscaldamento')|int }}
        delay_on:
          seconds: 2
        delay_off:
          seconds: 2
      # Lavaggio in corso
      lavatrice_lavaggio:
        value_template: >-
                    {{ states('sensor.plug_lavatrice_w')|int < states('input_number.lavatrice_soglia_lavaggio')|int and states('sensor.plug_lavatrice_w')|int > states('input_number.lavatrice_soglia_programma')|int }}
        delay_on:
          seconds: 5
        delay_off:
          seconds: 15
      # Centrifuga in corso
      lavatrice_centrifuga:
        value_template: >-
                    {{ states('sensor.plug_lavatrice_w')|int < states('input_number.lavatrice_soglia_riscaldamento')|int and states('sensor.plug_lavatrice_w')|int > states('input_number.lavatrice_soglia_centrifuga')|int }}
        delay_on:
          seconds: 5
        delay_off:
          seconds: 5

Dalla potenza istantanea all’energia

Procediamo con la definizione dei sensori chiave di questo package: il misuratore della potenza istantanea assorbita, ovvero i Watt, registrata dalla Smart Plug 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.

Abbiamo scelto, ma non è l’unico modo, di integrare la nostra Shelly Plug-S mediante protocollo MQTT. Partiamo con l’implementazione dello switch con cui possiamo accendere e spegnere la plug, ovvero l’alimentazione della lavatrice:

switch:
  - platform: mqtt
    name: "plug_lavatrice"
    command_topic: "shellies/shellyplug-s-123456/relay/0/command"
    state_topic: "shellies/shellyplug-s-123456/relay/0"
    retain: false
    payload_on: "on"
    payload_off: "off"

Procediamo con i valori di potenza assorbita, che andiamo a trasformare in energia mediante apposita integrazione, e valori diagnostici di temperatura:

  sensor:
    # Plug-s  
    - platform: mqtt
      name: plug_lavatrice_w
      state_topic: "shellies/shellyplug-s-123456/relay/0/power"
      unit_of_measurement: 'W'
      force_update: true  
    - platform: mqtt
      name: diagn_plug_lavatrice_temp
      state_topic: "shellies/shellyplug-s-123456/temperature"
      unit_of_measurement: 'C'  
    - platform: mqtt
      name: diagn_plug_lavatrice_overtemp
      state_topic: "shellies/shellyplug-s-123456/overtemperature"    
      
    # Power to Energy
    - platform: integration
      source: sensor.plug_lavatrice_w
      name: plug_lavatrice_kWh
      unit_prefix: k
      unit_time: h  
      method: left 

Infine, come abbiamo visto anche nel post dedicato al monitoraggio dei consumi, per implementare i contabilizzatori su base giornaliera e mensile, usamo utility_meter, come segue:

  # Totale consumi KWh
  utility_meter:
    plug_lavatrice_energy_day:
      source: sensor.plug_lavatrice_kWh
      cycle: daily  
    plug_lavatrice_energy_mth:
      source: sensor.plug_lavatrice_kWh
      cycle: monthly     

Automazioni

Tutto quanto definito finora vive di vita propria, con i sensori che seguono, sulla base delle soglie impostate, i vari stati di funzionamento della lavatrice. Non ci resta quindi che implementare dei meccanismi di notifica con cui il package può avvisarci di quanto sta rilevando:

  • cambio stato: una notifica molto verbosa, utile per debug, che indirizziamo verso l’app
  • fine programma: davvero utile, direi la funzione più utile di questo package, ci segnala la fine del programma e ci ricorda di svuotare la lavatrice. Possiamo indirizzarlo verso l’app Companion oppure verso Text-to-speech, usando un disposito integrato, ad esempio Google Mini.
  automation:
    # Notifica su app di cambio stato
    - alias: "Lavatrice__Notifica_cambio_stato"
      trigger:
        platform: state
        entity_id: sensor.lavatrice_fase_programma
      condition: []
      action:
         service: notify.mobile_app_oneplus_a6003
         data_template:
           title: "Lavatrice"
           message: "Cambio stato: da {{ trigger.from_state.state }} a {{ trigger.to_state.state }}"   
    # Notifica su app di fine programma
    - alias: "Lavatrice__Notifica_fine_programma"
      trigger:
        platform: state
        entity_id: sensor.lavatrice_fase_programma
        from: "Lavaggio"
        to: "Stop"
        for: '00:00:05'
      condition: []
      action:
         service: notify.mobile_app_oneplus_a6003
         data_template:
           title: "Lavatrice"
           message: "Programma terminato"
    # Messaggio su gruppo di Google mini di fine programma
    - alias: "Lavatrice__Notifica_fine_programma_tts"
      trigger:
        platform: state
        entity_id: binary_sensor.lavatrice_programma
        from: "on"
        to: "off"
        for: '00:00:05'
      condition: []
      action:
        service: tts.google_say
        entity_id: media_player.diffusione
        data:
          message: 'Programma lavatrice terminato'
          language: 'it'

Dashboard di controllo

Conclusa la parte di backed, passiamo all’implementazione del frontend, che ci servirà per:

  • visualizzare e gestire lo stato della lavatrice
    • accesa/spenta
    • programma e relativa fase
    • alimentazione tramite plug
  • attivare/disattivare le notifiche
  • impostare i parametri di configurazione
  • visualizzare dati di consumo
  • visualizzare dati diagnostici della plug

Per gli stati della lavatrice utilizziamo altrettante button-card che possiamo disporre, ad esempio, in una pila orizzontale. Ciascuna di esse, valutando lo stato del rispettivo binary_sensor assumerà un colore e visualizzerà un testo conseguentemente.

Di seguito le possibili combinazioni:


Ed il codice delle card:

  # Lavatrice Accesa/Spenta
  - type: custom:button-card
    entity: binary_sensor.lavatrice_stato
    icon: mdi:washing-machine
    color_type: icon
    name: "[[[ if (entity.state=='on') return 'Accesa'; else return 'Spenta'; ]]]"
    styles:
      card: [height: 100px]
      icon:
        - color: "[[[ if (entity.state=='off') return 'red'; else return 'lime'; ]]]"
  # Lavatrice Programma/Stop
  - type: custom:button-card
    entity: binary_sensor.lavatrice_programma
    icon: "[[[ if (entity.state=='off') return 'mdi:stop-circle-outline'; else return 'mdi:play-speed'; ]]]"        
    name: "[[[ if (entity.state=='off') return 'Stop'; else return 'Programma'; ]]]" 
    styles:
      card: [height: 100px]        
      icon:
        - color: "[[[ if (states['binary_sensor.lavatrice_stato'].state=='off') return '#666666'; else if (entity.state=='off') return 'gold'; else return 'lime'; ]]]"
  # Lavatrice Lavaggio in corso
  - type: custom:button-card
    entity: binary_sensor.lavatrice_lavaggio
    icon: mdi:water
    name: Lavaggio
    styles:
      card: [height: 100px] 
      icon:
        - color: "[[[ if (entity.state=='on') return 'steelblue'; else return '#666666'; ]]]"
  # Lavatrice Riscaldamento in corso
  - type: custom:button-card
    entity: binary_sensor.lavatrice_riscaldamento
    icon: mdi:fire
    name: Riscaldamento
    styles:
      card: [height: 100px] 
      icon:
        - color: "[[[ if (entity.state=='on') return 'orange'; else return '#666666'; ]]]"
  # Lavatrice Centrifuga in corso
  - type: custom:button-card
    entity: binary_sensor.lavatrice_centrifuga
    icon: mdi:circle-outline 
    name: Centrifuga
    styles:
      card: [height: 100px] 
      icon:
        - color: "[[[ if (entity.state=='on') return 'orange'; else return '#666666'; ]]]"
  # Lavatrice Stato Alimentazione (popup)
  - type: custom:button-card
    entity: switch.plug_lavatrice
    name: Corrente
    tap_action:
      action: more-info
    icon: "[[[ if (entity.state=='off') return 'mdi:power-plug-off'; else return 'mdi:power-plug'; ]]]"          
    styles:
      card: [height: 100px]           
      icon:
        - color: "[[[ if (entity.state=='off') return 'red'; else return 'lime'; ]]]"

Abbiamo poi delle card di tipo entities dove possiamo gestire lo stato delle notifiche, ovvero delle automazioni che le realizzano:

  # Notifiche
  - type: entities
    title: Notifiche
    icon: mdi:information
    show_header_toggle: false
    entities:     
      - entity: "automation.lavatrice_notifica_cambio_stato"
        name: Notifica cambio stato
        icon: mdi:rotate-right
        state_icon: true
      - entity: "automation.lavatrice_notifica_fine_programma"
        name: Notifica fine programma 
        icon: mdi:cellphone-information
        state_icon: true
      - entity: "automation.lavatrice_notifica_fine_programma_tts"
        name: Notifica fine programma Google
        icon: mdi:bullhorn
        icon_state: true      

Ed ancora, i parametri di input, ovvero le soglie di stato:

  # Configurazione
  - type: entities
    title: Configurazione fasi 
    icon: mdi:cogs  
    entities:           
    - entity: input_number.lavatrice_soglia_programma
      name: "Programma attivo oltre:"
      icon: mdi:play-speed
    - entity: input_number.lavatrice_soglia_lavaggio
      name: "Lavaggio in corso fino a:"
      icon: mdi:water
    - entity: input_number.lavatrice_soglia_riscaldamento
      name: "Riscaldamento acqua oltre:"
      icon: mdi:fire
    - entity: input_number.lavatrice_soglia_centrifuga
      name: "Centrifuga attiva oltre:"
      icon: mdi:circle-outline  

Infine le informazioni sulla smart plug:

  - type: glance
    columns: 3
    show_icon: false
    title: Storico consumi
    entities:
    # - entity: sensor.plug_lavatrice_w
      # name: Attuale      
    - entity: sensor.plug_lavatrice_energy_day
      name: Giorno
    - entity: sensor.plug_lavatrice_energy_mth
      name: Mese
    - entity: sensor.plug_lavatrice_kwh
      name: Totale
  - type: glance
    columns: 2
    show_icon: false
    title: Diagnosi Plug
    entities:
      - entity: sensor.diagn_plug_lavatrice_temp
        name: Temperatura Plug
      - entity: sensor.diagn_plug_lavatrice_overtemp
        name: Allarme temp Plug

Risultato finale

Il package è pronto. Il codice completo è disponibilie qui.

Ed ecco come appare la dashboard:


Enjoy!