geek.sonde.uk updated:
MQTT IoT LilyGo LoRa32 rdz_ttgo_sonde

MQTT: Guida Pratica per IoT e Radiosonde

Scopri come funziona il protocollo MQTT, come installare un broker locale, e come usarlo sia in scenari IoT generici sia con il ricevitore LilyGo LoRa32 che esegue rdz_ttgo_sonde per inviare dati di radiosonde in tempo reale.

~20 min read Linux / ESP32 Difficulty: Intermediate
01

Cos'è MQTT e perché usarlo

MQTT (Message Queuing Telemetry Transport) è un protocollo di messaggistica leggero, pensato per ambienti con larghezza di banda ridotta, alta latenza o dispositivi con poca RAM — esattamente il tipo di scenario che si incontra nell'IoT e con microcontrollori come l'ESP32.

Il modello di comunicazione è publish/subscribe: i client non si parlano direttamente ma attraverso un intermediario chiamato broker. Chi ha dati da condividere li pubblica su un topic (una stringa gerarchica); chi vuole riceverli si sottoscrive a quel topic.

Vantaggi principali rispetto a HTTP per l'IoT:

  • Overhead minimo: header fisso di soli 2 byte, ideale per connessioni lente o instabili.
  • Disaccoppiamento: publisher e subscriber non devono essere online allo stesso momento (con QoS 1/2).
  • Fan-out nativo: un singolo messaggio raggiunge tutti i subscriber interessati senza duplicare la trasmissione.
  • Wildcard sui topic: + (un livello) e # (tutto il sotto-albero) permettono sottoscrizioni flessibili.
  • QoS configurabile: 0 (at-most-once), 1 (at-least-once), 2 (exactly-once).
ℹ️
Porta standard

MQTT usa la porta 1883 in chiaro e 8883 con TLS. Molti broker espongono anche WebSocket su 9001 per l'uso da browser.

02

Prerequisiti

Prima di iniziare, assicurati di avere:

  • Un sistema Linux (Debian/Ubuntu o derivati) oppure un Raspberry Pi per il broker.
  • Accesso root o sudo sulla macchina dove installerai il broker.
  • Il LilyGo LoRa32 già flashato con il firmware rdz_ttgo_sonde e connesso alla tua rete WiFi locale.
  • Conoscenza base della riga di comando Linux.
  • Opzionale: Node-RED o Home Assistant per visualizzare i dati.
⚠️
Broker locale vs cloud

Questa guida usa Mosquitto in locale. Per uso in produzione con accesso remoto valuta HiveMQ Cloud, EMQX Cloud o un broker self-hosted con TLS abilitato e autenticazione obbligatoria.

03

Installare Mosquitto (broker MQTT)

Mosquitto è il broker MQTT open-source più diffuso, leggero e facile da configurare. È la scelta ideale per un laboratorio casalingo o un Raspberry Pi.

bash
# Aggiorna i repository e installa broker + client CLI
sudo apt update && sudo apt install -y mosquitto mosquitto-clients

# Abilita e avvia il servizio
sudo systemctl enable --now mosquitto

Di default Mosquitto su Debian/Ubuntu accetta connessioni solo da localhost. Per consentire ai dispositivi della rete locale (come il LilyGo) di connettersi, crea un file di configurazione personalizzato:

bash
sudo nano /etc/mosquitto/conf.d/local.conf
config /etc/mosquitto/conf.d/local.conf
# Ascolta su tutte le interfacce, porta standard
listener 1883

# Permetti connessioni anonime (solo in LAN fidata!)
allow_anonymous true

# Abilita i log (utile per il debug)
log_dest file /var/log/mosquitto/mosquitto.log
log_type all
bash
# Riavvia per applicare la configurazione
sudo systemctl restart mosquitto
⚠️
Sicurezza in produzione

Con allow_anonymous true chiunque in rete può pubblicare e leggere i topic. Per aggiungere autenticazione usa mosquitto_passwd e imposta allow_anonymous false nel config.

04

Primi test con mosquitto_sub e mosquitto_pub

Prima di coinvolgere qualsiasi dispositivo hardware, verifica che il broker funzioni usando i client CLI inclusi nel pacchetto mosquitto-clients.

Apri due terminali. Nel primo, sottoscrivi a un topic di test:

bash terminale 1 — subscriber
mosquitto_sub -h localhost -t "test/hello" -v

Nel secondo terminale, pubblica un messaggio:

bash terminale 2 — publisher
mosquitto_pub -h localhost -t "test/hello" -m "Ciao MQTT!"

Nel primo terminale dovresti vedere immediatamente:

output
test/hello Ciao MQTT!

Prova ora le wildcard — sottoscrivi a tutti i sensori in una struttura gerarchica:

