Fabricación inteligente

Dashboard de monitoreo de línea de producción con MQTT, Grafana y Node-RED

Construcción paso a paso de un dashboard de monitoreo de línea de producción: las estaciones publican estado y conteos por MQTT, Telegraf los almacena y Grafana o Node-RED los convierten en una vista de línea en vivo.

Dashboard de monitoreo de línea de producción con mosaicos de estado por estación, contadores de piezas y un indicador de OEE alimentados con datos MQTT
Pruébalo en tu propio broker MQTTConsigue un broker MQTT privado y gestionado con el plan Free y empieza con ejemplos de código listos para usar.
Pruébalo gratis Ejemplos de código Sin tarjeta

Un dashboard de monitoreo de línea de producción convierte las señales brutas de las máquinas en una sola pantalla que indica a los supervisores si la línea está en marcha, cuántas piezas buenas ha fabricado y dónde pierde tiempo. En este tutorial publicarás datos de estaciones por MQTT, los almacenarás con Telegraf e InfluxDB y construirás el dashboard en Grafana, con una alternativa más ligera en Node-RED para líneas pequeñas. Todo funciona contra un broker real, así que puedes seguirlo desde un portátil.

Qué muestra un buen dashboard de línea de producción

Antes de cablear nada, decide qué preguntas debe responder la pantalla. La mayoría de los dashboards de línea fracasan porque muestran todos los tags que expone el PLC en lugar del puñado de preguntas que la gente realmente se hace durante un turno.

Pregunta en planta Señal necesaria Widget típico
¿Está funcionando cada estación ahora mismo? state (RUNNING, IDLE, DOWN, SETUP) Mosaicos de estado por colores
¿Vamos según el plan del turno? Conteo de buenas, conteo planificado Número grande más barra de progreso
¿De dónde viene el scrap? Conteo de rechazos por estación Gráfico de barras por estación
¿Qué estación es el cuello de botella? Ritmo real frente a ritmo ideal Tabla ordenada por diferencia de ritmo
¿Qué tan sana está la línea en general? Disponibilidad, rendimiento, calidad Indicador de OEE con tres subbarras
¿Qué nos detuvo en la última hora? Cambios de estado con marca de tiempo Línea temporal de estados

Limita la primera versión a estos seis. Los supervisores pedirán más cuando confíen en las cifras, y la confianza llega cuando los conteos coinciden con lo que ven en planta.

Arquitectura: de la estación a la pantalla

El camino de los datos es corto y cada pieza es reemplazable:

  1. Cada estación (gateway del PLC, PC de edge o microcontrolador) publica un pequeño mensaje JSON de estado en un broker MQTT cada vez que cambia de estado y, como mínimo, cada pocos segundos.
  2. Telegraf se suscribe a los topics de la línea y escribe cada mensaje en InfluxDB como serie temporal.
  3. Grafana consulta InfluxDB y dibuja los paneles.
  4. Opcionalmente, un flujo de Node-RED se suscribe a los mismos topics y alimenta un dashboard ligero en una TV junto a la línea.

El broker es el hub que desacopla las estaciones de los consumidores. Si ese papel es nuevo para ti, esta explicación sobre qué hace un broker MQTT cubre lo básico. Como cada consumidor se suscribe por su cuenta, puedes añadir más adelante un historiador, un tablero andon, una calculadora de OEE o incluso un gemelo digital 3D de la línea sin tocar las estaciones.

Paso 1: diseña la estructura de topics

Un árbol de topics predecible ahorra horas más adelante. Usa una jerarquía al estilo ISA-95 para que el dashboard pueda filtrar por línea y estación con comodines:

connectmq/demo/<your-id>/line1/<station>/status

Por ejemplo, connectmq/demo/a7f3k9/line1/filler/status. El payload es un único objeto JSON:

{
  "state": "RUNNING",
  "good": 1842,
  "reject": 17,
  "rate": 58.5,
  "ideal_rate": 60,
  "ts": 1792137600
}

Los conteos son acumulados del turno, lo que hace robustos los datos: si se pierde un mensaje, el siguiente sigue llevando el total correcto. Los ritmos se expresan en piezas por minuto. Añade un nivel de empresa y de sitio delante de la línea cuando despliegues en más de una planta, por ejemplo en Monterrey y Querétaro.

Paso 2: simula las estaciones

Para construir el dashboard antes de conectar la línea real, ejecuta este simulador en Python. Usa paho-mqtt 2.x y el servidor MQTT público gratuito en broker.connectmq.com. Sustituye a7f3k9 por tu propio ID aleatorio, porque el área pública es legible por cualquiera.

import json
import random
import time

import paho.mqtt.client as mqtt

PREFIX = "connectmq/demo/a7f3k9/line1"
STATIONS = {"filler": 60, "capper": 62, "labeler": 65, "packer": 58}

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="line1-sim-a7f3k9")
client.connect("broker.connectmq.com", 1883, keepalive=30)
client.loop_start()

