Integrare Shelly EM a Home Assistant via MQTT

11 minuti di lettura
Scopi della guida:
  • Integrare l’attuatore Shelly EM all’HUB di domotica personale Home Assistant (come duplice sensore di assorbimento/consumo e interruttore per teleruttore)
  • Livello di difficoltà: bassa
  • Categoria d’integrazione: Local Push
Concetti affrontati:
  • Configurazione software
Componenti software utilizzate:
Prerequisiti:
  • Home Assistant configurato e funzionante
  • Componente/i Shelly da integrare già configurato/i in Wi-Fi
Dispositivi fisici utilizzati:
GUIDA maggiormente indicatA per:

Tutti gli ambienti

Note e disclaimer
  • qualsiasi eventuale modifica agli impianti domestici dev'essere progettata ed realizzata SOLO da personale qualificato;
  • qualsiasi modifica attuata in proprio è a propria responsabilità personale nonché a proprio rischio e pericolo (i contenuti della presenta pagina hanno puro scopo didattico);
  • qualsiasi modifica attuata in proprio a un dispositivo ne fa decadere garanzia, omologazioni e certificazioni di qualità.
Revisione guida: 1.3

Shelly EM - Home Assistant

Abstract

Uno dei grandi vantaggi della linea Shelly (rispetto per esempio alla diretta rivale, la ITEAD Sonoff, o altre analoghe) è quella di installare sui propri componenti di firmware in grado di offrire supporto allo standard MQTT.

MQTT (Message Queue Telemetry Transport) è uno standard particolarmente apprezzato in domotica personale per prestazioni e semplicità; la sua adozione consente di integrare con estrema facilità (e nel modo preferibile, il Local Push) qualunque componente che lo utilizzi con i più svariati ambienti operativi quali, in domotica, gli HUB personali.

Home Assistant è uno degli HUB personali con i quali è più semplice far dialogare i componenti Shelly sfruttando il protocollo MQTT: in questa guida vedremo come predisporre le funzionalità dello Shelly EM e come configurare Home Assistant affinché lo integri in tutte le sue possibili funzioni.

N.b. Sebbene esistano componenti aggiuntivi per integrare “facilmente” i componenti della linea Shelly, la metodologia MQTT qui descritta rimane quella più comprovatamente sicura, efficiente e dai risultati più certi nel tempo – nonché quella che consigliamo caldamente di adottare. In alternativa, è possibile utilizzare il componente ShellyForHASS (vedi guida).

Assunti

Per l’implementazione della presente guida è necessario che sulla propria rete sia presente un broker MQTT; in primis però è importante capire come MQTT funzioni: per far questo, è importante la lettura di questa scheda scritta appositamente per capire il ruolo del broker MQTT all’interno della propria rete – a prescindere dai componenti che supportino MQTT presenti nel proprio ambiente.

Per dotarsi di  un broker e per attivare le funzioni client MQTT su Home Assistant si rimanda a questa guida.

Si assume inoltre che lo/gli Shelly in questione siano già stati installati e poi configurati presso l’app Shelly Cloud (per Android e iOS) e quindi siano già parte della propria rete domestica.

Si parte

Modalità LAN e MQTT

La prima cosa da fare è connettere il nostro Shelly al broker MQTT presente sulla nostra rete (must-have indicato negli assunti). Per farlo è necessario attivare la modalità LAN disponibile sul firmware dell’unità, fornire le coordinate del broker (e gli eventuali username e password di autenticazione).

Per effettuare la configurazione è necessario utilizzare un qualsiasi browser tramite il quale collegarsi all’interfaccia web offerta dall’attuatore. Non è possibile effettuare questa configurazione tramite app mobile, e il perché è semplice: alcune impostazioni (tipo questa) sull’app semplicemente non figurano.

Avremo dunque bisogno dell’indirizzo IP a cui collegarci: lo si potrà trovare facilmente tramite l’interfaccia web del proprio modem/router oppure con un qualsiasi tool di scansione reti (eg. Fing). Se l’IP assegnato sarà (per esempio) il 192.168.1.100, l’interfaccia web alla quale collegarsi sarà disponibile all’indirizzo http://192.168.1.100.

Una volta connessi apparirà un’interfaccia estremamente elementare. Tappare sulla voce “Internet & Security“:

Shelly Cloud - Intenet e security

