Fabricación inteligente

Construir un sistema andon digital con MQTT: avisos, escalado y tableros

Un plano práctico para un andon basado en MQTT: cómo lanzan avisos los operarios, cómo se modelan los estados de aviso con mensajes retenidos, cómo funciona el escalado por tiempo y cómo los incumplimientos del tiempo de respuesta se convierten en alertas.

Tablero de un sistema andon digital que muestra los avisos abiertos por puesto con niveles de escalado y temporizadores de respuesta gestionados con mensajes 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 sistema andon digital convierte el clásico cordón o la lámpara en una petición de ayuda con seguimiento y escalado, que llega a la persona adecuada y deja constancia de lo rápido que la línea recibió apoyo. Este artículo diseña uno sobre MQTT: cómo lanzan avisos los operarios y las máquinas, cómo se modelan los estados de aviso con mensajes retenidos, cómo funciona el escalado por tiempo y cómo los incumplimientos del tiempo de respuesta se convierten en alertas y KPI.

Qué debe hacer un andon

El principio lean detrás del andon es sencillo: cuando surge un problema, detente y pide ayuda de inmediato, y haz visible la petición para que la ayuda llegue rápido. Un andon de papel y lámpara cubre la parte visible. Un sistema andon digital añade lo que las lámparas no pueden:

  1. Enrutamiento: un aviso de material va a logística, uno de calidad al ingeniero de calidad y un fallo de máquina a mantenimiento.
  2. Escalado: si nadie lo reconoce en un tiempo determinado, el aviso pasa al siguiente nivel, como el jefe de equipo y después el jefe de turno.
  3. Medición: tiempo hasta el reconocimiento y tiempo hasta la resolución por tipo de aviso, puesto y turno.
  4. Visibilidad en todas partes: los tableros de línea, las tablets de los supervisores, el taller de mantenimiento y los teléfonos muestran los mismos avisos abiertos.

Tipos de aviso y ciclo de vida

Empieza con una lista corta de tipos de aviso que correspondan a tus funciones de apoyo:

Tipo de aviso Lanzado por Responsable Primer escalado típico
Material Operario Logística / abastecedor de material Responsable de logística
Mantenimiento Operario o fallo de máquina Técnico de mantenimiento Supervisor de mantenimiento
Calidad Operario o puesto de inspección Técnico de calidad Ingeniero de calidad
Ayuda / jefe de equipo Operario Jefe de equipo Jefe de turno
Seguridad Operario Jefe de turno Dirección de planta

Cada aviso recorre el mismo ciclo de vida: abierto (lanzado), reconocido (alguien va de camino), resuelto (problema corregido, línea en marcha), con un estado opcional cancelado para los avisos erróneos. El nivel de escalado aumenta mientras un aviso permanece abierto o reconocido demasiado tiempo.

Diseñar el sistema andon digital sobre MQTT

MQTT encaja bien con el andon porque cada participante es un cliente ligero: pulsadores, gateways de máquinas, pantallas, teléfonos y el servicio de escalado. El broker distribuye cada cambio a todos los que lo necesitan. Si el concepto es nuevo para ti, empieza por qué hace un broker MQTT.

Estructura de topics

connectmq/plant1/assembly/line1/st-30/andon/material      retained: current call state for this type
connectmq/plant1/assembly/line1/st-30/andon/maintenance   retained
connectmq/plant1/assembly/line1/st-30/andon/events        not retained: every transition
connectmq/plant1/assembly/line1/andon/summary             retained: open calls on the line

Un topic retenido por puesto y tipo de aviso significa que una pantalla que se enciende a mitad de turno muestra de inmediato todos los avisos abiertos. Un payload vacío o resolved significa que no hay ningún aviso activo.

Payload del aviso

{
  "id": "st30-mat-1760600000",
  "type": "material",
  "state": "open",
  "level": 0,
  "opened": 1760600000,
  "acknowledged": null,
  "resolved": null,
  "by": "operator-panel-st30",
  "note": "Screws M4x10"
}

Las marcas de tiempo de cada transición hacen que calcular los tiempos de respuesta después sea trivial, y level indica a los tableros de qué color mostrar el aviso.

Lanzar, reconocer y resolver avisos

Las fuentes de avisos publican el estado retenido. Los pulsadores de los operarios pueden ser placas ESP32 con grandes pulsadores iluminados, una pantalla HMI o una app web en una tablet; las máquinas lanzan avisos de mantenimiento automáticamente a partir de los estados de fallo de la monitorización del estado de las máquinas. Los ejemplos siguientes simulan los tres pasos desde un terminal en el servidor MQTT público gratuito, pensado para pruebas y no para datos de producción:

