Grafana para la supervisión industrial del IoT: panel de control Modbus, alertas, historial

· 9 min de lectura
9 min read
Equipo Eziwan
Infraestructura IoT

Grafana se ha convertido en la herramienta de referencia para la visualización de datos industriales. Gratuita, de código abierto y ampliable, transforma tus datos Modbus, OPC-UA o MQTT en paneles de control operativos. Esta guía te muestra cómo diseñar un sistema completo de supervisión industrial con Grafana, o cómo Eziwan te lo ofrece «llave en mano».


¿Por qué Grafana para la supervisión industrial?

Grafana se ha consolidado en el sector por varias razones:

  • Conectores universales: InfluxDB, TimescaleDB, PostgreSQL, Prometheus, MQTT, API REST — una fuente de datos para cada pila tecnológica
  • Paneles avanzados: series temporales, indicadores, estadísticas, tablas, mapas de calor, diagramas de flujo (con complementos)
  • Alertas integradas: notificaciones por SMS, correo electrónico, Slack, PagerDuty y webhook
  • Gestión de accesos: equipos, carpetas y permisos por panel de control
  • Complementos industriales: P&ID (diagramas de flujo), diagramas de tuberías y esquemas sinópticos

En comparación con un sistema SCADA tradicional:

Grafana (+ stack IoT)SCADA Wonderware/Ignition
Coste de la licencia0 (código abierto)5 000–50 000 €
Coste de alojamiento50–200 €/mes (nube)Servidor dedicado + mantenimiento
Variables ilimitadas❌ (facturación por etiqueta)
Interfaz web nativa✅ (Ignition) / ❌ (Wonderware)
Compatible con dispositivos móvilesParcial
Integración en la nubeNativaCompleja

Arquitectura: de Modbus a Grafana

El conjunto completo de herramientas para supervisar controladores Modbus en Grafana:

Alternativa para grandes volúmenes:

Solución Eziwan (todo en uno):

Eziwan integra la pila completa (recogida de datos Modbus/OPC-UA, series temporales en la nube, paneles de Grafana preconfigurados, alertas por SMS/correo electrónico) sin que tengas que instalar ni mantener los componentes por separado.


Instalar 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:

Configuración de Telegraf para MQTT

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

# Análisis del tema MQTT: fábrica/planta/estación/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"

Crea tu primer panel de control industrial

Panel 1: Gráfico de tendencias (series temporales)

Para visualizar la evolución de la presión de una estación a lo largo del tiempo:

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

Panel de parámetros:

  • Tipo: Time series
  • Unidad del eje Y: bar (Presión)
  • Ancho de línea: 2
  • Opacidad de relleno: 10
  • Umbrales: verde < 8 bar, naranja 8-10 bar, rojo > 10 bar

Panel 2: Indicador (valor instantáneo)

Para mostrar el valor actual de una variable:

Consulta de InfluxDB:

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

Panel de parámetros:

  • Tipo: Gauge
  • Mín.: 0, Máx.: 16
  • Unidad: bar
  • Umbrales: 0 = verde, 10 = naranja, 12 = rojo

Panel 3: Estadísticas (KPI)

Para visualizar el TRS o un contador de producción:

Consulta de InfluxDB:

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

Panel de parámetros:

  • Tipo: Stat
  • Unidad: pcs (personalizada)
  • Modo de color: Background (rojo si es < el objetivo)

Panel 4: Tabla multisitio

Para ver el estado de todas tus páginas web en tiempo real:

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

Resultado: tabla con las columnas «Estación», «Presión», «Caudal» y «Estado», con una fila por emplazamiento.


Configurar las alertas de Grafana

Alerta por superación del umbral

En Grafana 10+ (Unified Alerting):

  1. Abrir el panel → Edit → Alert
  2. Crear una regla:
    Condition: WHEN last() OF query(A, 5m, now) IS ABOVE 10
  3. Configurar la notificación:
    • Punto de contacto: Correo electrónico → maintenance@usine.fr
    • Punto de contacto: Webhook → SMS a través de Twilio/OVH SMS
  4. Silenciamiento automático: 15 minutos tras la confirmación

Agrupación de alertas para sitios múltiples

Para evitar las «tormentas de alertas» cuando varios sitios web dejan de funcionar al mismo tiempo:

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

Anotaciones sobre eventos

Añadir anotaciones automáticas a los gráficos cuando se activen las alarmas:

// Crear una anotación de InfluxDB cuando se produce un fallo
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}"}))

Plantillas y variables de Grafana para sitios múltiples

Las variables de plantilla permiten crear un panel de control genérico que se puede reutilizar en todos tus sitios web.

Crear una variable «site»

