Grafana pour la supervision industrielle IoT : dashboard Modbus, alertes, historique

· 8 minutes de lecture
8 min read
Équipe Eziwan
Infrastructure IoT

Grafana est devenu l'outil de référence pour la visualisation de données industrielles. Gratuit, open-source, et extensible, il transforme vos données Modbus, OPC-UA ou MQTT en tableaux de bord opérationnels. Ce guide vous montre comment architecturer une supervision industrielle complète avec Grafana — ou comment Eziwan vous l'offre clé en main.


Pourquoi Grafana pour la supervision industrielle ?

Grafana s'est imposé dans l'industrie pour plusieurs raisons :

  • Connectors universels : InfluxDB, TimescaleDB, PostgreSQL, Prometheus, MQTT, REST API — une source de données pour chaque stack
  • Panels riches : time series, gauge, stat, table, heatmap, flow chart (avec plugins)
  • Alertes intégrées : notification SMS, email, Slack, PagerDuty, webhook
  • Gestion des accès : équipes, dossiers, permissions par dashboard
  • Plugins industriels : P&ID (Flowcharting), piping diagrams, schémas synoptiques

Comparé à un SCADA traditionnel :

Grafana (+ stack IoT)SCADA Wonderware/Ignition
Coût licence0 (open source)5 000–50 000€
Coût hébergement50–200€/mois (cloud)Serveur dédié + maintenance
Variables illimitées❌ (facturation par tag)
Interface web native✅ (Ignition) / ❌ (Wonderware)
Mobile readyPartiel
Intégration cloudNatifComplexe

Architecture : de Modbus à Grafana

La stack complète pour superviser des automates Modbus dans Grafana :

Alternative pour volumes importants :

Solution Eziwan (tout-en-un) :

Eziwan intègre la stack complète (collecte Modbus/OPC-UA, cloud time series, dashboards Grafana préconfigurés, alertes SMS/email) sans que vous ayez à installer et maintenir les composants individuellement.


Installer Grafana + InfluxDB avec 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:

Configuration Telegraf pour MQTT

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

