Integrazione MQTT
MQTT collega HyperVisu al mondo publish/subscribe: Zigbee2MQTT, Tasmota, Shelly (modalità MQTT), ESPHome, gateway energetici e qualsiasi firmware personalizzato che comunica con un broker MQTT. HyperVisu è un client MQTT: sottoscrive i topic su cui i dispositivi pubblicano il proprio stato e pubblica i comandi sui topic ascoltati dai dispositivi. Non c'è polling: un dispositivo che cambia stato esegue la pubblicazione e il widget si aggiorna immediatamente.
Al centro c'è un broker. Può essere un broker già attivo (Mosquitto, EMQX, quello integrato in un'installazione Zigbee2MQTT, …) oppure il broker integrato in HyperVisu, eseguibile direttamente dal server per consentire ai dispositivi di collegarsi senza intermediari (vedere "The Built-in MQTT Broker"). Tutto quanto descritto in questo articolo si applica a entrambi i casi: il broker integrato è un normale broker, accessibile tramite una comune connessione.
Cosa serve: l'indirizzo e la porta del broker, le sue credenziali di accesso se richieste, nonché i topic e il formato del payload del dispositivo (ricavabili dalla documentazione tecnica del dispositivo o letti direttamente dal broker con il topic browser descritto di seguito).
Connessioni. Attiva prima MQTT Protocol nella pagina Services (vedere "Services & Protocols"); su un server nuovo è disattivato. MQTT supporta connessioni multiple: una connessione per ciascun broker (vedere "Connections"). In Add connection, seleziona la scheda MQTT: la finestra di dialogo richiede Instance Name, Broker address, Port, Client ID e le credenziali, oltre a presentare il pulsante Test. Il CA certificate e le Broker options (Keepalive, Default QoS, Availability topic, Clean session) non compaiono in questa finestra: vanno impostati sulla connessione salvata, che si apre nel rispettivo editor appena si fa clic su Create connection. L'editor della connessione comprende:
| Campo | Descrizione |
|---|---|
| Broker address | Host o URL completo: mqtt://, mqtts://, ws://, wss:// (un semplice host corrisponde a mqtt://). Un eventuale percorso nell'indirizzo viene mantenuto, ad esempio ws://192.168.1.30/mqtt. |
| Port | La porta di ascolto: solitamente 1883 per MQTT standard e 8883 per MQTT su TLS. Inseriscila sempre: nella finestra di dialogo Add connection un campo porta vuoto viene salvato come 1883 a prescindere dallo schema, e il campo Port prevale sulla porta eventualmente indicata nell'indirizzo. |
| Username / Password | Lasciare vuoto per un broker anonimo. |
| Client ID | Lasciare vuoto per generarne uno a partire dall'indirizzo MAC del server. |
| Accept self-signed certificates | Visibile solo per mqtts:// / wss://. Disattivato per impostazione predefinita: il certificato del broker deve essere firmato da un'autorità fidata. Se attivato, il certificato non viene verificato. |
| CA certificate | Visibile solo per TLS: il certificato PEM dell'autorità che ha firmato il broker, quando non è pubblica. |
| Keepalive | Intervallo massimo di inattività del collegamento prima dell'invio di un ping (predefinito 60 s). |
| Default QoS | 0 · at most once, 1 · at least once o 2 · exactly once: utilizzato da ogni oggetto che non ne definisce uno specifico. |
| Availability topic / Announce HyperVisu availability | Topic su cui HyperVisu pubblica il proprio stato online / offline (predefinito hypervisu/status, retained). Il broker pubblica offline per suo conto in caso di caduta del collegamento. |
| Clean session | Attivo (predefinito): il broker cancella le sottoscrizioni alla perdita del collegamento e HyperVisu le rinnova alla riconnessione. Disattivare solo per un broker che deve accodare i messaggi mentre HyperVisu è offline. |
Il pulsante Test su una connessione MQTT esegue una verifica reale: il server si collega al broker e attende la risposta (entro 10 s). Un esito positivo mostra Connection succeeded. Nella finestra di dialogo Add connection, Test prova i valori digitati prima di creare la connessione. Su una connessione salvata, Test verifica i parametri salvati, non i campi non ancora memorizzati: fare prima clic su Save connection, poi su Test. L'esito positivo del test conferma che indirizzo, porta, credenziali e impostazioni TLS sono accettati dal broker; non certifica la presenza di dati sui topic.
Lo stato della connessione indica Connected finché il collegamento con il broker è attivo. Se il broker si disconnette, il tentativo di riconnessione si ripete ogni pochi secondi senza limiti: non è mai necessario riavviare il server.
📘 Nota: Dopo aver creato o salvato una connessione, compare Apply changes nella barra laterale con un contatore. La connessione è già operativa senza applicare; l'applicazione ricarica la configurazione del server e azzera il contatore.

