Se anche voi avete il Raspberry collegato in rete tramite wi-fi, vi sarà sicuramente capitato qualche volta di non riuscire a raggiungere il vostro Home Assistant ne da indirizzo remoto (esempio: https://lamiacasa.duckdns.org:8123) e neppure direttamente da rete locale (esempio: https://192.168.1.5:8123) dando per scontato che fosse un problema di Home Assistant.
Quindi vi sarete detti: “Mi collego in SSH e faccio un sudo reboot“.
A questo punto l’amara sorpresa… non riuscite a collegarvi nemmeno in SSH… il vostro Raspberry è sparito dalla rete locale!! Andate a controllare i dispositivi collegati in tempo reale direttamente dal pannello admin del vostro router…. niente… il Raspberry non c’è.
La soluzione? Staccare e riattaccare la spina! Ed ecco che dopo pochi minuti di avvio il tutto è tornato alla normalità.
Ma cosa è successo? C’è da sapere che il firmware del Raspberry soffre di un bug ancora irrisolto ad oggi che non gli permette di riconnettersi una volta che la connessione viene persa per qualche motivo. Questo non si verifica sempre, succede a random e quando succede dovete essere lì pronti a staccare la spina per ripristinare il corretto funzionamento.
Per fortuna esistono soluzioni alternative e automatizzate per rimediare al problema.
SOLUZIONE 1
Collegare il Raspberry tramite cavo ethernet. Ovviamente questa soluzione non è adatta a tutti, ma se ne avete la possibilità di farlo è la soluzione migliore!
SOLUZIONE 2
Molti utenti sul web dicono di disattivare il Power Management del wi-fi del proprio Raspberry per risolvere. Personalmente l’ho provato ma non ho risolto il problema. In ogni caso la procedura è questa.
Collegarsi tramite SSH e una volta loggati digitare il comando:
sudo cp /etc/network/interfaces /etc/network/interfaces.backup
per effettuare il backup di sicurezza.
Andiamo quindi a modificare il file con:
sudo nano /etc/network/interfaces
Se non avete mai customizzato questo file prima d’ora, potete tranquillamente sostituire il contenuto con questo blocco:
auto lo iface lo inet loopback iface eth0 inet dhcp auto wlan0 allow-hotplug wlan0 iface wlan0 inet dhcp wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf wireless-power off iface default inet dhcp
Ad ogni modo, nel caso aveste già modificato in precedenza tale file con altre impostazioni, il blocco fondamentale da aggiungere è questo:
auto wlan0 allow-hotplug wlan0 iface wlan0 inet dhcp wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf wireless-power off iface default inet dhcp
Ora salvate ed uscite dall’editor con CTRL-X, Y, INVIO e riavviate:
sudo reboot
Una volta riavviato, eseguite il comando:
iwconfig
ed assicuratevi che a schermo appaia, tra le altre, la stringa Power Management:off
SOLUZIONE 3
Questa è la soluzione che personalmente uso. E’ un semplice script che controlla ogni 10 minuti che il router sia raggiungibile tramite ping e nel caso il check fallisce, il wifi viene ripristinato in automatico.
Scarichiamo lo script da qui: NetReconnector oppure creiamo un file sul nostro PC denominato NetReconnector.sh e carichiamolo tramite SAMBA nel percorso del nostro Raspberry: /home/pi
Il file è così formato:
#!/bin/bash # by nickwang wxlcat@gmail.com NetCard=wlan0 # the netcard connected to the internet PingTarget=www.baidu.com # the ping target, router ip or website, etc: 192.168.1.1, www.baidu.com LogFile=~/NetReconnector.log # log file LogAll=false # log msg no matter whether the net is connected, used to be check whether the script is running. test -e $LogFile || touch $LogFile time=$(date "+%Y/%m/%d %H:%M:%S") ret=$(ping -c 2 -W 1 -I $NetCard $PingTarget | grep 'received' | cut -d ',' -f 2 | cut -d ' ' -f 2) if [ "$ret" == "0" ]; then sudo ifdown wlan0 && sudo ifup wlan0 echo "Try Reconnect: $?, $time" | tee -a $LogFile else if [ "$LogAll" == "true" ]; then echo "Network is ok, ret = $ret, $time" | tee -a $LogFile fi fi exit 0
Colleghiamoci tramite SSH e spostiamoci nella directory:
cd /home/pi
e successivamente digitiamo il comando:
vim NetReconnector.sh
Andiamo ora a modificare solo i campi NetCard e PingTarget
Assegnamo a NetCard il valore wlan0, mentre a PingTarget possiamo dargli un valore di un dominio, ad esempio www.google.it, ma più semplicemente l’IP del nostro router
Assegnato ora i permessi di esecuzione allo script:
chmod +x NetReconnector.sh
e successivamente il comando:
crontab -e
e inseriamo questa riga:
*/10 * * * * ~/NetReconnector.sh
la quale farà sì che il check sullo stato di connessione wifi venga eseguito ogni 10 minuti.