Los subflujos de Node-RED te permiten empaquetar un grupo de nodos en un único nodo reutilizable, de modo que la lógica que escribiste una vez se pueda colocar en cualquier pestaña y configurar en cada uso. En esta guía crearás un subflujo de alertas MQTT con sus propios ajustes, añadirás informe de estado y gestión de errores, y lo reutilizarás en varios topics de ConnectMQ sin copiar una sola función.
El problema que resuelven los subflujos
Los flujos MQTT tienden a repetirse. Cada topic de sensor necesita los mismos pasos: analizar el payload, comprobar que es coherente, comparar un valor con un umbral, publicar una alerta y quizá limitar la frecuencia de las alertas para no saturar al operador. La primera vez construyes estos nodos a mano. La quinta, los copias y pegas. Hacia la vigésima, corregir un error significa editar veinte nodos function, y siempre se te escapa alguno.
Un subflujo lo soluciona. Defines la lógica una vez como plantilla, y cada lugar donde la usas es una instancia de esa plantilla. Cambia la plantilla y todas las instancias se actualizan en el siguiente despliegue. Cada instancia puede seguir teniendo sus propios ajustes, como un umbral o un topic de alerta diferentes, mediante las propiedades del subflujo.
| Enfoque | Reutilización | Ajustes por uso | Mantenimiento |
|---|---|---|---|
| Copiar y pegar nodos | Manual | Editar cada copia | Hay que corregir todas las copias |
| Nodos link hacia una cadena compartida | Compartida, una sola instancia | Deben viajar en msg |
Un único lugar, pero el estado compartido puede chocar |
| Subflujo | Cada uso es una instancia | Propiedades por instancia | Una plantilla, estado aislado por instancia |
Los nodos link son una buena opción cuando quieres una única cadena de procesamiento compartida. Los subflujos de Node-RED son mejores cuando cada uso necesita su propia configuración y su propio estado.
Cómo funcionan los subflujos de Node-RED
Un subflujo tiene una plantilla e instancias:
- Plantilla. Se abre como una pestaña propia en el editor y contiene los nodos, un puerto de entrada opcional (0 o 1), cualquier número de puertos de salida y un puerto de estado opcional.
- Instancias. Aparecen en la paleta bajo "subflows" y se comportan como cualquier otro nodo. Cada instancia tiene su propio contexto flow y sus propios valores para las propiedades del subflujo.
- Propiedades. Se definen en el diálogo de edición de la plantilla, cada una con un nombre, un tipo y un valor predeterminado. Dentro del subflujo, los nodos las leen como variables de entorno:
env.get("THRESHOLD")en una función, o${THRESHOLD}escrito como valor completo de un campo de texto de un nodo.
Puedes crear un subflujo desde cero mediante el menú (Subflows → Create Subflow) o, con más frecuencia, seleccionar nodos existentes y elegir Subflows → Selection to Subflow. Node-RED conecta las entradas y salidas por ti en función de los cables que cruzaban el límite de la selección.
Crea un subflujo de alertas MQTT
El objetivo: un nodo que reciba un mensaje de telemetría MQTT ya analizado, compruebe un campo frente a un umbral, deje pasar los datos normales por la salida 1 y emita un mensaje de alerta por la salida 2, con un tiempo de enfriamiento para que el mismo dispositivo no genere alertas cada segundo.
Paso 1: crea la plantilla y las propiedades
Crea un nuevo subflujo, llámalo "Threshold alert" y configura inputs a 1 y outputs a 2. Abre las propiedades del subflujo y añade:
| Propiedad | Tipo | Predeterminado | Significado |
|---|---|---|---|
FIELD |
string | temp |
Campo del payload que se comprueba |
THRESHOLD |
number | 30 |
Alerta por encima de este valor |
COOLDOWN_S |
number | 60 |
Segundos mínimos entre alertas por topic |
SEVERITY |
string | high |
Etiqueta incluida en la alerta |
También puedes asignar a cada propiedad un widget de interfaz (texto, número, casilla, selector), lo que hace las instancias más amigables para los compañeros que nunca abren la plantilla.
Paso 2: añade la lógica
Dentro de la plantilla, conecta entrada → función → dos salidas. La función:
// Función dentro del subflujo "Threshold alert", 2 salidas
const field = env.get("FIELD");
const threshold = Number(env.get("THRESHOLD"));
const cooldownMs = Number(env.get("COOLDOWN_S")) * 1000;
const value = msg.payload && msg.payload[field];
if (typeof value !== "number") {
node.error(`Field "${field}" missing or not numeric on ${msg.topic}`, msg);
return [null, null];
}
let alertMsg = null;
if (value > threshold) {
const lastAlerts = flow.get("lastAlerts") || {};
const now = Date.now();
if (!lastAlerts[msg.topic] || now - lastAlerts[msg.topic] > cooldownMs) {
lastAlerts[msg.topic] = now;
flow.set("lastAlerts", lastAlerts);
alertMsg = {
topic: msg.topic.replace(/\/telemetry$/, "/alert"),
payload: {
field: field,
value: value,
threshold: threshold,
severity: env.get("SEVERITY"),
ts: new Date(now).toISOString()
}
};
}
}
node.status({ fill: alertMsg ? "red" : "green", shape: "dot", text: `${field}=${value}` });
return [msg, alertMsg];
Ten en cuenta que aquí flow es el contexto propio de la instancia. Dos instancias del subflujo no comparten sus tablas de enfriamiento, que es exactamente lo que quieres.
Paso 3: informa del estado en la instancia
Activa el puerto status del subflujo y conecta a él un nodo Status (limitado a la función). El nodo de instancia en tu pestaña principal mostrará entonces el mismo punto verde o rojo y el último valor, para que puedas supervisar muchas instancias de un vistazo.
Paso 4: úsalo en varios topics
En tu pestaña principal, añade un nodo mqtt in por cada origen, o uno con un comodín, y conéctalos a instancias separadas con ajustes distintos. Para una prueba rápida, publica en el servidor MQTT público gratuito, sustituyendo e2a7 por tu propia cadena aleatoria:
mosquitto_pub -h broker.connectmq.com -p 1883 -i demo-sub-e2a7 \
-t "connectmq/demo/e2a7/furnace1/telemetry" -m '{"temp": 912}'
mosquitto_pub -h broker.connectmq.com -p 1883 -i demo-sub-e2a7 \
-t "connectmq/demo/e2a7/tank1/telemetry" -m '{"level": 97}'
La primera instancia comprueba FIELD=temp con THRESHOLD=850 para los hornos; la segunda comprueba FIELD=level con THRESHOLD=95 para los depósitos. Conecta la segunda salida de cada instancia a un único nodo mqtt out compartido con el topic vacío, para que las alertas se publiquen en el topic que fijó la función.
Un subflujo con su propia suscripción MQTT
Un subflujo no necesita entrada. Un subflujo sin entradas puede contener su propio nodo mqtt in cuyo topic sea ${TOPIC}, una propiedad del subflujo. Cada instancia se suscribe entonces a un topic distinto mientras comparte un mismo nodo de configuración de broker, de modo que todas las instancias usan la misma conexión única con el broker.
Es una solución ordenada para paneles con muchos paneles de máquina idénticos: una instancia de subflujo por máquina, cada una con su TOPIC y un nombre para mostrar. La contrapartida es que la suscripción queda fijada en el momento del despliegue. Si necesitas cambiar de topic sobre la marcha, combina los subflujos con la suscripción MQTT dinámica de Node-RED.
Mantén el nodo de configuración del broker fuera del subflujo, en el flujo principal o en el ámbito global. Poner una configuración de broker dentro de la plantilla crearía una conexión con el broker por instancia, y cada una necesitaría su propio client ID.
Gestión de errores dentro de los subflujos
Los errores generados dentro de una instancia, incluida la llamada node.error(..., msg) anterior, pueden capturarse con un nodo Catch dentro de la plantilla del subflujo. Si ningún nodo Catch interno los gestiona, se propagan a los nodos Catch de la pestaña que contiene la instancia. Un patrón habitual es gestionar dentro del subflujo los errores conocidos y recuperables, y dejar que los inesperados suban a un único gestor de "errors" por pestaña.
Lista de comprobación de subflujos de Node-RED
- Da a cada propiedad un valor predeterminado sensato para que una nueva instancia funcione de inmediato.
- Prefiere propiedades a valores fijos en el código; todo lo que cambie entre usos debe ir en una propiedad.
- Mantén los subflujos enfocados: una tarea cada uno, como "parse", "alert" o "rate limit".
- Añade un puerto de estado para que las instancias sean observables en el lienzo.
- Mantén los nodos de configuración del broker fuera de la plantilla.
- Documenta el subflujo en su campo de descripción; aparece en la barra lateral de ayuda de cada instancia.
- Versiona tus plantillas con git mediante los proyectos de Node-RED, para que un cambio de plantilla se revise como código.
Para la parte de programación, nuestra guía del nodo function de Node-RED cubre con más profundidad los retornos con varias salidas y los envíos asíncronos, y la explicación del contexto en Node-RED aclara cómo se relaciona el contexto flow de una instancia con su padre mediante $parent. La documentación oficial de los subflujos en nodered.org enumera todas las opciones de la plantilla.
Ejecuta lógica reutilizable de Node-RED en ConnectMQ
Los subflujos facilitan pasar de tres sensores a trescientos, y tu broker debería escalar con ellos. ConnectMQ es un broker MQTT gestionado con TLS, MQTT 5 y un portal donde puedes definir reglas de alerta por umbral y vigilar los topics de alerta que publican tus subflujos. Cuando se te quede pequeño el nivel gratuito, los planes Serverless de pago admiten hasta 1.000 conexiones, y los clústeres Dedicated aíslan por completo tu tráfico. Crea tu primer broker en app.connectmq.com con el plan Serverless gratuito, sin tarjeta de crédito. Si aún estás eligiendo infraestructura, lee nuestra guía sobre el modelo de broker MQTT en la nube, y para una introducción completa consulta el tutorial de Node-RED MQTT.
Preguntas frecuentes
¿Cuál es la diferencia entre un subflujo y un grupo en Node-RED?
Un grupo es un recuadro visual alrededor de nodos de una pestaña. Un subflujo es una plantilla reutilizable que aparece como nodo en la paleta y puede instanciarse muchas veces con ajustes distintos.
¿Cómo paso ajustes a un subflujo de Node-RED?
Define propiedades en la plantilla del subflujo y asigna valores en cada instancia. Dentro del subflujo, léelas con env.get("NAME") o escribiendo ${NAME} en una propiedad de un nodo.
¿Tiene cada instancia de subflujo su propio contexto?
Sí. El contexto flow dentro de un subflujo pertenece a esa instancia, así que las instancias no interfieren entre sí. Usa el prefijo $parent. para acceder al contexto del flujo que la contiene.
¿Abren los nodos MQTT dentro de las instancias de subflujo conexiones adicionales con el broker?
No, si todos usan el mismo nodo de configuración de broker definido fuera del subflujo. Node-RED comparte una conexión por cada nodo de configuración de broker.



