
智慧家庭壞掉的時候,不會告訴你
如果你有讓 AI agent 或排程每天自動幫你跑事情,它壞掉的那天,多半不會告訴你。要知道它還活著,得反過來做:讓它每次做完都來報到,超過時間沒報到就叫你。這個叫 heartbeat(心跳),也有人叫 dead-man switch。 我家的 Home Assistant 今年有五次「儀表板說正常,其實已經壞了」,最長的 285 天,沒有一次是系統告訴我的。這篇用這五次講清楚:為什麼「沒有錯誤訊息」不等於「沒事」,heartbeat 要怎麼裝。 為什麼壞了不會說 自動化、排程、AI agent,回報的都是「指令送出了」,不是「事情發生了」。 叫喇叭播一段廣播,喇叭回「收到」;叫腳本去續期憑證,腳本回「執行完畢」。中間每多一次交棒,回報跟現實就多脫鉤一層。而最難抓的那種壞法,是根本沒有被叫起來:觸發條件永遠不成立,就沒有執行、沒有錯誤、沒有紀錄,去翻 log 乾乾淨淨。 所以要多一條反方向的線:不是等它報錯,是等它報平安。下面五次,每一次都是這條線該抓、當時卻沒有的。 五次,都是人發現的 回到家,該亮的燈沒亮 今年 4 月那陣子,回家常常發現燈沒亮。4 月 11 日查下去,負責開燈的那條自動化是關著的。 我家的「回家」是一串自動化接力:起點那條先把開燈那條關掉,免得它提早跑,做一輪雜務,最後再把它開回來。那天下午,雜務裡叫除濕機切模式的那一步,雲端 API 回了錯誤。Home Assistant 的預設是動作序列裡任何一步出錯,整條就停在那裡,排在最後的「開回來」永遠沒跑到。 關掉很簡單,開回來排在最後面,而最後面是最容易沒跑到的位置。 修法是在會失敗的那一步加 continue_on_error: true。 回到家,燈又不對 8 月 13 日,夜燈又不亮了。把每台 Zigbee 裝置最後一次通訊的時間拉出來,才對出臥室那顆動作感應器 8 月 1 日就沒電了,玄關那顆 8 月 3 日,各自掉線 12 天和 10 天。 這些裝置透過 Zigbee2MQTT(簡稱 Z2M)進到系統,它的 availability 預設是關的。所以裝置失聯時,系統不會把它標成離線,而是原封不動保留最後一次收到的值。玄關那顆最後回報的是「有人」,於是在系統眼裡,我家玄關從那天起二十四小時都有人站著。自動化等的是「從沒人變成有人」那一下,這一下永遠不會再來。 同一批清點,浴室那顆水感測器已經沒電 285 天,儀表板上一直顯示正常。 這類失敗在自動化層查不到 症狀在自動化層(該跑的沒跑),根因在裝置層(電池沒電)。automation trace 裡乾乾淨淨,因為沒觸發就沒有 trace。 ...