Ancora domotica: interruttore WiFi Shelly 1PM

Visto che mi sono preso bene con gli esperimenti di domotica nel post precedente ho acchiappato una buona offerta su Amazon e mi sono procurato uno Shelly 1PM.

Lo Shelly 1PM è un interruttore con connettività WiFi, che integra anche un misuratore di consumi elettrici e comunica facilmente con Home Assistant. Ha dimensioni molto contenute ed è quindi predisposto per essere inserito in scatole di derivazioni o altri posti angusti.

Lo Shelly può anche essere collegato a un interruttore o pulsante fisico. Questo è gestito via software e può essere usato per accendere o spegnere il dispositivo collegato, e realizza un controllo locale alternativo al controllo attraverso Home Assistant. A seconda di come si configura, l'interruttore può fornire lo stato (acceso/spento) o semplicemente uno switch (a ogni pressione dell'interruttore esterno cambio lo stato dell'uscita, se era acceso spengo e viceversa).

Ci sono diverse opzioni per metterlo in connessione con Home Assistant, e tra queste la più "grezza" (e quindi più interessante) è attraverso il protocollo MQTT.

Il protocollo MQTT prevede un nodo centrale, detto "broker", e un numero illimitato di dispositivi che comunicano con esso. Ciascun dispositivo connesso può inviare al broker un messaggio, specificando un "topic" (argomento) e un contenuto. Al tempo stesso, qualunque altro dispositivo connesso può mettersi in ascolto sul broker e ricevere messaggi con uno specifico topic, oppure tutti quanti indistintamente. Nel nostro caso, per esempio, Home Assistant può mandare il messaggio "accendi lo switch" al topic corrispondente al nostro Shelly, e quest'ultimo (che è in ascolto su quel topic) riceverà il messaggio e si attiverà. La comunicazione è bidirezionale, quindi lo Shelly a sua volta può mandare a Home Assistant informazioni relative, ad esempio, ai Watt consumati.

Preparazione Shelly

La prima cosa da fare è collegare Shelly all'alimentazione e a qualcosa da alimentare, e magari anche a un interruttore. E, visto che il tutto funziona con alimentazione di rete a 220V, è indispensabile fare le cose per bene senza fili volanti e far fare il lavoro a un elettricista competente. Disclaimer a parte, questa roba è pericolosa quindi la fate a vostro rischio e pericolo, se non avete idea di cosa state facendo non è il momento buono per imparare provando, fatevi aiutare da qualcuno che ne sa.

Ho una mezza idea di provare a usarlo per controllare le luci di Natale sul balcone, quindi ho deciso di creare un involucro con un pulsante (per poter accendere/spegnere le luci manualmente) e due prese in parallelo. Per semplicità ho usato componenti Gewiss System.

Lo schema di connessione è:

L'apparecchio che ho messo assieme per questi esperimenti è questo:

Fantastico come a distanza di decenni gli anni passati all'ITIS rimangano un buon investimento :-). Ps: se a qualcuno interessa, lo Shelly ci sta comodo comodo all'interno di un copriforo Gewiss System.

Installare un broker MQTT

Ci occorre un broker MQTT, naturalmente sotto forma di software da eseguire sul nostro server. Useremo Mosquitto, un broker molto semplice che si presta particolarmente per questa attività, e che può essere eseguito da Docker. Siccome lo useremo in tandem con Home Assistant lo posso inserire nello stesso docker-compose. Gli unici aspetti a cui prestare attenzione sono:

  • Esporre correttamente sulla rete la porta 1883 (usata dai dispositivi per connettersi al broker).
  • Passare all'avvio un file di configurazione custom che deve specificare un paio di parametri necessari al corretto funzionamento. Come sempre con docker, questo significa mappare una directory interna con una directory del server, e in quella directory del server piazzare il file corretto.

Il docker-compose che uso attualmente è:

version: '3'
services:
  homeassistant:
    container_name: homeassistant
    image: "ghcr.io/home-assistant/home-assistant:stable"
    volumes:
      - /apps/homeassistant/config:/config
      - /etc/localtime:/etc/localtime:ro
    restart: unless-stopped
    privileged: true
    network_mode: host

  mqtt:
    container_name: mosquitto
    image: eclipse-mosquitto:latest
    ports:
      - "1883:1883"
      - "9002:9001"
    volumes:
      - /apps/homeassistant/mosquitto/config:/mosquitto/config
      - /apps/homeassistant/mosquitto/log:/mosquitto/log
      - /apps/homeassistant/mosquitto/data/:/mosquitto/data

La cartella su cui abbiamo mappato la cartella di configurazione di Mosquitto è /apps/homeassistant/mosquitto/config, e in questa andiamo a scrivere il file mosquitto.conf:

allow_anonymous true
listener 1883
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log

A questo punto basta riavviare il nostro cluster docker-compose. Se vogliamo accertarci che Mosquitto non abbia avuto errori all'avvio possiamo vedere i log:

cat mosquitto/log/mosquitto.log

Configurazione MQTT su Home Assistant

Per mettere in comunicazione il broker MQTT con Home Assistant lo dobbiamo semplicemente aggiungere come integrazione. Menu "Impostazioni", "Integrazioni", pulsante "Aggiungi Integrazione...", "MQTT".

