Grafana voor industriële IoT-monitoring: Modbus-dashboard, waarschuwingen, geschiedenis

· 9 minuten leestijd
9 min read
Eziwan-team
IoT-infrastructuur

Grafana is uitgegroeid tot de standaardtool voor de visualisatie van industriële gegevens. Het is gratis, open-source en uitbreidbaar, en zet uw Modbus-, OPC-UA- of MQTT-gegevens om in operationele dashboards. Deze handleiding laat zien hoe u met Grafana een compleet industrieel monitoring-systeem kunt opzetten — of hoe Eziwan u dit kant-en-klaar aanbiedt.


Waarom Grafana voor industriële monitoring?

Grafana heeft om verschillende redenen een vaste plaats veroverd in de sector:

  • Universele koppelingen: InfluxDB, TimescaleDB, PostgreSQL, Prometheus, MQTT, REST API — één gegevensbron voor elke stack
  • Uitgebreide dashboards: tijdreeksen, meters, statistieken, tabellen, heatmaps, stroomdiagrammen (met plug-ins)
  • Geïntegreerde waarschuwingen: meldingen via sms, e-mail, Slack, PagerDuty, webhook
  • Toegangsbeheer: teams, mappen, machtigingen per dashboard
  • Industriële plug-ins: P&ID (stroomdiagrammen), leidingdiagrammen, synoptische schema’s

In vergelijking met een traditioneel SCADA-systeem:

Grafana (+ IoT-stack)SCADA Wonderware/Ignition
Licentiekosten0 (open source)5.000–50.000 €
Hostingkosten50–200 €/maand (cloud)Dedicated server + onderhoud
Onbeperkt aantal variabelen❌ (facturering per tag)
Native webinterface✅ (Ignition) / ❌ (Wonderware)
Geschikt voor mobielGedeeltelijk
CloudintegratieNativeComplex

Architectuur: van Modbus tot Grafana

De volledige stack voor het monitoren van Modbus-PLC’s in Grafana:

Alternatief voor grote hoeveelheden:

Eziwan-oplossing (alles-in-één):

Eziwan bevat de volledige stack (Modbus/OPC-UA-gegevensverzameling, tijdreeksen in de cloud, vooraf geconfigureerde Grafana-dashboards, SMS-/e-mailwaarschuwingen) zonder dat u de afzonderlijke componenten zelf hoeft te installeren en te onderhouden.


Grafana + InfluxDB installeren met 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:

Telegraf configureren voor MQTT

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

