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

    HA 模板實戰:常用寫法與五個會咬人的陷阱

    [複製鏈接]

    !lvup!   100%

    386

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22006063
    發表於 2026-9-21 13:30:24 | 顯示全部樓層 |閱讀模式
    模板(template)是 Home Assistant 最好用也最容易寫錯的地方。這篇只放兩種東西:你真的會用到的寫法,以及那些「看起來對、跑起來錯、而且不報錯」的。

    模板(template)是 Home Assistant 最好用也最容易寫錯的地方。這篇只放兩種東西:你真的會用到的寫法,以及那些「看起來對

    步驟 1:先把測試環境打開,這篇後面每一段都要貼進去


    • 設定 → 工具 → 範本 分頁


    ⚠ 路徑在一年內改了兩次,而且是兩件不同的事:


    • 2026.2 —— 從側邊欄搬進「設定」底下
    • 2026.8 —— 名字從「開發者工具」改成「工具」


    所以舊教學寫的「側邊欄 → 開發者工具 → 模板」、以及半新不舊的「設定 → 開發者工具」都是錯的。找不到就按 Ctrl + K 搜「範本」。

    你會看到什麼:左邊一塊可編輯的文字區(預設已經有一段示範),右邊即時顯示算出來的結果。改左邊,右邊立刻跟著變。

    這個習慣可以省掉八成的除錯時間:模板在這裡寫錯會直接紅字告訴你哪裡錯;同一段寫進 YAML 之後,唯一的症狀是「自動化沒反應」。

    步驟 2:四個取值函式,先認完

    把下面整段貼進範本工具(把實體 ID 換成你家真的有的):
    1. 狀態:{{ states('sensor.living_room_temperature') }}
    2. 屬性:{{ state_attr('light.living_room', 'brightness') }}
    3. 是不是開著:{{ is_state('light.living_room', 'on') }}
    4. 屬性比對:{{ is_state_attr('climate.living_room', 'hvac_action', 'cooling') }}
    5. 有沒有值:{{ has_value('sensor.living_room_temperature') }}
    複製代碼

    你會看到什麼:右邊五行,分別是一個數字(字串形式)、一個 0~255 的數字或 None、true 或 false、true 或 false、true 或 false。

    實體 ID 一律用英文。HA 會把中文名稱音譯成拼音,`sensor.客廳溫度` 多半不存在。去「設定 → 工具 → 狀態」查真正的 ID。

    states() 和 states.sensor.x.state 的差別
    1. {{ states('sensor.not_exist') }}        → unknown(安全)
    2. {{ states.sensor.not_exist.state }}     → 直接報錯,整個模板爆掉
    複製代碼

    一律用 states('...') 那種寫法。官方文件在「Considerations / Startup」段落特別講這件事:HA 剛啟動時很多實體還沒建出來,點號寫法會在那幾秒內讓你的模板實體整個變成 unavailable。

    點號寫法只在你要拿 `last_changed`、`last_reported`、`entity_id` 這類狀態物件本身的欄位時才需要。

    狀態物件本身的欄位

    陷阱一:所有狀態都是字串

    這是第一名,而且症狀最離奇。
    1. {{ states('sensor.living_room_temperature') > 25 }}
    2.   → 報錯:'>' not supported between instances of 'str' and 'int'
    3. {{ states('sensor.living_room_temperature') | float(0) > 25 }}
    4.   → 對
    複製代碼

    float(0) 裡那個 0 是「轉不出來就當 0」。不寫預設值的話,感測器變成 `unavailable` 的那一刻整個模板會拋錯 —— 然後你的自動化在裝置掉線時連「沒動」都不是,是直接失敗。

    兩個字串比較會出現的真實災難:
    1. {{ '30' > '9' }}          → false
    2. {{ '100' < '9' }}         → true
    複製代碼

    字串是逐字比的,`'3'` 小於 `'9'`,所以 30 度會被判成「小於 9 度」。冷氣自動化寫錯這個,夏天會完全不開。

    在範本工具裡自己跑一次上面兩行,親眼看到 false 和 true 比記規則有用。

    兩個轉換函式:

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

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

    本版積分規則

    延伸閱讀

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

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

    GMT+8, 2026-11-10 00:45 , Processed in 0.137106 second(s), 25 queries .

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