Ces routes permettent à un système de tickets, à un centre d’exploitation ou à un script de travailler avec les alarmes. Le fonctionnement des alarmes est expliqué dans Alarms et Working with alarms. Les chemins sont sous https://<your host>/tenant/<tenantId>.
Routes
| Méthode | Chemin | Permission | Action |
|---|---|---|---|
| GET | /api/iot/alarms | iot_alarm.read | Lister les alarmes |
| GET | /api/iot/alarms/counts | iot_alarm.read | Nombre d’alarmes ouvertes et acquittées par sévérité |
| GET | /api/iot/alarms/{alarmId} | iot_alarm.read | Une alarme, avec sa procédure d’intervention |
| GET | /api/iot/alarms/{alarmId}/events | iot_alarm.read | La chronologie de l’alarme |
| POST | /api/iot/alarms/{alarmId}/comments | iot_alarm.acknowledge | Ajouter une note à la chronologie |
| POST | /api/iot/alarms/acknowledge | iot_alarm.acknowledge | Acquitter jusqu’à 100 alarmes |
| POST | /api/iot/alarms/resolve | iot_alarm.resolve | Résoudre manuellement jusqu’à 100 alarmes |
| GET | /api/iot/alarm-rules/{profileId} | iot_alarm.read | Les règles d’alarme d’un profil |
| PUT | /api/iot/alarm-rules/{profileId} | iot_alarm.rules.manage | Remplacer les règles d’alarme d’un profil |
| GET, POST, DELETE | /api/iot/devices/{deviceId}/alarm-mute | lecture : iot_alarm.read ; modification : iot_alarm.mute | Les mises en sourdine d’un appareil |
Rôles par défaut : la lecture et l’acquittement sont des permissions User ; la résolution, la mise en sourdine et la modification des règles sont des permissions Admin.
Lister les alarmes
GET /api/iot/alarms (pages à partir de 1). Les paramètres inconnus sont refusés.
| Paramètre | Valeurs | Par défaut |
|---|---|---|
status | active (ouverte ou acquittée), OPEN, ACKNOWLEDGED, RESOLVED, any | active |
severity | liste séparée par des virgules de CRITICAL, MAJOR, MINOR, WARNING, INFO | toutes |
deviceId, profileId | un UUID | |
search | jusqu’à 128 caractères | |
from, to | ISO 8601 avec décalage horaire, sur l’heure d’ouverture | pour RESOLVED et any : les 7 derniers jours |
sort | severity, title, device, status, opened, avec :asc ou :desc | les plus récentes d’abord |
page, pageSize | à partir de 1 ; de 1 à 100 | 1, 20 |
Une liste RESOLVED ou any lit toujours une plage de dates, d’au maximum 92 jours : « 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
}
Les heures des alarmes sont exprimées en millisecondes depuis l’époque. resolveReason vaut clear (sa règle ou son flux l’a effacée), manual (une personne) ou originator_deleted (son appareil a été supprimé).
GET /api/iot/alarms/{alarmId} répond { "alarm": {...} } avec les mêmes champs, plus la procédure d’intervention de la règle. Une alarme d’une autre organisation renvoie un 404.
Nombres
GET /api/iot/alarms/counts?deviceId={deviceId}
{ "open": 4, "acknowledged": 1, "bySeverity": { "CRITICAL": 1, "MAJOR": 2, "MINOR": 0, "WARNING": 2, "INFO": 0 } }
Seules les alarmes non résolues sont comptées. Omettez deviceId pour l’ensemble de l’organisation.
Acquitter et résoudre
POST/tenant/{tenantId}/api/iot/alarms/acknowledge
Acquitter de 1 à 100 alarmes avec une note facultative (jusqu’à 2 000 caractères). Chaque alarme est traitée séparément ; une alarme déjà acquittée, résolue ou qui ne vous appartient pas est signalée avec ok: false, et non comme une erreur.
Corps de la requête application/json
{
"alarmIds": [
"9a7e…",
"b81f…"
],
"note": "Technician on the way, ticket INC-4411"
}
Exemple 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"}'
Réponses
200OK
{
"results": [
{
"alarmId": "9a7e…",
"ok": true
},
{
"alarmId": "b81f…",
"ok": false,
"reason": "not_active"
}
]
}
POST /api/iot/alarms/resolve accepte le même corps et répond de la même façon. Une alarme résolue est définitive ; si la condition est toujours vraie, la règle ouvre une nouvelle alarme. La résolution manuelle d’une alarme CRITICAL est consignée dans le journal d’audit.
Ajouter une note sans modifier l’état :
POST /api/iot/alarms/{alarmId}/comments
{ "text": "Spare part ordered" }
La réponse est 201 { "ok": true }. Les notes apparaissent dans la chronologie (GET .../events).
Règles d’alarme
GET /api/iot/alarm-rules/{profileId} répond { "rules": [...] }. PUT remplace l’ensemble des règles du profil : les règles omises sont supprimées, et leurs alarmes ouvertes sont résolues.
{
"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" }
}
]
}
Règles du schéma :
| Champ | Règle |
|---|---|
| Règles par profil | au maximum 50 ; chaque type une seule fois |
type | lettres, chiffres, _ . : -, jusqu’à 128 ; device_offline est la règle d’inactivité |
condition | une comparaison { key, op, value } avec op parmi >, >=, <, <=, ==, !=, ou { "all": [...] } / { "any": [...] } ; au maximum 16 comparaisons et 4 niveaux |
value | un nombre, un texte, un booléen, ou { "attribute": "<name>" } pour comparer à l’attribut de l’appareil |
clear | facultatif ; sans lui, l’alarme est effacée lorsqu’aucune condition de sévérité n’est vraie |
debounce | mode count (échantillons) ou duration (secondes du temps de l’appareil) ; raise et clear de 1 à 86 400 |
dampening | maxTransitions de 2 à 100, windowSec de 10 à 86 400, holdSec de 1 à 86 400 |
notify.recipients | de 1 à 20 de { kind: "user", userId }, { kind: "role", role: "OWNER" \| "ADMIN" \| "USER" }, { kind: "email", email } |
notify.repeatEverySec | de 60 à 604 800 |
inactivity.afterSec | de 10 à 604 800 |
Les clés de condition sont vérifiées par rapport aux clés du profil. La signification complète de chaque champ se trouve dans Alarm rules on device profiles et Alarm conditions reference.
Mises en sourdine
| Appel | Action |
|---|---|
GET /api/iot/devices/{deviceId}/alarm-mute | { "mutes": [...] } |
POST avec { "ruleId": null, "until": "2026-11-12T18:00:00+03:00", "reason": "Compressor service" } | Met en sourdine toutes les alarmes de l’appareil (ou une seule règle avec ruleId) jusqu’à une heure donnée ; 201 { "mute": {...} } |
DELETE ?muteId=… | Lève une mise en sourdine ; sans muteId, toutes les mises en sourdine de l’appareil : { "lifted": n } |
Une mise en sourdine doit se terminer dans le futur et durer au maximum 90 jours. Les alarmes continuent d’être enregistrées pendant la mise en sourdine ; personne n’est notifié. Voir Muting a device for maintenance.
Erreurs
| Statut | Message |
|---|---|
| 400 | La plage de dates se termine avant de commencer. / An alarm history range may span at most 92 days. / A mute must end in the future. / A mute may last at most 90 days. |
| 400 | Validation error avec issues : un ensemble de règles qui ne respecte pas le schéma, ou une clé de condition que le profil ne possède pas |
| 404 | Alarme introuvable. / Appareil introuvable. / Profil d’appareil introuvable. |
Des événements plutôt que des interrogations
Abonnez un webhook à alarm.created, alarm.acknowledged et alarm.cleared pour être informé des changements au fur et à mesure. Les charges utiles sont décrites dans la Webhook event reference.