Associazione di un oggetto (vedere "Binding MQTT" di seguito). Per ogni oggetto si inserisce un Topic; l'amministrazione lo memorizza come <connection>:<topic>, consentendo a due broker di gestire lo stesso nome topic. La direzione dell'oggetto determina il comportamento:
| Direzione | Comportamento |
|---|---|
| In | Sottoscrive il topic (topic di stato). Sono consentiti i caratteri jolly: + per un singolo livello, # per i livelli successivi. |
| Out | Pubblica sul topic (topic di comando). Deve essere un topic esatto: nessun carattere jolly. |
| In/Out | Sottoscrive e pubblica sullo stesso topic. Corretto solo per dispositivi che mantengono lo stato retained su un unico topic; è preferibile usare due oggetti distinti (uno In, uno Out). |
Il codec del payload — la modalità di conversione del payload in valore e viceversa — è la stringa del tipo di dati dell'oggetto, composta dall'editor a partire da questi campi:
| Campo | Memorizzato come | Significato |
|---|---|---|
| Payload format | — / PATH= | Raw value: l'intero payload costituisce il valore. JSON: il valore viene letto al percorso JSON path (state, sensor.temperature, values[0]). |
| ON token / OFF token | ON= / OFF= | Per oggetti booleani: i valori scritti e attesi dal dispositivo per vero/falso (es. ON / OFF). Senza token, true/false, 1/0, on/off sono interpretati in ingresso e true/false viene pubblicato in uscita. |
| Scale / Offset | SCALE= / OFFSET= | Lettura: valore = raw × scala + offset; la pubblicazione applica la formula inversa, raw = (valore − offset) ÷ scala. Un oggetto di comando e il rispettivo oggetto di stato utilizzano quindi la stessa scala. |
| Payload template | PUB= | Modello di pubblicazione opzionale; {{value}} viene sostituito dal valore, es. {"state":"{{value}}"}. Lasciare vuoto per pubblicare il valore puro. |
| QoS | QOS= | Broker default, 0, 1 o 2 per questo comando. |
| Retain published messages | RETAIN=1 | Disattivato per impostazione predefinita. |
| Minimum interval (ms) | THROTTLE= | I sensori con frequenza di invio elevata vengono limitati a questo intervallo (predefinito 100 ms); l'ultimo valore viene sempre ricevuto. 0 disattiva il filtro. |
La stringa ha il formato TYPE:param:param… — ad esempio BOOL:PATH=state:ON=ON:OFF=OFF oppure FLOAT:SCALE=0.3937:PUB={"brightness":{{value}}}. Una stringa vuota indica di "trattare il payload grezzo secondo il tipo dell'oggetto". L'editor dell'oggetto non contiene un campo per il tipo di dati: il tipo corrisponde a quello visualizzato sul campo selezionato nel topic browser (descritto di seguito), e la selezione di un campo aggiorna automaticamente il tipo dell'oggetto. Gli oggetti colore (RGB) accettano {"r","g","b"}, {"red","green","blue"}, [r,g,b], #RRGGBB e 255,128,0 in ingresso, e pubblicano {"r":…,"g":…,"b":…} a meno di impostare un template differente.
⚠️ Attenzione: Un comando inviato con flag retained viene rieseguito a ogni riconnessione del dispositivo al broker. Mantieni come retained lo stato, non i comandi: l'editor segnala un avviso quando si attiva il flag retain su un oggetto in uscita.
Topic browser. MQTT è l'unico protocollo i cui indirizzi possono essere rilevati direttamente dalla rete. Nell'editor dell'oggetto, alla sezione MQTT topic configuration, fare clic su Scan broker: il server resta in ascolto sull'intero broker per quattro secondi e segnala il numero di topic rilevati (i topic con flag retained arrivano subito, quindi una scansione breve mostra già la maggior parte dei punti utili; per un dispositivo senza retained, inviare una lettura e ripetere la scansione). L'elenco è limitato a 500 topic. L'editor non consente la scansione parziale del broker: aprire Topic e digitare in Search topics… per filtrare i risultati, oppure inserire il topic manualmente. Ogni riga mostra il topic e il rispettivo last payload, accompagnato dall'etichetta retained. Seleziona un topic e:
- per un payload JSON, ogni parametro è elencato sotto Pick the value this object should follow: un clic imposta il percorso JSON, il tipo di oggetto e, per i booleani, i token ON/OFF con la sintassi specifica del dispositivo;
- per un payload semplice, Use the raw payload as
assegna il tipo.
Seleziona il topic prima di fare clic su un parametro: la scelta di un altro topic reimposta il formato del payload, il percorso JSON e i token. Il clic non compila i campi Scale e Offset.
È comunque possibile inserire manualmente un topic non rilevato dalla scansione: un topic di comando potrebbe non essere mai stato pubblicato, oppure un oggetto in ingresso potrebbe richiedere un carattere jolly. Digitalo nel campo Topic e fai clic su Use "…" nell'elenco.