Dashboard Settings → Variables → New Variable:

  • Nombre: site
  • Tipo: Query
  • Fuente de datos: InfluxDB
  • Consulta:
    import "influxdata/influxdb/schema"
    schema.tagValues(bucket: "industrie", tag: "station")

Utilizar la variable en los paneles

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

Ahora el operador puede seleccionar la ubicación en un menú desplegable situado en la parte superior del panel de control.


Paneles de control preconfigurados de Grafana para la industria

Panel de control de la estación de bombeo

┌─────────────────────────────────────────────────────────────────┐
│ Estación: [menú desplegable] │ Período: [6 h|24 h|7 días|30 días] │
├──────────────┬──────────────┬──────────────┬────────────────────┤
│ Presión │ Caudal │ Nivel │ Estado de la bomba │
│ [gauge] │ [gauge] │ [gauge] │ [stat 🟢/🔴] │
├──────────────┴──────────────┴──────────────┴────────────────────┤
│ Tendencias en las últimas 24 horas: Presión / Caudal / Nivel │
│ [time series graph] │
├─────────────────────────────────────────────────────────────────┤
│ Alarmas activas │ Últimas intervenciones │
│ [table] │ [table annotations] │
└─────────────────────────────────────────────────────────────────┘

Panel de control de producción multisitio

┌────────────────────────────────────────────────────────────────────┐
│ 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 │ │
├──────────┴──────────┴──────────┴──────────┴──────────┴────────────┤
│ Producción acumulada en 24 horas: objetivo frente a real [gráfico de barras] │
└────────────────────────────────────────────────────────────────────┘

Integración de Eziwan con Grafana

Eziwan ofrece dos formas de integración con Grafana:

Modo 1: Grafana alojado en Eziwan (recomendado)

La plataforma Eziwan integra Grafana de forma nativa. Tus datos Modbus/OPC-UA ya se encuentran en nuestra base de datos de series temporales alojada en Francia. Puedes acceder directamente a los paneles de control desde tu navegador, con:

  • Paneles de control preconfigurados para los casos de uso más habituales (agua, energía, producción)
  • Alertas por SMS/correo electrónico gestionadas
  • Historial de 5 años sin necesidad de configuración
  • Multisede, multiusuario y gestión de permisos

Modo 2: Exportación a tu Grafana ya existente

Si ya dispone de un Grafana interno:

  • API REST de Eziwan: consulte sus datos a través de GET /api/v1/variables/{id}/history
  • Webhook MQTT: Eziwan publica tus datos en tu broker MQTT existente
  • Complemento de Grafana para Eziwan (disponible bajo petición): complemento de fuente de datos para conexión directa

Preguntas frecuentes — Grafana para la supervisión industrial

¿Puede Grafana sustituir a un sistema SCADA en producción? En cuanto a la visualización y las alertas, sí, en muchos casos. Para el control en tiempo real (escritura en el controlador lógico programable, secuencias de comandos), se sigue recomendando un sistema SCADA o un sistema HMI específico. Grafana destaca en el registro histórico, el análisis de tendencias y la supervisión de múltiples emplazamientos.

¿Qué base de datos se debe utilizar para almacenar datos industriales en Grafana? InfluxDB es la opción estándar para las series temporales industriales (alta frecuencia, compresión nativa, potentes consultas Flux). TimescaleDB (una extensión de PostgreSQL) es adecuada si ya dispones de PostgreSQL. Prometheus es adecuado para métricas de infraestructura, pero menos relevante para datos de procesos.

¿Cómo proteger el acceso a Grafana desde Internet? Colocar Grafana detrás de un proxy inverso (Nginx/Traefik) con TLS, activar la autenticación OIDC/LDAP, desactivar el acceso anónimo y configurar alertas ante intentos fallidos de conexión. Nunca exponer InfluxDB directamente a Internet.

¿Puede Grafana gestionar 1 000 sitios y 100 000 variables? Sí, con la arquitectura adecuada. InfluxDB 2.x admite miles de millones de puntos. Grafana Enterprise gestiona la agrupación en clústeres. Para volúmenes muy grandes, se recomienda utilizar Apache Kafka en una fase previa para el streaming, así como políticas de retención diferenciadas (datos de 1 s conservados durante 30 días, datos de 1 min conservados durante 5 años).

¿Puedo tener un esquema P&ID en Grafana? Sí, con el complemento Flowcharting (basado en draw.io). Dibuja tu esquema P&ID, asigna variables de Grafana a cada equipo y los valores se mostrarán en tiempo real en el esquema sinóptico, cambiando de color según el estado.


Para profundizar en el tema


¿Te apetece tener paneles de Grafana sin tener que gestionar la infraestructura? Prueba Eziwan gratis durante 30 días: tus datos Modbus en Grafana en menos de una hora.


Recursos adicionales