Verrà chiesto di specificare l'ip del broker e la porta, e le credenziali di accesso (in questo caso non usate).

Per verificare il corretto funzionamento del sistema possiamo provare a inviare/ricevere un messaggio MQTT di test. Dalla lista delle integrazioni premiamo il link "configura" nella tile MQTT. In questa pagina possiamo sia ascoltare che mandare messaggi. Mettiamoci in ascolto su un topic qualunque (tipo "ciao"), e mandiamo un messaggio qualunque su questo stesso topic. Se il messaggio inviato appare nella lista dei ricevuti sappiamo che sta funzionando.

Configurare Shelly

A questo punto possiamo attaccare la spina del nostro aggeggio e provare a comunicare con lo Shelly. Alla prima connessione il dispositivo è configurato come access point Wifi, e dobbiamo collegarci ad esso (ad esempio con il cellulare). La rete si chiamerà qualcosa tipo "shelly1pm-...".

Una volta connessi possiamo aprire dal browser l'interfaccia web all'indirizzo "http://192.168.33.1". Nell'interfaccia dobbiamo modificare i parametri di connessione per fare in modo che lo Shelly si colleghi alla nostra rete WiFi di casa. Possiamo anche dargli un IP statico, per semplificarci la vita quando vorremo accedervi.

Dopo aver salvato le configurazioni, possiamo ricollegare il nostro telefono al WiFi domestico (o usare il computer) e andare all'indirizzo che abbiamo impostato sopra.

Nota: se abbiamo sbagliato qualcosa nella configurazione, lo Shelly non sarà in grado di connettersi alla nostra rete e sarà quindi irraggiungibile. Niente panico, è possibile resettarlo alle impostazioni iniziali e ricominciare la procedura da capo. Per resettarlo, bisogna scollegarlo dall'alimentazione, ricollegarlo e rapidamente spegnerlo/riaccenderlo più volte usando l'interruttore collegato. Alla quinta operazione si sentirà il relè interno fare un doppio click, segno che il reset è andato a buon fine.

Se siamo riusciti ad accedere all'interfaccia web sul nuovo indirizzo possiamo procedere con la configurazione finale.

Nel menu "Settings", sotto la voce "Button Type", possiamo configurare il funzionamento dell'interruttore collegato. Nel mio caso ho un interruttore e voglio usarlo come pulsante (ignorandone la posizione, usandolo solo per rilevare il movimento e switchare il dispositivo collegato) e quindi ho scelto l'opzione "Edge Switch".

Sotto il menu "Advanced Developer Settings" dobbiamo attivare la funzione MQTT, configurando l'indirizzo del nostro server Mosquitto e il prefisso custom (che sarà presente nei topic per comunicare con il dispositivo).

Dopo aver salvato le modifiche passiamo a completare la configurazione di Home Assistant.

Configurazione sensori/switch su Home Assistant

Per prima cosa verifichiamo che messaggi passano attraverso il nostro broker. Apriamo la pagina di configurazione MQTT dentro Home Assistant (come visto sopra), mettiamoci in ascolto sul topic "#" (che significa "qualunque") e proviamo a operare l'interruttore. Dovremmo vedere passare dei messaggi di stato.

Dobbiamo modificare manualmente il file di configurazione di Home Assistant (configuration.yaml) per aggiungere i nostri sensori e il nostro interruttore, aggiungendo questi blocchi:

switch:
  - platform: mqtt
    name: "Shelly01-switch"
    state_topic: "shellies/shelly01/relay/0"
    command_topic: "shellies/shelly01/relay/0/command"
    qos: 0
    payload_on: "on"
    payload_off: "off"
    optimistic: false
    retain: false

sensor:
  - platform: mqtt
    name: "Shelly01 Potenza"
    state_topic: "shellies/shelly01/relay/0/power"
    qos: 0
    unit_of_measurement: "W"
  - platform: mqtt
    name: "Shelly01 Energia"
    state_topic: "shellies/shelly01/relay/0/energy"
    qos: 0
    unit_of_measurement: "W"
  - platform: mqtt
    name: "Shelly01 Temperatura"
    state_topic: "shellies/shelly01/temperature"
    qos: 0
    unit_of_measurement: "°C"
  - platform: mqtt
    name: "Shelly01 Sovratemperatura"
    state_topic: "shellies/shelly01/overtemperature"
    qos: 0

In ciascuna sezione c'è un "name" (descrittivo, libero) e uno "state topic" (al cui interno deve essere riportato il nome impostato nello Shelly, fare riferimento ai topic visti passare su MQTT quando fatto la prova prima prima).

A questo punto basta riavviare Home Assistant e dovrebbe essere tutto pronto per l'integrazione. Possiamo creare una semplice dashboard ed esporre interruttore e sensori:

A questo punto abbiamo finito. Possiamo operare lo Shelly sia attraverso l'interruttore hardware che attraverso la dashboard, e in ciascun caso lo stato nella dashboard è aggiornato correttamente.

Adesso devo procurarmi delle luci decenti per il terrazzo e scoprire come impostare l'accensione temporizzata. Sarà argomento di un post futuro.

Grazie per l'ascolto e alla prossima!