# Parsen van het MQTT-onderwerp: fabriek/locatie/station/variabele
[[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"

Uw eerste industriële dashboard maken

Paneel 1: Trendgrafiek (tijdreeks)

Om de ontwikkeling van de druk van een station in de loop van de tijd weer te geven:

InfluxDB-query (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")

Instellingenpaneel:

  • Type: Time series
  • Eenheid Y-as: bar (druk)
  • Lijnbreedte: 2
  • Vuldekking: 10
  • Drempelwaarden: groen < 8 bar, oranje 8-10 bar, rood > 10 bar

Paneel 2: Meter (momentane waarde)

Om de huidige waarde van een variabele weer te geven:

InfluxDB-query:

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

Instellingenpaneel:

  • Type: Gauge
  • Min: 0, Max: 16
  • Eenheid: bar
  • Drempelwaarden: 0=groen, 10=oranje, 12=rood

Panel 3: Statistieken (KPI)

Om de OEE of een productieteller weer te geven:

InfluxDB-query:

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

Instellingenpaneel:

  • Type: Stat
  • Eenheid: pcs (aangepast)
  • Kleurmodus: Background (rood indien < doelwaarde)

Panel 4: Tabel met meerdere locaties

Om de status van al uw websites in realtime te bekijken:

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

Resultaat: tabel met de kolommen Station / Druk / Debiet / Status, één rij per locatie.


Grafana-waarschuwingen instellen

Waarschuwing bij overschrijding van de drempelwaarde

In Grafana 10+ (Unified Alerting):

  1. Open het paneel → Edit → Alert
  2. Maak een regel aan:
    Condition: WHEN last() OF query(A, 5m, now) IS ABOVE 10
  3. Configureer de melding:
    • Contactpunt: E-mail → maintenance@usine.fr
    • Contactpunt: Webhook → SMS via Twilio/OVH SMS
  4. Automatisch stilzetten: 15 minuten na bevestiging

Groepering van waarschuwingen voor meerdere locaties

Om "alert storms" te voorkomen wanneer meerdere sites tegelijkertijd uitvallen:

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

Aantekeningen bij gebeurtenissen

Automatische aantekeningen toevoegen aan grafieken bij alarmen:

// Een InfluxDB-annotatie aanmaken bij een storing
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}"}))

Grafana-sjablonen en -variabelen voor meerdere sites

Met sjabloonvariabelen kunt u een generiek dashboard maken dat u voor al uw websites kunt hergebruiken.

Een variabele "site" aanmaken

Dashboard Settings → Variables → New Variable:

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

De variabele in de panelen gebruiken

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

De gebruiker kan nu de locatie selecteren via een vervolgkeuzemenu bovenaan het dashboard.


Vooraf geconfigureerde Grafana-dashboards voor de industrie

Dashboard voor het toezicht op het pompstation

┌─────────────────────────────────────────────────────────────────┐
│ Meetstation: [dropdown] │ Periode: [6 uur|24 uur|7 dagen|30 dagen] │
├──────────────┬──────────────┬──────────────┬────────────────────┤
│ Druk │ Debiet │ Niveau │ Status pomp │
│ [gauge] │ [gauge] │ [gauge] │ [stat 🟢/🔴] │
├──────────────┴──────────────┴──────────────┴────────────────────┤
│ 24-uurstrends: Druk / Debiet / Niveau │
│ [time series graph] │
├─────────────────────────────────────────────────────────────────┤
│ Actieve alarmen │ Laatste interventies │
│ [table] │ [table annotations] │
└─────────────────────────────────────────────────────────────────┘

Dashboard voor productie op meerdere locaties

┌────────────────────────────────────────────────────────────────────┐
│ 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 │ │
├──────────┴──────────┴──────────┴──────────┴──────────┴────────────┤
│ Gecumuleerde productie over 24 uur: doelstelling versus werkelijkheid [staafdiagram] │
└────────────────────────────────────────────────────────────────────┘

Integratie van Eziwan met Grafana

Eziwan biedt twee manieren om Grafana te integreren:

Modus 1: Grafana gehost in Eziwan (aanbevolen)

Het Eziwan-platform integreert Grafana native. Uw Modbus/OPC-UA-gegevens staan al in onze tijdreeksdatabase, die in Frankrijk wordt gehost. U hebt rechtstreeks toegang tot de dashboards via uw browser, met:

  • Vooraf geconfigureerde dashboards voor veelvoorkomende toepassingen (water, energie, productie)
  • Beheerde sms- en e-mailwaarschuwingen
  • 5 jaar gegevensopslag zonder configuratie
  • Ondersteuning voor meerdere locaties en gebruikers, en rechtenbeheer

Modus 2: Exporteren naar uw bestaande Grafana-instantie

Als u al een interne Grafana-instantie hebt:

  • Eziwan REST-API: vraag uw gegevens op via GET /api/v1/variables/{id}/history
  • MQTT-webhook: Eziwan publiceert uw gegevens op uw bestaande MQTT-broker
  • Eziwan Grafana-plugin (op aanvraag beschikbaar): plugin voor directe verbinding

Veelgestelde vragen — Grafana voor industriële monitoring

Kan Grafana een SCADA-systeem in de productie vervangen? Voor visualisatie en waarschuwingen: ja, in veel gevallen. Voor realtime besturing (commando's naar de PLC, besturingssequenties) blijft een SCADA- of een speciaal HMI-systeem aanbevolen. Grafana blinkt uit in het bijhouden van historische gegevens, trendanalyse en monitoring van meerdere locaties.

Welke database is geschikt voor het opslaan van industriële gegevens in Grafana? InfluxDB is de standaardkeuze voor industriële tijdreeksen (hoge frequentie, native compressie, krachtige Flux-query’s). TimescaleDB (een PostgreSQL-extensie) is geschikt als u al PostgreSQL gebruikt. Prometheus is geschikt voor infrastructuurmetrieken, maar minder relevant voor procesgegevens.

Hoe beveilig je de toegang tot Grafana via het internet? Plaats Grafana achter een reverse proxy (Nginx/Traefik) met TLS, schakel OIDC/LDAP-authenticatie in, schakel anonieme toegang uit en stel waarschuwingen in voor mislukte inlogpogingen. Stel InfluxDB nooit rechtstreeks bloot aan het internet.

Kan Grafana 1.000 sites en 100.000 variabelen aan? Ja, met de juiste architectuur. InfluxDB 2.x ondersteunt miljarden gegevenspunten. Grafana Enterprise zorgt voor de clustering. Voor zeer grote volumes kunt u overwegen om Apache Kafka stroomopwaarts in te zetten voor streaming, en gedifferentieerde bewaarbeleidsregels toe te passen (gegevens van 1 seconde worden 30 dagen bewaard, gegevens van 1 minuut worden 5 jaar bewaard).

Kan ik een P&ID-overzicht in Grafana weergeven? Ja, met de Flowcharting-plugin (gebaseerd op draw.io). U tekent uw P&ID-schema, koppelt Grafana-variabelen aan elk apparaat, en de waarden worden in realtime weergegeven op het schema, waarbij de kleur verandert afhankelijk van de status.


Meer informatie


Wilt u Grafana-dashboards zonder dat u de infrastructuur hoeft te beheren? Probeer Eziwan 30 dagen gratis uit — uw Modbus-gegevens in Grafana in minder dan een uur.


Aanvullende bronnen