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!