Al momento stai visualizzando Gateway Zigbee ethernet/wifi su Raspberry Pi 3 o 2 (con stampa 3D)

Gateway Zigbee ethernet/wifi su Raspberry Pi 3 o 2 (con stampa 3D)

In questo articolo creiamo un gateway Zigbee Ethernet e wifi usando un Raspberry Pi 3 o 2 (che magari hai di recupero) con la migliore tecnologia Zigbee 3 disponibile (CC2538 + CC2592 con antenna esterna), comprensivo di case 3D da stampare.

Il limite dei coordinator USB collegati all’host dove gira Home Assistant, come ad esempio la Conbee 2, è il fatto di essere “attaccati” all’host che, se non è in un punto centrale della casa, rischia di necessitare e dipendere da diversi router zigbee per poter funzionare (vedi articolo dedicato). Con Raspberry Pi 4, inoltre, è necessario usare una prolunga per evitare i disturbi USB3 che ne comprometterebbero il funzionamento.
Questi problemi vengono quindi spazzati via da questa soluzione:

  • Il coordinator Zigbee potrà essere posizionato in posizione centrale rispetto alla casa, non dovendo essere collegato all’host
  • Avendo una antenna esterna e amplificata da CC2592 la portata sarà migliore diminuendo ulteriormente la necessità di dipendere da diversi router, a tutto beneficio della stabilità dell’impianto
  • Non avrai bisogno di prolunghe o altre appendici: colleghi l’alimentazione ed eventualmente il cavo ethernet al case da stampare in 3D, nient’altro
  • Utilizza una ventola PWM Noctua per essere inudibile anche se posizionato in zona notte
  • Compatibile sia con ZHA, l’integrazione Zigbee nativa di Home Assistant, che con zigbee2mqtt, un AddOn che utilizza MQTT per comunicare con Home Assistant.
Se ancora non sai quale integrazione utilizzare è il momento di leggere questo articolo: Home Assistant e ZigBee: orientiamoci.

Sei dunque pronto a potenziare e rendere stabile ed affidabile la tua rete Zigbee? Bene, continua a leggere 🙂

Materiale necessario per creare l’gateway zigbee ethernet / wifi

Per realizzare questo gateway zigbee ethernet / wifi avrai bisogno dei seguenti componenti (non ti spaventare, ho voluto essere esaustivo nell’elenco!):

Ovviamente puoi effettuare delle modifiche nella scelta dei materiali, ad esempio la ventola non è necessario che sia PWM, anche se ho notato grandi benefici in termini di rumore (praticamente inudibile).

Stampa 3D del case per l’gateway Zigbee ethernet / wifi

Come prima cosa scarica i file STL da stampare di seguito (disponibile anche su Thingiverse):

Ovviamente il sovracoperchio andrà ruotato di 180° per poggiare la superficie superiore al piano di stampa.

Consiglio di stampare a 200 micron per layer, con 5 layer pieni superiori ed inferiori e infill al 100%. Basatevi poi sulla vostra esperienza e sul tipo di filamento che utilizzerete. Il corpo andrà sostenuto con supporti per i fori dei connettori.

Personalmente ho scelto filamento in PETG per Corpo e Coperchio per via della sua migliore resistenza al calore e PLA per il sovracoperchio per via della migliore finitura che riesco ad ottenere.

Assemblaggio dell’gateway zigbee ethernet / wifi

Stampati i tre pezzi vediamo ora come assemblarli con il Raspberry Pi.

Inserti filettati e distanziali

Come prima cosa dobbiamo inserire i 4 inserti filettati M2.5 (nei quattro fori alla base dove poggerà il Raspberry Pi) ed i 4 inserti filettati M3 (nei quattro fori dove poggerà il coperchio).

