|
|
「家裡的燈有時候就是怪怪的」這種話,背後常常是一個沒人發現的依賴關係 —— 例如 MQTT 跑在 NAS 上,而 NAS 每週自動重開一次維護。這一篇不談原則,直接做:先用三個指令列出你實際有哪些外部依賴,再把它們一個一個變成看得到的狀態,最後把自動化改成「依賴掛了也還能動」。

這篇做完你會有什麼
- 一份從系統裡實際撈出來的外部依賴清單,不是憑印象寫的
- 每一個依賴都有一個 binary_sensor,在儀表板上看得到活著沒
- 所有靠外部資料的範本實體都加上 availability,失聯時顯示 unavailable 而不是假裝正常
- 三種優雅降級的寫法,附完整可貼的 YAML
- 一份「故意弄壞」的演練清單和記錄表
步驟 1:把你實際的依賴撈出來(三個方法,都要做)
憑印象列依賴一定會漏,而漏掉的那個通常就是會咬你的那個。
1-1 從設定介面看整合清單
- 設定 → 裝置與服務
- 一個一個看,每一個整合底下如果有 IP 位址或網址,它就是一個外部依賴
- 在紙上或記事本分三欄寫:整合名稱、它連到哪裡、掛了會失去什麼
這個方法會漏掉的:靠 YAML 設定的整合(SNMP、command_line、rest)不會出現在這一頁。
1-2 用指令把所有設定條目的主機位址列出來(這一步最有價值)
先裝終端機:設定 → 附加元件 → 附加元件商店 → 搜尋 Terminal & SSH → 安裝 → 在側邊欄顯示 → 啟動。
從側邊欄開啟終端機,貼上:
- jq -r '.data.entries[]
- | "\(.domain)\t\(.title)\t\(.data.host // .data.url // .data.ip_address // "-")"' \
- /config/.storage/core.config_entries | sort | column -t
複製代碼
你會看到類似這樣的輸出(每一行是一個整合):
- esphome 客廳藍牙代理 192.168.2.51
- hue Philips Hue 192.168.2.20
- met 臺北 -
- mqtt Mosquitto 192.168.2.10
- ping 192.168.2.10 192.168.2.10
- synology_dsm NAS 192.168.2.10
複製代碼
第三欄有 IP 或網址的每一行,都是一個外部依賴。 上面這個例子一眼就看得出問題:MQTT 和 NAS 是同一個 IP(192.168.2.10)—— 這就是「NAS 一重開,所有 Zigbee 裝置消失」的來源。
jq: command not found:換成這一行(結果比較難讀,但不用額外工具):
- grep -oE '"(host|url|ip_address)": *"[^"]*"' /config/.storage/core.config_entries | sort -u
複製代碼
1-3 用範本列出現在所有不可用的實體
開發者工具 → 範本分頁,把左邊全部刪掉,貼上:
- 不可用的實體共 {{ states | selectattr('state','in',['unavailable','unknown'])
- | list | count }} 個
- {% for e in states | selectattr('state','eq','unavailable') | list
- | sort(attribute='entity_id') %}
- {{ e.entity_id }}
- {%- endfor %}
複製代碼
你會看到右邊即時算出結果。
正常情況下這個數字應該是個位數(通常是幾個預設停用的診斷實體)。超過二十個的話,多半有一整個整合正在失聯,而你可能一直沒發現 —— 因為沒有人會去看一個不會亮的燈。
把這段存成一個常駐感測器,加到 configuration.yaml 的最外層:
- template:
- - sensor:
- - name: "不可用的實體數"
- unique_id: unavailable_entity_count
- unit_of_measurement: "個"
- state: >
- {{ states | selectattr('state','in',['unavailable','unknown'])
- | list | count }}
- attributes:
- entities: >
- {{ states | selectattr('state','eq','unavailable')
- | map(attribute='entity_id') | list }}
複製代碼
|
|