Caratteristiche di funzionamento utili
- Stato immediato al riavvio. I messaggi retained vengono ritrasmessi dal broker a ogni connessione o riconnessione: i widget mostrano i valori senza attendere la successiva pubblicazione del dispositivo.
- Nessun feedback fittizio. Un comando viene confermato solo quando il dispositivo pubblica il proprio topic di stato (o il broker lo ritrasmette), esattamente come per gli oggetti di stato KNX. Se il dispositivo non risponde, il widget non simula lo stato.
- Comandi durante una disconnessione. I comandi con QoS 1 o 2 vengono accodati se il broker non è raggiungibile e recapitati al ripristino della connessione; i comandi con QoS 0 verso un broker non raggiungibile non vanno a buon fine e vengono registrati nei log.
- Protezione. I payload superiori a 64 KB vengono scartati con un avviso; viene aperta una sola sottoscrizione per ciascun filtro di topic distinto, indipendentemente dal numero di oggetti associati.
Esempio pratico: lampada dimmerabile Zigbee2MQTT
Zigbee2MQTT pubblica lo stato della lampada in formato JSON su zigbee2mqtt/lamp ({"state":"ON","brightness":178}) e accetta comandi su zigbee2mqtt/lamp/set. La luminosità varia da 0 a 254.
- Crea una connessione MQTT per il broker (vedere "Connections"): indirizzo broker
192.168.1.10, porta1883, credenziali del broker Zigbee2MQTT se presenti. Fai clic su Test: deve confermare l'esito positivo. - In Devices, aggiungi un widget Dimmer denominato "Luce ufficio". In Protocol, seleziona la connessione del broker identificata dal nome assegnato. Il dispositivo viene creato con quattro oggetti: Switch ON/OFF, Switch Feedback, Dimming setpoint e Dimming feedback.
- Su Switch ON/OFF (comando on/off): digita
zigbee2mqtt/lamp/setin Topic e fai clic su Use "…" nell'elenco. Imposta ON token suON, OFF token suOFFe Payload template su{"state":"{{value}}"}. Digita manualmente i token: le vociONeOFFin grigio sono solo indicazioni d'esempio; senza token l'interruttore pubblicatrueofalse. - Su Switch Feedback (stato on/off): fai clic su Scan broker, seleziona
zigbee2mqtt/lamp, quindi fai clic sul campostate: l'editor imposta il percorso JSONstatee i tokenON/OFF. - Su Dimming setpoint (comando luminosità): topic
zigbee2mqtt/lamp/set, Payload template{"brightness":{{value}}}, Scale0.3937, Offset0. - Su Dimming feedback (stato luminosità): topic
zigbee2mqtt/lamp, fai clic sul campobrightnesse imposta la stessa Scale0.3937. Questo valore corrisponde a circa100/254: i valori in ingresso vengono moltiplicati per tale fattore (la scala Zigbee 0–254 diventa 0–100 %), mentre i valori in uscita vengono divisi (0–100 % diventa 0–254). - Fai clic su Save object per ciascun oggetto, quindi fai clic su Apply changes nella barra laterale e conferma.
- Imposta la luminosità al
50 %nell'app. La lampada riceve circa127e il suo feedback restituisce circa50 %. Il cursore conferma il valore dal topic di stato, e anche regolando la lampada dal telecomando fisico l'app si aggiorna di conseguenza.
📘 Nota: Il valore trasmesso non è arrotondato:
50 %viene pubblicato come127.000254. L'editor dell'oggetto non include un campo per il tipo di dati, pertanto non è possibile forzare un oggetto di comando a inviare un numero intero. Verifica che la lampada supporti valori decimali di luminosità.
Binding MQTT
Gli oggetti MQTT si configurano nella finestra delle impostazioni dell'oggetto (aprire l'oggetto con Edit, vedere "Object Settings, Logging & Notifications"). La sezione dedicata al protocollo è suddivisa in tre schede:
MQTT topic configuration
| Campo | Descrizione |
|---|---|
| Topic | Il topic sottoscritto dall'oggetto (In: topic di stato, con caratteri jolly + e # ammessi) o sul quale l'oggetto pubblica (Out: topic di comando, senza caratteri jolly). Selezionalo dall'elenco dopo Scan broker oppure digitalo. L'indirizzo memorizzato è <connection>:<topic>. |
| Scan broker | Si mette in ascolto sul broker per alcuni secondi ed elenca i topic rilevati, ciascuno con il rispettivo Last payload e l'etichetta retained. Con un topic selezionato, un payload JSON mostra i suoi campi sotto Pick the value this object should follow: un clic compila percorso JSON, tipo di dati e token ON/OFF; un payload semplice propone Use the raw payload as |
| Payload format | Raw value (l'intero payload costituisce il valore) o JSON con un JSON path (state, sensor.temperature, values[0]). |
| ON token / OFF token | Oggetti booleani: valori scritti e attesi dal dispositivo per vero/falso (es. ON / OFF). |
Publishing (oggetti in uscita)
| Campo | Descrizione |
|---|---|
| Payload template | Opzionale. {{value}} viene sostituito dal valore; lasciare vuoto per pubblicare il valore puro. |
| QoS | Broker default, 0, 1 o 2: il livello di consegna garantito per questo comando. |
| Retain published messages | Disattivato per impostazione predefinita. Un comando retained viene eseguito a ogni riconnessione del dispositivo: memorizza lo stato, non i comandi. |
Subscribing (oggetti in ingresso)
| Campo | Descrizione |
|---|---|
| Minimum interval (ms) | I sensori con frequenza di invio elevata vengono limitati a questo intervallo (predefinito 100 ms); l'ultimo valore viene sempre ricevuto. 0 disattiva il filtro. |
| Scale / Offset | Oggetti numerici: valore = raw × scala + offset in ingresso, formula inversa in pubblicazione. |
I campi vengono memorizzati come stringa del tipo di dati dell'oggetto (es. BOOL:PATH=state:ON=ON:OFF=OFF): la sintassi, il topic browser e un esempio pratico sono descritti nel capitolo MQTT sopra.
