Traducido del English por IA ·
Hacemos esto en nuestra planta: una Pi con un altavoz de bocina lee las alarmas críticas por encima del ruido. Ciaran tiene razón, consulta la API de Alarms.Pide a tu administrador una clave de API solo con el permiso de lectura de alarmas (leer alarmas es un permiso de nivel Usuario por defecto) y una lista de IP permitidas para la dirección de la universidad. Luego:
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)
El estado OPEN significa que las alarmas reconocidas dejan de leerse, lo que a la gente le gusta: reconócela en la app y la sala se queda en silencio. Pon a tus reglas de alarma títulos legibles, porque eso es lo que se lee en voz alta, por ejemplo «{{device.name}} temperatura {{value}}». Quince segundos es una frecuencia de sondeo razonable; mantente muy por debajo de los límites de la API. Si algún día obtienes un endpoint público, el webhook alarm.created sustituiría el sondeo: 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.

