Se avete un dispositivo Sonoff flashato con il firmware Tasmota, vi sarà probabilmente capitato di notare un comportamento anomalo dopo una riconnessione alla rete Wi-Fi o al server MQTT. Nel mio caso, il Sonoff collegato alla stampante 3D si accendeva ad ogni perdita e riacquisizione della connessione.

Per risolvere il problema bisogna prima capirne la causa.

La causa: il RETAIN di MQTT

Il problema è quasi sempre causato dal RETAIN, un’opzione configurabile sui topic MQTT che permette al broker di memorizzare l’ultimo stato di un topic e di reinviarlo al device nel momento in cui si riconnette. Probabilmente durante le prime configurazioni di prova è stato attivato un topic che è rimasto memorizzato nel broker.

Se vogliamo che alla riconnessione del Sonoff non venga eseguita nessuna operazione (cioè che il dispositivo mantenga lo stato attuale), è necessario:

  1. Impostare retain: false nella configurazione
  2. Cancellare i topic retain già memorizzati nel broker MQTT

Vediamo come fare in entrambi i casi: via terminale (per chi ha Hassbian + Mosquitto) e via client grafico (per chi ha HASSIO con MQTT embedded).


Metodo 1: via terminale (Hassbian + Mosquitto)

Passo 1: imposta retain: false su Home Assistant

Per prima cosa riconfigura gli switch MQTT su Home Assistant impostando retain: false.

[IMMAGINE: Screenshot configurazione retain: false in Home Assistant]

Passo 2: visualizza i topic attivi

Accedi via terminale al Raspberry e digita il comando seguente per visualizzare tutti i topic Tasmota attivi:

1
sudo mosquitto_sub -t stat/# -t tele/# -t cmnd/#  -v -u iltuoutente -P latuapassword

Il risultato sarà qualcosa di simile a questo:

[IMMAGINE: Screenshot output mosquitto_sub con topic attivi]

Il topic da eliminare è quello che inizia per cmnd, ovvero il comando che arriva da Home Assistant per accendere/spegnere il dispositivo.

Passo 3: cancella il topic incriminato

Una volta trovato il topic, puoi cancellarlo inviando un payload vuoto con questo comando:

1
sudo mosquitto_pub -t cmnd/stampante3d/POWER -r -n -u iltuoutente -P latuapassword

Le opzioni del comando:

  • -r: assegna il RETAIN al topic
  • -n: passa un payload null (vuoto)
  • -u: nome utente di Mosquitto
  • -P: password di Mosquitto

Se non hai impostato utente e password in Mosquitto, puoi omettere -u e -P.

Passo 4: verifica

Ripeti il comando di sottoscrizione per verificare che il topic cmnd non sia più presente:

1
sudo mosquitto_sub -t stat/# -t tele/# -t cmnd/#  -v -u iltuoutente -P latuapassword

[IMMAGINE: Screenshot output mosquitto_sub senza topic cmnd]

Se provi ora a far perdere la connessione al Sonoff, alla riconnessione non verrà eseguita nessuna operazione.


Metodo 2: via MQTT Lens (HASSIO con MQTT embedded)

Chi ha HASSIO con il broker MQTT embedded e non ha accesso al terminale del Raspberry non può usare i comandi di Mosquitto. In questo caso è possibile cancellare i topic tramite un client MQTT grafico.

Io ho usato MQTT Lens, un’app per Chrome disponibile sul Chrome Web Store.

Passo 1: configura la connessione

Installa MQTT Lens, clicca sul “+” accanto a CONNECTIONS e configura la connessione al tuo broker MQTT.

[IMMAGINE: Screenshot configurazione connessione in MQTT Lens]

Passo 2: sottoscrivi il topic cmnd/#

Effettua la sottoscrizione al topic cmnd/#.

[IMMAGINE: Screenshot sottoscrizione topic cmnd/# in MQTT Lens]

In basso verranno visualizzati tutti i topic cmnd attivi nel tuo broker MQTT.

[IMMAGINE: Screenshot lista topic cmnd attivi]

Passo 3: cancella i topic

Cancellali uno per uno inviando un payload vuoto (null) e selezionando la casella retain.

[IMMAGINE: Screenshot invio payload null con retain selezionato]

Passo 4: verifica

Ripeti la sottoscrizione al topic cmnd/#. I topic cancellati non dovrebbero più comparire.

[IMMAGINE: Screenshot verifica topic rimossi]


Conclusioni

I topic cmnd/# memorizzati con il RETAIN attivo vengono richiamati ad ogni riconnessione del Tasmota, causando operazioni indesiderate. Cancellarli e impostare retain: false risolve definitivamente il problema.

Se usi altri software come Node-RED o dashboard MQTT per inviare comandi al Sonoff, assicurati che anche lì il retain sia impostato su false.


Se ti ritrovi lo stesso comportamento anomalo su un altro dispositivo Tasmota, il sospetto principale resta sempre il RETAIN.