找回密碼
 立即註冊
    查看: 8|回覆: 0

    讓 Home Assistant 自己告訴你哪裡壞了:可維護性的十個實作步驟

    [複製鏈接]

    !lvup!   100%

    383

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005836
    發表於 4 天前 | 顯示全部樓層 |閱讀模式
    智能家居最麻煩的不是壞掉,是「安靜地壞掉」。

    感應器沒電、Zigbee 裝置掉線、某個整合的 API 改了——這些都不會跳錯誤訊息,只是那條自動化從此不再觸發。你可能三個月後才因為「咦,怎麼最近燈都不會自己亮」而發現。

    這篇做兩件事:


    • 前半(步驟 1~5):把設定整理成半年後你還看得懂、還敢改的樣子
    • 後半(步驟 6~10):讓系統主動回報自己的健康狀況


    全部做完大約兩小時,之後每個月花十分鐘看一次報告就好。

    全部做完大約兩小時,之後每個月花十分鐘看一次報告就好。

    步驟 1:找出散落各處的重複判斷

    這是最常見、也最難察覺的技術債。

    典型長這樣——三個自動化各自判斷「現在是不是夜間」:
    1. # 自動化 A
    2. conditions:
    3.   - condition: template
    4.     value_template: "{{ now().hour >= 23 or now().hour < 6 }}"
    5. # 自動化 B
    6. conditions:
    7.   - condition: template
    8.     value_template: "{{ now().hour >= 23 or now().hour < 6 }}"
    9. # 自動化 C(這裡不小心寫成 22)
    10. conditions:
    11.   - condition: template
    12.     value_template: "{{ now().hour >= 22 or now().hour < 6 }}"
    複製代碼

    同一個「夜間」的定義散在三個地方,而且已經不一致了。只差一小時,所以沒有任何症狀,你永遠不會發現。

    怎麼把它們找出來:


    • 開設定 → 自動化與場景,右上角三個點 → 以 YAML 編輯(在單一自動化裡),或是直接用 File editor 開 `automations.yaml`
    • 搜尋 `now().hour`、`sun.sun`、`is_state('person`、`> 70`(濕度門檻)這幾個字串


    你會看到什麼:同一個判斷出現兩次以上。出現第二次,就該抽出來。

    步驟 2:把重複的判斷抽成一個實體

    放在 `configuration.yaml` 的最外層(頂格):
    1. template:
    2.   - binary_sensor:
    3.       - name: 夜間模式
    4.         unique_id: night_mode
    5.         icon: mdi:weather-night
    6.         state: >
    7.           {{ now().hour >= 23 or now().hour < 6 }}
    8.       - name: 家裡太濕
    9.         unique_id: home_too_humid
    10.         device_class: moisture
    11.         state: >
    12.           {{ states('sensor.living_room_humidity') | float(0) > 70 }}
    13.         availability: >
    14.           {{ has_value('sensor.living_room_humidity') }}
    複製代碼

    ⚠⚠ 三個一定要注意的地方

    一、不要用舊的 `- platform: template` 寫法。

    舊式長這樣(錯的):
    1. binary_sensor:
    2.   - platform: template
    3.     sensors:
    4.       night_mode:
    5.         friendly_name: 夜間模式
    6.         value_template: "{{ now().hour >= 23 }}"
    複製代碼

    HA 2026.6 已經把這個寫法整個移除,涵蓋十種實體類型(sensor、binary_sensor、cover、fan、light、lock、switch、vacuum、weather、alarm_control_panel)。

    移除的方式是靜默的:實體直接不見,引用它的自動化在介面上仍顯示「已啟用」卻永遠不觸發,儀表板上沒有任何紅字。2025.12 到 2026.5 之間有棄用警告,但那些警告只出現在日誌裡,沒在看的人不會知道。

    二、`availability_template:` 已經改名成 `availability:`。

    舊名只在已被移除的 `platform: template` 底下合法。寫在新式區塊裡不會報錯,只是那個實體建不出來——你會在狀態頁找不到它,而且不知道為什麼。

    三、`unique_id` 一定要寫。

    沒有 `unique_id` 的模板實體不能在介面上改名、不能指定區域、不能停用。而且之後想補上去的話,實體 ID 會重新產生一次,引用它的地方全部要再改一遍。

    ⚠ 第四件事:中文的 `name:` 不會產生中文的實體 ID。

    HA 會把中文音譯成拼音,`夜間模式` 出來的是 `binary_sensor.ye_jian_mo_shi` 之類的東西,不是 `binary_sensor.night_mode`。

    拿中文去寫在自動化裡,會指到一個不存在的實體,而且完全不報錯——條件永遠不成立,自動化永遠不觸發。

    所以每建一個模板實體,都要接著做這件事:


    • 設定 → 裝置與服務 → 實體,搜尋剛才的名稱
    • 點進去 → 齒輪 → 把實體 ID 改成你要用的英文名(這裡改成 `binary_sensor.night_mode`)


    能改的前提就是上面說的 `unique_id`——沒有它,介面上連齒輪都沒有。

    你會看到什麼:存檔後到設定 → 工具 → YAML → 重新載入範本實體(不用整個重啟)。改完實體 ID 之後,到設定 → 工具 → 狀態搜尋 `binary_sensor.night_mode`,值應該是 `on` 或 `off`。

    找不到那個實體 → 十次有九次是 YAML 縮排錯了,或是 `template:` 這個鍵不在最外層。到設定 → 工具 → YAML → 檢查設定,它會指出行號。
    實體存在但一直是 `unavailable` → `availability:` 裡引用的感測器不存在。把那一整段貼到設定 → 工具 → 範本去試算,右邊會直接告訴你哪個名字錯了。

    步驟 3:把三個自動化改成引用那個實體
    1. conditions:
    2.   - condition: state
    3.     entity_id: binary_sensor.night_mode
    4.     state: "on"
    複製代碼

    三個實際的好處(不是三個說法,是三件你之後真的會做的事):


    • 要把夜間改成 22:30 起算,只改一個地方
    • 可以直接在介面上看「現在是不是夜間」——除錯時不用再猜
    • 可以拉到儀表板上,家人也看得到現在是什麼模式


    你會看到什麼:改完之後,到設定 → 工具 → 狀態把 `binary_sensor.night_mode` 的值手動設成 `on`(手動設定的值會維持到下次模板重算),然後觸發那條自動化,確認條件有過。

    設定 → 工具 → 狀態

    步驟 4:整頓命名

    半年後你看到這一行,完全不知道它在幹嘛:
    1. - action: script.turn_on
    2.   target:
    3.     entity_id: script.1690234871234
    複製代碼

    命名分三個層次,各有各的規則:


    • 實體 ID——英文、小寫、底線、由大到小。`light.bedroom_ceiling`,不是 `light.ceiling_bedroom`。由大到小的好處是排序時同一個房間會自動聚在一起
    • 顯示名稱——中文、人話。`主臥天花板燈`
    • 自動化的 alias——要能讀成一句完整的規則


    自動化命名的對照:
    1. # 壞的(半年後完全看不出在做什麼)
    2. alias: 燈光自動化 2
    3. alias: 感應器
    4. alias: test
    5. alias: 新自動化
    6. # 好的(alias 本身就是文件)
    7. alias: 浴室有人時開燈,離開三分鐘關
    8. alias: 離家後五分鐘提醒門沒鎖
    9. alias: 濕度超過 70% 開除濕機,降到 55% 關
    複製代碼

    好處很實際:自動化列表本身變成一份規格書,你不用點進去就知道哪一條該負責這次的問題。

    怎麼改實體 ID:設定 → 工具 → 狀態找到實體 → 或是設定 → 裝置與服務 → 實體找到它 → 點進去 → 齒輪 → 改「實體 ID」。

    ⚠ 改實體 ID 會靜默地破壞所有引用它的地方。HA 在改名時會問你「要不要一併更新引用」,那個對話框只涵蓋自動化與腳本,不涵蓋儀表板 YAML、模板裡的字串、以及其他整合的設定。

    改完一定要做這件事:用 File editor 或 Samba 在整個 `/config` 底下搜尋舊的實體 ID,看還有沒有殘留。

    步驟 5:給每一條自動化一個 `id`

    `id` 放在 `alias` 旁邊,同一層:
    1. - alias: 浴室有人時開燈,離開三分鐘關
    2.   id: bathroom_motion_light
    3.   triggers:
    4.     - trigger: state
    5.       entity_id: binary_sensor.bathroom_motion
    6.       to: "on"
    7.   actions:
    8.     - action: light.turn_on
    9.       target:
    10.         entity_id: light.bathroom
    11.     - wait_for_trigger:
    12.         - trigger: state
    13.           entity_id: binary_sensor.bathroom_motion
    14.           to: "off"
    15.           for: "00:03:00"
    16.     - action: light.turn_off
    17.       target:
    18.         entity_id: light.bathroom
    19.   mode: restart
    複製代碼

    沒有 `id` 的自動化有三個問題:

    以下還有約 60% 的內容
    登入後即可閱讀完整教學

    登入繼續閱讀使用 Google 登入
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

    延伸閱讀

    加入惟家 LINE 群 QR Code加入惟家 LINE 群

    Archiver|手機版|惟家的智能論壇

    GMT+8, 2026-9-25 12:01 , Processed in 0.155253 second(s), 36 queries .

    快速回覆 返回頂部 返回列表