Un pannello energetico locale può iniziare con tre componenti: un broker MQTT, un flusso n8n e un database di serie temporali. Il flusso riceve una lettura di potenza, la converte in un record e la invia a InfluxDB; da lì è possibile consultare e rappresentare la serie.
Il modello n8n per il monitoraggio IoT combina già un MQTT Trigger, un nodo di codice e una richiesta HTTP a InfluxDB. Il suo esempio usa un ESP32 con sensore DHT22, ma il modello stesso propone di adattare il flusso ad altri dispositivi MQTT. In questo tutorial useremo letture di tensione, corrente e potenza, come quelle supportate dal monitor energetico di riferimento.
Il percorso sarà MQTT → n8n → InfluxDB. Il progetto di monitoraggio energetico di riferimento fornisce i dati del pannello tramite API; qui l'attenzione è rivolta alla ricezione delle letture e al loro invio a InfluxDB.
flowchart LR A["Publicador de prueba"] --> B["Mosquitto local"] B --> C["MQTT Trigger de n8n"] C --> D["Validar y convertir"] D --> E["HTTP Request"] E --> F["InfluxDB"] F --> G["Panel de consultas"]
Avvio locale con Docker
Questo Compose avvia n8n, Mosquitto e InfluxDB su una rete comune. Mosquitto è in ascolto sulla porta locale 1883, il broker usato anche dall'esempio di monitoraggio energetico disponibile su GitHub. La configurazione con accesso anonimo è adatta solo a questa dimostrazione locale: il repository avverte che un'installazione di produzione deve richiedere autenticazione, ACL per argomento e TLS.
services:
mosquitto:
image: eclipse-mosquitto:2
ports:
- "1883:1883"
command: ["mosquitto", "-c", "/mosquitto-no-auth.conf"]
volumes:
- ./mosquitto.conf:/mosquitto-no-auth.conf:ro
n8n:
image: n8nio/n8n:latest
ports:
- "5678:5678"
volumes:
- n8n_data:/home/node/.n8n
influxdb:
image: influxdb:2
ports:
- "8086:8086"
volumes:
- influxdb_data:/var/lib/influxdb2
volumes:
n8n_data:
influxdb_data:
Salva il file come compose.yaml. Per questo avvio Mosquitto richiede una configurazione esplicita:
listener 1883
allow_anonymous true
Avvia i servizi con docker compose up -d. Per collegare n8n a InfluxDB, ti serviranno l'indirizzo e la porta del database, il bucket, l'identificatore dell'organizzazione e un token; l'esempio di n8n indica questi dati per la richiesta HTTP. La porta di InfluxDB in questo Compose è la 8086.
Pubblica una lettura MQTT di prova
L'argomento seguirà il modello devices/{device_uid}/measurements, documentato dal monitor energetico su GitHub. L'identificatore del dispositivo è nell'argomento; il JSON contiene le misure e la marca temporale. Per simulare un dispositivo basta pubblicare manualmente una lettura da Python usando Paho MQTT.
python -m pip install paho-mqtt
import json
from datetime import datetime, timezone
import paho.mqtt.client as mqtt
broker = "localhost"
topic = "devices/DEV-002/measurements"
reading = {
"voltage": 230.4,
"current": 2.8,
"power": 645.1,
"timestamp": datetime.now(timezone.utc).isoformat()
}
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
client.connect(broker, 1883, 60)
client.publish(topic, json.dumps(reading), qos=0)
client.disconnect()
print("Lectura publicada:", reading)
L'argomento e i campi della lettura corrispondono allo schema di telemetria del repository IoT Energy Monitor. Pubblica il messaggio dopo aver attivato il flusso; se lo invii prima, il trigger non sarà ancora in ascolto.
Configura l'MQTT Trigger di n8n
Crea un nuovo workflow e aggiungi un nodo MQTT Trigger. Nelle credenziali, imposta l'host mosquitto e la porta 1883: all'interno di Docker, n8n deve usare il nome del servizio, non localhost. Iscrivilo a devices/+/measurements, che raccoglie le letture di qualsiasi dispositivo con questa struttura.
La documentazione di n8n descrive MQTT come un protocollo leggero di pubblicazione e sottoscrizione e rimanda alle credenziali MQTT per l'autenticazione di questo nodo. Per questo Compose locale, il broker è stato lasciato senza autenticazione; non riutilizzare questa configurazione al di fuori di una macchina di prova.
Aggiungi un nodo Code dopo il trigger. Poiché i nomi delle proprietà di output possono dipendere da come il messaggio arriva al nodo, pubblica prima una lettura e controlla l'elemento in ingresso nell'esecuzione di n8n. Il codice seguente accetta il JSON già interpretato oppure una stringa in message o payload; rifiuta i campi mancanti e i valori negativi prima della scrittura.
const input = $input.first().json;
let reading = input;
if (typeof input.message === 'string') {
reading = JSON.parse(input.message);
} else if (typeof input.payload === 'string') {
reading = JSON.parse(input.payload);
} else if (input.message && typeof input.message === 'object') {
reading = input.message;
}
const required = ['voltage', 'current', 'power', 'timestamp'];
for (const key of required) {
if (!(key in reading)) {
throw new Error(`Falta el campo ${key}`);
}
}
for (const key of ['voltage', 'current', 'power']) {
if (typeof reading[key] !== 'number' || reading[key] < 0) {
throw new Error(`Medida inválida: ${key}`);
}
}
const timestamp = Date.parse(reading.timestamp);
if (!Number.isFinite(timestamp)) {
throw new Error('La marca de tiempo no es válida');
}
return [{
json: {
voltage: reading.voltage,
current: reading.current,
power: reading.power,
timestampSeconds: Math.floor(timestamp / 1000)
}
}];
Invia i dati a InfluxDB
Collega un nodo HTTP Request a Code. Il modello n8n usa quel nodo per inviare i dati a InfluxDB e specifica che servono l'URL e la porta del database, il bucket, l'identificatore dell'organizzazione e un token. Configura questi valori in base all'istanza locale e al formato di scrittura supportato.
Il nodo Code seguente prepara una stringa di dati per il corpo della richiesta. Configura il nodo HTTP Request in base alle impostazioni di scrittura della tua istanza e passa questa stringa come corpo.
const { voltage, current, power, timestampSeconds } = $input.first().json;
const line = `energy,device=DEV-002 voltage=${voltage},current=${current},power=${power} ${timestampSeconds}`;
return [{ json: { line } }];
L'esempio imposta il dispositivo su DEV-002, che identifica il contatore MQTT nel progetto di riferimento. Per distinguere più dispositivi, usa un identificatore controllato dall'argomento e convalidane il valore prima di inserirlo come etichetta; non inserire testo ricevuto senza verificarlo.
Verifica la serie e consulta il pannello
Attiva il workflow ed esegui di nuovo il publisher. Verifica che le letture siano state memorizzate in InfluxDB; poi consulta i dati e visualizzali nel pannello in base alla configurazione della tua istanza.
Il modello n8n per i sensori remoti invia anch'esso i dati dal flusso a InfluxDB tramite HTTP e indica che possono essere visualizzati in tempo reale. Qui l'archiviazione mantiene separati tensione, corrente e potenza; le letture istantanee, da sole, non bastano per affermare il consumo cumulativo in kWh. Il monitor energetico di riferimento calcola tale energia integrando campioni consecutivi e ignorando gli intervalli troppo distanziati, invece di presumere che una singola lettura sia rimasta costante.
Problemi comuni
Se il trigger non riceve nulla, controlla prima l'host del broker: nel container n8n è mosquitto, mentre il publisher eseguito sul computer usa localhost. Verifica anche l'argomento esatto e che il workflow sia attivo.
Se il flusso raggiunge HTTP Request ma InfluxDB lo rifiuta, verifica l'organizzazione, il bucket, il token e che il corpo abbia il formato previsto dalla tua istanza. Una marca temporale non valida o una lettura con misure negative deve causare un errore nel nodo Code, prima di tentare di archiviarla.
Il broker di questo esempio è configurato per una prova locale. Se entra a far parte di un'installazione reale, sostituisci l'accesso anonimo con autenticazione, autorizzazioni per argomento e TLS; queste misure figurano anche tra le raccomandazioni di sicurezza del progetto di monitoraggio energetico.