bash
# '#' cattura TUTTO ciò che parte da 'casa/'
mosquitto_sub -h localhost -t "casa/#" -v

# '+' sostituisce un singolo livello (es. qualsiasi stanza)
mosquitto_sub -h localhost -t "casa/+/temperatura" -v
Il broker funziona

Se il messaggio arriva, Mosquitto è configurato correttamente. Ora nota l'IP della macchina con ip a — ti servirà per configurare i client remoti.

05

Casi d'uso generici per IoT

MQTT si adatta a qualsiasi scenario dove dispositivi eterogenei devono scambiarsi dati in modo asincrono. Ecco una struttura di topic consigliata e alcuni pattern comuni.

Convenzione per i topic: usa una gerarchia descrittiva come:

topic schema
# Schema consigliato
{progetto}/{luogo}/{dispositivo}/{metrica}

# Esempi concreti
casa/soggiorno/esp32-01/temperatura
casa/giardino/sensore-pioggia/stato
impianto/pannelli/inverter/potenza_w
stazione-meteo/roof/bmp280/pressione_hpa

Esempio: ESP32 che pubblica temperatura con MicroPython:

python main.py (MicroPython)
import network, time, json
from umqtt.simple import MQTTClient

BROKER = "192.168.1.100"   # IP del tuo server Mosquitto
CLIENT_ID = "esp32-soggiorno"
TOPIC = b"casa/soggiorno/esp32-01/temperatura"

client = MQTTClient(CLIENT_ID, BROKER)
client.connect()

while True:
    temp = leggi_sensore()   # funzione che legge il tuo DHT22, ecc.
    payload = json.dumps({"value": temp, "unit": "C"})
    client.publish(TOPIC, payload)
    time.sleep(30)

Retained messages — mantieni sempre l'ultimo valore disponibile per i nuovi subscriber:

bash
# Il flag -r pubblica con retain=true
# Ogni nuovo subscriber riceverà subito l'ultimo valore
mosquitto_pub -h localhost -t "casa/soggiorno/luce/stato" \
    -m '{"stato":"on","brightness":80}' -r

Last Will and Testament (LWT) — il broker pubblica un messaggio automatico se il client si disconnette inaspettatamente:

bash
# --will-topic / --will-payload configurano il messaggio di "morte"
mosquitto_sub -h localhost -t "casa/#" \
    --will-topic "casa/esp32-01/status" \
    --will-payload "offline" \
    --will-retain -v
ℹ️
Integrazione con Node-RED

Node-RED ha nodi MQTT nativi (mqtt in / mqtt out). Basta configurare il broker e trascinare i nodi sulla canvas per creare dashboard, automazioni e integrazioni senza scrivere codice.

06

Configurare MQTT su rdz_ttgo_sonde

Il firmware rdz_ttgo_sonde per LilyGo LoRa32 supporta MQTT come output nativo. Una volta abilitato, il ricevitore pubblica automaticamente i dati di ogni radiosonde decodificata (posizione GPS, temperatura, umidità, altitudine, RSSI) su un topic del tuo broker.

Accedi all'interfaccia web del dispositivo (l'IP è mostrato sul display) e vai su Config → Data feed. Compila i seguenti campi:

config Interfaccia web → Config → Data feed
MQTT Active (needs reboot)  = 1
MQTT client ID              = lilygolora-sonde
MQTT server hostname        = 192.168.1.100   # IP del tuo broker
MQTT Port                   = 1883
MQTT Username               =                # vuoto se allow_anonymous true
MQTT Password               = 
MQTT Prefix                 = sonde/         # prefisso dei topic

Salva e riavvia il dispositivo. Dopo il reboot, sottoscrivi al topic per vedere i dati in arrivo:

bash
# '#' cattura tutto ciò che pubblica il LilyGo sotto il prefisso sonde/
mosquitto_sub -h 192.168.1.100 -t "sonde/#" -v

Quando viene decodificata una radiosonde, riceverai un payload JSON simile a questo:

json payload esempio (RS41)
{
  "lat":   45.4654,
  "lon":   9.1865,
  "alt":   12540.3,
  "vs":    5.2,       // velocità verticale m/s
  "hs":    8.5,       // velocità orizzontale m/s
  "dir":   282.9,     // direzione gradi
  "type":  "RS41",
  "id":    "V1620877",
  "frame": 6507,
  "temp":  -42.1,
  "hum":   14.3,
  "rssi":  -87
}
⚠️
Broker non raggiungibile → possibile interferenza

Se il broker MQTT non è raggiungibile dalla rete WiFi del LilyGo, la libreria async-mqtt-client effettua tentativi di riconnessione ripetuti. Su ESP32 le callback WiFi possono introdurre jitter nei timer della decodifica FSK. Se noti perdita di frame, verifica prima che il broker sia online e raggiungibile dall'IP del dispositivo.

