找回密碼
 立即註冊
惟家LINE群QRCODE
    查看: 0|回覆: 0

    條件(condition)的七種寫法,含容易寫錯的 and / or / not

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    自動化沒反應,八成是條件沒過。
    這篇把所有條件類型講一遍,附最容易寫錯的地方。



    1. state — 最常用
    1. conditions:
    2.   - condition: state
    3.     entity_id: binary_sensor.有人在家
    4.     state: "on"
    複製代碼

    三個常見錯誤
    1. # 錯:on 不加引號會被 YAML 當成布林值 true
    2.     state: on
    3. # 錯:大小寫有差,狀態是小寫的 "on"
    4.     state: "ON"
    5. # 對
    6.     state: "on"
    複製代碼

    for 可以要求「維持多久」:
    1.   - condition: state
    2.     entity_id: binary_sensor.有人在家
    3.     state: "off"
    4.     for:
    5.       minutes: 10
    複製代碼

    2. numeric_state — 比數值
    1.   - condition: numeric_state
    2.     entity_id: sensor.客廳溫度
    3.     above: 28
    4.     below: 35
    複製代碼

    above 和 below 都是「不含」(嚴格大於/小於)。
    28 度整的時候,above: 28 是不成立的。

    要比屬性的話:
    1.   - condition: numeric_state
    2.     entity_id: light.客廳
    3.     attribute: brightness
    4.     above: 200
    複製代碼

    3. time — 時段與星期
    1.   - condition: time
    2.     after: "22:00:00"
    3.     before: "06:00:00"
    4.     weekday: [mon, tue, wed, thu, fri]
    複製代碼

    跨午夜是自動處理的。上面那個 HA 會正確理解成「晚上十點到隔天早上六點」,
    這跟自己寫範本不一樣(自己寫要用 or)。

    after / before 也可以吃 input_datetime:
    1.   - condition: time
    2.     after: input_datetime.夜間開始
    3.     before: input_datetime.夜間結束
    複製代碼

    4. sun — 日出日落
    1.   - condition: sun
    2.     after: sunset
    3.     after_offset: "-00:30:00"      # 日落前 30 分鐘就算
    複製代碼

    台灣夏天七點多才天黑、冬天五點半就暗了,
    用 sun 比寫死「18:00」合理很多。

    5. zone — 地理位置
    1.   - condition: zone
    2.     entity_id: person.charles
    3.     zone: zone.公司
    複製代碼

    6. template — 什麼都能寫
    1.   - condition: template
    2.     value_template: >
    3.       {{ states('sensor.客廳溫度') | float(0) > 28
    4.          and states('sensor.室外溫度') | float(99) > 26 }}
    複製代碼

    float() 的預設值一定要給。
    感測器不可用的時候回傳字串 unavailable,比大小會直接讓條件報錯。

    而且預設值要選對方向:上面「室外溫度」給 99,
    是因為抓不到的時候寧可當成「外面很熱」讓冷氣開;
    如果給 0,抓不到就永遠不開冷氣了。

    7. trigger — 只在特定觸發時成立
    1.   - condition: trigger
    2.     id: 回家
    複製代碼

    這個配 choose 用,前面那篇講過。



    and / or / not 怎麼組

    預設就是 and。條件清單裡的每一項都要成立:
    1. conditions:
    2.   - condition: state
    3.     entity_id: binary_sensor.有人在家
    4.     state: "on"
    5.   - condition: time
    6.     after: "18:00:00"
    7. # 上面兩個「都」要成立
    複製代碼

    要 or 就得明確包起來:
    1. conditions:
    2.   - condition: or
    3.     conditions:
    4.       - condition: state
    5.         entity_id: binary_sensor.前門
    6.         state: "on"
    7.       - condition: state
    8.         entity_id: binary_sensor.後門
    9.         state: "on"
    複製代碼

    巢狀組合:
    1. conditions:
    2.   # 有人在家 而且(太熱 或 太濕)
    3.   - condition: state
    4.     entity_id: binary_sensor.有人在家
    5.     state: "on"
    6.   - condition: or
    7.     conditions:
    8.       - condition: numeric_state
    9.         entity_id: sensor.溫度
    10.         above: 28
    11.       - condition: numeric_state
    12.         entity_id: sensor.濕度
    13.         above: 75
    複製代碼

    not 最容易寫錯
    1.   - condition: not
    2.     conditions:
    3.       - condition: state
    4.         entity_id: binary_sensor.睡覺模式
    5.         state: "on"
    複製代碼

    注意 not 底下還是 conditions(複數)
    而且如果放多個,意思是「這些條件全部不成立」。

    簡寫形式

    條件也可以寫成一行範本(HA 會自動當成 template 條件):
    1. conditions:
    2.   - "{{ states('sensor.溫度') | float(0) > 28 }}"
    複製代碼

    短的時候很方便,但除錯時追蹤紀錄顯示得比較不清楚
    複雜的還是寫完整形式。

    除錯:怎麼知道卡在哪一個條件

    設定 → 自動化 → 點進去 → 右上三個點 → 追蹤

    藍色路徑是走過的,斷掉的地方就是沒過的條件。
    點那個條件節點,右邊會顯示當時的實際值 —— 這個最有用,
    你會看到「喔原來那時候溫度是 unavailable」。

    還有一招:開發者工具 → 範本

    把條件寫成範本貼進去,立刻看 true / false:
    1. {{ is_state('binary_sensor.有人在家', 'on') }}
    2. {{ states('sensor.溫度') | float(0) > 28 }}
    3. {{ now().hour >= 22 or now().hour < 6 }}
    複製代碼

    一個實用的習慣

    條件太多的自動化很難維護。我的做法是把複雜的判斷做成 template binary_sensor
    1. template:
    2.   - binary_sensor:
    3.       - name: 該開冷氣了
    4.         state: >
    5.           {{ is_state('binary_sensor.家裡真的有人','on')
    6.              and states('sensor.客廳溫度') | float(0) > 28
    7.              and not is_state('input_boolean.外出模式','on') }}
    複製代碼

    然後自動化的條件就只剩一行:
    1. conditions:
    2.   - condition: state
    3.     entity_id: binary_sensor.該開冷氣了
    4.     state: "on"
    複製代碼

    好處:那個判斷可以被多個自動化共用,而且可以直接在介面上看它現在是不是 on。

    ---

    條件寫錯最麻煩的是它不會報錯,只是安靜地不執行
    所以養成「寫完先去追蹤看一次」的習慣真的很重要。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

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

    GMT+8, 2026-9-24 10:31 , Processed in 0.100239 second(s), 25 queries .

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