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

    怎麼判斷一則自動化該不該存在:五個檢驗與它們的實作

    [複製鏈接]

    !lvup!   100%

    386

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22006063
    發表於 2026-9-21 14:15:50 | 顯示全部樓層 |閱讀模式
    同樣的感應器和燈,有人做出全家都喜歡的系統,有人做出家人偷偷拔插頭的系統。差別不在技術,在幾個可以當場檢驗的設計判斷。

    這一篇的每一節都是:一個可以問出答案的問題,加上一段可以直接貼進設定檔的實作。

    一段可以直接貼進設定檔的實作

    檢驗一:這則自動化消除了哪一個動作?

    問法:說出一句「以前我要做 X,現在不用了」。說不出來,它就只是「很酷」。
    1. 半夜起床走道燈微亮    消除了:摸黑找開關
    2. 洗衣機洗好通知        消除了:一直去陽台看
    3. 離家自動關全部        消除了:出門前巡一輪
    4. 冷氣還開著的提醒      消除了:在公司一直想這件事
    5. 要先開 App 才能開燈    沒有消除任何動作,而且多了一個
    6. 要記得先切換模式      多了一個要記住的事
    7. 燈會依心情變色        很好看,但不是自動化該做的事
    複製代碼

    這個檢驗最有價值的用法是拿去看「已經做好的」那些,而不是還沒做的。

    步驟 1:用資料找出該刪的自動化

    Home Assistant 幫每一則自動化記了「上次觸發時間」。三個月沒觸發過的,多半就是答不出上面那個問題的那些。

    到設定 → 工具 → 範本,把下面整段貼進左邊的編輯區:
    1. {% set ns = namespace(rows = []) %}
    2. {% for a in states.automation %}
    3.   {% set lt = a.attributes.get('last_triggered') %}
    4.   {% if lt is none %}
    5.     {% set ns.rows = ns.rows + [a.name ~ ' -- 從來沒有觸發過'] %}
    6.   {% elif (now() - lt).days > 90 %}
    7.     {% set ns.rows = ns.rows
    8.          + [a.name ~ ' -- ' ~ (now() - lt).days ~ ' 天沒觸發'] %}
    9.   {% endif %}
    10. {% endfor %}
    11. 共 {{ states.automation | list | count }} 則自動化,
    12. 其中 {{ ns.rows | count }} 則超過 90 天沒動作:
    13. {{ ns.rows | join('\n') }}
    複製代碼

    你會看到右邊即時列出清單,像這樣:
    1. 共 47 則自動化,其中 6 則超過 90 天沒動作:
    2. 假期模式隨機開燈 -- 從來沒有觸發過
    3. 訪客模式 -- 從來沒有觸發過
    4. 下雨收衣服提醒 -- 173 天沒觸發
    複製代碼

    清單是空的,恭喜,你的自動化都還活著。

    所有自動化都顯示「從來沒有觸發過」,代表你剛重新安裝過 —— last_triggered 在重啟後會還原,但重建系統之後就是空的,等一個月再看。

    步驟 2:看完清單之後怎麼處理


    • 從來沒觸發過 —— 多半是條件寫錯了,或者觸發條件根本不會成立。這是壞掉而不是沒用,先去追蹤頁面看一眼
    • 很久沒觸發但條件是合理的(例如颱風才會用到的)—— 保留,但貼一個標籤歸類
    • 很久沒觸發而且你想不起來它在做什麼 —— 停用它,不要直接刪。停用一個月沒有人抱怨再刪


    為什麼要停用而不是直接刪:自動化壞掉的時候很安靜,沒有人會跑來跟你說「客廳的燈今天沒有自己亮」,他們只會自己去按開關。留一個月的緩衝可以接住這種情況。

    檢驗二:如果這個判斷錯了,往哪一邊倒比較不痛?

    問法:這則自動化有兩種錯法,哪一種你比較能接受?然後刻意往那一邊設計。
    1. 感應器壞了 → 燈一直亮        可以接受(浪費電)
    2. 感應器壞了 → 燈永遠不亮      不能接受(半夜摔倒)
    3. 判斷錯 → 冷氣多開十分鐘      可以接受
    4. 判斷錯 → 半夜冷氣自己關掉    不能接受(會熱醒)
    5. 通知誤報 → 多一則訊息        可以接受
    6. 通知漏報 → 漏水沒人發現      不能接受
    複製代碼

    步驟 3:把它寫進條件裡

    Home Assistant 有一個內建函式 has_value(),判斷一個實體現在有沒有有效的數值(unknown 和 unavailable 都算沒有)。

    不好的寫法:
    1.   conditions:
    2.     - condition: state
    3.       entity_id: binary_sensor.living_room_presence
    4.       state: "off"
    5.   actions:
    6.     - action: light.turn_off
    7.       target:
    8.         entity_id: light.living_room
    複製代碼

    感應器掉線時它的狀態是 unavailable,不等於 "off",所以這則不會執行 —— 這次剛好安全。

    但反過來的那一則就不安全了:
    1.   # 危險:感應器掉線時 states() 回傳 'unavailable',
    2.   # 這個數字比較會直接出錯或用到預設值
    3.   conditions:
    4.     - condition: numeric_state
    5.       entity_id: sensor.living_room_temperature
    6.       above: 28
    7.   actions:
    8.     - action: climate.turn_on
    9.       target:
    10.         entity_id: climate.living_room
    複製代碼

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

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

    本版積分規則

    延伸閱讀

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

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

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

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