Grafana per il monitoraggio industriale dell'IoT: dashboard Modbus, avvisi, cronologia

· 9 minuti di lettura
9 min read
Team Eziwan
Infrastruttura IoT

Grafana è diventato lo strumento di riferimento per la visualizzazione dei dati industriali. Gratuito, open source ed estensibile, trasforma i vostri dati Modbus, OPC-UA o MQTT in dashboard operative. Questa guida vi mostra come progettare un sistema completo di monitoraggio industriale con Grafana — oppure come Eziwan ve lo offre già pronto all’uso.


Perché scegliere Grafana per il monitoraggio industriale?

Grafana si è affermato nel settore per diversi motivi:

  • Connettori universali: InfluxDB, TimescaleDB, PostgreSQL, Prometheus, MQTT, REST API — una fonte di dati per ogni stack
  • Pannelli avanzati: serie temporali, indicatori, statistiche, tabelle, mappe di calore, diagrammi di flusso (con plugin)
  • Avvisi integrati: notifiche via SMS, e-mail, Slack, PagerDuty, webhook
  • Gestione degli accessi: team, cartelle, autorizzazioni per dashboard
  • Plugin di settore: P&ID (diagrammi di flusso), schemi di tubazioni, schemi sinottici

Rispetto a un sistema SCADA tradizionale:

Grafana (+ stack IoT)SCADA Wonderware/Ignition
Costo della licenza0 (open source)5.000–50.000 €
Costo dell'hosting50–200 €/mese (cloud)Server dedicato + manutenzione
Variabili illimitate❌ (fatturazione per tag)
Interfaccia web nativa✅ (Ignition) / ❌ (Wonderware)
Ottimizzato per dispositivi mobiliParzialmente
Integrazione cloudNativaComplessa

Architettura: da Modbus a Grafana

Lo stack completo per monitorare i controllori Modbus in Grafana:

Alternativa per grandi volumi:

Soluzione Eziwan (tutto in uno):

Eziwan integra lo stack completo (raccolta dati Modbus/OPC-UA, serie temporali nel cloud, dashboard Grafana preconfigurate, avvisi via SMS/e-mail) senza che sia necessario installare e gestire i singoli componenti.


Installare Grafana + InfluxDB con Docker

# docker-compose.yml
version: '3.8'

services:
influxdb:
image: influxdb:2.7
ports:
- "8086:8086"
environment:
DOCKER_INFLUXDB_INIT_MODE: setup
DOCKER_INFLUXDB_INIT_USERNAME: admin
DOCKER_INFLUXDB_INIT_PASSWORD: mot_de_passe_securise
DOCKER_INFLUXDB_INIT_ORG: eziwan
DOCKER_INFLUXDB_INIT_BUCKET: industrie
DOCKER_INFLUXDB_INIT_RETENTION: 1825d # 5 ans
volumes:
- influxdb_data:/var/lib/influxdb2

grafana:
image: grafana/grafana:10.4.0
ports:
- "3000:3000"
environment:
GF_SECURITY_ADMIN_PASSWORD: grafana_securise
volumes:
- grafana_data:/var/lib/grafana
depends_on:
- influxdb

telegraf:
image: telegraf:1.29
volumes:
- ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
depends_on:
- influxdb

volumes:
influxdb_data:
grafana_data:

Configurazione di Telegraf per MQTT

# telegraf.conf
[[inputs.mqtt_consumer]]
servers = ["tcp://localhost:1883"]
topics = ["usine/#"]
qos = 1
data_format = "json"

# Analisi sintattica del topic MQTT: fabbrica/sito/stazione/variabile
[[inputs.mqtt_consumer.topic_parsing]]
topic = "usine/+/+/+"
tags = "_/_/station/_"
fields = "_/_/_/value"

[[outputs.influxdb_v2]]
urls = ["http://influxdb:8086"]
token = "votre_token_influxdb"
organization = "eziwan"
bucket = "industrie"

Creare il proprio primo dashboard industriale

Pannello 1: Grafico di tendenza (serie temporale)

Per visualizzare l'andamento della pressione di una stazione nel tempo:

Query InfluxDB (Flux):

from(bucket: "industrie")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "mqtt_consumer")
|> filter(fn: (r) => r["station"] == "station1")
|> filter(fn: (r) => r["_field"] == "pression")
|> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
|> yield(name: "mean")

