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

    用 trigger id 把五個自動化合併成一個(附完整範例)

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    如果你的自動化列表長這樣:


    • 前門開了通知
    • 後門開了通知
    • 陽台門開了通知
    • 書房窗開了通知
    • 廚房窗開了通知


    那這篇是寫給你的。五個自動化,內容幾乎一模一樣,
    改一次邏輯要改五個地方 —— 而且一定會漏掉一個。



    核心工具:trigger id

    每個觸發器都可以掛一個 id,動作裡用 trigger.id 就知道是哪個觸發的。

    最簡單的合併
    1. alias: 門窗開啟提醒
    2. triggers:
    3.   - trigger: state
    4.     entity_id:
    5.       - binary_sensor.前門
    6.       - binary_sensor.後門
    7.       - binary_sensor.陽台門
    8.       - binary_sensor.書房窗
    9.       - binary_sensor.廚房窗
    10.     to: "on"
    11.     for: "00:05:00"
    12. actions:
    13.   - action: notify.mobile_app_charles
    14.     data:
    15.       title: 門窗提醒
    16.       message: >
    17.         {{ trigger.to_state.name }} 已經開著五分鐘了
    18. mode: parallel
    19. max: 10
    複製代碼

    這個版本連 trigger id 都不用 —— 因為五個觸發器條件一樣,
    直接把 entity_id 寫成清單就好,再用 trigger.to_state.name 取名字。

    注意 mode 要用 parallel。前門和後門同時開著的話,
    single 會漏掉第二個。

    什麼時候才真的需要 trigger id

    當每個觸發器要做不一樣的事的時候。

    實例:一個「情境切換」自動化
    1. alias: 情境切換
    2. triggers:
    3.   - trigger: state
    4.     entity_id: input_boolean.在家模式
    5.     to: "on"
    6.     id: 回家
    7.   - trigger: state
    8.     entity_id: input_boolean.在家模式
    9.     to: "off"
    10.     id: 離家
    11.   - trigger: time
    12.     at: "23:00:00"
    13.     id: 睡覺
    14.   - trigger: state
    15.     entity_id: binary_sensor.看電影模式
    16.     to: "on"
    17.     id: 看電影
    18. conditions: []
    19. actions:
    20.   - choose:
    21.       - conditions:
    22.           - condition: trigger
    23.             id: 回家
    24.         sequence:
    25.           - action: scene.turn_on
    26.             target: {entity_id: scene.回家}
    27.           - action: climate.set_temperature
    28.             target: {entity_id: climate.客廳}
    29.             data: {temperature: 26}
    30.       - conditions:
    31.           - condition: trigger
    32.             id: 離家
    33.         sequence:
    34.           - action: light.turn_off
    35.             target: {entity_id: all}
    36.           - action: climate.turn_off
    37.             target: {entity_id: climate.客廳}
    38.       - conditions:
    39.           - condition: trigger
    40.             id: 睡覺
    41.         sequence:
    42.           - action: scene.turn_on
    43.             target: {entity_id: scene.夜間}
    44.           - action: input_boolean.turn_on
    45.             target: {entity_id: input_boolean.夜間模式}
    46.       - conditions:
    47.           - condition: trigger
    48.             id: 看電影
    49.         sequence:
    50.           - action: light.turn_on
    51.             target: {entity_id: light.氛圍燈}
    52.             data: {brightness_pct: 15}
    53.           - action: cover.close_cover
    54.             target: {entity_id: cover.客廳窗簾}
    55. mode: queued
    56. max: 5
    複製代碼



    好處


    • 所有情境邏輯在同一個檔案,一眼看得完
    • 要加新情境,加一個觸發器 + 一段 choose 就好
    • 共用的條件(例如「只在有人在家時執行」)寫一次就好
    • 追蹤紀錄會顯示走了哪個分支,除錯很快


    壞處(要老實講)


    • 檔案會變長,超過大概六、七個分支就該拆了
    • 一個自動化壞掉,全部情境一起停擺
    • YAML 縮排層級變深,容易縮錯


    我的判斷標準

    邏輯高度相似 → 合併。行為各自獨立 → 分開。

    門窗提醒那種「五個一樣的」一定合併。
    「洗衣機好了通知」跟「該倒垃圾了」則完全沒關係,硬合併只會讓兩件事綁死。

    一個實用的小技巧

    trigger id 可以重複。多個觸發器用同一個 id,就會走同一個分支:
    1. triggers:
    2.   - trigger: state
    3.     entity_id: person.charles
    4.     to: home
    5.     id: 有人回來
    6.   - trigger: state
    7.     entity_id: person.家人
    8.     to: home
    9.     id: 有人回來
    複製代碼

    這樣「任何一個人回家」就只要寫一次動作。

    ---

    我自己把原本 34 個自動化合併到 21 個,維護起來輕鬆很多。
    但也有幾個試著合併後反而更難懂,又拆回去了。

    不是越少越好,是越好讀越好
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

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

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

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