Traduit de English par IA ·
Nous faisons cela sur notre atelier : un Pi avec un haut-parleur à pavillon lit les alarmes critiques par-dessus le bruit. Ciaran a raison, interrogez l’API Alarms.Demandez à votre administrateur une clé API avec uniquement l’autorisation de lecture des alarmes (la lecture des alarmes est une autorisation de niveau Utilisateur par défaut) et une liste blanche d’adresses IP pour l’adresse de l’université. Ensuite :
import requests, subprocess, time
H = {"Authorization": f"Bearer {API_KEY}"}
URL = f"https://{HOST}/tenant/{TENANT}/api/iot/alarms"
seen = set()
while True:
r = requests.get(URL, headers=H, params={"status": "OPEN", "severity": "CRITICAL,MAJOR",
"sort": "opened:desc", "pageSize": 20}, timeout=10)
for a in r.json()["items"]:
if a["alarmId"] not in seen:
seen.add(a["alarmId"])
subprocess.run(["sh", "-c", f'echo "{a["deviceName"]}: {a["title"]}" | piper --model en_GB-alan-medium.onnx --output-raw | aplay -r 22050 -f S16_LE'])
time.sleep(15)
Le statut OPEN signifie que les alarmes acquittées ne sont plus lues, ce qui plaît aux gens : acquittez-la dans l’application et la pièce se tait. Donnez à vos règles d’alarme des titres lisibles, car c’est ce qui sera énoncé, par exemple « {{device.name}} température {{value}} ». Quinze secondes est une cadence d’interrogation raisonnable, restez bien en dessous des limites de l’API. Si vous obtenez un jour un point d’accès public, le webhook alarm.created remplacerait l’interrogation : Webhooks.
We do this on our plant floor, a Pi with a horn speaker reads critical alarms over the noise. Ciaran’s right, poll the Alarms API.
Ask your admin for an API key with only the alarm read permission (reading alarms is a User-level permission by default) and an IP allowlist for the uni’s address. Then:
import requests, subprocess, time
H = {"Authorization": f"Bearer {API_KEY}"}
URL = f"https://{HOST}/tenant/{TENANT}/api/iot/alarms"
seen = set()
while True:
r = requests.get(URL, headers=H, params={"status": "OPEN", "severity": "CRITICAL,MAJOR",
"sort": "opened:desc", "pageSize": 20}, timeout=10)
for a in r.json()["items"]:
if a["alarmId"] not in seen:
seen.add(a["alarmId"])
subprocess.run(["sh", "-c", f'echo "{a["deviceName"]}: {a["title"]}" | piper --model en_GB-alan-medium.onnx --output-raw | aplay -r 22050 -f S16_LE'])
time.sleep(15)
Status OPEN means acknowledged alarms stop being read, which people like: ack it in the app and the room goes quiet. Give your alarm rules readable titles because that’s what gets spoken, e.g. « {{device.name}} temperature {{value}} ». Fifteen seconds is a polite poll rate, stay well under the API limits. If you ever do get a public endpoint, the alarm.created webhook would replace the polling: Webhooks.