Pannello delle impostazioni:

  • Tipo: Time series
  • Unità asse Y: bar (Pressione)
  • Spessore linea: 2
  • Opacità riempimento: 10
  • Soglie: verde < 8 bar, arancione 8-10 bar, rosso > 10 bar

Pannello 2: Indicatore (Valore istantaneo)

Per visualizzare il valore corrente di una variabile:

Query InfluxDB:

from(bucket: "industrie")
|> range(start: -1m)
|> filter(fn: (r) => r["station"] == "station1" and r["_field"] == "pression")
|> last()

Impostazioni del pannello:

  • Tipo: Gauge
  • Min: 0, Max: 16
  • Unità: bar
  • Soglie: 0=verde, 10=arancione, 12=rosso

Panel 3: Statistiche (KPI)

Per visualizzare il TRS o un contatore di produzione:

Query InfluxDB:

from(bucket: "industrie")
|> range(start: -24h)
|> filter(fn: (r) => r["_field"] == "pieces_produites")
|> sum()

Parametri pannello:

  • Tipo: Stat
  • Unità: pcs (personalizzata)
  • Modalità colore: Background (rosso se < obiettivo)

Panel 4: Tabella multisito

Per visualizzare lo stato di tutti i tuoi siti in tempo reale:

from(bucket: "industrie")
|> range(start: -5m)
|> filter(fn: (r) => r["_field"] == "pression" or r["_field"] == "debit" or r["_field"] == "etat")
|> last()
|> pivot(rowKey: ["_time", "station"], columnKey: ["_field"], valueColumn: "_value")

Risultato: tabella con le colonne Stazione / Pressione / Portata / Stato, una riga per ogni sito.


Configurare gli avvisi di Grafana

Avviso di superamento della soglia

In Grafana 10+ (Unified Alerting):

  1. Aprire il pannello → Edit → Alert
  2. Creare una regola:
    Condition: WHEN last() OF query(A, 5m, now) IS ABOVE 10
  3. Configurare la notifica:
    • Punto di contatto: Email → maintenance@usine.fr
    • Punto di contatto: Webhook → SMS tramite Twilio/OVH SMS
  4. Silenziamento automatico: 15 minuti dopo la conferma

Raggruppamento degli avvisi per siti multipli

Per evitare le "alert storms" quando più siti smettono di funzionare contemporaneamente:

# alertmanager.yml
route:
group_by: ['alertname', 'site']
group_wait: 30s
group_interval: 5m
repeat_interval: 3h
receiver: 'maintenance-team'

receivers:
- name: 'maintenance-team'
email_configs:
- to: 'maintenance@usine.fr'
send_resolved: true
webhook_configs:
- url: 'https://api.sms-provider.fr/send'

Annotazioni sugli eventi

Aggiungere annotazioni automatiche ai grafici in caso di allarmi:

// Creare un'annotazione InfluxDB in caso di errore
from(bucket: "industrie")
|> range(start: v.timeRangeStart)
|> filter(fn: (r) => r["_field"] == "defaut" and r["_value"] == 1)
|> map(fn: (r) => ({r with _value: "Défaut détecté sur ${r.station}"}))

Modelli e variabili Grafana per siti multipli

Le variabili dei modelli consentono di creare un dashboard generico riutilizzabile per tutti i tuoi siti.

Creare una variabile "site"

Dashboard Settings → Variables → New Variable:

  • Nome: site
  • Tipo: Query
  • Origine dati: InfluxDB
  • Query:
    import "influxdata/influxdb/schema"
    schema.tagValues(bucket: "industrie", tag: "station")

Utilizzo della variabile nei pannelli

from(bucket: "industrie")
|> range(start: v.timeRangeStart)
|> filter(fn: (r) => r["station"] == "${site}")
|> filter(fn: (r) => r["_field"] == "pression")

L'operatore può ora selezionare il sito da un menu a tendina nella parte superiore della dashboard.


Dashboard Grafana preconfigurate per il settore industriale

Pannello di controllo della stazione di pompaggio

┌─────────────────────────────────────────────────────────────────┐
│ Stazione: [menu a tendina] │ Periodo: [6 ore|24 ore|7 giorni|30 giorni] │
├──────────────┬──────────────┬──────────────┬────────────────────┤
│ Pressione │ Portata │ Livello │ Stato pompa │
│ [gauge] │ [gauge] │ [gauge] │ [stat 🟢/🔴] │
├──────────────┴──────────────┴──────────────┴────────────────────┤
│ Andamenti nelle ultime 24 ore: Pressione / Portata / Livello │
│ [time series graph] │
├─────────────────────────────────────────────────────────────────┤
│ Allarmi attivi │ Ultimi interventi │
│ [table] │ [table annotations] │
└─────────────────────────────────────────────────────────────────┘

