Architettura

Come tutte le parti del sistema comunicano tra loro

Tempmonh è un sistema distribuito: l'intelligenza non si trova in un'unica macchina, ma è suddivisa tra la camera fisica, un server intermedio e un'app web. Ogni componente ha un ruolo preciso e comunica con gli altri attraverso protocolli standard aperti.

In parole semplici

Immagina un termostato intelligente. Il sensore nella stanza misura la temperatura e invia il dato. Un hub centrale lo riceve e lo memorizza in un diario. Il tuo telefono legge quel diario e ti mostra i grafici. Puoi anche mandare comandi dall'app e il termostato li esegue. Tempmonh funziona esattamente così, ma per una camera di fermentazione e con strumenti professionali.

ESP32 — Il cervello della camera

L'ESP32 è un microcontrollore dual-coreprogettato da Espressif Systems specificamente per applicazioni IoT. Integra nel singolo chip il processore, la memoria, il modulo Wi-Fi 802.11 b/g/n e il Bluetooth — eliminando la necessità di moduli separati. Un core gestisce la comunicazione di rete (MQTT, Wi-Fi), l'altro legge i sensori e controlla gli attuatori in tempo reale.

Specifiche principali
ArchitetturaDual-core Xtensa LX6 32-bit
Frequenzafino a 240 MHz
RAM520 KB SRAM
Flash4 MB
Wi-Fi802.11 b/g/n
Bluetoothv4.2 BR/EDR + BLE
GPIO22 pin
Protocolli supportatiI2C, SPI, UART, PWM, ADC
Deep sleep< 10 µA

Ruolo nel sistema

L'ESP32 è il nodo centrale della camera fisica. Legge il DHT22 ogni 2 secondi, controlla in base alla logica interna heating pad e ventole, aggiorna il display OLED, gestisce l'input del rotary encoder e pubblica tutti i dati sul broker MQTT via Wi-Fi. Riceve anche comandi dall'esterno tramite MQTT per il controllo remoto.

MQTT & Mosquitto — La rete postale

MQTT (Message Queuing Telemetry Transport) è un protocollo di messaggistica leggero, progettato per dispositivi con risorse limitate e reti instabili. Funziona con tre componenti: il publisher (chi pubblica il dato), il subscriber (chi lo riceve) e il broker(l'intermediario). Mosquittoè il broker open-source più usato al mondo per IoT: riceve i messaggi dall'ESP32 e li distribuisce a tutti i client iscritti — Telegraf, la dashboard Next.js — in millisecondi.

La comunicazione MQTT è full duplex: ogni client può pubblicare e sottoscriversi contemporaneamente, senza dover aspettare il turno dell'altro. Nel nostro sistema questo significa che l'ESP32 pubblica continuamente i dati dei sensori e allo stesso tempo rimane in ascolto sui topic di comando — pronti a ricevere istruzioni dalla dashboard in qualsiasi momento, senza che le due direzioni si ostacolino a vicenda.

Connessione ESP32 → Mosquitto — MQTT over TLS
ProtocolloMQTT over TLS 1.2 / 1.3
Porta8883 (MQTT sicuro)
Autenticazione brokerCertificato SSL (CA pubblica)
Autenticazione clientUsername + password
Libreria ESP32WiFiClientSecure + PubSubClient

L'ESP32 si connette al broker Mosquitto sulla porta standard 8883, riservata a MQTT over TLS. Prima di stabilire la connessione, verifica il certificato SSL del server tramite la CA root — garantendo che stia parlando col broker autentico e non con un intermediario malevolo (attacco man-in-the-middle). Il canale è cifrato end-to-end: tutti i messaggi di telemetria e i comandi viaggiano criptati sulla rete pubblica.

Regola critica — QoS dei comandi

MQTT definisce tre livelli di affidabilità nella consegna dei messaggi, detti Quality of Service (QoS):
  • QoS 0— "fire and forget": il messaggio viene inviato una volta sola, senza conferma. Se la rete cade in quel momento, il messaggio è perso.
  • QoS 1— "at least once": il broker conferma la ricezione. Se la conferma non arriva, il messaggio viene reinviato automaticamente fino a successo garantito.
  • QoS 2— "exactly once": consegna garantita esattamente una volta, con un handshake a quattro fasi.

I messaggi di telemetria (temperatura, umidità) possono usare QoS 0: se un dato va perso, quello successivo arriva dopo 2 secondi. I comandi inviati da Next.js verso l'ESP32 — accensione heating pad, velocità ventole, contenuto display — sono operazioni critiche e devono usare almeno QoS 1. Un comando perso potrebbe lasciare la camera in uno stato sbagliato senza che nessuno se ne accorga.

Topic MQTT del progetto

TBD (to be defined)

Telegraf + InfluxDB 2 — Il diario storico

Telegraf — il bridge intelligente

Telegraf è un agente di raccolta dati scritto in Go, sviluppato da InfluxData. La sua architettura a plugin lo rende estremamente flessibile: si configura per sottoscriversi ai topic MQTT di Mosquitto tramite il plugin mqtt_consumer, parsifica i payload JSON, e li riscrive in InfluxDB tramite il plugin influxdb_v2. Non richiede codice: solo un file di configurazione.

InfluxDB 2 — il database delle serie temporali

InfluxDB è un database progettato appositamente per dati con marca temporale. A differenza di un database SQL tradizionale, ottimizza l'archiviazione e le query su sequenze di valori nel tempo: "dammi la temperatura media ogni 5 minuti nelle ultime 24 ore" è una query nativa, velocissima anche con milioni di punti. Usa il linguaggio Flux per query analitiche avanzate e supporta retention policy (cancellazione automatica dei dati più vecchi di N giorni).

Struttura di un dato in InfluxDB

TBD (to be defined)

Esempio

dht22,device=esp32-01 temperature=28.5,humidity=78.2 1710842400000000000

Measurement

Nome del dato (es. dht22)

Fields

Valori misurati (temp., umidità)

Timestamp

Nanosec. Unix (momento esatto)

Next.js — La dashboard

La dashboard è costruita con Next.js 15 (App Router) ed è divisa in due modalità di accesso ai dati:

Dati real-time

La dashboard si connette direttamente a Mosquitto tramite WebSocket. Ogni volta che l'ESP32 pubblica un nuovo dato, arriva al browser in meno di un secondo. Nessun polling, nessun ritardo.

Dati storici

Grafici e statistiche vengono calcolati con query a InfluxDB 2 eseguite server-side (Server Components di Next.js). Le credenziali del DB non raggiungono mai il browser.

Controllo remoto — Pub/Sub MQTT

Per inviare un comando alla camera (es. "accendi il heating pad"), la dashboard pubblica un messaggio su un topic MQTT di comando. Mosquitto lo instrada all'ESP32 che lo riceve e lo esegue fisicamente. Il meccanismo è bidirezionale: la camera pubblica stato, la dashboard pubblica comandi.

Dashboard → pubblica → Mosquitto → instrada → ESP32 → esegue → Heating pad ON

Sicurezza

Tutte le query a InfluxDB avvengono server-side in Next.js: il token di accesso al database non lascia mai il server. Il client (browser) vede solo i dati già elaborati, mai le credenziali. La connessione MQTT tra ESP32 e Mosquitto avviene sulla porta 8883 (MQTT over TLS), con verifica del certificato SSL lato ESP32. La dashboard si connette invece tramite WebSocket sicuro (WSS su porta 443) gestito da Traefik come reverse proxy.