Per farlo basta appoggiare la parte liscia dell’inserto nel foro e poi appoggiare la punta del saldatore sull’inserto esercitando una piccola pressione verso il basso. Appena si scalderà inizierà a scendere, inglobandosi nella plastica. Terminare la pressione e staccare la punta del saldatore non appena la parte superiore dell’inserto raggiungerà lo stesso piano della superficie stampata. Fare inoltre attenzione a non toccare alcuna parte stampata con il saldatore, si scioglierebbe molto velocemente.
Fai attenzione a non stortare gli inserti mentre entrano nella plastica.

Avvitare quindi nei fori alla base dove poggerà il Raspberry Pi i distanziali M2.5 6mm così da fissarli.

Il risultato a questo punto dovrebbe essere questo:

Il corpo stampato 3D con gli inserti ed i distanziali fissati
Corpo del case con inserti inseriti e distanziali avvitati

Collegamenti elettrici ventola PWM

Partiamo inserendo l’HAT Zigbee CC2538 di Giovanni Castania al Raspberry Pi.

Prima di proseguire l’assemblaggio sarà bene collegare i pin della ventola PWM per lavorare comodi. Dobbiamo usare, oltre a VCC e GND, un PIN in output che supporti PWM hardware ed un pin in input per il sensore tachimetrico. Io ho usato i seguenti (verificando con Giovanni che non fossero utilizzati dall’HAT):

  • BLU = segnale PWM –> GPIO18
  • VERDE = sensore RPM –> GPIO13 (con resistenza pull-up da 660Ω o più sul 3.3V)
  • GIALLO = VCC 5V
  • NERO = GND

Abbiamo due possibilità: saldare i pin sotto alla scheda del Raspberry Pi oppure sopra all’HAT. Io ho seguito questa seconda strada perchè l’ho fatto da RPI già montato nel case.

Fate molta attenzione a non creare corto circuiti saldando i pin!

Facciamo riferimento allo schema degli I/O del Raspberry Pi 3b:

Schema dell'header del Raspberry Pi 3B

Le posizioni a cui saldare i pin della ventola sono quindi i seguenti:

Schema di collegamento della ventola Noctua PWM ai pin esposti dall'HAT zigbee
Attenzione! Il cavo verde (sensore RPM) è un OC, va quindi collegato con una resistenza di pull-up a +3.3V. Attenzione a non collegarlo al +5V!
Io ho usato una resistenza da 1kΩ, 1/4W.

Assemblaggio finale

A questo punto fissiamo la ventola alla parte sottostante il coperchio con le viti in dotazione. Facciamo attenzione al verso in cui la montiamo: l’aria deve essere spinta verso l’interno, non succhiata verso l’esterno.

Fissiamo l’antenna in dotazione all’HAT stringendo bene il dado di fissaggio, quindi inseriamo il connettore sull’HAT.

Ora posizioniamo il coperchio sopra alla base così che la ventola sia dalla parte del connettore HDMI e alimentazione, così da ottimizzare il flusso verso i componenti che scaldano.
Fissare il coperchio con le viti M3.

Il gateway zigbee ethernet / wifi chiuso e finito, senza sovracoperchio
Il case con l’hardware ed il coperchio montati

A questo punto non rimane che posizionare il sovracoperchio sopra al coperchio per rendere più gradevole l’estetica. Il risultato dovrebbe essere il seguente:

Il gateway zigbee ethernet / wifi finito - lato antenna
A sinistra il foro per la MicroSD e griglia di aerazione, a destra alimentazione MicroUSB, porta HDMI e jack audio

Il gateway zigbee ethernet / wifi finito - lato connettori
A sinistra connettori ethernet e USB, a destra griglia di aerazione

Installazione e configurazione del software

Avendo a questo punto terminato le operazioni sugli oggetti fisici possiamo passare ora ad installare e configurare il software per preparare il nostro nuovo gateway zigbee ethernet / wifi!

Installazione e configurazione del sistema operativo

Consiglio di utilizzare Raspberry Pi OS (precedentemente noto come Raspbian) in versione Lite a 32 bit.

Consiglio quindi a questo punto di seguire il seguente articolo per preparare il Raspberry Pi: Installare Raspberry Pi OS senza collegare monitor e tastiera