Entrare poi nella sezione “Advanced – Developer Settings“.
La schermata che segue consente di inserire username, password e indirizzo (e porta) del proprio broker MQTT:

Shelly - Configurazione MQTT

Per quanto riguarda l’indirizzo e porta del server, esso deve essere espresso in termini di IP:PORTA (eg. 192.168.1.1:1883). La porta standard del broker MQTT è 1883 (a meno che non l’abbiate modificata).

Il resto va impostato come da configurazione (raccomandiamo la retain non abilitata e la QoS a 0 oppure a 1 (addirittura 2, in caso di specifiche necessità).

Cliccare poi su “Use Custom MQTT Prefix” per definire il “nome” MQTT dell’attuatore:

Shelly - MQTT - Custom MQTT Prefix

La scelta del nome è personale; si tratta di un passaggio cardine rispetto alla configurazione che effettueremo, successivamente, su Home Assistant.

Una volta completata la configurazione, cliccare su “SAVE“.

N.b. Attivare MQTT – quindi la cosiddetta modalità “LAN” di fatto disconnette il componente dal cloud Shelly, il che non consentirà più di controllare l’unità via app (da remoto, perché localmente continuerà a funzionare). Tale comportamento è più normale: il controllo remoto sarà garantito attraverso Home Assistant e non più dall’app Shelly Cloud.

Modalità d’uso dello Shelly

Prima di passare a Home Assistant, alcune considerazioni lato Shelly sono doverose.

Shelly EM viene tipicamente utilizzato per misurare l’assorbimento di un impianto elettrico domestico (e altre misure): posizionandolo quindi a monte di quest’ultimo (solitamente sul quadro) misura l’assorbimento complessivo (tramite una pinza amperometrica sul canale 1) oppure i singoli consumi di due zone (due pinze amperometriche). Va da sé che l’integrazione possa prevedere la realizzazione di:

  • uno o due sensori di assorbimento istantaneo (espressi in Watt);
  • uno o due sensori di voltampere reattivo (espressi in VAR, laddove necessario per usi specifici);
  • contabilizzatori di consumo giornaliero (espresso in kWh);
  • contabilizzatori di consumo mensile (espresso in kWh);
  • contabilizzatori di consumo annuale (espresso in kWh);
  • un sensore di voltaggio istantaneo (espresso in Volt, misurato all’ingresso dell’unità);
  • un sensore di corrente istantanea (espresso in Ampere, calcolato).

Dato che l’unità è dotata anche di un relè per l’innesco di un eventuale teleruttore (vedi scheda) è eventualmente anche necessario dotarsi di un interruttore per attivare/disattivare tale funzione.

Nei paragrafi che seguono scopriremo come integrare via MQTT tutti questi diversi elementi.

N.b. Se lo Shelly EM viene utilizzato, anziché a monte dell’impianto, a monte di un elettrodomestico, esso può essere utilizzato come strumento per dedurre lo stato operativo di un elettrodomestico.

Home Assistant

Vediamo ora come provvedere all’integrazione del sensore/attuatore nelle varie modalità e scenari descritti.

Sensori

In questa sezione ci concentreremo sulla sensoristica; si noti come in ogni configurazione il NOME_SHELLY presente nel codice di configurazione proposto vada personalizzato come spiegato sopra.

ASSORBIMENTO ISTANTANEO (WATT)

I primi sensori che andremo a definire saranno quelli che forniscono alla domotica la lettura istantanea dell’assorbimento espresso in Watt, il quali serviranno poi anche come fonti alimentanti per creare i contatori (giornaliero, mensile e annuali) e altri sensori.

La modifica al file di configurazione di Home Assistant è la seguente:

sensor:
  - platform: mqtt
    name: "Shelly EM Assorbimento ch1"
    state_topic: "shellies/NOME_SHELLY/emeter/0/power"
    value_template: "{{ value }}"
    unit_of_measurement : "Watt"
    icon: mdi:speedometer
  - platform: mqtt
    name: "Shelly EM Assorbimento ch2"
    state_topic: "shellies/NOME_SHELLY/emeter/1/power"
    value_template: "{{ value }}"
    unit_of_measurement : "Watt"
    icon: mdi:speedometer

Le due entità generate da questa configurazione si chiameranno:

  • sensor.shelly_em_assorbimento_ch1
  • sensor.shelly_em_assorbimento_ch2

le quali forniscono le misure sui due canali nel caso della presenza di due pinze amperometriche sui due canali disponibili.
Ovviamente se si utilizza un solo canale (una sola pinza amperometrica per misurare tutto l’impianto) sarà sufficiente aggiungere solo il blocco corrispondente (di solito ch1).

SOMMATORIA

In caso si utilizzino contemporaneamente due canali (per misurare diverse zone dell’abitazione, o altri scenari) torna utile un sensore di assorbimento istantaneo complessivo.

Per farlo si utilizza la piattaforma “Template Sensor“:

sensor:
  - platform: template
    sensors:
      shelly_em_assorbimento:
        friendly_name: "Shelly EM Assorbimento"
        value_template: '{{ (states("sensor.shelly_em_assorbimento_ch1")|float + states("sensor.shelly_em_assorbimento_ch2")|float)|float|round(1) }}'
        unit_of_measurement : "Watt"
        icon: mdi:speedometer

Il sensore così configurato provvede a sommare i due assorbimenti istantanei, fornendo così l’assorbimento istantaneo complessivo. L’entità derivante si chiamerà sensor.shelly_em_assorbimento.

N.b. In caso si utilizzi un canale per misurare l’assorbimento dell’impianto (ch1) e uno per misurare, per esempio, la produzione di un impianto fotovoltaico (ch2), il sensore sommatoria può essere utile per definire il bilancio algebrico dei due valori.

Tutti questi sensori esprimono l’assorbimento istantaneo rilevati dallo Shelly EM: dopo l’implementazione di tale sensore si consideri, ovviamente, la possibilità di implementare delle notifiche legate al superamento di specifiche soglie o altri automatismi.

N.b. Quando si parla di sensori di questo tipo si consiglia sempre di valutare l’adozione di misure atte a ridurre il numero di dati scritti sul database.
VOLTAMPERE REATTIVO (VAR)

Se per qualche motivo è necessario un sensore che rilevi la misura del voltampere reattivo, la configurazione è la seguente:

sensor:
  – platform: mqtt
    name: "Shelly EM Voltampere reattivo ch1"
    state_topic: "shellies/NOME_SHELLY/emeter/0/reactive_power"
    unit_of_measurement: "VAR"
    icon: mdi:speedometer
  – platform: mqtt
    name: "Shelly EM Voltampere reattivo ch2"
    state_topic: "shellies/NOME_SHELLY/emeter/1/reactive_power"
    unit_of_measurement: "VAR"
    icon: mdi:speedometer

Ovviamente anche in questo caso andranno implementati tanti blocchi quante sono le pinze amperometriche utilizzate.
Le entità generate si chiameranno:

  • sensor.shelly_em_voltampere_reattivo_ch1
  • sensor.shelly_em_voltampere_reattivo_ch2

Ovviamente se si utilizza un solo canale (una sola pinza amperometrica per misurare tutto l’impianto) sarà sufficiente aggiungere solo il blocco corrispondente (solitamente ch1).

VOLTAGGIO (VOLT)

In questo caso sia che si utilizzino una o due pinze amperometriche, il sensore di voltaggio è unico, dato che il valore viene misurato singolarmente in ingresso all’unità:

sensor:
  – platform: mqtt
    name: “Shelly EM Tensione“
    state_topic: “shellies/NOME_SHELLY/emeter/0/voltage”
    unit_of_measurement: “Volt”
    icon: mdi:flash-circle

L’entità derivante si chiamerà sensor.shelly_em_tensione.

N.b. L’unità effettivamente eroga due topic telemetrici MQTT differenziati, relativi ai due canali, i quali riportano entrambi anche la lettura del voltaggio. Tali valori non coincidono mai: perché questo, dato che la misurazione del voltaggio è unica e viene effettuata in ingresso all’unità? Semplice: le misure dei due canali vengono prodotte in istanti diversi e quando viene collezionato il dato del voltaggio – dato molto variabile – viene pubblicato risultando, sui due canali, diverso. Questo porta a pensare che ci sia bisogno di un duplice sensore di tensione, ma è un errore: ne basta uno solo sempre e comunque.
N.b. Quando si parla di sensori di questo tipo si consiglia sempre di valutare l’adozione di misure atte a ridurre il numero di dati scritti sul database.
CORRENTE (Ampere)

Dato che il valore di corrente (in Ampere) non è fornito dall’unità e dato che è calcolabile dal rapporto assorbimento / voltaggio, definiamo due “Template Sensor” che effettuino il calcolo arrotondando il risultato alla prima cifra decimale:

sensor:
  - platform: template
    sensors:
      shelly_em_corrente_ch1:
        friendly_name: "Shelly EM Corrente ch1"
        value_template: '{{ (states("sensor.shelly_em_assorbimento_ch1")|float / states("sensor.shelly_em_tensione")|float)|float|round(1) }}'
        unit_of_measurement: "Ampere"
        icon_template: mdi:current-ac
      shelly_em_corrente_ch2:
        friendly_name: "Shelly EM Corrente ch2"
        value_template: '{{ (states("sensor.shelly_em_assorbimento_ch2")|float / states("sensor.shelly_em_tensione")|float)|float|round(1) }}'
        unit_of_measurement: "Ampere"
        icon_template: mdi:current-ac

Le entità derivanti, sensor.shelly_em_corrente_ch1 e sensor.shelly_em_corrente_ch2, descriveranno in Ampere la corrente in transito sui due canali.

In caso si utilizzi un sensore dato dalla sommatoria dei due canali, ovviamente basterà anche un solo sensore template il quale utilizzi, come parametro dividendo (nell’esempio sensor.shelly_em_assorbimento_ch1 e sensor.shelly_em_assorbimento_ch2), l’eventuale entità sommatoria (eg. sensor.shelly_em_assorbimento).

N.b. Quando si parla di sensori di questo tipo si consiglia sempre di valutare l’adozione di misure atte a ridurre il numero di dati scritti sul database.
CONSUMO

È il momento di definire due generici contatori di consumo i quali esprimano l’assorbimento in kWh dei due canali, i quali vengano utilizzati poi per i contabilizzatori veri e propri che vedremo a seguire. Si tratta fondamentalmente di sensori “di servizio”:

sensor:
  - platform: mqtt
    name: "Shelly EM Consumo ch1"
    state_topic: "shellies/NOME_SHELLY/emeter/0/energy"
    unit_of_measurement: 'kWh'
    value_template: "{{ (value|float / 60000) | round (3) }}"
  - platform: mqtt
    name: "Shelly EM Consumo ch2"
    state_topic: "shellies/NOME_SHELLY/emeter/1/energy"
    unit_of_measurement: 'kWh'
    value_template: "{{ (value|float / 60000) | round (3) }}"

I sensori, chiamati sensor.shelly_em_consumo_ch1 e sensor.shelly_em_consumo_ch2, riporteranno il cumulativo in kWh dei due canali. Si azzereranno ad ogni riavvio dello Shelly, ma questo non è un problema: al conteggio incrementale (giornaliero, mensile o di altri periodi) provvederanno le entità di tipo “Utility Meter” che vedremo a seguire.

Ovviamente se si utilizza un solo canale (una sola pinza amperometrica per misurare tutto l’impianto) sarà sufficiente aggiungere solo il blocco corrispondente (solitamente ch1).

SOMMATORIA

Come nel caso spiegato sopra relativo all’assorbimento istantaneo, anche per i consumi è possibile definire un’entità cumulativa complessiva.

Per farlo anche in questo caso si utilizza la piattaforma “Template Sensor“:

sensor:
  - platform: template
    sensors:
      shelly_em_consumo:
        friendly_name: "Shelly EM Consumo"
        value_template: '{{ (states("sensor.shelly_em_consumo_ch1")|float + states("sensor.shelly_em_consumo_ch2")|float)|float|round(1) }}'
        unit_of_measurement : "Watt"
        icon_template: mdi:speedometer

L’unità derivante si chiamerà sensor.shelly_em_consumo.

N.b. Quando si parla di sensori di questo tipo si consiglia sempre di valutare l’adozione di misure atte a ridurre il numero di dati scritti sul database.
CONTABILIZZATORI

In caso si utilizzino contemporaneamente due canali (per misurare diverse zone dell’abitazione, o altri scenari) o che se ne usi uno solo, siamo pronti a definire dei contabilizzatori di consumo.

CONSUMO GIORNALIERO

In questo caso sfrutteremo la piattaforma “Utility Meter“, utilizzata per definire dei contabilizzatori.

utility_meter:
  shelly_em_consumo_giornaliero:
    source: sensor.shelly_em_consumo
    cycle: daily

Il sensore utility.meter.shelly_em_consumo_giornaliero riporterà il cumulativo giornaliero espresso in kWh, azzerandosi automaticamente alla mezzanotte (e riportando, nei propri attributi, il consumo giornaliero precedente).

Nell’esempio abbiamo utilizzato, come fonte alimentante per il contabilizzatore utilizziamo l’entità sommatoria sensor.shelly_em_consumo, ma avremmo anche potuto utilizzare sensor.shelly_em_consumo_ch1 e/o sensor.shelly_em_consumo_ch2 per definire dei contabilizzatori specifici per canale.

Daremo questa affermazione per scontata anche per i contabilizzatori che seguono.

CONSUMO MENSILE

In questo caso sfrutteremo nuovamente la piattaforma “Utility Meter”, ma stavolta per definire un contatore mensile:

utility_meter:
  shelly_1pm_consumo_mensile:
    source: sensor.shelly_em_consumo
    cycle: monthly

Il sensore utility.meter.shelly_em_consumo_mensile riporterà il cumulativo mensile espresso in kWh, azzerandosi automaticamente il primo giorno di ogni mese (e riportando, nei propri attributi, il consumo mensile del mese precedente).

CONSUMO ANNUALE

In questo caso sfrutteremo nuovamente la piattaforma “Utility Meter”, ma stavolta per definire un contatore mensile:

utility_meter:
  shelly_1pm_consumo_annuale:
    source: sensor.shelly_em_consumo
    cycle: yearly

Il sensore utility.meter.shelly_em_consumo_annuale riporterà il cumulativo mensile espresso in kWh, azzerandosi automaticamente il primo giorno dell’anno (e riportando, nei propri attributi, il consumo annuale dell’anno precedente).

Interruttore

Ipotizziamo di aver collegato allo Shelly EM un teleruttore per l’interruzione della corrente (vedi scheda). Definiremo quindi uno “Switch: allo scopo utilizzeremo la piattaforma “MQTT Switch“.

L’implementazione è semplice:

switch:
  - platform: mqtt
    name: "Shelly EM Teleruttore"
    state_topic: "shellies/NOME_SHELLY/relay/0"
    command_topic: "shellies/NOME_SHELLY/relay/0/command"
    availability_topic: "shellies/NOME_SHELLY/online"
    qos: 1
    value_template: "{% if value == 'on' %} on {% else %} off {% endif %}" 
    payload_on: "on"
    payload_off: "off"
    payload_available: "true"
    payload_not_available: "false"
    optimistic: false
    retain: false

Il valore NOME_SHELLY è ovviamente da personalizzare: tale nome viene impostato nella fase di configurazione MQTT già effettuata precedentemente. Ovviamente il tutto è personalizzabile, inclusi (in primis) i nomi dei due interruttori (campo “name“), o per esempio l’icona (campo “icon“) usando il solito materialicondesign.com per la scelta dell’icona appropriata.

QoS, come spesso capita, è impostato a 1 per una maggiore certezza dell’esecuzione dei comandi.

Dopo aver variato la configurazione di Home Assistant, riavviarlo. Verranno create un’entità (nel caso dell’esempio, switch.shelly_em_teleruttore). a rappresentazione presso l’interfaccia Lovelace UI è la seguente:

Automazione per il censimento iniziale dello stato

All’avvio, Home Assistant non conosce lo stato dello/degli Shelly; per far in modo che tali stati vengano raccolti immediatamente, aggiungere la seguente automazione all’elenco di quelle esistenti:

- alias: MQTT Announce
  trigger:
  - event: start
    platform: homeassistant
  condition: []
  action:
  - service: mqtt.publish
    data:
      payload: announce
      topic: shellies/command
    

Pubblicando il topic “shellies/command“, tutti gli Shelly presenti sulla rete connessi al broker MQTT risponderanno fornendo il proprio stato.

Comandi speciali

La presenza dello standard MQTT consente agli Shelly di essere configurati e interrogati tramite comandi diretti MQTT (nonché API REST via HTTP). A tale aspetto abbiamo dedicato la scheda che segue:

Shelly, MQTT e HTTP: comandi utili



Home Assistant Official Logo ATTENZIONE: ricorda che sul nostro community FORUM c'è una sezione ad hoc dedica a Home Assistant, per qualsiasi dubbio, domanda, informazione nel merito specifico di queste componenti.


Telegram News Channel