Dashboard di produzione multisito

┌────────────────────────────────────────────────────────────────────┐
│ Vue globale — 15 sites │
├──────────┬──────────┬──────────┬──────────┬──────────┬────────────┤
│ Site 1 │ Site 2 │ Site 3 │ Site 4 │ Site 5 │ ... │
│ TRS: 87% │ TRS: 91% │ TRS: 73% │ TRS: 94% │ TRS: 82% │ │
│ 🟢 OK │ 🟢 OK │ 🔴 Alrm │ 🟢 OK │ 🟡 Warn │ │
├──────────┴──────────┴──────────┴──────────┴──────────┴────────────┤
│ Produzione cumulativa nelle ultime 24 ore: obiettivo vs. dati effettivi [grafico a barre] │
└────────────────────────────────────────────────────────────────────┘

Integrazione Eziwan → Grafana

Eziwan offre due modalità di integrazione con Grafana:

Modalità 1: Grafana ospitato su Eziwan (consigliato)

La piattaforma Eziwan integra Grafana in modo nativo. I vostri dati Modbus/OPC-UA sono già presenti nel nostro database di serie temporali ospitato in Francia. Potete accedere direttamente alle dashboard dal vostro browser, con:

  • Dashboard preconfigurate per i casi d’uso più comuni (acqua, energia, produzione)
  • Avvisi via SMS/e-mail gestiti
  • Archiviazione dei dati per 5 anni senza necessità di configurazione
  • Gestione multisito, multiutente e dei diritti di accesso

Modalità 2: Esportazione verso il proprio Grafana esistente

Se disponete già di un Grafana interno:

  • API REST Eziwan: interrogate i vostri dati tramite GET /api/v1/variables/{id}/history
  • Webhook MQTT: Eziwan pubblica i vostri dati sul vostro broker MQTT esistente
  • Plugin Grafana Eziwan (disponibile su richiesta): plugin di origine dati per la connessione diretta

Domande frequenti — Grafana per il monitoraggio industriale

Grafana può sostituire un sistema SCADA in produzione? Per la visualizzazione e gli avvisi, sì, in molti casi. Per il controllo in tempo reale (scrittura sul PLC, sequenze di comando), si consiglia comunque di utilizzare un sistema SCADA o un sistema HMI dedicato. Grafana eccelle nella registrazione storica dei dati, nell'analisi delle tendenze e nel monitoraggio multisito.

Quale database utilizzare per archiviare i dati industriali in Grafana? InfluxDB è la scelta standard per le serie temporali industriali (alta frequenza, compressione nativa, potenti query Flux). TimescaleDB (estensione di PostgreSQL) è l'ideale se si dispone già di PostgreSQL. Prometheus è adatto alle metriche di infrastruttura, ma meno indicato per i dati di processo.

Come proteggere l'accesso a Grafana da Internet? Posizionare Grafana dietro un reverse proxy (Nginx/Traefik) con TLS, abilitare l'autenticazione OIDC/LDAP, disabilitare l'accesso anonimo, configurare avvisi in caso di tentativi di connessione non riusciti. Non esporre mai InfluxDB direttamente su Internet.

Grafana è in grado di gestire 1.000 siti e 100.000 variabili? Sì, con l'architettura giusta. InfluxDB 2.x supporta miliardi di punti dati. Grafana Enterprise gestisce il clustering. Per volumi molto elevati, prendere in considerazione l’utilizzo di Apache Kafka a monte per lo streaming e l’adozione di politiche di conservazione differenziate (dati con intervallo di 1 secondo conservati per 30 giorni, dati con intervallo di 1 minuto conservati per 5 anni).

È possibile visualizzare uno schema P&ID in Grafana? Sì, con il plugin Flowcharting (basato su draw.io). È sufficiente disegnare lo schema P&ID, associare le variabili di Grafana a ciascuna apparecchiatura e i valori verranno visualizzati in tempo reale sullo schema sinottico con un cambio di colore a seconda dello stato.


Per approfondire


Vuoi creare dashboard Grafana senza dover gestire l'infrastruttura? Prova Eziwan gratuitamente per 30 giorni — i tuoi dati Modbus su Grafana in meno di un'ora.


Risorse aggiuntive