In tale articolo ti verrà proposto di disabilitare il bluetooth ed abilitare l’UART, è importante che tu lo faccia altrimenti l’HAT zigbee non funzionerà.

Al termine dell’articolo dovresti aver ottenuto il tuo Raspberry attivo e funzionante. Ti consiglio di utilizzare Putty da ora in poi per proseguire la configurazione.

Se hai installato anche l’ambiente desktop puoi usare anche quello volendo, tramite VNC. Putty è comunque la soluzione più veloce.

Gestione della ventola dinamica

Ora pensiamo a come gestire la ventola in modo dinamico, così che giri tanto più veloce quanto più alta sia la temperatura. In tal modo si troverà normalmente un punto di incontro tra temperatura e giri della ventola che tenderà a lasciare una grande silenziosità senza far comunque scaldare la CPU.

Scarica i seguenti script python ed estraili dallo zip che hai scaricato nella directory ~/scripts ovvero /home/pi/scripts

Per far tutto dalla shell del raspberry utilizza i seguenti comandi:

mkdir scripts
cd scripts
wget https://henriksozzi.it/wp-content/uploads/2021/09/PWM-fan-python-scripts.zip
unzip PWM-fan-python-scripts.zip
rm PWM-fan-python-scripts.zip

Lo script fan_control.py servirà come servizio di regolazione della velocità della ventola automatico, mentre read_fan_speed.py potremo usarlo per restituirci velocità della ventola e temperatura della CPU (come miglioria futura sarebbe bello inviare questi valori ad Home Assistant…)

Apriamo il primo con il seguente comando:

nano fan_control.py

I parametri che ci potrebbe interessare modificare sono subito sotto il commento #Configuration:

# Configuration
FAN_PIN = 18            # BCM pin used to drive PWM fan
WAIT_TIME = 1           # [s] Time to wait between each refresh
PWM_FREQ = 25           # [kHz] 25kHz for Noctua PWM control
  • FAN_PIN: è il pin utilizzato per l’output PWM che regolerà la velocità della ventola. Se hai seguito lo schema elettrico presente in questo articolo andrà già bene così com’è, altrimenti dovrai sostituirlo con il pin utilizzato.
  • WAIT_TIME: è il tempo da attendere espresso in secondi tra un refresh e l’altro della temperatura e quindi della velocità impostata. 1 è un valore più che adeguato
  • PWM_FREQ: è la frequenza dell’output PWM. Se hai usato la ventola Noctua consigliata non devi cambiare questo valore.

Salviamo le eventuali modifiche con CTRL + X e poi S.

Ora apriamo l’altro script con il seguente comando:

nano read_fan_control.py

I parametri che ci potrebbe interessare modificare sono subito sotto il commento #Pin configuration:

# Pin configuration
TACH = 13       # Fan's tachometer output pin
PULSE = 2       # Noctua fans puts out two pluses per revolution
WAIT_TIME = 1   # [s] Time to wait between each refresh
  • TACH: è il pin utilizzato per collegare il sensore tachimetrico della ventola. Se hai seguito lo schema presente in questo articolo il valore è già corretto.
  • PULSE: numero di impulsi per ogni giro della ventola che il tachimetrico fornisce. Se hai usato la ventola Noctua consigliata non devi cambiare questo valore.
  • WAIT_TIME: tempo da attendere tra un refresh e l’altro che aggiungerà una riga con velocità e temperatura alla console.

Installiamo lo script come servizio automatico

Creiamo il file per gestire il servizio:

sudo nano /etc/systemd/system/autofan.service

All’interno di tale file incolliamo il seguente contenuto:

[Unit]
Description=Control the attached PWN fan depending on CPU temperature
After=multi-user.target

[Service]
ExecStart=/usr/bin/python3 /home/pi/scripts/fan_control.py
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

E salviamo come di consueto con CTRL + X e S.

Ora ricarichiamo i servizi, abilitiamo l’avvio automatico quando parte il sistema operativo e facciamo partire il servizio:

