lunedì 18 marzo 2019

MQTT ed il retain


Prima di addentrarci in Home Assistant, parliamo di una peculiarità di MQTT, ovvero i messaggi di retain e del perché sarebbe meglio usarli.

Abbiamo parlato la settimana scorsa del QoS legato a MQTT, per avere la certezza che i messaggi siano inviati.

C'è sempre un ma in questo scenario, anche implementando una QoS di livello 2, non si sa quando i messaggi saranno ricevuti da TUTTI i subscriber.

Mettiamo il caso che due dispositivi siano iscritti ad un topic, cosa plausibile per gli scenari di automazione domestica.
Mettiamo il caso che uno vada offline (vuoi per manutenzione, vuoi perché il segnale wifi è miserrimo, ecc.).
Il dispositivo ancora on line pubblica un messaggio con QoS di livello 2 ed il broker lo riceve correttamente.
Ma il broker non manda il messaggio, perché non c'è on line nessun dispositivo iscritto al topic.

Risultato?
La vostra automazione vi ha appena salutato con la manina...

Secondo esempio, molto più banale e semplice.
Fate una qualche modifica a Home Assistant che richiede il riavvio del sistema.
Benissimo, reboot e in breve siete on line nuovamente.
Però HASSIO non vi riporta lo stato di nessun sensore applicato alle porte o alle finestre.
Unico modo per venirne a capo è aprire tutte le porte e le finestre per ricevere il messaggio di stato.

Si, si potrebbe usare un qualche meccanismo per forzare l'invio del topic, tipo mettere il TELEPERIOD a 1, ma c'è una cosa più elegante...

Per ovviare a queste problematica, sono stati implementati i messaggi chiamati "retain".

Quando si abilita il retain, ogni dispositivo con questo attributo manda un messaggio di stato e richiede all'host di conservare il messaggio fino a quanto non ne arriva uno successivo.

In questo modo tutti i subscriber, non appena si collegano, ricevono l'ultimo stato (o valore) del dispositivo che lo ha generato.
Questo è davvero utile, perchè i subscriber non hanno modo di sapere ogni quanto riceveranno aggiornamenti e presumeranno che il dispositivo sia offline fino a che non gli viene detto diversamente.
In questo modo, vuoi per un riavvio di Home Assistant, vuoi per un dispositivo momentaneamente offline, tutto resta sincronizzato all'ultimo valore.

Questo è, a mio avviso, un modo comodo e veloce per avere sempre tutto sincronizzato senza restare nel dubbio...



Fonti :

Steve's Internet Guide - MQTT Retained Messages Explained
HiveMQ - MQTT Essentials Part 8: Retained Messages
Verne - Retained Messages



Nessun commento:

Posta un commento

Sei davvero sicuro di voler sprecare tempo prezioso per scrivere qualcosa? Non è che preferisci andare su Google?

Cerca nel blog

I post più letti di sempre