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:
- Enrutamiento: un aviso de material va a logística, uno de calidad al ingeniero de calidad y un fallo de máquina a mantenimiento.
- 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.
- Medición: tiempo hasta el reconocimiento y tiempo hasta la resolución por tipo de aviso, puesto y turno.
- 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
- Acuerda los tipos de aviso, los responsables y los tiempos de escalado con producción, logística, mantenimiento y calidad.
- Haz un piloto en una línea con pulsadores sencillos y un tablero.
- Facilita el reconocimiento: un solo toque en el teléfono o un pulsador en el lugar del responsable.
- Revisa los KPI cada semana y ajusta los tiempos de escalado a objetivos realistas.
- 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.



