La domotica è arrivata ormai in ogni abitazione, dove è difficile non trovare almeno un gadget che offra funzioni per le "smart home". Che si tratti della lavatrice che ci notifica la fine del ciclo di lavaggio o della caldaia che riscalda la casa prima del nostro rientro, è del tutto normale affidarsi a tecnologie simili nella nostra quotidianità.
Tempo addietro abbiamo parlato di come sia semplice realizzare un dashboard completa per il controllo dei device IoT (Internet of Things) sfruttando il noto progetto open source Home Assistant. Quest'oggi, invece, vogliamo parlarvi di Zigbee2MQTT, un software che consente di far comunicare tra di loro due protocolli molto popolari come Zigbee e MQTT.
I protocolli Zigbee e MQTT
Zigbee è una tecnologia wireless diffusissima tra "smart device" di vario tipo. Con ridotti consumi energetici consente di connettersi ad un hub wireless che a sua volta comunica con il nostro router per offrire funzionalità di controllo remoto e notifica degli eventi, programmati e non.
MQTT è invece un messaging protocol progettato appositamente per le applicazioni che devono operare con capacità di banda limitata. Dunque si adatta perfettamente al mondo della domotica.
Zigbee2MQTT è un progetto open source ideato per consentire a Zigbee e a MQTT di interfacciarsi in modo semplice, cosi da bypassare le diverse soluzioni di bridge o gateway proprietari.
Nella guida di oggi scopriremo come implementare Zigbee2MQTT in un Raspberry Pi, in modo da realizzare un hub wireless per i nostri device IoT che sfruttano il protocollo Zigbee.
Raspberry Pi e configurazione hardware
Di base i vari modelli di Raspberry Pi non sono equipaggiati con uno Zigbee transceiver quindi è necessario acquistarne uno. Ne esistono a decine in rete sotto forma di pratici dongle USB, bisogna però essere certi che quello che andiamo a comprare sia compatibile con Raspberry Pi OS o, più in generale, con Debian, la distribuzione su cui si basa Raspberry Pi OS.
Inoltre per completare il nostro progetto è essenziale, ovviamente, dotarci della board ARM, sono sufficienti un Raspberry Pi 4 o un più datato Raspberry Pi 3. Oltretutto bisogna reperire: una scheda microSD da almeno 64GB, un alimentatore USB, un cavo di rete cat 6, mouse, tastiera e monitor. Gli ultimi tre elementi posso anche essere bypassati se abbiamo già un Raspberry Pi configurato e connesso alla nostra rete locale.
Installazione e configurazione iniziale di Raspberry Pi OS
Se abbiamo appena acquistato la board ARM è necessario installare e configurare il suo sistema operativo di riferimento, ovvero Raspberry Pi OS. Per farlo dobbiamo affidarci ad uno dei tanti imaging tool reperibili in rete. Quest'oggi andremo ad utilizzare Raspberry Pi Imager, l'utility realizzata dai developer del progetto.
Dopo aver scaricato il file ISO di Raspberry Pi OS e l'installer di Raspberry Pi OS Imager, avviamo quest'ultimo e clicchiamo su "Choose OS" cosi da scegliere l'ISO della distribuzione. Poi selezioniamo l'opzione "Choose Storage" per impostare la microSD da utilizzare per il processo ed infine selezioniamo "Write".
La procedura dovrebbe durare alcuni minuti. Al suo termine scolleghiamo la microSD dal PC ed inseriamola nel Raspberry Pi. Dunque avviamo il device e procediamo con la configurazione di Raspberry Pi OS.
Questo wizard è davvero semplice e non ci addentreremo nei dettagli. Basta seguire la pratica procedura guidata per arrivare al termine.
Installazione di Docker su Raspberry Pi OS
Una volta sul Desktop del sistema operativo avviamo la shell e rivolgiamoci al package manager APT per assicurarci di avere la versione più recente di tutti i software presenti nella distribuzione:
sudo apt update && sudo apt upgrade
Fatto questo passiamo alla configurazione del sistema di container open source Docker. Infatti il server Zigbee2MQTT viene eseguito in tale ambiente. Installiamo Docker in questo modo:
curl -sSL https://get.docker.com | sh
sudo sh get-docker.sh
Aggiungiamo poi il nostro utente al suo gruppo:
sudo usermod -aG docker nomedelnostroutente
Ora, tramite il gestore dei demoni systemd, indichiamo al sistema di eseguire Docker ad ogni boot della distribuzione:
sudo systemctl enable docker.service && sudo systemctl enable containerd.service
Individuare lo Zigbee Adapter
È arrivato il momento di individuare lo Zigbee Adapter USB connesso al device, per farlo usiamo questo semplice comando:
sudo dmesg
Come output vengono elencanti una serie di nomi dei device USB connessi tra cui appunto lo Zigbee Adapter.
Prendiamo nota del suo nominativo preciso perché ci servirà tra poco.
Configurazione di Zigbee2MQTT
Adesso generiamo una nuova directory dedicata a Zigbee2MQTT :
sudo mkdir -p /opt/stacks/zigbee2mqtt
e spostiamoci dentro di essa:
cd /opt/stacks/zigbee2mqtt
Passiamo quindi alla creazione del Docker Compose file di Zigbee2MQTT:
sudo nano compose.yaml
Dentro il file di testo aperto dall'editor nano dobbiamo inserire uno script come il seguente:
version: '3.8'
services:
mqtt:
image: eclipse-mosquitto:2
restart: unless-stopped
volumes:
- "./mosquitto-data:/mosquitto"
ports:
- "1883:1883"
- "9001:9001"
command: "mosquitto -c /mosquitto-no-auth.conf"
zigbee2mqtt:
container_name: zigbee2mqtt
restart: unless-stopped
image: koenkk/zigbee2mqtt
volumes:
- ./zigbee2mqtt-data:/app/data
- /run/udev:/run/udev:ro
ports:
- 8080:8080
environment:
- TZ=<Europe/Rome>
devices:
- /dev/<NOMEDELZigbeeAdapter>:/dev/<NOMEDELZigbeeAdapter>
Salviamo le modifiche con CTRL+O e chiudiamo il file con CTRL+X.
Passiamo al file di configurazione di Zigbee2MQTT vero e proprio:
sudo mkdir /opt/stacks/zigbee2mqtt/zigbee2mqtt-data
sudo nano /opt/stacks/zigbee2mqtt/zigbee2mqtt-data/configuration.yaml
Quindi inseriamo queste configurazioni:
permit_join: true
mqtt:
base_topic: zigbee2mqtt
server: mqtt://mqtt
serial:
port: /dev/<NOMEDELZigbeeAdapter>
frontend:
port: 8080
advanced:
network_key: GENERATE
Salviamo ora con CTRL+O e chiudiamo il file con CTRL+X.
E finalmente avviamo il tutto:
docker compose up
Accedere all'interfaccia web di Zigbee2MQTT
Siamo pronti per accedere a Zigbee2MQTT cosi da amministrare i nostri device Zigbee. Apriamo il browser Web e digitiamo nella barra degli URL questo indirizzo:
http://<192.168.1.12>:8080
Se non conosciamo l'IP locale del Raspberry Pi possiamo ottenerlo con il comando:
hostname -I
A questo punto si può accedere all'interfaccia del Zigbee2MQTT bridge e avviare il processo di pairing con i dispositivi presenti nelle vicinanze.