Ciao a tutti,
il progetto che vi presento è nato da un frigorifero difettoso: mi è successo in due occasioni di accorgermi che il frigo non funzionava solo quando ormai aveva raggiunto la temperatura ambiente, ovvero quando ormai è tutto da buttare...
Ho inserito all'interno del frigo un comune termoigrometro da esterno che avevo, che trasmette sui 433 MHz i valori di temperatura e umidità verso una unità con display. Questa soluzione mi permetteva di controllare la temperatura, ma non di essere avvisato in caso di guasto, da qui l'idea di integrarlo con Home Assistant.
Come vedremo questa soluzione consente di rendere smart diversi dispositivi radio, che magari abbiamo già in casa.
Oltre che da sensori di temperatura ed umidità, è infatti possibile ricevere dati da sensori vento, sensori pioggia, stazioni meteo, sensori consumo elettrico, dispositivi X10 e telecomandi auto.
Io ho integrato, oltre ai 3 sensori di temperatura che avevo a disposizione, anche un Efergy E2 Classic (è il modello senza wifi, che trasmette la lettura ad un display).
[attachment=87]
Una volta configurati i sensori in Home Assistant è possibile creare delle automazioni per gestire gli allarmi in caso di superamento della soglia, o per staccare le prese smart in caso di elevato consumo elettrico.
Nel mio caso l'automazione invia una notifica telegram ed un messaggio vocale da Alexa quando la temperatura del frigo supera i 7 gradi e quando la potenza elettrica assorbita supera i 3.1kW per più di 45 secondi.
Vediamo come!
Hardware
Per ricevere e decodificare i sensori radio è necessario un decoder usb per il digitale terrestre, facilmente reperibile online con una spesa intorno ai 10€ (basta cercare RTL-SDR RTL2832U).
[attachment=84]
Software
Per prima cosa serve un broker MQTT (io ho usato l'addon Mosquitto Broker) e HA con l'integrazione MQTT configurata.
Esiste poi l'addon rtl4332mqtt che utilizza il tool rtl_433, il quale permette di ricevere i segnali di tantissimi dispositivi radio (al momento sono gestiti 125 protocolli) e di inviare i dati decodificati ad un broker MQTT.
L'addon si installa aggiungendo il repository https://github.com/james-fry/hassio-addons, e seguendo le indicazioni presenti nella documentazione.
La particolarità di questa addon è che utilizza uno script salvato nella cartella config di HA per lanciare il tool rtl_433, in questo modo si ha l'enorme vantaggio di poter facilmente modificare lo script per adattarlo alle proprie esigenze.
Ad esempio io ho la necessità di ascoltare due protocolli su due frequenze diverse (la radio può ricevere solo una frequenza alla volta):
Di conseguenza ho modificato la riga 185 dello script che lancia rtl_433 come segue:
[font=Courier New]
/usr/local/bin/rtl_433 -F json -R 42 -R 36 -f 433920000 -f 433550000 -H60 | while read line[/font]
con -R ho indicato i due protocolli, con -f le due frequenze e con -H 60 ho impostato il cambio di frequenza di ricezione ogni minuto.
La configurazione dell'addon quindi dipende molto dai dispositivi che volete ricevere, il metodo più semplice è avviare l'addon con l'opzione -G che abilita tutti i protocolli e collegarsi al broker sottoscrivendosi al topic radice tramite un qualsiasi client mqtt. In questo modo è possibile vedere tutti i messaggi che passano e definire opportunamente la configurazione dell'addon e dei sensori nel file config.yaml.
config.yaml
Configurazione sensore potenza elettrica istantanea
L'addon manda al broker MQTT i dati decodificati in formato json, facilmente leggibile da HA. Di seguito un esempio:
[font=Courier New]topic: homeassistant/sensor/rtl433/[font=Courier New]Efergy_e2_CT/[font=Courier New]46955[/font][/font][/font]
[font=Courier New]{"time" : "2019-05-09 08:14:46", "model" : "Efergy e2 CT", "id" : 46955, "current" : 1.220, "interval" : 6, "battery" : "OK", "learn" : "NO"}[/font]
L'addon costruisce il topic utilizzando la radice salvata nella configurazione dell'addon (homeassistant/sensor/rtl433) più i campi "model" e "id", inoltre il sensore invia il valore della corrente in Ampere, quindi per calcolare la potenza istantanea è necessario moltiplicare per il valore della tensione (230).
Ecco di seguito la configurazione del sensore in Home Assistant:
[font=Courier New]sensor:
- platform: mqtt
name: "Consumo istantaneo"
icon: mdi:power-socket-eu
state_topic: "homeassistant/sensor/rtl433/Efergy_e2_CT/46955"
unit_of_measurement: "W"
value_template: "{{ (value_json.current | float * 230) | round(0)}}"[/font]
Configurazione sensore temperatura ed umidità
Si procede analogamente per i sensori di temperatura ed umidità:
[font=Courier New][font=Courier New]topic: home[/font][font=Courier New]assistant/sensor/rtl433/HIDEKI_TS04_sensor/null[/font][/font]
[font=Courier New]{"time" : "2019-05-09 08:15:31", "model" : "HIDEKI TS04 sensor", "rc" : 11, "channel" : 3, "battery" : "OK", "temperature_C" : 21.500, "humidity" : 48}
{"time" : "2019-05-12 00:34:33", "model" : "HIDEKI TS04 sensor", "rc" : 10, "channel" : 2, "battery" : "OK", "temperature_C" : 4.200, "humidity" : 92}[/font]
[font=Courier New]{"time" : "2019-05-12 00:36:27", "model" : "HIDEKI TS04 sensor", "rc" : 12, "channel" : 1, "battery" : "OK", "temperature_C" : 21.400, "humidity" : 64}[/font]
in questo caso l'addon invia al broker i valori dei 3 sensori sullo stesso topic [font=Courier New]homeassistant/sensor/rtl433/HIDEKI_TS04_sensor/null[/font], in quanto i sensori non trasmettono l'attributo 'id'.
Per distinguere il sensore a cui appartiene il messaggio ci sono due soluzioni: modificare lo script in modo da utilizzare un altro campo per costruire il topic, oppure filtrare su HA il messaggio ricevuto utilizzando un parametro univoco sui 4 sensori, così da assegnare la lettura al sensore HA corretto.
Io ho scelto quest'ultima strada, filtrando per il parametro 'rc':
[font=Courier New]#
Sensore RC10 - Frigo
#
- platform: mqtt
name: "T Frigo"
state_topic: "homeassistant/sensor/rtl433/HIDEKI_TS04_sensor/null"
unit_of_measurement: '°C'
value_template: "{% if value_json.rc == 10 %} {{ value_json.temperature_C }} {% else %} {{ states('sensor.t_frigo') }} {% endif %}"
- platform: mqtt
name: "H Frigo"
icon: mdi:water-percent
state_topic: "homeassistant/sensor/rtl433/HIDEKI_TS04_sensor/null"
unit_of_measurement: '%'
value_template: "{% if value_json.rc == 10 %} {{ value_json.humidity }} {% else %} {{ states('sensor.h_frigo') }} {% endif %}"
[/font]
automations.yaml
A questo punto è possibile configurare le automazioni secondo le proprie esigenze, di seguito riporto la mia configurazione:
Notifica temperatura frigorifero elevata
[font=Courier New]
- id: '1550357002874'
alias: Allarme Frigo
trigger:
- above: '7'
entity_id: sensor.t_frigo
platform: numeric_state
condition: []
action:
- data:
message: Temperatura frigo {{ states.sensor.t_frigo.state }}°C registrata
alle {{now().strftime('%H:%M del %d-%m-%Y')}}
title: 'ALLARME FRIGO'
service: notify.telegram
- alias: ''
data:
data:
type: tts
message: Attenzione! La temperatura del frigorifero si sta alzando
target:
- Echo Sala
service: notify.alexa_media[/font]
Notifica superamento 3kW
[font=Courier New]
- id: '1557606777678'
alias: Allarme 3kW
trigger:
- above: '3100'
entity_id: sensor.consumo_istantaneo
for: 00:00:45
platform: numeric_state
condition: []
action:
- data:
message: Potenza istantanea superiore a 3kW. Pericolo di stacco contatore
title: 'ALLARME Potenza elettrica'
service: notify.telegram
- data:
data:
type: tts
message: Attenzione! Elevato consumo di corrente, pericolo di stacco contatore
target:
- Echo Sala
service: notify.alexa_media[/font]
Lovelace
Per finire vi riporto di seguito qualche screenshot delle card che ho configurato: ho utilizzato le card sensor all'interno di un horizontal-stack per i valori istantanei e le history-graph per lo storico.
[attachment=92]