07

Integrare i dati in Home Assistant

Home Assistant con l'add-on Mosquitto broker integrato o con un broker esterno può ricevere e visualizzare i dati delle radiosonde come sensori nella dashboard.

Aggiungi i sensori MQTT in configuration.yaml (o tramite l'editor UI):

yaml configuration.yaml
mqtt:
  sensor:
    - name: "Radiosonde Altitudine"
      state_topic: "sonde/lilygolora-sonde"
      value_template: "{{ value_json.alt | round(0) }}"
      unit_of_measurement: "m"
      icon: "mdi:weather-windy"

    - name: "Radiosonde Temperatura"
      state_topic: "sonde/lilygolora-sonde"
      value_template: "{{ value_json.temp }}"
      unit_of_measurement: "°C"
      device_class: "temperature"

    - name: "Radiosonde ID"
      state_topic: "sonde/lilygolora-sonde"
      value_template: "{{ value_json.id }}"

    - name: "Radiosonde RSSI"
      state_topic: "sonde/lilygolora-sonde"
      value_template: "{{ value_json.rssi }}"
      unit_of_measurement: "dBm"
      icon: "mdi:signal"

Se usi Home Assistant con Mosquitto add-on integrato, configura rdz_ttgo_sonde con:

config rdz_ttgo_sonde → Config → Data feed
MQTT server hostname  = homeassistant.local   # o IP di HA
MQTT Port             = 1883
MQTT Username         = homeassistant          # utente Mosquitto HA
MQTT Password         = la-tua-password
ℹ️
Mosquitto add-on in HA

L'add-on Mosquitto di Home Assistant abilita l'autenticazione per default. Crea un utente dedicato dal pannello Impostazioni → Persone e usalo nelle credenziali MQTT del firmware.

08

Visualizzare i dati con Node-RED

Node-RED è un ambiente di programmazione visuale che permette di creare flussi di elaborazione dati senza scrivere molto codice. È ideale per loggare, trasformare e visualizzare i messaggi MQTT delle radiosonde.

Installa Node-RED (se non già presente):

bash
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
sudo systemctl enable --now nodered

Un flusso Node-RED minimo per ricevere e loggare i dati delle sonde:

json Flusso importabile in Node-RED
[
  {
    "id": "mqtt-in-sonde",
    "type": "mqtt in",
    "topic": "sonde/#",
    "broker": "192.168.1.100",
    "datatype": "json"
  },
  {
    "id": "parse-sonde",
    "type": "function",
    "func": "msg.payload = { id: msg.payload.id, alt: msg.payload.alt, temp: msg.payload.temp }; return msg;"
  },
  {
    "id": "debug-out",
    "type": "debug",
    "complete": "payload"
  }
]

Con i nodi node-red-dashboard puoi aggiungere gauge, grafici temporali e mappe per vedere la traiettoria della sonde in tempo reale.

ℹ️
Nota sul JSON di rdz_ttgo_sonde

Alcune versioni del firmware possono generare JSON con una virgola finale prima della chiusura (,}), non valida secondo lo standard. Se il nodo JSON di Node-RED restituisce errori di parsing, usa un nodo function per sanitizzare il payload: msg.payload = msg.payload.replace(/,\s*\}/g, '}');

09

Verifica e debug

Comandi utili per diagnosticare problemi di connessione o messaggi mancanti:

bash
# Verifica che il broker sia attivo e in ascolto
sudo systemctl status mosquitto

# Controlla i log del broker in tempo reale
sudo tail -f /var/log/mosquitto/mosquitto.log

# Verifica che la porta 1883 sia aperta
ss -tlnp | grep 1883

# Testa la raggiungibilità dal LilyGo (dalla macchina broker)
# (sostituisci con l'IP del LilyGo mostrato sul display)
ping 192.168.1.XXX

# Sniffa TUTTI i messaggi sul broker (utile per debug)
mosquitto_sub -h localhost -t "#" -v

Se il LilyGo non si connette al broker, controlla in ordine:

  • Il LilyGo è connesso alla stessa rete WiFi del broker? L'IP è visibile sul display.
  • Il firewall del server blocca la porta 1883? (sudo ufw allow 1883/tcp)
  • L'hostname o IP del broker è corretto nella config di rdz_ttgo_sonde?
  • Il Client ID è univoco? Due client con lo stesso ID si disconnettono a vicenda.
Tutto funzionante!

Quando vedi i messaggi JSON arrivare da mosquitto_sub -t "sonde/#" -v ogni volta che il LilyGo decodifica una sonde, il setup è completo. Puoi ora collegarci Home Assistant, Node-RED, Grafana+InfluxDB o qualsiasi altro sistema che parla MQTT.