Indice |
Introduzione
Ci sono migliaia e migliaia di prodotti "smart" sul mercato, dalle prese wifi che misurano il consumo elettrico del carico a gadget decisamente più dubbi. I problemi di questi prodotti sono gli stessi:
- Interoperabilità: se compro dispositivi di una certa marca riesco poi ad utilizzarla con un'altra? O devo usare 30 app diverse?
- Longevità e sicurezza: cosa succede alla mia casa domotica se domani la tale azienda fallisce o decide che mantenere il software e l'infrastruttura cloud costa troppo?
- Privacy: cosa succede ai miei dati? Chi li guarda? Cosa ci fanno?
Sono tutte domande lecite oggi che la domotica è sempre più parte della nostra quotidianità. È diventato un argomento talmente importante che nel 2024 il software open source con il più grande numero di collaboratori è diventato Home Assistant (fonte: Octoverse 2024). Questo software è facilmente installabile su piccoli computer (tra cui il famosissimo Raspberry Pi) e facilmente configurabile per integrare e gestire in modo semplice e dettagliato i vari dispositivi e le loro automazioni.
Al tempo stesso, si è sviluppata una larga comunità di entusiasti intorno al MCU ESP32 di Espressif, che è di fatto diventato lo standard per le automazioni DIY open source perché costa poco, integra wi-fi e Bluetooth, ed è dual-core. Il progetto si chiama ESPHome e il suo grande punto di forza è che non richiede alcuna conoscenza di programmazione per poter essere utilizzato. Infatti, il programma viene generato sul momento utilizzando un file YAML che possiamo modificare con i "componenti" che ci interessano. I componenti sono davvero tanti, possiamo utilizzare i sensori e attuatori più comuni con con Home Assistant aggiungendo poche righe al file.
Oltre ai vari esempi già elencati sul sito, ecco alcune cose che sono riuscito a fare con questo MCU e il software stack di ESPHome:
- modificato un sensore di qualità dell'aria IKEA per ottenere i dati registrati delle PM2.5 e attivare automazioni di casa a seconda dei valori;
- modificata una pompa di calore Clivet per ricevere la telemetria di un vasto numero di sensori interni e per controllarne le varie funzioni (tramite ModBus);
- aggiunto dei sensori magnetici per accendere/spegnere la luce dello sgabuzzino quando la porta è aperta/chiusa;
- aggiunto un piccolo display per monitorare certi eventi (tipo ricordarmi che la lavatrice ha finito e che qualcuno dovrà stendere).
Di cosa parleremo
In questo breve articolo vedremo come creare una semplice automazione per accendere e spegnere un "TV simulator" in certe fasce orarie con una scheda di sviluppo ESP32 e Home Assistant. Il TV simulator in oggetto non è altro che una scheda di LED che si illuminano in sequenza casuale, dando l'impressione da fuori che qualcuno stia guardando la TV. Il costo per realizzare questo progetto è di alcuni euro:
- ESP32 DevKit 1, ~4 euro su AliExpress (i prezzi variano a seconda dei periodi, ma sono intorno a questa cifra);
- TV simulator con cavo USB, ~8 euro su AliExpress;
- MOSFET tipo N BS170 che avevo già in casa, recuperato da non so dove;
Utilizzeremo Python per configurare ESPHome e Docker per avviare Home Assistant. Se non conoscete Docker potete usare il metodo che vi piace di più seguendo la guida ufficiale. Per molti il sistema più semplice è utilizzare una macchina virtuale. I comandi riportati in questa guida funzionano per Linux e Mac. Per Windows, potete seguire la guida ufficiale di ESPHome.
Hardware
L'idea che ho avuto per controllare il TV simulator è molto semplice: usare un MOSFET per tagliare l'alimentazione a 5 V della scheda elettronica, e controllare il MOSFET tramite un pin del ESP32. Il BS170 può essere attivato con una tensione di 2.1 V (Typ.), che significa che possiamo usare i 3.3 V erogati dal ESP32 per comandarlo senza problemi. Per prima cosa quindi, dobbiamo smontare il dispositivo per vedere com'è fatto dentro e dove possiamo inserirci. Inoltre dovremo misurare la corrente in ingresso del circuito per assicurarci di utilizzare un MOSFET adatto.
La prima buona notizia è che c'è un sacco di spazio tra retro del circuito stampato e la calotta, la seconda è che il retro del circuito non ha componenti ed è perfetto per incollarci l'ESP32.
La terza buona notizia è che il circuito di alimentazione è molto semplice: il diodo D2 è collegato al positivo del connettore elettrico e quindi possiamo toglierlo (e aggiungerlo esternamente) per avere due punti in cui interrompere il circuito col nostro MOSFET.
Il lettore attento avrà però probabilmente realizzato che un MOSFET di tipo N non è adatto ad interrompere corrente sul polo positivo, ci vorrebbe un tipo P. E infatti la mia soluzione originale di interrompere il polo positivo non è fattibile, ma visto che ci ho pensato solo dopo aver dissaldato il diodo, ho deciso di cogliere l'occasione per misurare il flusso di corrente. Ho quindi saldato due connettori volanti e usato il multimetro per fare la misura.
Otteniamo una corrente di picco di 311 mA ed una corrente media di 186 mA, ben alla portata del nostro BS170 che ha un limite di 500 mA costanti.
A questo punto ri-saldiamo il diodo che abbiamo accidentalmente tolto, smarrito, ritrovato e smarrito di nuovo, con uno simile. Il 1N4001 va più che bene, avendo la stessa caduta di tensione del diodo originale di 0.6 V e un limite di 1 A di corrente.
Avendo ripristinato il funzionamento dell'apparecchio, possiamo pensare a come interrompere il negativo del circuito. Sfortunatamente il polo negativo si estende per tutta la scheda elettronica e non c'è un unico componente che possiamo rimuovere come abbiamo fatto col diodo in precedenza.
La soluzione più semplice che ho trovato è stato tagliare il cavo di alimentazione e inserirci il MOSFET in mezzo.
Quindi, con un paio di fori nel retro della scatola di plastica e qualche saldatura, abbiamo preparato il circuito per controllare l'alimentazione. Già che avevo il saldatore in mano ho rimosso il LED rosso di questa scheda di sviluppo che rimane sempre accesso quando è alimentata. Siccome non l'avrei mai più visto dopo aver chiuso la scatola non c'era bisogno che consumasse corrente per nulla.
Firmware
Per prima cosa spostiamoci in una directory dedicata al progetto e prepariamo un ambiente virtuale di Python che useremo per caricare il firmware sul ESP32.
$ mkdir esphome && cd esphome $ python3 -m venv venv $ source venv/bin/activate (venv) $ pip install esphome
Se non vi piacciono o non sapete usare gli ambienti virtuali di Python, potete installare ESPHome a livello globale con pip install esphome
.
Una volta terminata l'installazione dell'ambiente possiamo creare i file con cui ESPHome genererà il programma da caricare. Il primo file lo chiameremo secrets.yaml
e conterrà le varie password che installeremo sul MCU:
-
ap_password
: password della rete wifi che ESPHome emette se non riesce a collegarsi alla rete wifi specificata dopo; -
ota_password
: password per aggiornamenti Over-the-Air (via wifi); una volta che l'ESP32 si collega alla rete specificata possiamo aggiornare il firmware senza doverlo ricollegare al PC; -
api_key
: chiave di autenticazione che dovremo fornire ad Home Assistant per poter comunicare con l'ESP; -
wifi_ssid
ewifi_password
: i dati di accesso alla nostra rete wifi
Le password per AP e OTA sono casuali di 12 caratteri, la chiave dell'API è 32 byte con encoding base64 (che potete trovare pre-generata a questa pagina).
ap_password: "WnUC0jn6a7q" ota_password: "k0hqJYHzBMH" api_key: "1HBEN9VP4figjejjCs3+Nf51ZwE6IOfzbRElWmGrZBI=" wifi_ssid: "NomeDelMioWifi" wifi_password: "PasswordDelMioWifi"
Il secondo file lo chiameremo tv_simulator.yaml
e conterrà la configurazione del MCU. In questa configurazione - a parte il minimo necessario per far funzionare ESPHome - descriviamo un'uscita sul GPIO 13 e un'entità light che verrà utilizzata da Home Assistant per controllare questo GPIO. Aggiungiamo anche un sensore che misura il segnale wifi, giusto per darci un'idea sulla posizione del dispositivo rispetto all'access point.
esphome: name: tvsimulator esp32: board: nodemcu-32s logger: api: encryption: key: !secret api_key ota: - platform: esphome password: !secret ota_password wifi: ssid: !secret wifi_ssid password: !secret wifi_password fast_connect: true ap: ssid: "TV Simulator Hotspot" password: !secret ap_password # Questa parte solo se si vuole specificare un indirizzo statico manual_ip: static_ip: 192.168.1.200 gateway: 192.168.1.1 subnet: 255.255.255.0 captive_portal: output: - platform: gpio id: mosfet_control pin: number: GPIO13 mode: output: true pulldown: true light: - platform: binary name: "TV Simulator" output: mosfet_control sensor: - platform: wifi_signal name: "ESP TV Simulator RSSI" entity_category: "diagnostic"
Breve spiegazione del file (per ulteriori dettagli, fate riferimento alla documentazione ufficiale):
-
esphome
: configurazione di base [Link] -
esp32
: configurazione della piattaforma (il tipo di hardware che verrà utilizzato) [Link] -
logger
: permette di visualizzare messaggi di diagnostica via wifi [Link] con:
esphome logs tv_simulator.yaml
-
api
: abilita l'API nativa di ESPHome usata da Home Assistant per controllare il dispositivo [Link] -
ota
: abilita la possibilità di aggiornare l'ESP32 dal nostro PC via wifi [Link] -
wifi
: configura il collegamento wifi; si noti la sezioneap
che configura un Access Point quando l'ESP32 non riesce a collegarsi alla rete specificata [Link] -
captive_portal
: abilita una semplice pagina web che permette di riconfigurare le credenziali della rete wifi quando l'ESP32 non riesce a collegarsi [Link] -
output
: configura le uscite del MCU, in questo caso utilizzando il GPIO 13 con la resistenza di pull-down interna abilitata [Link sezione output] [Link piattaforma gpio] -
light
: il tipo di componente da esporre ad Home Assistant; in questo caso Home Assistant gestirà l'uscita come se fosse una semplice lampadina accesa/spenta (platform: binary
) [Link sezione light] [Link componente binary] -
sensor
: sezione che include tutti i sensori che raccolgono dati che vengono poi passati ad Home Assistant [Link]; in questo caso, solo il sensore di segnale wifi [Link]
A questo punto siamo pronti per generare il programma e caricarlo sul ESP32. Per prima cosa assicuriamoci che non ci siano errori durante la compilazione usando esphome compile tv_simulator.yaml
.
(venv) $ esphome compile tv_simulator.yaml INFO ESPHome 2024.9.2 INFO Reading configuration tv_simulator.yaml... INFO Generating C++ source... INFO Compiling app... Processing tvsimulator (board: nodemcu-32s; framework: arduino; platform: platformio/espressif32@5.4.0) [..] RAM: [= ] 12.4% (used 40728 bytes from 327680 bytes) Flash: [===== ] 50.8% (used 933077 bytes from 1835008 bytes) Building .pioenvs/tvsimulator/firmware.bin Creating esp32 image... Successfully created esp32 image. [..] =============================== [SUCCESS] Took 17.33 seconds =============================== INFO Successfully compiled program.
È arrivato il momento di collegare l'ESP32 al PC tramite il cavo USB. Il dispositivo si presenterà come una porta seriale, identificata in maniera diversa a seconda del vostro sistema operativo, ma generalmente lo troverete come tty sotto /dev
. Sul mio PC la trovo come /dev/tty.usbserial-57220135851
.
Una volta identificata la porta seriale da usare carichiamo il programma sull'ESP32 con esphome run --device [TTY] tv_simulator.yaml
, nel mio caso il comando sarà:
esphome run --device /dev/tty.usbserial-57220135851 tv_simulator.yaml
Al termine dell'operazione ci verrà mostrato il log del dispositivo e i dettagli del suo stato. Se è andato tutto bene vedremo anche i dettagli di rete:
[12:01:19][I][app:100]: ESPHome version 2024.9.2 compiled on Oct 17 2024, 12:53:52 [12:01:19][C][wifi:600]: WiFi: [12:01:19][C][wifi:428]: Local MAC: AA:BB:CC:DD:EE:FF [12:01:19][C][wifi:433]: SSID: 'IlMioWifi' [12:01:19][C][wifi:436]: IP Address: 192.168.1.200 [12:01:19][C][wifi:440]: BSSID: 00:11:22:33:44:55 [12:01:19][C][wifi:441]: Hostname: 'tvsimulator' [12:01:19][C][wifi:443]: Signal strength: -55 dB ▂▄▆█ [12:01:19][C][wifi:447]: Channel: 11 [12:01:19][C][wifi:448]: Subnet: 255.255.255.0 [12:01:19][C][wifi:449]: Gateway: 192.168.1.1 [12:01:21][C][logger:186]: Level: DEBUG
Da adesso in poi se vogliamo modificare il programma ci basterà avere l'ESP32 alimentato e utilizzare esphome run tv_simulator.yaml
per aggiornarlo via wifi.
Abbiamo finito il setup del microcontrollore, possiamo adesso immergere nella colla a caldo il MOSFET e l'ESP32 per poi chiudere la scatola.
Home Assistant
Avviamo ora Home Assistant usando Docker. Questa configurazione è per un'istanza temporanea/di prova, alcune funzioni (tipo autodiscovery dei dispositivi) non funzioneranno. Per un'installazione fatta a dovere seguite le istruzioni di installazione di Home Assistant.
Creiamo anzitutto una directory in cui Home Assistant può salvare i propri file di configurazione.
$ mkdir ha-config
Fatto questo possiamo creare il file docker-compose.yaml
con all'interno la seguente configurazione.
services: homeassistant: container_name: homeassistant image: "ghcr.io/home-assistant/home-assistant:stable" volumes: - ./ha-config:/config - /etc/localtime:/etc/localtime:ro privileged: true ports: - 8123:8123
E quindi avviamo il container con docker compose up
. Dopo che l'immagine del container è stata scaricata e avviata, dovreste poter accedere ad https://127.0.0.1:8123 e seguire la procedura di onboarding.
In un'installazione completa di Home Assistant il dispositivo verrà individuato automaticamente.
Nel nostro caso invece, una volta completata la procedura dobbiamo aggiungere il nostro TV simulator andando (con l'interfaccia in Inglese) su Settings > Devices and Services > Add Integration e selezionando ESPHome.
Inseriamo quindi l'indirizzo IP del dispositivo e confermiamo la scelta. Una volta connesso, Home Assistant vi chiederà la password dell'API (che abbiamo specificato in precedenza in secrets.yaml
) e finirà la registrazione dell'ESP32.
Possiamo adesso accendere e spegnere il TV simulator da Home Assistant!
Una semplice automazione
Creiamo ora la nostra automazione per gestire il dispositivo. Il mio Home Assistant accende il TV simulator appena dopo il tramonto, se la tapparella della sala è alzata e se non siamo in casa. Lo spegne poi quando qualcuno torna a casa o la tapparella viene chiusa. In questo paragrafo vedremo come fare una versione più semplice (rilevare la presenza/assenza di persone in un locale in modo accurato è sorprendentemente difficile) di questa automazione.
Quello che vogliamo che faccia è semplicemente questo: accendere il TV simulator al tramonto e spegnerlo alle 19.30. Le automazioni in Home Assistant si dividono in tre sezioni:
- trigger ("When"), cioè gli eventi che avviano l'automazione;
- condizioni ("And if"), ossia una serie di controlli che verificano se l'automazione può continuare (ad esempio se vogliamo controllare che la tapparella sia alzata prima di continuare - se è chiusa è inutile accendere il TV simulator, da fuori non si vedrebbe comunque);
- azioni ("Then do"), quindi i comandi alle varie apparecchiature, l'avvio di altre automazioni, l'invio di notifiche, eccetera.
Nella nostra situazione ci conviene creare due diverse automazioni, una per l'accensione e una per lo spegnimento del dispositivo. Per l'accensione:
- il trigger sarà l'ora del tramonto;
- le condizioni saranno vuote perché vogliamo che questa azione sia eseguita sempre, tutti i giorni;
- l'azione sarà accendere il TV simulator.
Per lo spegnimento seguiremo un concetto simile:
- il trigger sarà l'orario;
- condizioni rimangono vuote;
- l'azione sarà spegnere il TV simulator.
Spostiamoci quindi in Settings > Automations & Scenes e clicchiamo su Create Automation e dal nuovo menù scegliamo Create new automation.
Per la prima automazione impostiamo il trigger con Add Trigger e scegliamo Time and location e poi Sun. Impostiamo Sunset (tramonto) come evento. Aggiungiamo quindi l'azione con il bottone Add action in basso, scegliamo Device > Tvsimulator e impostiamo il campo Action su Turn on TV Simulator.
Clicchiamo su Save nell'angolo in basso a destra e diamo un nome alla nostra automazione.
Creiamo adesso la seconda automazione seguendo la stessa procedura di prima. Come trigger però invece di usare Sun selezioniamo Time e impostiamo le 19.30 come orario. Per l'azione da eseguire, invece di Turn on TV Simulator dovremo selezionare Turn off TV Simulator.
Da adesso in poi, fintantoché Home Assistant continuerà a funzionare, il nostro TV Simulator verrà gestito in modo automatico. Ovviamente questa automazione è poco pratica, siccome ad esempio non ignora i weekend e si spegne ad un orario fisso piuttosto che quando una persona rientra a casa. Home Assistant offre un grado di personalizzazione molto elevato, ma la discussione delle funzioni avanzate esula dallo scopo questo articolo. Per gli interessati consiglio di giocare con le varie opzioni e consultare i forum di Home Assistant. Una ricerca con Google solitamente porta alla soluzione che cerchiamo per un'automazione.
Conclusione
In questo progetto abbiamo visto come con qualche euro possiamo trasformare un dispositivo qualunque in un dispositivo "connesso", senza dover rinunciare alla nostra privacy o dover per forza mandare i nostri dati su Internet.
L'esempio di questo articolo è il più semplice che mi è venuto in mente quando ho avuto l'idea di scrivere qualche paragrafo sugli ESP32 e ESPHome, ma basta fare un giro sul sito ufficiale per vedere la miriade di opzioni che ci sono. Alla fine abbiamo tra le mani un microcontrollore che si può interfacciare con moltissimi componenti tramite un vasto numero di protocolli, quindi con un po' di tempo e voglia di leggere la documentazione (tra l'altro molto ben fatta) si riesce facilmente a costruire sistemi complessi ma facili da mantenere e con una spesa molto ridotta.
Nella mia personale esperienza, ESPHome mi ha permesso di collegare la pompa di calore ad Home Assistant tramite un ESP32 e un transceiver Modbus e ho finalmente potuto sincronizzare il riscaldamento/raffreddamento e la produzione di acqua calda sanitaria con l'impianto fotovoltaico per cercare, quando possibile, di accendere la pompa di calore durante il picco solare giornaliero. Con questo sistema controllato da Home Assistant e alcuni altri accorgimenti, tra cui la conoscenza dei consumi dei vari elettrodomestici e un display che ci informa del consumo e della produzione elettrica attuale, in due siamo riusciti a ridurre le spese di energia elettrica a poco meno di 70 euro all'anno (senza considerare tasse e costi fissi della bolletta.)
Mi sono quindi molto affezionato ad Home Assistant e ai vari dispositivi che supporta. Non devo per forza comprare dispositivi di una certa marca, o dover controllare che questi dispositivi siano compatibili con altro. Non devo preoccuparmi della connessione Internet, basta che ci sia la rete wifi disponibile e tutto opera in locale. Inoltre, dopo ormai due anni che ho una casa domotica (e con questo non intendo le lampadine che cambiano colore - sia chiaro) tutte le automazioni di casa sono completamente trasparenti, non dobbiamo tirare fuori il telefono per avviare/fermare/cambiare automazioni. Il tutto è poi ovviamente costruito in modo che se il server di casa (che è un Odroid C4, tipo Raspberry Pi) si rompe o ha dei problemi, possiamo comunque operare tutto in manuale.
La filosofia che seguo e che invito tutti a seguire è quella di Paulus Schoutsen, sviluppatore di Home Assistant, che concentra il suo pensiero in questi punti:
- You should not have to adapt to technology: la domotica deve semplificare, non rendere la vita dell'utente più difficile. Se per accendere la luce di casa quando tornate la sera dovete tirare fuori il telefono, aprire un'app, aspettare che si colleghi e premere un bottone sullo schermo, siete sulla strada sbagliata;
- You are not the only user of your home automation: chi vive assieme a qualcuno sa benissimo che i propri hobby non sono necessariamente gli stessi degli altri, le automazioni devono essere utili a tutti e non devono essere d'intralcio;
- Limit the impact of false positives and negatives: ricordatevi sempre di pensare a cosa può andare storto se un'automazione smette di funzionare, riuscite ancora ad accendere il riscaldamento o passate l'inverno al freddo finché non la riparate?
- The perfect app is no app: un interruttore fisico è meglio di app o assistenti vocali
- Your system should run at home, not in the cloud: non fidiamoci della connessione Internet per automatizzare casa, poi cosa succede quando l'azienda che vi ha venduto il dispositivo smette di supportarlo?
Link: https://www.home-assistant.io/blog/2016/01/19/perfect-home-automation/
Ulanzi Smart Clock, basato su ESP32 con firmware open source AWTRIX3 controllato da Home Assistant. In questa foto è visualizzato in tempo reale il consumo elettrico registrato da uno Shelly EM posto nel quadro contatori.
Spero che questo articolo sia d'ispirazione a chi ancora non ha avuto modo di usare microcontrollori o ha sempre pensato che fossero troppo complessi da utilizzare, o a chi è alle prime armi con la domotica e si vuole cimentare in po' di sano DIY. Per chi invece è interessato a concentrare i propri dispositivi in un sistema open e comandarli in locale ma non vuole cimentarsi nell'elettronica fatta in casa, esistono molti prodotti che se configurati a dovere non richiedono una connessione Internet per funzionare (ad esempio i dispositivi Shelly, che sul sito di Home Assistant sono classificati "platino" [Link]).
In ogni caso, buon lavoro!