Novedad: el cortafuegos de IA supervisa cada módulo y explica cada incidente con palabras sencillas. Vea cómo funciona

API de alarmas

Liste, lea, reconozca y resuelva alarmas, lea su cronología y recuentos, reemplace las reglas de alarma de un perfil y silencie dispositivos mediante REST.

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étodoRutaPermisoFunción
GET/api/iot/alarmsiot_alarm.readListar alarmas
GET/api/iot/alarms/countsiot_alarm.readRecuentos de abiertas y reconocidas por gravedad
GET/api/iot/alarms/{alarmId}iot_alarm.readUna alarma, con su runbook
GET/api/iot/alarms/{alarmId}/eventsiot_alarm.readLa cronología de la alarma
POST/api/iot/alarms/{alarmId}/commentsiot_alarm.acknowledgeAñadir una nota a la cronología
POST/api/iot/alarms/acknowledgeiot_alarm.acknowledgeReconocer hasta 100 alarmas
POST/api/iot/alarms/resolveiot_alarm.resolveResolver hasta 100 alarmas manualmente
GET/api/iot/alarm-rules/{profileId}iot_alarm.readLas reglas de alarma de un perfil
PUT/api/iot/alarm-rules/{profileId}iot_alarm.rules.manageReemplazar las reglas de alarma de un perfil
GET, POST, DELETE/api/iot/devices/{deviceId}/alarm-mutelectura: iot_alarm.read; cambio: iot_alarm.muteLos 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ámetroValoresPredeterminado
statusactive (abierta o reconocida), OPEN, ACKNOWLEDGED, RESOLVED, anyactive
severitylista separada por comas de CRITICAL, MAJOR, MINOR, WARNING, INFOtodas
deviceId, profileIdun UUID
searchhasta 128 caracteres
from, toISO 8601 con desfase horario, sobre la hora de aperturapara RESOLVED y any: los últimos 7 días
sortseverity, title, device, status, opened, con :asc o :desclas más recientes primero
page, pageSizedesde 1; de 1 a 1001, 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:

CampoRegla
Reglas por perfilcomo máximo 50; cada type una vez
typeletras, dígitos, _ . : -, hasta 128; device_offline es la regla de inactividad
conditionuna comparación { key, op, value } con op uno de >, >=, <, <=, ==, !=, o { "all": [...] } / { "any": [...] }; como máximo 16 comparaciones y 4 niveles
valueun número, texto, booleano, o { "attribute": "<name>" } para comparar con el atributo del dispositivo
clearopcional; sin él, la alarma se despeja cuando no se cumple ninguna condición de gravedad
debouncemode count (muestras) o duration (segundos de tiempo del dispositivo); raise y clear de 1 a 86.400
dampeningmaxTransitions de 2 a 100, windowSec de 10 a 86.400, holdSec de 1 a 86.400
notify.recipientsde 1 a 20 de { kind: "user", userId }, { kind: "role", role: "OWNER" \| "ADMIN" \| "USER" }, { kind: "email", email }
notify.repeatEverySecde 60 a 604.800
inactivity.afterSecde 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

LlamadaFunció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

EstadoMensaje
400El 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.
400Validation error con issues: un conjunto de reglas que incumple el esquema, o una clave de condición que el perfil no tiene
404Alarma 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.