NOTES | 技術筆記
設備異常通知一直狂發?邊緣觸發、冷卻時間與資料中斷偵測
數值超標就發 LINE,上線後常變成手機響不停、設備當機卻沒人知道。這篇說明三個做法:只在「變成超標」那一刻通知、冷卻時間擋抖動、資料停止更新也要通知,附 Python 寫法。
這篇是條件監控通知器的設計筆記。
「數值超標就發通知」的第一版,最常見的寫法是每 30 秒檢查一次、超標就送。這樣寫在邏輯上沒錯,但只要資料一真實,就會遇到下面三個問題。
坑一:持續超標,每輪都通知
# 第一版:每輪檢查,超標就送
while True:
temp = read_temp()
if temp >= 200:
send_line(f"溫度過高:{temp}")
time.sleep(30)
溫度超標 10 分鐘,就收到 20 則一樣的訊息。
做法:邊緣觸發(edge trigger)。 不要問「現在超標嗎」,要問「是不是剛剛才變成超標」。所以要記住上一輪的狀態:
was_active = False
while True:
active = read_temp() >= 200
if active and not was_active:
send_line("溫度過高") # 只在由正常變成超標時送一次
if not active and was_active:
send_line("已恢復正常") # 選擇性:恢復時也說一聲
was_active = active
time.sleep(30)
坑二:數值在門檻附近抖動
溫度在 199.5 和 200.5 之間來回跳的時候,邊緣觸發每跳一次就會送一則「過高」、一則「恢復」。
常見的解法有兩種,可以一起用:
| 做法 | 怎麼做 | 適合 |
|---|---|---|
| 冷卻時間 | 通知後 N 分鐘內,再次成立也不通知 | 規則很多、不想逐條調參數 |
| 遲滯(hysteresis) | 200 以上算異常,要降到 195 以下才算恢復 | 單一數值、門檻明確 |
冷卻時間有一個細節要注意:被冷卻擋下的那一次,恢復時也不要通知。 不然收訊息的人會看到「已恢復正常」,卻找不到它在恢復什麼。我的做法是每條規則記三件事:
| 欄位 | 意思 |
|---|---|
active |
上一輪成不成立 |
notified |
這一輪異常有沒有真的通知過 |
last_fired_at |
上次通知的時間,用來算冷卻 |
只有 notified 為真,才送恢復通知。
另外,這三個欄位要存在檔案裡,不能只放在記憶體。程式重開(停電、Windows 更新)之後,如果狀態歸零,正在超標的那台設備會再通知一次。用 SQLite 就夠了,一個檔案,不用另外裝資料庫。
坑三:設備不回報,程式就安靜了
最危險的一種:設備當機,紀錄檔停止寫入。沒有新資料,自然沒有超標,通知程式就一直沉默,看起來一切正常。
做法:把「沒有資料」本身當成一種異常。 記下每台設備最後一筆資料的時間,超過 N 分鐘沒更新就通知:
for target, last_ts in last_seen.items():
if now - last_ts > timedelta(minutes=10):
notify_once(f"{target} 資料停止更新超過 10 分鐘")
幾個實務細節:
- 用資料本身的時間,不要用讀取的時間。 檔案還在、程式也讀得到,但內容的時間戳記停在一小時前,這也算中斷。
- 列出一定要有資料的設備。 程式啟動後一筆都沒收到的設備,也要能發現。
- 限定監控時段。 產線下班、週末停機時,「沒有資料」是正常的,不該半夜通知。
- 讀取失敗和資料中斷分開。 檔案打不開、API 連不上,是「來源」的問題;連續失敗幾次才通知,避免網路閃一下就叫。
讀紀錄檔的小地方
設備持續寫入的 CSV,每輪只讀新增的部分。不要每次整個檔案重讀:
- 用位元組位置記住上次讀到哪裡,下一輪從那裡開始。
- 最後一列如果還沒寫完換行,這一輪先不處理,留到下一輪。不然會讀到
2026-11-02 09:02:00,A,1這種半截資料。 - 檔案變小了,代表被輪替或清空,從頭開始讀。
通知管道
- LINE Notify 已在 2025 年 3 月底結束服務(數位時代報導),現在要用 LINE 官方帳號的 Messaging API 推播,或改用 Telegram。
- 送出失敗要重試,重試後還是失敗,也要記錄下來,監控本身不能因此停掉。
- 金鑰放在環境變數,設定檔才能放心交給別人看。
小結
| 問題 | 做法 |
|---|---|
| 持續超標,一直通知 | 邊緣觸發:只在由正常變成異常時通知 |
| 門檻附近抖動 | 冷卻時間或遲滯;被擋下的那次不送恢復 |
| 程式重開又通知一次 | 狀態存 SQLite |
| 設備當機沒人知道 | 資料停止更新也是異常,配合監控時段 |
這些做法我都整理進條件監控通知器,可以直接看範例執行結果。如果你的設備或系統已經有紀錄檔,想先看看套上去會收到哪些通知,歡迎用下方的 LINE 聯絡我。