Documentación: Nodo Bloqueo de Flujo (Lock Flow)¶
Descripción General¶
El Nodo Bloqueo de Flujo (Lock Flow) es un nodo de acción que implementa un bloqueo de concurrencia (mutex) sobre la automatización. Garantiza que solo una ejecución a la vez avance por la parte protegida del flujo: la primera ejecución que llega adquiere el bloqueo y continúa por la salida Flow free; cualquier otra ejecución que llegue mientras el bloqueo está tomado se desvía por la salida Flow locked.
En entornos IoT e industriales es clave para evitar acciones simultáneas conflictivas: que dos automatizaciones no abran la misma barrera al mismo tiempo, que no se dispare dos veces una rutina de mantenimiento sobre la misma línea de producción, o que un comando crítico a un equipo no se ejecute de forma concurrente.
¿Cuándo usar este nodo?¶
Utiliza este nodo cuando necesites:
- Serializar ejecuciones: que un proceso crítico no corra dos veces al mismo tiempo (control de concurrencia).
- Implementar un candado por recurso (por línea de producción, por dispositivo, por zona) usando un identificador de bloqueo.
- Evitar condiciones de carrera cuando varios eventos podrían disparar la misma automatización casi simultáneamente.
- Construir flujos con dos caminos: uno cuando el recurso está libre y otro cuando está ocupado.
Arquitectura: las dos salidas (Flow free / Flow locked)¶
El nodo expone dos conectores de salida:
- Flow free (verde): se toma cuando la ejecución adquiere el bloqueo correctamente. Conecta aquí las acciones protegidas (las que solo debe correr una ejecución a la vez).
- Flow locked (ámbar): se toma cuando el bloqueo ya estaba tomado por otra ejecución. Conecta aquí lo que debe ocurrir cuando el recurso está ocupado (por ejemplo, registrar el evento, notificar o simplemente terminar).
Configuración del Nodo¶
El nodo cuenta con dos pestañas de configuración: Formulario (Form) y Editor de JSON (JSON Editor).

Vista Formulario¶
1. ID del Bloqueo (Lock ID) *Requerido¶
Identificador del bloqueo. Todas las ejecuciones que usen el mismo lock_id compiten por el mismo candado. Usa un identificador descriptivo por recurso (por ejemplo, production_line_1). Soporta expresiones de plantilla para generar bloqueos dinámicos por objeto (por ejemplo, barrier_{{trigger.object_id}}).
2. Permitir Reemplazo (Allow replacement)¶
Interruptor que, al activarse, permite que una nueva ejecución tome el bloqueo aunque ya esté ocupado (reemplaza al titular actual). Por defecto está desactivado, de modo que el bloqueo respeta al primero que lo adquirió.
3. Tiempo de Espera (Timeout, segundos)¶
Tiempo máximo (en segundos) que la ejecución esperará para adquirir el bloqueo antes de desviarse por Flow locked. Con 0, no espera: si está ocupado, va directo a Flow locked.
4. Modo de Liberación (Release mode)¶
Define cómo se libera el bloqueo:
- By time: el bloqueo se libera automáticamente al cabo de un tiempo (definido en Release time).
- By automation completion: el bloqueo se libera cuando la automatización termina su ejecución.
5. Tiempo de Liberación (Release time, minutos)¶
Cuando el modo es By time, indica los minutos tras los cuales el bloqueo se libera automáticamente. Es obligatorio y debe ser mayor que 0 si el modo es By time (actúa como salvaguarda para que un bloqueo no quede tomado indefinidamente).

Vista Editor de JSON¶

Estructura JSON (Parámetros de entrada)¶
{
"lock_id": "production_line_1",
"allow_replacement": false,
"timeout_in_seconds": 30,
"release_mode": "by_time",
"release_time_in_minutes": 10
}
Campos del JSON¶
| Campo | Tipo | Descripción |
|---|---|---|
lock_id |
string | Identificador del bloqueo. Las ejecuciones con el mismo valor comparten el candado. |
allow_replacement |
boolean | Si es true, una nueva ejecución puede tomar el bloqueo aunque esté ocupado. |
timeout_in_seconds |
number | Segundos a esperar para adquirir el bloqueo antes de ir a Flow locked (0 = no esperar). |
release_mode |
string | Modo de liberación: by_time o by_automation_completion. |
release_time_in_minutes |
number | Minutos tras los que se libera el bloqueo (requerido y > 0 cuando release_mode es by_time). |
Output: Dónde viene la data del nodo¶
El nodo no produce un payload de datos; su efecto es de control de flujo: encamina la ejecución por Flow free (bloqueo adquirido) o por Flow locked (bloqueo ocupado). Las acciones conectadas a cada salida determinan el comportamiento según el estado del candado.
Ejemplos de uso¶
Ejemplo 1: Evitar mantenimiento concurrente en una línea de producción¶
Caso de uso: Varias condiciones pueden disparar la rutina de mantenimiento de la Línea 1, pero solo debe ejecutarse una a la vez. El nodo adquiere el bloqueo production_line_1; si ya hay una rutina en curso, la nueva ejecución se desvía y no interfiere.
- Lock ID:
production_line_1 - Timeout:
30segundos - Release mode:
By time - Release time:
10minutos - Flow free → ejecutar la rutina de mantenimiento. Flow locked → registrar que ya había una en curso.
(ver estructura JSON anterior)
Ejemplo 2: Candado por dispositivo con plantilla¶
Caso de uso: Una automatización opera sobre distintas barreras vehiculares. Usando un bloqueo dinámico por objeto se evita ejecutar dos comandos simultáneos sobre la misma barrera, sin bloquear a las demás.
- Lock ID:
barrier_{{trigger.object_id}} - Release mode:
By automation completion
Validación y errores¶
| Condición | Causa / Solución habitual |
|---|---|
release_time_in_minutes is required when release_mode is by_time |
El modo es By time pero el tiempo de liberación es 0 o está vacío. Asigna un valor en minutos mayor que 0. |
| La ejecución siempre va a Flow locked | El bloqueo está tomado y el timeout es 0, o quedó un bloqueo previo sin liberar. Ajusta el timeout o el modo de liberación. |
| El bloqueo no se libera | Si usas By time, revisa que el Release time sea razonable; si usas By automation completion, asegúrate de que la automatización finalice. |
Buenas prácticas¶
- Un
lock_idpor recurso: usa identificadores descriptivos (por línea, dispositivo o zona) para que el candado proteja exactamente lo que debe. - Definir siempre una salvaguarda de tiempo: con By time, un Release time prudente evita que un bloqueo quede tomado para siempre ante un fallo.
- Conectar ambas salidas: aprovecha Flow locked para registrar o notificar cuando el recurso está ocupado, en vez de perder ese evento.
- Usar
Allow replacementcon cuidado: solo cuando una nueva ejecución deba tener prioridad sobre la anterior; de lo contrario, déjalo desactivado.