sudo systemctl daemon-reload
sudo systemctl enable autofan.service
sudo systemctl start autofan.service

Se in futuro vorremo vedere il log del servizio (per verificare che sia stato avviato, per esempio):

sudo journalctl -b0 --unit=autofan.service

Per riavviare il servizio (utile quando si modifica il file python, per esempio):

sudo systemctl restart autofan.service

Installazione software per zigbee

A questo punto non ci resta che installare il software che servirà per far comunicare la nostra istanza di Home Assistant con l’HAT Zigbee montato nel nostro gateway zigbee ethernet / wifi.

A seconda dell’integrazione che desideri utilizzare espandi la sezione di tuo interesse:


Zigbee Home Automation (ZHA)

Come prima cosa installiamo ser2net, il servizio che permetterà di fare da ponte tra la seriale dell’HAT zigbee ed una porta TCP che l’integrazione di Home Assistant utilizzerà per comunicare con l’HAT:

sudo apt install ser2net

Al termine configuriamo i parametri di ser2net:

sudo nano /etc/ser2net.conf

Scorri in fondo al file ed aggiungi la seguente riga:

1234:raw:600:/dev/ttyAMA0:115200 8DATABITS NONE 1STOPBIT

Dove 1234 è la porta TCP che condividerà la seriale dell’HAT zigbee. Puoi scegliere un’altra porta nel range 1 – 65535 che non sia utilizzata da altri servizi.

Salviamo con CTRL + X e S per confermare, dopo di che riavviamo il servizio ser2net:

sudo systemctl restart ser2net.service

Se tutto è andato bene siamo pronti a configurare l’integrazione su Home Assistant!

Prima di aggiungere l’integrazione consiglio di aggiungere nel vostro configuration.yaml (o in un package) il seguente codice (come specificato qui):

zha:
  zigpy_config:
    network:
      channel: 25 

Ovviamente sostituisci il canale con quello che vuoi venga utilizzato dalla tua rete zigbee.

Se non sai cosa scegliere ti consiglio la lettura di questo articolo ora: ZigBee: copertura, router, canali

Riavvia ora Home Assistant

Da Home Assistant in Impostazioni -> Integrazioni premere il tasto in basso a destra + AGGIUNGI INTEGRAZIONE. Dall’elenco cliccare su Zigbee Home Automation.
Verranno richiesti dei parametri. Come tipo di radio selezionare ZNP = Texas Instruments Z-Stack ZNP protocol: CC253x, CC26x2, CC13x2 e premere INVIA.

ZHA - Aggiunta integrazione: scelta tipo di radio zigbee

A questo punto nel campo Percorso del dispositivo seriale inseriamo il valore socket://INDIRIZZO_IP:PORTA, come mostrato di seguito:

ZHA - Aggiunta integrazione: inserimento parametri di collegamento

Dopo aver premuto INVIA l’integrazione dovrebbe installarsi ed essere pronta per essere configurata.

Per informazioni su come procedere dopo aver installato l’integrazione consiglio la lettura del seguente articolo: ZHA: ZigBee in Home Assistant

Zigbee2MQTT

Installiamo zigbee2mqtt sul Raspberry Pi appena preparato seguendo le indicazioni del sito ufficiale.

Come prima cosa installiamo il repository di node.js:

sudo curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -

Ora installiamo Node.js con NPM ed i compilatori C per compilare gli addon nativi:

sudo apt-get install -y nodejs git make g++ gcc

Verifichiamo ora che Node.js sia funzionante e la versione corretta:

node --version

Alla data in cui scrivo il risultato è v14.18.0

Ora verifichiamo NPM:

npm --version

Alla data in cui scrivo il risultato è 6.14.15

Ora cloniamo il repository di zigbee2mqtt e prendiamone possesso:

sudo git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
sudo chown -R pi:pi /opt/zigbee2mqtt

Installiamo ora le dipendenze di zigbee2mqtt:

cd /opt/zigbee2mqtt
npm ci

