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

    script 跟 automation 差在哪?什麼時候該把動作拆出來

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    新手常問:一樣都是「做一連串事情」,為什麼要分成兩種?

    一句話:automation 是「什麼時候做」,script 是「做什麼」。



    結構上的差別


    • automation = 觸發器 + 條件 + 動作
    • script = 只有動作(要別人來叫它)


    script 不會自己跑,一定要有東西呼叫它:自動化、按鈕、語音、儀表板、API。

    什麼時候該拆成 script

    狀況一:同一串動作被多個自動化用到

    這是最主要的理由。

    我家的「睡前模式」會被三個地方觸發:
    晚上 11 點自動、床頭的實體按鈕、還有語音說「我要睡了」。

    如果不拆,同一串動作要寫三次。拆成 script 之後:
    1. # scripts.yaml
    2. 睡前模式:
    3.   alias: 睡前模式
    4.   sequence:
    5.     - action: light.turn_off
    6.       target:
    7.         entity_id: all
    8.     - action: lock.lock
    9.       target:
    10.         entity_id: lock.前門
    11.     - action: climate.set_preset_mode
    12.       target:
    13.         entity_id: climate.主臥
    14.       data:
    15.         preset_mode: sleep
    16.     - action: input_boolean.turn_on
    17.       target:
    18.         entity_id: input_boolean.夜間模式
    19.     - condition: state
    20.       entity_id: binary_sensor.後門
    21.       state: "on"
    22.     - action: notify.mobile_app_charles
    23.       data:
    24.         message: 後門還開著,我沒有幫你鎖
    25.   mode: single
    複製代碼

    三個自動化都只要:
    1. actions:
    2.   - action: script.turn_on
    3.     target:
    4.       entity_id: script.睡前模式
    複製代碼

    狀況二:想要在儀表板上放一個按鈕

    script 可以直接拉到儀表板當按鈕,automation 不行
    (automation 的開關是「啟用/停用」,不是「執行」)。

    狀況三:自動化太長,讀不下去

    把幾個邏輯段落各自拆成 script,主自動化就變成一份目錄:
    1. actions:
    2.   - action: script.turn_on
    3.     target: {entity_id: script.關閉所有電器}
    4.   - action: script.turn_on
    5.     target: {entity_id: script.啟動保全}
    6.   - action: script.turn_on
    7.     target: {entity_id: script.發送離家摘要}
    複製代碼



    一個很重要的坑:turn_on 不會等它跑完
    1. # 這樣「不會」等 script 跑完才做下一步
    2. - action: script.turn_on
    3.   target: {entity_id: script.前置作業}
    4. - action: light.turn_on          # 可能前置作業還沒好就執行了
    5.   target: {entity_id: light.客廳}
    複製代碼

    要等它跑完,用直接呼叫的寫法:
    1. - action: script.前置作業      # 沒有 turn_on,直接叫名字
    2. - action: light.turn_on
    3.   target: {entity_id: light.客廳}
    複製代碼

    這兩種寫法的差別是「非同步」跟「同步」
    遇到「順序怪怪的」問題八成是中了這個。

    script 也可以收參數

    這讓它變得很像函式:
    1. 語音播報:
    2.   alias: 語音播報
    3.   fields:
    4.     message:
    5.       description: 要講的內容
    6.       required: true
    7.       selector:
    8.         text:
    9.     volume:
    10.       description: 音量 0-1
    11.       default: 0.5
    12.       selector:
    13.         number: {min: 0, max: 1, step: 0.1}
    14.   sequence:
    15.     - action: media_player.volume_set
    16.       target: {entity_id: media_player.客廳音箱}
    17.       data:
    18.         volume_level: "{{ volume }}"
    19.     - action: tts.speak
    20.       target: {entity_id: tts.piper}
    21.       data:
    22.         media_player_entity_id: media_player.客廳音箱
    23.         message: "{{ message }}"
    24.   mode: queued
    25.   max: 10
    複製代碼

    呼叫時帶參數:
    1. - action: script.語音播報
    2.   data:
    3.     message: 洗衣機好了
    4.     volume: 0.7
    複製代碼

    這個 script 我寫一次,家裡十幾個自動化都在用。
    之後想換 TTS 引擎或改音量邏輯,只改這一個地方。

    什麼時候「不要」拆

    只有一個自動化會用到、而且只有兩三步的 —— 不要拆。
    拆了之後你要在兩個檔案之間跳,反而更難懂。

    我的判斷:被用到兩次以上,或者超過八個步驟,才拆。

    ---

    順帶一提,script 的 mode 選項跟 automation 一樣(single/restart/queued/parallel),
    邏輯也一樣。語音播報那種就很適合 queued。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

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

    GMT+8, 2026-9-24 11:18 , Processed in 0.075229 second(s), 24 queries .

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