# Parsing du topic MQTT : usine/site/station/variable
[[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"

Créer votre premier dashboard industriel

Panel 1 : Graphe de tendance (Time Series)

Pour afficher l'évolution de la pression d'une station dans le temps :

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")

Paramètres panel :

  • Type : Time series
  • Y-axis unit : bar (Pressure)
  • Line width : 2
  • Fill opacity : 10
  • Thresholds : vert < 8 bar, orange 8-10 bar, rouge > 10 bar

Panel 2 : Gauge (Valeur instantanée)

Pour afficher la valeur courante d'une variable :

Query InfluxDB :

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

Paramètres panel :

  • Type : Gauge
  • Min : 0, Max : 16
  • Unit : bar
  • Thresholds : 0=green, 10=orange, 12=red

Panel 3 : Stat (KPI)

Pour afficher le TRS ou un compteur de production :

Query InfluxDB :

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

Paramètres panel :

  • Type : Stat
  • Unit : pcs (custom)
  • Color mode : Background (rouge si < objectif)

Panel 4 : Table multi-sites

Pour afficher l'état de tous vos sites en temps réel :

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")

Résultat : tableau avec colonnes Station / Pression / Débit / État, une ligne par site.


Configurer les alertes Grafana

Alerte sur seuil dépassé

Dans Grafana 10+ (Unified Alerting) :

  1. Ouvrir le panel → Edit → Alert
  2. Créer une règle :
    Condition: WHEN last() OF query(A, 5m, now) IS ABOVE 10
  3. Configurer la notification :
    • Contact Point : Email → maintenance@usine.fr
    • Contact Point : Webhook → SMS via Twilio/OVH SMS
  4. Silence automatique : 15 minutes après acquittement

Alert grouping pour multi-sites

Pour éviter les "alert storms" quand plusieurs sites tombent simultanément :

# 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'

Annotation sur événements

Ajouter des annotations automatiques sur les graphes lors d'alarmes :

// Créer une annotation InfluxDB lors d'un défaut
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}"}))

Templates et variables Grafana pour multi-sites

Les Template Variables permettent de créer un dashboard générique réutilisable pour tous vos sites.

Créer une variable "site"

Dashboard Settings → Variables → New Variable :

  • Name : site
  • Type : Query
  • Data Source : InfluxDB
  • Query :
    import "influxdata/influxdb/schema"
    schema.tagValues(bucket: "industrie", tag: "station")

Utiliser la variable dans les panels

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

L'opérateur peut maintenant choisir le site dans un menu déroulant en haut du dashboard.


Dashboards préconfigurés Grafana pour l'industrie

Dashboard Supervision Station de Pompage

┌─────────────────────────────────────────────────────────────────┐
│ Station : [dropdown] │ Période : [6h|24h|7j|30j] │
├──────────────┬──────────────┬──────────────┬────────────────────┤
│ Pression │ Débit │ Niveau │ État Pompe │
│ [gauge] │ [gauge] │ [gauge] │ [stat 🟢/🔴] │
├──────────────┴──────────────┴──────────────┴────────────────────┤
│ Tendances 24h : Pression / Débit / Niveau │
│ [time series graph] │
├─────────────────────────────────────────────────────────────────┤
│ Alarmes actives │ Dernières interventions │
│ [table] │ [table annotations] │
└─────────────────────────────────────────────────────────────────┘

Dashboard Production Multi-Sites

┌────────────────────────────────────────────────────────────────────┐
│ 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 │ │
├──────────┴──────────┴──────────┴──────────┴──────────┴────────────┤
│ Production cumulée 24h : objectif vs réel [bar chart] │
└────────────────────────────────────────────────────────────────────┘

Intégration Eziwan → Grafana

Eziwan propose deux modes d'intégration avec Grafana :

Mode 1 : Grafana hébergé dans Eziwan (recommandé)

La plateforme Eziwan intègre Grafana nativement. Vos données Modbus/OPC-UA sont déjà dans notre time series database hébergée en France. Vous accédez directement aux dashboards depuis votre navigateur, avec :

  • Dashboards pré-configurés pour les cas d'usage courants (eau, énergie, production)
  • Alertes SMS/email gérées
  • Historisation 5 ans sans configuration
  • Multi-sites, multi-utilisateurs, gestion des droits

Mode 2 : Export vers votre Grafana existant

Si vous avez déjà un Grafana interne :

  • API REST Eziwan : interrogez vos données via GET /api/v1/variables/{id}/history
  • Webhook MQTT : Eziwan publie vos données sur votre broker MQTT existant
  • Plugin Grafana Eziwan (disponible sur demande) : datasource plugin pour connexion directe

FAQ — Grafana supervision industrielle

Grafana peut-il remplacer un SCADA en production ? Pour la visualisation et les alertes, oui dans beaucoup de cas. Pour le contrôle en temps réel (écriture sur automate, séquences de commande), un SCADA ou un système HMI dédié reste recommandé. Grafana excelle en historisation, analyse de tendances et monitoring multi-sites.

Quelle base de données pour stocker des données industrielles dans Grafana ? InfluxDB est le choix standard pour les time series industrielles (haute fréquence, compression native, requêtes Flux puissantes). TimescaleDB (extension PostgreSQL) convient si vous avez déjà PostgreSQL. Prometheus est adapté aux métriques infrastructure mais moins pertinent pour les données process.

Comment sécuriser l'accès à Grafana depuis Internet ? Mettre Grafana derrière un reverse proxy (Nginx/Traefik) avec TLS, activer l'authentification OIDC/LDAP, désactiver l'accès anonyme, configurer des alertes sur tentatives de connexion échouées. Ne jamais exposer InfluxDB directement sur Internet.

Grafana peut-il gérer 1 000 sites et 100 000 variables ? Oui avec la bonne architecture. InfluxDB 2.x supporte des milliards de points. Grafana Enterprise gère le clustering. Pour des volumes très importants, envisager Apache Kafka en amont pour le streaming, et des politiques de rétention différenciées (données 1s gardées 30j, données 1min gardées 5 ans).

Puis-je avoir un synoptique P&ID dans Grafana ? Oui avec le plugin Flowcharting (basé sur draw.io). Vous dessinez votre schéma P&ID, attachez des variables Grafana à chaque équipement, et les valeurs s'affichent en temps réel sur le synoptique avec changement de couleur selon l'état.


Pour aller plus loin


Envie de dashboards Grafana sans gérer l'infrastructure ? Testez Eziwan gratuitement 30 jours — vos données Modbus dans Grafana en moins d'une heure.


Ressources complémentaires