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 聯絡我。

← 回到技術筆記

你的情況也類似?

加 LINE 最快。說說你現在怎麼做、想變成什麼樣子,
我回你可行的做法和需要釐清的問題。

加 LINE 聊一聊 →

或寫信:ted@tedshen.link