Los bloques de acción hacen algo: llamar a otro sistema, publicar un mensaje, guardar una variable, iniciar un temporizador, pasar el mensaje a otro flujo o escribir una línea de registro. Las acciones de dispositivo, alarma y notificación tienen sus propias páginas: bloques de datos IoT y bloques de alarma, comando y notificación.
Comportamiento común de los bloques de salida
Petición HTTP, MQTT out y Webhook comparten estas reglas:
| Tema | Comportamiento |
|---|---|
| Riesgo | Externo: un despliegue que contenga uno pide una confirmación |
| Reintentos | Solo los fallos transitorios se reintentan; 3 intentos por defecto (ajustes retry_*), como máximo 5, con un retroceso exponencial desde 1 s |
| Idempotencia | Cada intento de un mensaje lleva la misma clave (X-Idempotency-Key, o la propiedad de usuario MQTT 5 idempotency-key), también tras un fallo o una repetición, para que el receptor pueda deduplicar |
| Entrega | Al menos una vez |
| Cortacircuitos | Un bloque cuyas llamadas siguen fallando pausa sus llamadas durante un tiempo (circuit_open) |
| Mensajes tardíos | late: skip (por defecto; el mensaje se detiene y se cuenta como Demasiado antiguo) o send (un flujo de datos que también debe recibir el retraso acumulado tras una caída) |
| Pruebas | Una ejecución de prueba no envía nada e informa de lo que habría enviado |
| Orden | Las llamadas de Petición HTTP y MQTT out se ejecutan por separado de la ejecución que las hizo: el siguiente mensaje del dispositivo no espera la respuesta, y el orden de los mensajes tras la llamada no está garantizado |
| Direcciones | Las direcciones privadas e internas se rechazan (ssrf_blocked) |
Petición HTTP
Llama a un endpoint HTTP y coloca la respuesta en el mensaje. El esquema, el host, el puerto, la autenticación y TLS vienen solo de la conexión endpoint, nunca del mensaje. Consulte Conexiones y secretos.
| Ajuste | Significado | Por defecto | Valores |
|---|---|---|---|
| endpoint | La conexión del endpoint HTTP | obligatorio | |
| host | Otro host que permite el endpoint | vacío | una plantilla; debe coincidir con los hosts permitidos del endpoint |
| method | Método HTTP | GET | GET, POST, PUT, PATCH, DELETE, HEAD |
| path | Se añade a la ruta base del endpoint | vacío | una plantilla, 1.024 caracteres |
| query | Parámetros de consulta | ninguno | hasta 16 filas |
| headers | Cabeceras adicionales | ninguna | hasta 16 filas; Host, Authorization, Cookie, Proxy-*, Content-Length, X-Idempotency-Key y las cabeceras hop-by-hop se rechazan |
| body | Qué se envía | payload | payload, template, none (oculto para GET, HEAD, DELETE) |
| template | La plantilla del cuerpo | vacío | hasta 4.096 caracteres |
| template_format | Cómo se escriben los valores {{ }} | text | text, json (cada valor como valor JSON; el cuerpo debe ser JSON) |
| timeout_ms | Tiempo por intento | 10,000 | 1.000 a 30.000 |
| parse | Cómo se lee la respuesta | auto | auto, json, text |
| max_bytes | Respuesta más grande | 64 KiB | 1 a 256 KiB |
| response_headers | Cabeceras de respuesta que se guardan en msg.metadata.headers | all | all, list, none (como máximo 32 cabeceras, 8 KiB) |
| max_parallel | Llamadas en curso para este bloque | 0 (sin límite) | 0 a 64 |
| inline | Mantiene la llamada dentro de la ejecución, de modo que el siguiente mensaje del dispositivo espera la respuesta (el despliegue avisa) | off | on, off |
| retry_* | Intentos y retroceso | 3, desde 1 s | |
| late | Véase arriba | skip | skip, send |
Salidas:
out: estado inferior a 400.msg.payloades el cuerpo,msg.statusCode,msg.contentType,msg.metadata.headers. No se siguen las redirecciones.error:http_status(400 o superior, cuerpo enmsg.payload),timeout,connect,tls,ssrf_blocked,too_large,invalid_json,invalid_value,oauth_failed,function_error,circuit_open,limit.msg.error.attemptsindica cuántos intentos se hicieron.
Se reintenta: timeouts, fallos de conexión y HTTP 408, 425, 429 (respetando Retry-After), 500, 502, 503, 504.
Para un cuerpo JSON construido a partir de valores, use template_format: json y deje los marcadores sin comillas: {"name": {{ msg.payload.name }}, "n": {{ msg.payload.n }}}.
Respuesta HTTP
Responde al llamante de un disparador Webhook síncrono (reply: response). Gana la primera respuesta de una ejecución.
| Ajuste | Significado | Por defecto | Valores |
|---|---|---|---|
| status | Estado HTTP (msg.statusCode lo sobrescribe) | 200 | 100 a 599 |
| headers | Cabeceras de respuesta | ninguna | content-type, cache-control, location (3xx), x-* (no x-forwarded-*) |
| body | Qué se envía | payload | payload, template, none |
| template | Plantilla del cuerpo | vacío | hasta 4.096 caracteres |
| max_bytes | Cuerpo más grande | 256 KiB | como máximo 256 KiB |
Errores: no_reply_pending, reply_sent, limit. Sin respuesta, el llamante recibe 204; tras el timeout del hook, 504.
MQTT out
Publica el payload en un tema de su broker y después pasa el mensaje. El texto se envía como texto y cualquier otro valor como JSON.
| Ajuste | Significado | Por defecto | Valores |
|---|---|---|---|
| broker | La conexión al broker MQTT | obligatorio | |
| topic | El tema | {{ msg.topic }} | una plantilla, 256 caracteres; un ~/ inicial es el prefijo de tema del broker |
| qos | Garantía de entrega | 0 | 0, 1, 2 |
| retain | Pide al broker que conserve el mensaje | off | on, off |
| timeout_ms | Tiempo para la confirmación | 10,000 | 1.000 a 30.000 |
| max_parallel | Publicaciones en curso | 0 (sin límite) | 0 a 64 |
| retry_*, late | Como arriba |
Errores: bad_topic (vacío, + o #, o ~/ sin prefijo), timeout, connect, auth, ssrf_blocked, node_not_ready, not_configured, circuit_open, limit. Solo los timeouts y los fallos de conexión se reintentan.
Webhook
Envía el mensaje a uno de los endpoints webhook de su organización: firmado, con reintentos y listado en las entregas del endpoint. Es la vía de entrega garantizada.
| Ajuste | Significado | Por defecto | Valores |
|---|---|---|---|
| endpoint | El endpoint | obligatorio | endpoints activos suscritos a Mensaje de automatización |
| topic | Se envía como topic | {{ msg.topic }} | una plantilla, 256 caracteres |
| body | Qué se envía además del tema | payload | payload, payload and metadata |
| metadata_keys | Claves de metadatos enviadas | ninguna | como máximo 20 |
| late | Véase arriba | skip | skip, send |
El receptor recibe el evento automation.message con topic, payload, originator, flowId, flowVersion, nodeId, actor y los metadatos indicados. out lleva msg.metadata.webhook.deliveryId una vez encolado. Errores: endpoint_not_found, endpoint_inactive, enqueue_failed, not_configured, node_not_ready, circuit_open, limit (webhooks no incluidos en su plan). Consulte Webhooks.
Emitir evento
Envía un evento que el disparador Evento con origen flow recibe, en cualquier flujo.
| Ajuste | Significado | Por defecto | Valores |
|---|---|---|---|
| kind | El nombre del evento | obligatorio | una letra minúscula al inicio, después letras minúsculas, dígitos, _ y .; hasta 32 caracteres |
| data | Lo que transporta | msg.payload | cualquier tipo de valor; un valor que no es objeto se envuelve como { "value": … } |
Los oyentes reciben msg.payload = los datos y msg.topic flow/<kind>. Errores: rate_limited, invalid_value (un kind no válido, o «emit: depth»: el quinto paso de una cadena). Un despliegue rechaza un bucle que pueda ver (flow_cycle). Un mensaje tardío no emite nada.
Establecer variable
Guarda un valor en una variable de flujo o global.
| Ajuste | Significado | Valores |
|---|---|---|
| path | La variable | flow.<name> o global.<name>, se permiten claves más profundas; flow.persist:<name> para el almacén persistente |
| value | Lo que se guarda | cualquier tipo de valor; nada (null) la elimina |
Errores: invalid_value, limit (almacén lleno; el valor anterior se mantiene). Límites: 1 MiB por flujo, 4 MiB para variables globales. En una prueba se escribe la copia propia de la prueba.
Temporizador
Inicia, reinicia o cancela un temporizador con nombre. Cuando termina, se activa todo disparador Named timer con ese nombre.
| Ajuste | Significado | Predeterminado | Valores |
|---|---|---|---|
| name | El temporizador, compartido por todos los flujos | obligatorio | |
| op | Iniciar (de nuevo) o cancelar | start | start, cancel |
| ms | Duración (msg.ms la sobrescribe) | 1 min | 0 a 7 días |
Iniciar un temporizador en marcha lo reinicia desde cero: el patrón watchdog. Error queue_full «too many timers»: la organización tiene 64 temporizadores de 60 s o menos, o 10 000 más largos. Un mensaje tardío no inicia ni cancela nada.
Activar o desactivar un flujo
Activa o desactiva otro flujo, igual que el interruptor de la lista de flujos.
| Ajuste | Significado | Predeterminado | Valores |
|---|---|---|---|
| flow | El flujo | obligatorio | un flujo desplegado de la organización, distinto de este |
| state | Activar o desactivar | enable | enable, disable |
out lleva msg.metadata.flow_enable { flow, enabled, changed }. Errores: not_configured, self_reference, not_found, not_approved, conflict, invalid, limit (más de 6 cambios por minuto). Desplegar un flujo con este bloque requiere la confirmación escrita.
Ejecutar flujo
Entrega el mensaje a la Flow input de otro flujo y termina esta rama.
| Ajuste | Significado | Valores |
|---|---|---|
| flow | El flujo a ejecutar | otro flujo del mismo host; nunca un flujo raíz |
No hay puerto out; nada regresa. Errores: not_configured, invalid_value (ausente, desactivado o detenido), forbidden (un raíz), loop (quinto salto). Un flujo que otros flujos ejecutan no se puede eliminar hasta que se quiten esos bloques. El mensaje conserva su dispositivo, así que Save telemetry funciona en el flujo destino.
Link out
Pasa el mensaje a bloques Link in por nombre, o devuelve la respuesta a una Link call.
| Ajuste | Significado | Predeterminado | Valores |
|---|---|---|---|
| mode | link (a bloques Link in) o return (responder al llamador) | link | link, return |
| targets | Nombres de Link in (modo link) | vacío | hasta 16 |
| name | El nombre del retorno (modo return) | out | un retorno que declara el llamador |
No hay puerto out. Un destino ausente es una advertencia en el panel de depuración, no un error. Un despliegue rechaza nombres desconocidos y bucles sin bloque de espera (cycle_sync).
Registro del sistema
Escribe una línea en el registro del flujo (Activity > Events > Log, se guarda 24 horas).
| Ajuste | Significado | Predeterminado | Valores |
|---|---|---|---|
| text | La línea, con marcadores {{ }} | {{ msg.payload }} | hasta 512 caracteres |
| level | Prioridad | info | info, notice, warn, err |
Depuración
Muestra los mensajes que le llegan en la pestaña Activity > Debug del editor. No tiene puerto out.
| Ajuste | Significado | Predeterminado | Valores |
|---|---|---|---|
| property | Qué mostrar | msg.payload | msg (el mensaje completo) o una ruta |
| active | Mostrar mensajes | on | on, off |
Las entradas de depuración se guardan 24 horas y son visibles para las personas que pueden depurar. El botón del bloque lo activa o desactiva sin guardar.
Escribir en una base de datos de series temporales externa
Un bloque escribe un punto por mensaje en un servidor de base de datos de series temporales externo propio, mediante una conexión a servidor de base de datos. Ajustes: el servidor, el bucket o la base de datos, la medición, hasta 16 etiquetas, de 1 a 32 campos (con un tipo: auto, float, int, string, bool), la hora (predeterminado: la hora del primer intento, igual en cada reintento), timeout_ms (de 1 000 a 30 000), reintentos y late. out lleva msg.metadata con la medición escrita, los campos y las etiquetas. Para una integración general, el bloque HTTP request a tu propia API suele ser más sencillo.