counters = {name: {"good": 0, "reject": 0, "state": "RUNNING"} for name in STATIONS}

try:
    while True:
        for name, ideal in STATIONS.items():
            c = counters[name]
            # Cambiar de estado de vez en cuando para que el dashboard sea interesante
            roll = random.random()
            if c["state"] == "RUNNING" and roll < 0.03:
                c["state"] = random.choice(["DOWN", "IDLE"])
            elif c["state"] != "RUNNING" and roll < 0.25:
                c["state"] = "RUNNING"

            rate = 0.0
            if c["state"] == "RUNNING":
                rate = round(ideal * random.uniform(0.85, 1.0), 1)
                made = int(rate / 12)  # aproximadamente 5 segundos de producción
                rejects = 1 if random.random() < 0.04 else 0
                c["good"] += made - rejects
                c["reject"] += rejects

            payload = {
                "state": c["state"],
                "good": c["good"],
                "reject": c["reject"],
                "rate": rate,
                "ideal_rate": ideal,
                "ts": int(time.time()),
            }
            client.publish(f"{PREFIX}/{name}/status", json.dumps(payload), qos=1, retain=True)
        time.sleep(5)
except KeyboardInterrupt:
    client.loop_stop()
    client.disconnect()

Cuatro estaciones publicando cada cinco segundos quedan muy por debajo del límite del broker público de 10 mensajes por segundo por cliente. El indicador retain hace que un dashboard que se conecte a mitad de turno reciba de inmediato el último estado conocido de cada estación. Verifica el flujo desde una terminal:

mosquitto_sub -h broker.connectmq.com -p 1883 -i viewer-a7f3k9 -t "connectmq/demo/a7f3k9/line1/+/status" -v

Paso 3: almacena los datos con Telegraf e InfluxDB

El consumidor MQTT de Telegraf convierte cada mensaje en un punto de InfluxDB, y el análisis de topics extrae la línea y la estación como tags. Guarda esto como telegraf.conf:

[agent]
  interval = "5s"
  flush_interval = "5s"

[[inputs.mqtt_consumer]]
  servers = ["tcp://broker.connectmq.com:1883"]
  topics = ["connectmq/demo/a7f3k9/line1/+/status"]
  client_id = "telegraf-a7f3k9"
  qos = 1
  data_format = "json"
  json_string_fields = ["state"]
  json_time_key = "ts"
  json_time_format = "unix"

  [[inputs.mqtt_consumer.topic_parsing]]
    topic = "connectmq/demo/+/+/+/status"
    measurement = "_/_/_/_/_/measurement"
    tags = "_/_/_/line/station/_"

[[outputs.influxdb_v2]]
  urls = ["http://localhost:8086"]
  token = "YOUR_INFLUX_TOKEN"
  organization = "plant"
  bucket = "line"

Cada punto llega a la measurement status con los tags line=line1 y station=filler, más los campos state, good, reject, rate e ideal_rate. En producción, cambia el servidor a ssl://broker.connectmq.com:8883 y añade username = "YOUR_USERNAME", password = "YOUR_PASSWORD" y tu client_id asignado. Encontrarás más opciones en la guía del consumidor MQTT de Telegraf.

Paso 4: construye el dashboard de monitoreo de línea de producción en Grafana

Añade InfluxDB como fuente de datos en Grafana (lenguaje de consultas Flux) y crea estos paneles.

Mosaicos de estado por estación. Usa un panel Stat con mapeo de valores: RUNNING en verde, IDLE en amarillo, DOWN en rojo, SETUP en azul.

from(bucket: "line")
  |> range(start: -5m)
  |> filter(fn: (r) => r._measurement == "status" and r._field == "state")
  |> last()
  |> group(columns: ["station"])

Piezas buenas en este turno. Como los conteos son acumulados, el último valor es el total:

from(bucket: "line")
  |> range(start: today())
  |> filter(fn: (r) => r._measurement == "status" and r._field == "good" and r.station == "packer")
  |> last()

Usa la última estación de la línea (aquí, la empacadora) como producción de la línea; contar en todas las estaciones duplica el conteo.

Ritmo frente a ideal. Un panel Time series con rate e ideal_rate por estación muestra el cuello de botella de un vistazo: la estación cuyo ritmo real queda más por debajo de su ideal mientras está en marcha.

Línea temporal de estados. El panel State timeline de Grafana, alimentado con el campo state, ofrece una barra por estación coloreada según el estado a lo largo del turno, que es la forma más rápida de ver cuándo y dónde se detuvo la línea.

Indicador de OEE. Para una primera versión, calcula el OEE en un suscriptor aparte, publica el resultado en line1/oee y grafica ese topic. Los cálculos se explican en cómo calcular el OEE, y el tutorial de monitoreo de OEE en tiempo real incluye un suscriptor listo. Hacer el cálculo una sola vez, fuera de Grafana, garantiza que todas las pantallas muestren la misma cifra.