Attendiamo con pazienza il termine dell’operazione (ci vorranno poco più di due minuti). Verranno mostrati diversi warning a video che possiamo ignorare. Al termine l’ultima riga dovrebbe essere come questa (il numero di packages può variare):

added 967 packages in 130.32s

L’installazione è terminata. Prima di avviare zigbee2mqtt dobbiamo configurarlo:

nano /opt/zigbee2mqtt/data/configuration.yaml

Modifichiamo i seguenti valori:

# Home Assistant integration (MQTT discovery)
homeassistant: true

# allow new devices to join
permit_join: true

# MQTT settings
mqtt:
  # MQTT base topic for zigbee2mqtt MQTT messages
  base_topic: zigbee2mqtt
  # MQTT server URL
  server: 'mqtt://192.168.1.250'
  # MQTT server authentication, uncomment if required:
  user: mqtt_user
  password: mqtt_password

# Serial settings
serial:
  # Location of CC2531 USB sniffer
  port: /dev/ttyAMA0

# Specify to generate a new network key at next start
advanced:
    network_key: GENERATE

Salviamo come sempre con CTRL + X e S

Rispetto a quanto trovato abbiamo modificato le seguenti voci:

  • homeassistant: true
    Attiva MQTT discovery per creare automaticamente i nuovi dispositivi in Home Assistant. Più dettagli a questa pagina
  • server: 'mqtt://192.168.1.250'
    Specifica l’indirizzo IP del nostro broker MQTT (sostituisci ovviamente l’IP con il tuo)
  • user: e password:
    Il nome utente e password per accedere al tuo broker, se necessario.
  • port: /dev/ttyAMA0
    Questo è l’indirizzo della porta seriale interna che l’HAT utilizza.
  • network_key: GENERATE
    Specifica di generare una nuova chiave di rete al prossimo avvio.

Abbiamo così terminato la configurazione di zigbee2mqtt. A questo punto per avviarlo e verificare che funzioni e impostarlo come servizio che viene automaticamente eseguito seguire la procedura sul sito ufficiale.


Ti va di darmi una mano?

Il contenuto di questo sito è completamente gratuito senza pubblicità invasive e il fine non è certo guadagnare …ma mantenere un sito ha un costo. Se ti va di darmi una mano per sostenere le spese o ti va di sostenere questo progetto hai le seguenti modalità:


  • Donazione con Paypal:

  • Regalami un caffè su Buymeacoffee:


  • Effettua i tuoi acquisti Amazon a partire da QUESTO LINK (o tramite i prodotti sotto)

  • Effettuare i tuoi acquisti AliExpress usando QUESTO LINK

Henrik Sozzi

Sono un analista programmatore per lavoro e per passione. Amo la domotica, la stampa 3D e la tecnologia in generale. Mastodon: @pixel

