Un comando (también llamado RPC) pide a un dispositivo que haga algo: reiniciarse, conmutar una salida, ejecutar una prueba. Cada comando se guarda como una solicitud, y puede seguirse hasta que el dispositivo responda. Los comandos solo se envían a través de sesiones TLS (salvo que el perfil permita un comando en claro), nunca por los flujos que procesan telemetría, y cada uno se comprueba frente a los permisos del remitente.
El catálogo de comandos
Cada perfil de dispositivo tiene una pestaña Commands: «Los comandos que los operadores pueden enviar a los dispositivos de este perfil; cada nivel necesita su propio permiso.» Editarla requiere el permiso para gestionar comandos (administradores).
Seleccione Add command y complete:
| Campo | Significado |
|---|---|
| Method | El nombre en el cable, namespace.verb, por ejemplo sys.info. Letras, dígitos, _ y .. |
| Label, Description | Lo que ven los operadores. |
| Tier | Basic, Privileged o Critical: quién puede enviarlo (ver abajo). |
| High impact (asks for a confirmation) | El remitente debe confirmar; el comando se envía como máximo una vez y se audita. |
| Typed confirmation phrase | Opcional, solo para alto impacto: el operador la escribe para enviar (por ejemplo REBOOT). |
| One-way (no answer) | El dispositivo no responde. |
| Long-running (the answer only says it started) | El dispositivo responde de inmediato e informa del resultado más tarde. |
| Default timeout (ms) | De 1.000 a 600.000. Vacío: el Default RPC timeout del perfil. |
| Persistent by default (delivered when the device comes back) | Pone el comando en cola mientras el dispositivo está desconectado. |
| Parameters | Se crean con Fields (nombre, etiqueta, tipo Text, Number, Yes / no, Choice o Any value (JSON), obligatorio, min, max, choices) o como Advanced (JSON). Hasta 50 parámetros. |
| Masked parameters | Nombres de parámetros cuyos valores nunca se muestran en el historial. |
From a template inicia el formulario a partir de un comando que la plataforma ya envía (como un control de placa). Import sustituye todo el catálogo por una exportación ({"commands": [ … ]}); Export muestra el catálogo en JSON. Un perfil admite hasta 200 comandos.
Niveles
| Nivel | Quién puede enviarlo (por defecto) |
|---|---|
| Basic | Usuarios |
| Privileged | Administradores |
| Critical | Administradores |
| Raw (un método que no está en el catálogo) | Propietarios |
Nota
Algunos comandos nunca se envían, lo pida quien lo pida: restablecimiento de fábrica, emparejamiento, olvidar Wi-Fi y cloud.forget. Algunas familias de métodos pertenecen a un módulo y solo ese módulo las envía (por ejemplo tunnel.* para acceso remoto y esim.*). Los perfiles que solo usan el esquema de temas Legacy compatible no tienen comandos: «El RPC no está disponible para dispositivos con el esquema Legacy compatible; use atributos compartidos (pestaña Attributes) para enviar ajustes.»
Enviar un comando
- Abra el dispositivo y su pestaña Commands.
- Elija un comando en Choose a command (o Other method (raw), solo propietarios) y complete sus Parameters.
- Configure las opciones si es necesario:
| Opción | Significado | Por defecto |
|---|---|---|
| Do not wait for an answer (one-way) | El dispositivo no responde. | Desactivada (dos sentidos) |
| Answer timeout (seconds) | Tiempo de espera de la respuesta, de 1 a 600 segundos. | El valor por defecto del comando; si no, 10 segundos |
| Deliver when the device comes back (persistent) | Mantiene el comando en cola mientras el dispositivo está desconectado. | El valor por defecto del comando |
| Give up after (minutes) | Momento en que se descarta un comando en cola. | 24 horas; como máximo 7 días |
- Seleccione Send. Un comando de alto impacto pregunta Send {method}? («Este comando tiene impacto en el dispositivo (puede reiniciarlo o perder su sesión).») y, si tiene frase, Type {phrase} to confirm.
Si el dispositivo está desconectado, la pestaña avisa: «El dispositivo está desconectado: sin «persistent» el comando falla de inmediato.»
Los paneles, los símbolos SCADA, las reglas y los flujos también pueden enviar comandos. Un control de placa envía solo comandos de nivel básico. Consulte Control cards.
Estados del comando
| Estado | Se muestra como | Significado |
|---|---|---|
QUEUED | Queued | Almacenado, esperando al dispositivo. |
SENT | Sent | Enviado al dispositivo. |
DELIVERED | Delivered | El dispositivo lo recibió. |
SUCCESSFUL | Successful | El dispositivo respondió con éxito. |
FAILED | Failed | El dispositivo respondió con un error. |
TIMEOUT | Timed out | Sin respuesta a tiempo. Significa «no llegó ninguna respuesta», no «no se ejecutó». |
EXPIRED | Expired | Caducó antes de poder entregarse. |
CANCELLED | Cancelled | Alguien lo canceló. |
Un comando de larga duración muestra Running on the device hasta que llega su resultado; un comando que caducó muestra No answer: the outcome is unknown; una respuesta posterior al final muestra Answered after the end.
El historial
El History de la pestaña Commands lista Method, Status, Sent by (Console, API, A flow, Firmware update, An alarm action, A dashboard control), Created, Completed y Duration. Abra un comando para ver su Request, Response y Progress, para Cancel command mientras esté en cola o enviado, o para Send again. Los parámetros secretos aparecen enmascarados.
Límites por defecto: 10 comandos por dispositivo y minuto, y 600 por organización y minuto; parámetros de hasta 16 KiB de JSON; una respuesta de hasta 64 KiB. El historial se conserva durante 90 días.
En el dispositivo
El dispositivo se suscribe a v1/rpc/req/+ y recibe:
PUBLISH v1/rpc/req/42
{"method": "sys.ping", "params": {"host": "8.8.8.8", "count": 3}}
Para un comando de dos sentidos responde con el mismo id:
PUBLISH v1/rpc/res/42
{"ok": true, "result": {"sent": 3, "received": 3, "avg_ms": 18.2}}
Reglas para el dispositivo:
- Un comando puede llegar dos veces. Recuerde al menos los últimos 32 ids de solicitud durante 10 minutos y nunca ejecute dos veces el mismo id.
- Si la solicitud incluye
expirationTimey ya ha pasado, no la ejecute; responda{"ok": false, "error": "expired"}. - Si una solicitud es mayor de lo que el dispositivo puede aceptar, no la ejecute; responda
{"ok": false, "error": "payload_too_large"}. - Los comandos solo se entregan después de que el dispositivo se haya suscrito a
v1/rpc/req/+en esta conexión.
Los dispositivos HTTP esperan comandos con GET /api/v1/rpc y responden con POST /api/v1/rpc/{id}. Consulte Device HTTP API.
Comandos de larga duración
PUBLISH v1/rpc/res/43
{"ok": true, "accepted": true, "job_id": "43"}
PUBLISH v1/attributes
{"rpc_result": {"job_id": "43", "method": "sys.traceroute", "ok": true, "result": {...}, "ts": 1759572042000}}
Solicitudes desde el dispositivo
Un dispositivo también puede pedir algo a la nube: publique en v1/rpc/up/req/{id} con {"method": …, "params": …} y lea la respuesta en v1/rpc/up/res/{id}. Sus flujos reciben y responden estas solicitudes.
LoRaWAN y dispositivos hijos de pasarela
- Los dispositivos LoRaWAN reciben downlinks sin procesar con el comando
lora.downlink. Consulte Sending downlinks. - Los comandos a dispositivos detrás de una pasarela están en desarrollo. Consulte Commands to devices behind a gateway.
Por API
POST/tenant/{tenantId}/api/iot/devices/{deviceId}/rpc
Envía un comando a un dispositivo. Campos del cuerpo: method (obligatorio), params, oneway, persistent, timeoutMs (de 1.000 a 600.000), expiresInS (de 1 a 604.800), wait, confirm, confirmText, source (console, api o dashboard_control). params ocupa como máximo 16 KiB de JSON. Una llamada bidireccional, no persistente, con un tiempo de espera de como máximo 30 segundos espera a que termine y responde 200. Cualquier otra llamada responde 202 de inmediato. Un comando de alto impacto requiere "confirm": true.
Cuerpo de la solicitud application/json
{
"method": "sys.ping",
"params": {
"host": "8.8.8.8",
"count": 3
},
"timeoutMs": 10000
}
Ejemplo curl
curl -X POST 'https://<your-host>/tenant/{tenantId}/api/iot/devices/{deviceId}/rpc' \
-H 'Content-Type: application/json' \
-d '{"method":"sys.ping","params":{"host":"8.8.8.8","count":3},"timeoutMs":10000}'
Respuestas
200OK
{
"rpc": {
"rpcId": "…",
"deviceId": "…",
"method": "sys.ping",
"status": "SUCCESSFUL",
"outcome": null,
"response": {
"ok": true,
"result": {
"sent": 3,
"received": 3,
"avg_ms": 18.2
}
},
"tier": "basic",
"highImpact": false,
"source": "api",
"…": "…"
}
}
202Accepted
{
"rpc": {
"rpcId": "…",
"deviceId": "…",
"method": "sys.reboot",
"status": "QUEUED",
"…": "…"
}
}
400Bad Request
{
"message": "This command needs confirm: true.",
"code": "VALIDATION_ERROR",
"details": {
"reason": "confirm_required"
}
}
403Forbidden
Sin cuerpo de respuesta.
404Not Found
{
"message": "Device not found.",
"code": "NOT_FOUND"
}
429Too Many Requests
Sin cuerpo de respuesta.
Lee un comando con GET /tenant/{tenantId}/api/iot/rpc/{rpcId} y cancélalo con POST …/rpc/{rpcId}/cancel (solo mientras esté QUEUED o SENT; queda auditado). El campo outcome muestra running, unknown o late tal como se describe arriba. Consulta Commands API.
Los eventos de webhook rpc.completed y rpc.failed informan a otros sistemas del resultado. Los comandos de alto impacto y los comandos raw se escriben en el registro de auditoría al crearse y al terminar.

