Estas rutas permiten que un sistema de tickets, un centro de operaciones o un script trabajen con alarmas. El funcionamiento de las alarmas se explica en Alarms y Working with alarms. Las rutas están bajo https://<your host>/tenant/<tenantId>.
Rutas
| Método | Ruta | Permiso | Función |
|---|---|---|---|
| GET | /api/iot/alarms | iot_alarm.read | Listar alarmas |
| GET | /api/iot/alarms/counts | iot_alarm.read | Recuentos de abiertas y reconocidas por gravedad |
| GET | /api/iot/alarms/{alarmId} | iot_alarm.read | Una alarma, con su runbook |
| GET | /api/iot/alarms/{alarmId}/events | iot_alarm.read | La cronología de la alarma |
| POST | /api/iot/alarms/{alarmId}/comments | iot_alarm.acknowledge | Añadir una nota a la cronología |
| POST | /api/iot/alarms/acknowledge | iot_alarm.acknowledge | Reconocer hasta 100 alarmas |
| POST | /api/iot/alarms/resolve | iot_alarm.resolve | Resolver hasta 100 alarmas manualmente |
| GET | /api/iot/alarm-rules/{profileId} | iot_alarm.read | Las reglas de alarma de un perfil |
| PUT | /api/iot/alarm-rules/{profileId} | iot_alarm.rules.manage | Reemplazar las reglas de alarma de un perfil |
| GET, POST, DELETE | /api/iot/devices/{deviceId}/alarm-mute | lectura: iot_alarm.read; cambio: iot_alarm.mute | Los silenciamientos de un dispositivo |
Roles predeterminados: leer y reconocer son permisos de User; resolver, silenciar y cambiar reglas son permisos de Admin.
Listar alarmas
GET /api/iot/alarms (las páginas empiezan en 1). Los parámetros desconocidos se rechazan.
| Parámetro | Valores | Predeterminado |
|---|---|---|
status | active (abierta o reconocida), OPEN, ACKNOWLEDGED, RESOLVED, any | active |
severity | lista separada por comas de CRITICAL, MAJOR, MINOR, WARNING, INFO | todas |
deviceId, profileId | un UUID | |
search | hasta 128 caracteres | |
from, to | ISO 8601 con desfase horario, sobre la hora de apertura | para RESOLVED y any: los últimos 7 días |
sort | severity, title, device, status, opened, con :asc o :desc | las más recientes primero |
page, pageSize | desde 1; de 1 a 100 | 1, 20 |
Una lista de RESOLVED o any siempre lee un intervalo de tiempo, de como máximo 92 días: «An alarm history range may span at most 92 days.»
{
"items": [
{
"alarmId": "9a7e…",
"type": "high_temperature",
"severity": "CRITICAL",
"status": "OPEN",
"originator": { "type": "DEVICE", "id": "6f1c…", "name": "cold-room-2" },
"deviceId": "6f1c…",
"deviceName": "cold-room-2",
"profileId": "a1b2…",
"ruleId": "3c4d…",
"title": "Temperature too high",
"details": { "temperature": 9.4 },
"topic": null,
"startTs": 1762678800000,
"openedAt": 1762678800000,
"acknowledgedAt": null,
"acknowledgedBy": null,
"resolvedAt": null,
"resolvedBy": null,
"resolveReason": null,
"occurrences": 3,
"flapping": false,
"isAuto": true
}
],
"total": 1
}
Las horas de las alarmas son milisegundos desde la época. resolveReason es clear (su regla o flujo la despejó), manual (una persona) o originator_deleted (su dispositivo se eliminó).
GET /api/iot/alarms/{alarmId} responde { "alarm": {...} } con los mismos campos más el runbook de la regla. Una alarma de otra organización devuelve 404.
Recuentos
GET /api/iot/alarms/counts?deviceId={deviceId}
{ "open": 4, "acknowledged": 1, "bySeverity": { "CRITICAL": 1, "MAJOR": 2, "MINOR": 0, "WARNING": 2, "INFO": 0 } }
Solo se cuentan las alarmas que no están resueltas. Omita deviceId para toda la organización.
Reconocer y resolver
POST/tenant/{tenantId}/api/iot/alarms/acknowledge
Reconoce de 1 a 100 alarmas con una nota opcional (hasta 2.000 caracteres). Cada alarma se gestiona por separado; una alarma que ya está reconocida, resuelta o que no es suya se notifica con ok: false, no como error.
Cuerpo de la solicitud application/json
{
"alarmIds": [
"9a7e…",
"b81f…"
],
"note": "Technician on the way, ticket INC-4411"
}
Ejemplo curl
curl -X POST 'https://<your-host>/tenant/{tenantId}/api/iot/alarms/acknowledge' \
-H 'Content-Type: application/json' \
-d '{"alarmIds":["9a7e…","b81f…"],"note":"Technician on the way, ticket INC-4411"}'
Respuestas
200OK
{
"results": [
{
"alarmId": "9a7e…",
"ok": true
},
{
"alarmId": "b81f…",
"ok": false,
"reason": "not_active"
}
]
}
POST /api/iot/alarms/resolve acepta el mismo cuerpo y responde de la misma forma. Una alarma resuelta es definitiva; si la condición sigue siendo verdadera, la regla abre una nueva alarma. Resolver manualmente una alarma CRITICAL queda registrado en el registro de auditoría.
Añadir una nota sin cambiar el estado:
POST /api/iot/alarms/{alarmId}/comments
{ "text": "Spare part ordered" }
La respuesta es 201 { "ok": true }. Las notas aparecen en la cronología (GET .../events).
Reglas de alarma
GET /api/iot/alarm-rules/{profileId} responde { "rules": [...] }. PUT reemplaza todo el conjunto de reglas del perfil: las reglas que omita se eliminan, y sus alarmas abiertas se resuelven.
{
"rules": [
{
"type": "high_temperature",
"title": "Temperature too high",
"severities": [
{ "severity": "CRITICAL", "condition": { "key": "temperature", "op": ">", "value": { "attribute": "maxTempThreshold" } } },
{ "severity": "WARNING", "condition": { "key": "temperature", "op": ">", "value": 6 } }
],
"debounce": { "mode": "duration", "raise": 300, "clear": 120 },
"hysteresis": 0.5,
"notify": { "recipients": [{ "kind": "role", "role": "ADMIN" }], "minSeverity": "WARNING", "repeatEverySec": 3600 },
"runbook": "Check the door seal, then the compressor."
},
{
"type": "device_offline",
"title": "Sensor offline",
"inactivity": { "afterSec": 900, "severity": "WARNING" }
}
]
}
Reglas del esquema:
| Campo | Regla |
|---|---|
| Reglas por perfil | como máximo 50; cada type una vez |
type | letras, dígitos, _ . : -, hasta 128; device_offline es la regla de inactividad |
condition | una comparación { key, op, value } con op uno de >, >=, <, <=, ==, !=, o { "all": [...] } / { "any": [...] }; como máximo 16 comparaciones y 4 niveles |
value | un número, texto, booleano, o { "attribute": "<name>" } para comparar con el atributo del dispositivo |
clear | opcional; sin él, la alarma se despeja cuando no se cumple ninguna condición de gravedad |
debounce | mode count (muestras) o duration (segundos de tiempo del dispositivo); raise y clear de 1 a 86.400 |
dampening | maxTransitions de 2 a 100, windowSec de 10 a 86.400, holdSec de 1 a 86.400 |
notify.recipients | de 1 a 20 de { kind: "user", userId }, { kind: "role", role: "OWNER" \| "ADMIN" \| "USER" }, { kind: "email", email } |
notify.repeatEverySec | de 60 a 604.800 |
inactivity.afterSec | de 10 a 604.800 |
Las claves de condición se comprueban contra las claves del perfil. El significado completo de cada campo está en Alarm rules on device profiles y Alarm conditions reference.
Silenciamientos
| Llamada | Función |
|---|---|
GET /api/iot/devices/{deviceId}/alarm-mute | { "mutes": [...] } |
POST con { "ruleId": null, "until": "2026-11-12T18:00:00+03:00", "reason": "Compressor service" } | Silencia todas las alarmas del dispositivo (o una regla con ruleId) hasta una hora; 201 { "mute": {...} } |
DELETE ?muteId=… | Levanta un silenciamiento; sin muteId, todos los silenciamientos del dispositivo: { "lifted": n } |
Un silenciamiento debe terminar en el futuro y durar como máximo 90 días. Las alarmas se siguen registrando mientras están silenciadas; no se notifica a nadie. Consulte Muting a device for maintenance.
Errores
| Estado | Mensaje |
|---|---|
| 400 | El intervalo de tiempo termina antes de empezar. / Un intervalo del historial de alarmas puede abarcar como máximo 92 días. / Un silenciamiento debe terminar en el futuro. / Un silenciamiento puede durar como máximo 90 días. |
| 400 | Validation error con issues: un conjunto de reglas que incumple el esquema, o una clave de condición que el perfil no tiene |
| 404 | Alarma no encontrada. / Dispositivo no encontrado. / Perfil de dispositivo no encontrado. |
Eventos en lugar de sondeo
Suscriba un webhook a alarm.created, alarm.acknowledged y alarm.cleared para conocer los cambios en cuanto ocurren. Los payloads están en la Webhook event reference.