Questo articolo ha 17 commenti

  1. iSSU (@issu73)

    Se ti può interessare, sto predisponendo il mio raspberry pi1 per questo progetto, ho aggiunto il controllo della temperatura ed altri sensori seguendo questa guida: https://github.com/hjelev/rpi-mqtt-monitor
    Funziona alla grande e vedo tutti i sensori su HA.
    Domani provo a spostare la conbee II e ti aggiorno.

    1. Henrik Sozzi

      Ciao grazie per il suggerimento. In realtà ho provato uno script molto simile (probabilmente un fork) e alcuni dei relativi fork. Il problema è che ho sempre rilevato un memory leak che faceva progressivamente aumentare la RAM usata. Tienila d’occhio…
      Alla fine ho provato glances che però anche lui sembra comportarsi così. Sto ancora verificando per trovare la soluzione giusta per includere il monitoraggio remoto nell’articolo (o in uno nuovo)

      1. iSSU (@issu73)

        alla fine ho eliminato il sensore di temperatura e lo switch della ventola in quanto non so per quale motivo non si aggiornava in tempo reale.
        Sono sempre alla ricerca di qualcosa di interessante.

    1. Henrik Sozzi

      Ti ringrazio, è un’alternativa interessante. Personalmente, dopo averne provate un po’, sono approdato a glances e sto usando quello per monitorare i miei Raspberry in casa. Al momento vedo un leggero leak che occupa all’incirca 1% di RAM al giorno, motivo per il quale non ho ancora pensato di consigliare una delle opzioni…
      Allo stato attuale l’opzione che mi sembra più promettente è Sys-QTT ma non ho ancora avuto tempo di provarlo.
      L’opzione SSH l’avevo valutata anch’io ma non mi fa impazzire lasciare un canale SSH aperto, sebbene sia una possibilità e certamente una valida opzione di cui ti ringrazio per i riferimenti.
      Se farò qualche esperimento riuscito particolarmente bene in ambito lo condividerò. Intanto grazie.

  2. Dario

    Ciao Henrik, allacciandomi al tuo progetto, volevo chiederti se sia possibile eventualmente recuperare i dispositivi da un dongle usb 3.0 (la chiavetta di Giovanni per intenderci) collegata ad un raspberry pi4 con homeassistant installato sopra, per poterli gestire da un Nuc, dove ho fatto una nuova installazione di homeassistant. Purtroppo sono obbligato a tenere il raspi perchè sopra mi gira un’addon per gestire la mia domotica di casa scritto solo per raspberry, il quale recupero sul nuc tramite Mqtt. In questo modo potrei lasciare il raspberry, che gestirebbe solo più questo addon e la rete zigbee, in posizione strategica in casa per la rete zigbee soprattutto e posizionare il nuc da un’altra parte a me più comoda. Spero di essermi spiegato. Grazie mille Salutoni !!!

    1. Henrik Sozzi

      Ciao, non sono sicuro di aver capito. Hai spostato HA da Raspberry Pi4 ad un NUC ma devi tenere il Raspberry per farci girare il software specifico (non su HassOS, suppongo…) e vorresti usarlo anche come gateway zigbee ma usando la chiavetta di Giovanni? Se è così, si, puoi senza problemi. Se usi ZHA o hai zigbee2mqtt installato sull’host HA basterà configurare ser2net sul raspberry per puntare alla seriale esposta dalla chiavetta, a differenza dell’articolo, e il gioco è fatto.
      Se invece installi zigbee2mqtt sul raspberry dovrai solo configurarlo per accedere alla chiavetta in locale e connettersi al tuo broker mqtt che già hai e anche lì il gioco è fatto.

  3. Dario

    Ciao, hai capito perfettamente, solo che sul Raspberry devo lasciare HassOS, perchè l’addon che mi serve, gira su di esso, però da quanto ho capito ser2net non può essere installato su Homeassistant. Considera che io uso ZHA. Hai qualche idea? Grazie mille !!!

    1. Henrik Sozzi

      Qual’è questo addon…? Gli addon sono container docker con dentro un software che girerebbe su un normale S.O….

  4. bwillyb

    lo posso fare con il dongle zigbee di sonoff ?

      1. Willy

        Ma se il mio home assistant gira su vm debian e volessi usare il broker mosquito dove lo installo sul raspy con il dongle sonoff o sul docker debian?

        1. Henrik Sozzi

          Mosquitto ti serve se usi zigbee2mqtt, non ti serve se usi zha.
          Se scegli zigbee2mqtt ti consiglio di installare il broker sull’host dove hai Home Assistant in quanto potrebbe servirti per altro un domani.
          Se usi Home Assistant OS (che consiglio) lo installi con un click (c’è l’addon pronto)

          1. bwillyb

            mi dice che è collegato al server mosquito e Zigbee2MQTT started
            ma ora metto l’ip del raspberry sulla porta 8081 ma niente.
            Cioè come aggiungo i device?

  5. Willy

    Grazie. Smanetto e vediamo come va

    1. bwillyb

      risolto.
      Hai fatte una grande guida
      grazie

      1. Henrik Sozzi

        Non ho fatto in tempo a risponderti… Bene, mi piace risolvere i problemi in questo modo! ^_^
        Grazie per l’apprezzamento! 🙂

Rispondi

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.