T=connectmq/demo/andon-6h4v/line1/st-30/andon/material
OPENED=$(date +%s)

# Operator raises a call
mosquitto_pub -h broker.connectmq.com -p 1883 -i andon-op-$RANDOM -q 1 -r -t $T \
  -m "{\"id\":\"st30-mat-1\",\"type\":\"material\",\"state\":\"open\",\"level\":0,\"opened\":$OPENED}"

# Material handler acknowledges
mosquitto_pub -h broker.connectmq.com -p 1883 -i andon-ack-$RANDOM -q 1 -r -t $T \
  -m "{\"id\":\"st30-mat-1\",\"type\":\"material\",\"state\":\"acknowledged\",\"level\":0,\"opened\":$OPENED,\"acknowledged\":$(date +%s)}"

# Call resolved
mosquitto_pub -h broker.connectmq.com -p 1883 -i andon-res-$RANDOM -q 1 -r -t $T \
  -m "{\"id\":\"st30-mat-1\",\"type\":\"material\",\"state\":\"resolved\",\"opened\":$OPENED,\"resolved\":$(date +%s)}"

Una app real de respuesta lee el aviso retenido, actualiza los campos y vuelve a publicar el objeto completo. Como el topic es por puesto y tipo, los avisos simultáneos de tipos distintos nunca se sobrescriben entre sí.

El servicio de escalado

El escalado es un pequeño servicio que se suscribe a todos los topics andon, sigue los avisos abiertos, sube el nivel cuando se superan los límites de tiempo y publica la duración abierta para que puedan dispararse las alertas. Aquí está con MQTT.js y MQTT 5:

// andon-escalation.mjs  -  npm install mqtt
import mqtt from "mqtt";

const prefix = "connectmq/demo/andon-6h4v/line1";
const limits = {                        // seconds until next level, per call type
  material:    [180, 600, 1200],
  maintenance: [300, 900, 1800],
  quality:     [300, 900],
  help:        [120, 600],
  safety:      [0, 60],
};

const client = mqtt.connect("mqtts://broker.connectmq.com:8883", {
  clientId: "andon-esc-6h4v",
  protocolVersion: 5,
});
const calls = new Map();                // topic -> call object

client.on("connect", () => client.subscribe(`${prefix}/+/andon/+`, { qos: 1 }));

client.on("message", (topic, buf) => {
  if (topic.endsWith("/events")) return;
  const text = buf.toString();
  if (!text) { calls.delete(topic); return; }
  const call = JSON.parse(text);
  if (call.state === "resolved" || call.state === "cancelled") {
    if (!calls.delete(topic)) return;      // ignore stale retained resolutions
    const station = topic.split("/").at(-3);
    client.publish(topic.replace(/[^/]+$/, "events"), JSON.stringify({ ...call, station }), { qos: 1 });
  } else {
    calls.set(topic, call);
  }
  publishSummary();
});

function publishSummary() {
  const open = [...calls.entries()].map(([t, c]) => ({
    station: t.split("/").at(-3), type: c.type, state: c.state, level: c.level ?? 0,
    open_s: Math.round(Date.now() / 1000 - c.opened),
  }));
  const maxOpen = open.reduce((m, c) => Math.max(m, c.open_s), 0);
  client.publish(`${prefix}/andon/summary`,
    JSON.stringify({ ts: Math.round(Date.now() / 1000), open_calls: open.length, max_open_s: maxOpen, calls: open }),
    { qos: 1, retain: true });
}

setInterval(() => {
  const now = Date.now() / 1000;
  for (const [topic, call] of calls) {
    const steps = limits[call.type] ?? [300];
    const age = now - call.opened;
    const level = steps.filter((s) => age >= s).length;
    if (level > (call.level ?? 0)) {
      call.level = level;
      client.publish(topic, JSON.stringify(call), { qos: 1, retain: true });
      console.log(`escalated ${call.type} at ${topic} to level ${level}`);
    }
  }
  publishSummary();
}, 10_000);

El servicio vuelve a publicar el aviso retenido con un level más alto, de modo que todos los tableros cambian de color a la vez, y publica un resumen retenido de la línea con max_open_s, la antigüedad del aviso abierto más antiguo. Los avisos resueltos se copian al topic events, donde un historiador los recoge para los informes. Cuando llega un mensaje de resolución, el servicio deja de seguir el aviso para que el resumen baje, e ignora las resoluciones retenidas antiguas que recibe tras un reinicio.

Ejecútalo cerca de la línea o en la nube; solo necesita acceso de red al broker. Para tener redundancia, dos instancias pueden repartirse el trabajo usando las shared subscriptions de MQTT 5, disponibles en el plan Serverless de pago de ConnectMQ y en los planes superiores.