Alternativa con Node-RED para una sola línea

Si solo necesitas una TV junto a una línea y no quieres una base de datos de series temporales, Node-RED es más rápido. Configura un nodo de configuración mqtt-broker con servidor broker.connectmq.com y puerto 1883 (u 8883 con TLS y tus credenciales en producción), y añade:

  1. Un nodo mqtt in suscrito a connectmq/demo/a7f3k9/line1/+/status, con la salida configurada como objeto JSON parseado.
  2. Un nodo function que extraiga el nombre de la estación de msg.topic.split("/")[4] y lo enrute al widget adecuado.
  3. Widgets ui-text de Dashboard 2.0 para el estado, widgets ui-gauge para el ritmo y un ui-chart para los conteos de buenas.

La contrapartida es el historial: Node-RED muestra bien el presente, pero no es un historiador. Muchas plantas usan ambos, con Node-RED en la pantalla de línea y Grafana para la revisión del turno. El artículo dashboard de OEE con Node-RED profundiza en este enfoque.

Errores comunes y cómo corregirlos

  • Los conteos vuelven a cero a mitad de turno. Un reinicio del PLC o del gateway borra su contador. Guarda la línea base del turno en el edge, o haz que el dashboard use difference() con nonNegative: true para que los reinicios no generen producción negativa.
  • Los mosaicos muestran un RUNNING obsoleto. Si una estación se desconecta, su mensaje retenido sigue diciendo RUNNING. Añade el campo ts al mosaico y colorealo en gris cuando tenga más de 30 segundos, o usa un mensaje Last Will de MQTT que publique OFFLINE.
  • Client IDs duplicados. Dos instancias de Telegraf con el mismo client ID se expulsarán mutuamente una y otra vez. Cada cliente necesita un ID único.
  • Demasiados paneles. Si la pantalla necesita scroll en la TV de planta, está demasiado cargada. Lleva el detalle a un dashboard de profundización.

De la demo a producción

El servidor público es perfecto para construir, pero sus topics son visibles para cualquiera. Para una línea real, pasa a un broker privado: un broker MQTT gestionado te quita el trabajo de parchear y escalar un servidor, y un broker MQTT en la nube permite que los supervisores remotos y la oficina central vean el mismo dashboard. Con ConnectMQ creas el broker en el portal, obtienes un usuario, una contraseña y un client ID, y solo cambias la configuración de conexión en el simulador, Telegraf y Node-RED. El explorador de topics en vivo del portal es muy útil para confirmar que todas las estaciones publican antes de depurar un panel de Grafana vacío.

El plan Serverless gratuito admite hasta 25 conexiones, suficiente para una línea piloto con su gateway, Telegraf y un par de dashboards. Las plantas más grandes suelen pasar al plan Serverless de pago o a un clúster Dedicated a medida que se incorporan más líneas. Para la estrategia general, consulta la guía de manufactura inteligente.

Empieza con ConnectMQ

Crea un broker gratuito en app.connectmq.com con el plan Serverless y sin tarjeta de crédito, apunta tus estaciones y Telegraf hacia él, y ten hoy mismo un dashboard de línea de producción funcionando sobre infraestructura privada.

Preguntas frecuentes

¿Debo usar Grafana o Node-RED para un dashboard de línea de producción?

Usa Grafana cuando necesites historial, comparaciones entre turnos y muchos usuarios; usa Node-RED para una visualización rápida en vivo de una sola línea. Muchos equipos usan ambos a partir de los mismos topics MQTT.

¿Con qué frecuencia deben publicar su estado las estaciones?

Publica de inmediato en cada cambio de estado y envía un heartbeat cada 5 a 10 segundos. Así los mosaicos se mantienen al día sin saturar el broker.

¿Puedo conectar los PLC directamente?

La mayoría de los PLC necesitan un gateway de edge (Node-RED, un conversor de protocolos o el propio cliente MQTT del PLC) que lea los tags y publique JSON en el broker. Una vez que los datos están en MQTT, al dashboard no le importa de dónde vienen.

¿Es seguro el servidor MQTT público gratuito para datos reales de producción?

No. El área pública de broker.connectmq.com es legible por cualquiera, así que úsala solo para pruebas y lleva los datos de producción a un broker privado de ConnectMQ con credenciales y TLS.

Artículos relacionados

OEE vs TEEP vs OOE: ¿qué indicador deberías usar?

OEE, OOE y TEEP comparten los mismos factores de rendimiento y calidad, pero se miden frente a bases de tiempo distintas. Esta comparativa resuelve un único ejemplo y enumera las señales MQTT que necesita cada indicador.

8 min de lectura

Todos los artículos →

Tu broker MQTT privado, a unos pocos clics

Crea una cuenta, obtén las credenciales de tu broker y conecta tu primer dispositivo, sin servidores que instalar, parchear ni escalar.