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

    HA 自動化進階:用 choose 把十個自動化合併成一個

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    寫久了會發現:一堆長得很像的自動化,只有一兩個地方不同。

    choose 可以把它們合併。



    問題的樣子
    1. 自動化 1:早上 7 點 → 開窗簾
    2. 自動化 2:中午 12 點 → 開空調
    3. 自動化 3:晚上 6 點 → 開燈
    4. 自動化 4:晚上 11 點 → 關全部
    複製代碼

    四個自動化,四個檔案區塊,改一個要找半天。

    用 choose 合併
    1. automation:
    2.   - alias: 一天的作息
    3.     triggers:
    4.       - trigger: time
    5.         at: "07:00:00"
    6.         id: 早上
    7.       - trigger: time
    8.         at: "12:00:00"
    9.         id: 中午
    10.       - trigger: time
    11.         at: "18:00:00"
    12.         id: 傍晚
    13.       - trigger: time
    14.         at: "23:00:00"
    15.         id: 睡覺
    16.     actions:
    17.       - choose:
    18.           - conditions:
    19.               - condition: trigger
    20.                 id: 早上
    21.             sequence:
    22.               - action: cover.open_cover
    23.                 target:
    24.                   entity_id: cover.客廳窗簾
    25.           - conditions:
    26.               - condition: trigger
    27.                 id: 中午
    28.             sequence:
    29.               - action: climate.turn_on
    30.                 target:
    31.                   entity_id: climate.客廳
    32.           - conditions:
    33.               - condition: trigger
    34.                 id: 傍晚
    35.             sequence:
    36.               - action: light.turn_on
    37.                 target:
    38.                   entity_id: light.客廳
    39.           - conditions:
    40.               - condition: trigger
    41.                 id: 睡覺
    42.             sequence:
    43.               - action: light.turn_off
    44.                 target:
    45.                   entity_id: all
    複製代碼

    一個自動化,一個地方管,邏輯一目了然。

    關鍵是 trigger 的 id


    • 每個觸發器給一個 id
    • 用 condition: trigger 判斷是哪一個觸發的
    • id 可以重複 —— 兩個觸發器用同一個 id,就會跑同一段




    choose 還可以加 default
    1.       - choose:
    2.           - conditions: ...
    3.             sequence: ...
    4.         default:
    5.           - action: persistent_notification.create
    6.             data:
    7.               message: 沒有符合的條件
    複製代碼

    都不符合的時候跑 default。

    if / then / else(更簡單的二選一)

    只有兩種情況的話,choose 太囉嗦
    1.       - if:
    2.           - condition: numeric_state
    3.             entity_id: sensor.客廳溫度
    4.             above: 28
    5.         then:
    6.           - action: climate.turn_on
    7.             target:
    8.               entity_id: climate.客廳
    9.         else:
    10.           - action: fan.turn_on
    11.             target:
    12.               entity_id: fan.客廳
    複製代碼

    比 choose 好讀很多。

    repeat(重複做)



    三種模式

    一、count(做 N 次)
    1.       - repeat:
    2.           count: 3
    3.           sequence:
    4.             - action: light.turn_on
    5.               target:
    6.                 entity_id: light.走道
    7.             - delay: "00:00:01"
    8.             - action: light.turn_off
    9.               target:
    10.                 entity_id: light.走道
    11.             - delay: "00:00:01"
    複製代碼

    閃三次(用來提醒)。

    二、while(條件成立就一直做)
    1.       - repeat:
    2.           while:
    3.             - condition: state
    4.               entity_id: binary_sensor.門
    5.               state: "on"
    6.             - condition: template
    7.               value_template: "{{ repeat.index <= 10 }}"
    8.           sequence:
    9.             - action: notify.mobile_app_phone
    10.               data:
    11.                 message: 門還開著
    12.             - delay: "00:05:00"
    複製代碼

    重要:while 一定要加次數上限

    repeat.index 是「這是第幾次」

    沒有上限的話,門一直開著就會無限迴圈
    HA 會卡住。

    三、for_each(對一批東西各做一次)
    1.       - repeat:
    2.           for_each:
    3.             - light.客廳
    4.             - light.餐廳
    5.             - light.走道
    6.           sequence:
    7.             - action: light.turn_on
    8.               target:
    9.                 entity_id: "{{ repeat.item }}"
    10.             - delay: "00:00:02"
    複製代碼

    一盞一盞慢慢開(做出漸進的效果)。

    repeat 裡面能用的變數


    • repeat.index —— 第幾次(從 1 開始)
    • repeat.first —— 是不是第一次
    • repeat.last —— 是不是最後一次
    • repeat.item —— for_each 的當前項目


    parallel(同時做)

    預設動作是一個一個依序跑。

    有 delay 的時候會卡住後面的
    1.       - action: light.turn_on
    2.         target: {entity_id: light.A}
    3.       - delay: "00:00:30"
    4.       - action: light.turn_off
    5.         target: {entity_id: light.A}
    6.       - action: light.turn_on          # 要等 30 秒才會跑到這裡
    7.         target: {entity_id: light.B}
    複製代碼

    用 parallel 讓它們同時跑
    1.       - parallel:
    2.           - sequence:
    3.               - action: light.turn_on
    4.                 target: {entity_id: light.A}
    5.               - delay: "00:00:30"
    6.               - action: light.turn_off
    7.                 target: {entity_id: light.A}
    8.           - sequence:
    9.               - action: light.turn_on
    10.                 target: {entity_id: light.B}
    11.               - delay: "00:01:00"
    12.               - action: light.turn_off
    13.                 target: {entity_id: light.B}
    複製代碼

    兩盞燈各自倒數,互不影響。



    變數(variables)

    算一次,用很多次
    1.     actions:
    2.       - variables:
    3.           目標亮度: >
    4.             {% if now().hour < 7 or now().hour >= 22 %}
    5.               15
    6.             {% elif now().hour < 18 %}
    7.               80
    8.             {% else %}
    9.               50
    10.             {% endif %}
    11.       - action: light.turn_on
    12.         target:
    13.           entity_id: light.走道
    14.         data:
    15.           brightness_pct: "{{ 目標亮度 }}"
    16.       - action: light.turn_on
    17.         target:
    18.           entity_id: light.樓梯
    19.         data:
    20.           brightness_pct: "{{ 目標亮度 }}"
    複製代碼

    好處


    • 邏輯只寫一次
    • 要改的時候只改一個地方
    • 比較好讀


    注意variables 的作用範圍是「從定義的地方到結束」
    不是整個自動化。放在最前面最安全。

    wait_for_trigger(等某件事發生)
    1.       - action: light.turn_on
    2.         target:
    3.           entity_id: light.走道
    4.       - wait_for_trigger:
    5.           - trigger: state
    6.             entity_id: binary_sensor.走道人體
    7.             to: "off"
    8.             for: "00:02:00"
    9.         timeout: "00:30:00"
    10.         continue_on_timeout: true
    11.       - action: light.turn_off
    12.         target:
    13.           entity_id: light.走道
    複製代碼

    邏輯:開燈 → 等到「沒人兩分鐘」→ 關燈。

    如果三十分鐘都沒等到,也強制關燈(timeout)。

    continue_on_timeout


    • true —— 超時也繼續往下(本例會關燈)
    • false —— 超時就停止整個自動化


    wait_template(等條件成立)
    1.       - wait_template: "{{ states('sensor.洗衣機功率') | float(0) < 5 }}"
    2.         timeout: "02:00:00"
    複製代碼

    比 wait_for_trigger 簡單,但只能等「狀態」不能等「事件」。

    stop(提前結束)
    1.       - if:
    2.           - condition: state
    3.             entity_id: input_boolean.假期模式
    4.             state: "on"
    5.         then:
    6.           - stop: "假期模式,跳過"
    複製代碼

    比用一堆巢狀的 if 好讀。

    mode(同時觸發怎麼辦)

    這個很多人沒設,然後出怪事。


    • single(預設)—— 還在跑的時候再次觸發會被忽略,
        而且日誌會出現警告
    • restart —— 重新開始。走道燈自動化最適合這個
    • queued —— 排隊,一個一個跑
    • parallel —— 同時跑好幾份


    怎麼選


    • 有 delay 或 wait 而且會重複觸發restart
    • 每次觸發都要完整跑完queued
    • 動作很快、不在乎重複single 就好
    • 同一個自動化服務很多裝置parallel(記得設 max)


    max 和 max_exceeded
    1.     mode: parallel
    2.     max: 10
    3.     max_exceeded: silent
    複製代碼

    max_exceeded: silent 可以把「超過上限」的警告關掉(預設會寫日誌)。

    ---

    下一篇:HA 的模板(template)實戰 ——
    最常用的二十個寫法,包含那些會咬人的陷阱。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

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

    GMT+8, 2026-9-24 12:22 , Processed in 0.079842 second(s), 24 queries .

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