Laboratuvardaki bir Pi, yeni Hermetry alarmlarını hoparlörden sesli okusun
Yapay zekâ tarafından English dilinden çevrildi ·
Yine ben. Laboratuvarımızda alarm kurallarıyla Hermetry üzerinde çalışan 6 derin dondurucu ve inkübatör var, sistem çalışıyor ama uyarılar zile gidiyor ve eldiven takılıyken kimse ekrana bakmıyor. PI, odadaki bir hoparlörün “Dondurucu 3 sıcaklık yüksek” gibi bir mesajı sesli söyleyip söyleyemeyeceğini sordu.Yedek bir Pi 4 ve bir USB hoparlörüm var. Çevrimdışı metinden konuşmaya (text to speech) çalışıyor (piper ve espeak-ng’yi test ettim, piper çok daha doğal geliyor). Anlamadığım kısım, Pi’nin yeni bir alarmdan nasıl haberdar olacağı. Hermetry’de Pi’ye yönelik bir webhook kurdum ama hiçbir şey gelmiyor. Pi, genel adresi olmayan, NAT arkasındaki üniversite ağında. Webhook yanlış araç mı?
Me again. Our lab has 6 freezers and incubators on Hermetry with alarm rules and they work, but alerts go to the bell and nobody looks at the screen while wearing gloves. The PI asked if a speaker could just say “Freezer 3 temperature high” in the room.
I have a spare Pi 4 and a USB speaker. Offline text to speech works (I tested piper and espeak-ng, piper sounds much nicer). The part I don’t get is how the Pi finds out about a new alarm. I set up a webhook in Hermetry pointing at the Pi and nothing ever arrives. The Pi is on the university network behind NAT, no public address. Is a webhook the wrong tool?
Yapay zekâ tarafından English dilinden çevrildi ·
Bunu bir e-posta üzerinden duyuracak şekilde bir yol bulabilir misin? Mesela gelen kutusunu okuyacak gibi?
Could you have it announce by e-mail somehow? Like read the inbox?
Yapay zekâ tarafından English dilinden çevrildi ·
Webhook’ların Hermetry’nin dışarıdan erişebileceği bir HTTPS URL’sine ihtiyacı var; NAT arkasında olduklarında bu çağrılar hiçbir zaman ulaşmaz. Bir tünel ya da ters proxy gerekir ve üniversite BT birimi muhtemelen buna hayır diyecektir.
Webhooks need an HTTPS URL Hermetry can reach from outside, so behind NAT they’ll never land. You’d need a tunnel or a reverse proxy, and uni IT will probably say no.
Yapay zekâ tarafından English dilinden çevrildi ·
Ya da işi tersine çevirip Pi’nin sorgulamasını sağlayın. Alıcı NAT arkasında olduğunda pull yöntemi push yönteminden daha iyidir.
Or turn it around and have the Pi ask. Pull beats push when the receiver is behind NAT.
Yapay zekâ tarafından English dilinden çevrildi ·
takipteyim, intercom işim için de bunu istiyorum lol
following, I want this for my intercom thing too lol
Yapay zekâ tarafından English dilinden çevrildi ·
Bunu tesis katımızda yapıyoruz: gürültünün üzerinden kritik alarmları okuyan, boynuz hoparlörlü bir Pi var. Ciaran haklı, Alarms API’yi sorgulayın.Yöneticinizden yalnızca alarm okuma iznine sahip bir API anahtarı isteyin (alarm okuma, varsayılan olarak Kullanıcı düzeyinde bir izindir) ve üniversitenin adresi için bir IP izin listesi isteyin. Sonra:
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)
OPEN durumu, onaylanmış alarmların artık okunmamasını sağlar; insanlar bunu sever: uygulamada onaylayın, oda sessizleşir. Alarm kurallarınıza okunabilir başlıklar verin, çünkü seslendirilen şey budur, örneğin “{{device.name}} sıcaklık {{value}}”. On beş saniye, nazik bir sorgulama aralığıdır; API limitlerinin epey altında kalın. Herhangi bir zaman halka açık bir uç noktanız olursa, alarm.created webhook’u sorgulamanın yerini alır: 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.
Yapay zekâ tarafından English dilinden çevrildi ·
Dün çalıştırdım, laboratuvardaki herkes bayıldı. IT’ye hiç sormak zorunda kalmadım, bu ayrı bir kazançtı. Tek sorun: önce status=active kullandım, seen-set boş olduğu için yeniden başlatmadan sonra onaylanmış alarmları tekrar tekrar okumaya devam etti. Sizin yazdığınız gibi OPEN’a geçtim. Ayrıca piper “frz” olarak okuduğu için cihaz adlarını “frz-03” yerine “freezer three” olarak değiştirmem gerekti.
Got it running yesterday, everyone in the lab loves it. Had to ask IT nothing, which was a win. Only thing: I first used status=active and it kept repeating acknowledged alarms after a restart because my seen-set was empty, switched to OPEN like you wrote. Also had to change device names from “frz-03” to “freezer three” because piper read it as “frz”.
- Bu konuyu yanıtlamak için giriş yapmış olmalısınız.
Sohbete katılın
Soru sormak ve yanıtlamak, yararlı gönderileri beğenmek ve sorununuzu çözen yanıtı işaretlemek için oturum açın. Her katkı puan ve seviye kazandırır.

