|
|
新手常問:一樣都是「做一連串事情」,為什麼要分成兩種?
一句話:automation 是「什麼時候做」,script 是「做什麼」。

結構上的差別
- automation = 觸發器 + 條件 + 動作
- script = 只有動作(要別人來叫它)
script 不會自己跑,一定要有東西呼叫它:自動化、按鈕、語音、儀表板、API。
什麼時候該拆成 script
狀況一:同一串動作被多個自動化用到
這是最主要的理由。
我家的「睡前模式」會被三個地方觸發:
晚上 11 點自動、床頭的實體按鈕、還有語音說「我要睡了」。
如果不拆,同一串動作要寫三次。拆成 script 之後:
- # scripts.yaml
- 睡前模式:
- alias: 睡前模式
- sequence:
- - action: light.turn_off
- target:
- entity_id: all
- - action: lock.lock
- target:
- entity_id: lock.前門
- - action: climate.set_preset_mode
- target:
- entity_id: climate.主臥
- data:
- preset_mode: sleep
- - action: input_boolean.turn_on
- target:
- entity_id: input_boolean.夜間模式
- - condition: state
- entity_id: binary_sensor.後門
- state: "on"
- - action: notify.mobile_app_charles
- data:
- message: 後門還開著,我沒有幫你鎖
- mode: single
複製代碼
三個自動化都只要:
- actions:
- - action: script.turn_on
- target:
- entity_id: script.睡前模式
複製代碼
狀況二:想要在儀表板上放一個按鈕
script 可以直接拉到儀表板當按鈕,automation 不行
(automation 的開關是「啟用/停用」,不是「執行」)。
狀況三:自動化太長,讀不下去
把幾個邏輯段落各自拆成 script,主自動化就變成一份目錄:
- actions:
- - action: script.turn_on
- target: {entity_id: script.關閉所有電器}
- - action: script.turn_on
- target: {entity_id: script.啟動保全}
- - action: script.turn_on
- target: {entity_id: script.發送離家摘要}
複製代碼

一個很重要的坑:turn_on 不會等它跑完
- # 這樣「不會」等 script 跑完才做下一步
- - action: script.turn_on
- target: {entity_id: script.前置作業}
- - action: light.turn_on # 可能前置作業還沒好就執行了
- target: {entity_id: light.客廳}
複製代碼
要等它跑完,用直接呼叫的寫法:
- - action: script.前置作業 # 沒有 turn_on,直接叫名字
- - action: light.turn_on
- target: {entity_id: light.客廳}
複製代碼
這兩種寫法的差別是「非同步」跟「同步」,
遇到「順序怪怪的」問題八成是中了這個。
script 也可以收參數
這讓它變得很像函式:
- 語音播報:
- alias: 語音播報
- fields:
- message:
- description: 要講的內容
- required: true
- selector:
- text:
- volume:
- description: 音量 0-1
- default: 0.5
- selector:
- number: {min: 0, max: 1, step: 0.1}
- sequence:
- - action: media_player.volume_set
- target: {entity_id: media_player.客廳音箱}
- data:
- volume_level: "{{ volume }}"
- - action: tts.speak
- target: {entity_id: tts.piper}
- data:
- media_player_entity_id: media_player.客廳音箱
- message: "{{ message }}"
- mode: queued
- max: 10
複製代碼
呼叫時帶參數:
- - action: script.語音播報
- data:
- message: 洗衣機好了
- volume: 0.7
複製代碼
這個 script 我寫一次,家裡十幾個自動化都在用。
之後想換 TTS 引擎或改音量邏輯,只改這一個地方。
什麼時候「不要」拆
只有一個自動化會用到、而且只有兩三步的 —— 不要拆。
拆了之後你要在兩個檔案之間跳,反而更難懂。
我的判斷:被用到兩次以上,或者超過八個步驟,才拆。
---
順帶一提,script 的 mode 選項跟 automation 一樣(single/restart/queued/parallel),
邏輯也一樣。語音播報那種就很適合 queued。 |
|