Alertas por tiempo de respuesta

El topic de resumen facilita detectar los incumplimientos del tiempo de respuesta sin más código. En el portal de ConnectMQ, crea una regla de alerta por umbral sobre el campo max_open_s de .../andon/summary, por ejemplo "mayor que 900", y cada incumplimiento queda en el registro de alertas con su hora y su valor. Los supervisores pueden revisar el registro al final de cada turno. Para enviar notificaciones a teléfonos, chats o una sirena, conecta Node-RED u otro pequeño suscriptor al broker y reenvía los eventos; la guía de alertas por umbral con MQTT explica ese patrón.

Tableros

Los tableros andon son simplemente suscriptores. Un navegador en una pantalla mural se conecta por WebSocket seguro (wss://broker.connectmq.com:8084/mqtt), se suscribe a los topics andon de la línea y al resumen, y representa los puestos como mosaicos: verde sin aviso, amarillo para un aviso abierto, naranja para reconocido, rojo cuando está escalado. Como todos los estados son retenidos, un tablero que se reinicia recupera la imagen completa en un segundo. Los mismos datos pueden ser un panel de un dashboard de monitorización de líneas de producción más amplio o colorear los puestos en un gemelo digital 3D de la línea.

KPI andon que vale la pena seguir

KPI Cálculo Uso
Avisos por turno y tipo Recuento de eventos resueltos Revela problemas crónicos de material o calidad
Tiempo medio hasta el reconocimiento reconocido menos abierto Mide la disponibilidad del apoyo
Tiempo medio hasta la resolución resuelto menos abierto Mide el impacto en la línea
Tasa de escalado Avisos que alcanzan el nivel 1 o superior divididos entre todos los avisos Muestra si los límites y la dotación se ajustan a la realidad
Puestos con más tiempo andon Suma del tiempo abierto por puesto Orienta el trabajo de mejora

Vincula los eventos andon con los códigos de motivo de parada para que el tiempo que un puesto esperó material se clasifique de forma coherente en las pérdidas de disponibilidad.

Checklist de despliegue

  1. Acuerda los tipos de aviso, los responsables y los tiempos de escalado con producción, logística, mantenimiento y calidad.
  2. Haz un piloto en una línea con pulsadores sencillos y un tablero.
  3. Facilita el reconocimiento: un solo toque en el teléfono o un pulsador en el lugar del responsable.
  4. Revisa los KPI cada semana y ajusta los tiempos de escalado a objetivos realistas.
  5. Amplía a otras líneas con la misma estructura de topics; los tableros y los servicios funcionan sin cambios.

Infraestructura para un andon en toda la planta

Un andon que enmudece erosiona rápidamente la confianza, así que el broker debe estar disponible en cada turno. Un broker MQTT gestionado elimina el mantenimiento de servidores, y un broker MQTT en la nube permite a los supervisores recibir avisos en dispositivos móviles fuera de la red de la planta sin abrir puertos en el firewall. Para el contexto general, consulta la guía de fabricación inteligente.

Construye tu andon con ConnectMQ

ConnectMQ ofrece MQTT 5 sobre TLS y WebSocket seguro, retained messages, un explorador de topics en directo, reglas de alerta por umbral con registro de alertas y una vista de dispositivos ISA-95. Crea un broker Serverless gratuito, sin tarjeta de crédito, y prueba esta semana tu sistema andon digital en una línea.

Preguntas frecuentes

¿Qué es un sistema andon digital?

Es una versión electrónica del andon lean que permite a operarios y máquinas lanzar avisos de ayuda, los dirige a los responsables adecuados, los escala cuando nadie responde y registra los tiempos de respuesta y de resolución.

¿Por qué usar MQTT para el andon?

MQTT entrega los cambios de estado al instante a cada pantalla, teléfono y servicio, funciona igual con pulsadores de bajo consumo que con navegadores, y los mensajes retenidos permiten que cualquier pantalla recupere los avisos abiertos nada más arrancar.

¿Cómo funciona el escalado sin un motor de reglas en el broker?

Un pequeño servicio se suscribe a los topics de avisos, compara la antigüedad de cada aviso con los límites de escalado y vuelve a publicar los avisos con un nivel más alto. Las alertas por umbral de ConnectMQ registran después los incumplimientos del límite global de tiempo de respuesta.

¿Pueden las máquinas lanzar avisos andon automáticamente?

Sí. Un gateway en el edge que monitoriza los fallos de las máquinas puede publicar un aviso de mantenimiento en el topic andon del puesto cuando una máquina se detiene, usando el mismo payload que un aviso manual.

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.