|
|
自動化沒反應,八成是條件沒過。
這篇把所有條件類型講一遍,附最容易寫錯的地方。

1. state — 最常用
- conditions:
- - condition: state
- entity_id: binary_sensor.有人在家
- state: "on"
複製代碼
三個常見錯誤:
- # 錯:on 不加引號會被 YAML 當成布林值 true
- state: on
- # 錯:大小寫有差,狀態是小寫的 "on"
- state: "ON"
- # 對
- state: "on"
複製代碼
加 for 可以要求「維持多久」:
- - condition: state
- entity_id: binary_sensor.有人在家
- state: "off"
- for:
- minutes: 10
複製代碼
2. numeric_state — 比數值
- - condition: numeric_state
- entity_id: sensor.客廳溫度
- above: 28
- below: 35
複製代碼
above 和 below 都是「不含」(嚴格大於/小於)。
28 度整的時候,above: 28 是不成立的。
要比屬性的話:
- - condition: numeric_state
- entity_id: light.客廳
- attribute: brightness
- above: 200
複製代碼
3. time — 時段與星期
- - condition: time
- after: "22:00:00"
- before: "06:00:00"
- weekday: [mon, tue, wed, thu, fri]
複製代碼
跨午夜是自動處理的。上面那個 HA 會正確理解成「晚上十點到隔天早上六點」,
這跟自己寫範本不一樣(自己寫要用 or)。
after / before 也可以吃 input_datetime:
- - condition: time
- after: input_datetime.夜間開始
- before: input_datetime.夜間結束
複製代碼
4. sun — 日出日落
- - condition: sun
- after: sunset
- after_offset: "-00:30:00" # 日落前 30 分鐘就算
複製代碼
台灣夏天七點多才天黑、冬天五點半就暗了,
用 sun 比寫死「18:00」合理很多。
5. zone — 地理位置
- - condition: zone
- entity_id: person.charles
- zone: zone.公司
複製代碼
6. template — 什麼都能寫
- - condition: template
- value_template: >
- {{ states('sensor.客廳溫度') | float(0) > 28
- and states('sensor.室外溫度') | float(99) > 26 }}
複製代碼
float() 的預設值一定要給。
感測器不可用的時候回傳字串 unavailable,比大小會直接讓條件報錯。
而且預設值要選對方向:上面「室外溫度」給 99,
是因為抓不到的時候寧可當成「外面很熱」讓冷氣開;
如果給 0,抓不到就永遠不開冷氣了。
7. trigger — 只在特定觸發時成立
- - condition: trigger
- id: 回家
複製代碼
這個配 choose 用,前面那篇講過。

and / or / not 怎麼組
預設就是 and。條件清單裡的每一項都要成立:
- conditions:
- - condition: state
- entity_id: binary_sensor.有人在家
- state: "on"
- - condition: time
- after: "18:00:00"
- # 上面兩個「都」要成立
複製代碼
要 or 就得明確包起來:
- conditions:
- - condition: or
- conditions:
- - condition: state
- entity_id: binary_sensor.前門
- state: "on"
- - condition: state
- entity_id: binary_sensor.後門
- state: "on"
複製代碼
巢狀組合:
- conditions:
- # 有人在家 而且(太熱 或 太濕)
- - condition: state
- entity_id: binary_sensor.有人在家
- state: "on"
- - condition: or
- conditions:
- - condition: numeric_state
- entity_id: sensor.溫度
- above: 28
- - condition: numeric_state
- entity_id: sensor.濕度
- above: 75
複製代碼
not 最容易寫錯:
- - condition: not
- conditions:
- - condition: state
- entity_id: binary_sensor.睡覺模式
- state: "on"
複製代碼
注意 not 底下還是 conditions(複數),
而且如果放多個,意思是「這些條件全部不成立」。
簡寫形式
條件也可以寫成一行範本(HA 會自動當成 template 條件):
- conditions:
- - "{{ states('sensor.溫度') | float(0) > 28 }}"
複製代碼
短的時候很方便,但除錯時追蹤紀錄顯示得比較不清楚,
複雜的還是寫完整形式。
除錯:怎麼知道卡在哪一個條件
設定 → 自動化 → 點進去 → 右上三個點 → 追蹤
藍色路徑是走過的,斷掉的地方就是沒過的條件。
點那個條件節點,右邊會顯示當時的實際值 —— 這個最有用,
你會看到「喔原來那時候溫度是 unavailable」。
還有一招:開發者工具 → 範本
把條件寫成範本貼進去,立刻看 true / false:
- {{ is_state('binary_sensor.有人在家', 'on') }}
- {{ states('sensor.溫度') | float(0) > 28 }}
- {{ now().hour >= 22 or now().hour < 6 }}
複製代碼
一個實用的習慣
條件太多的自動化很難維護。我的做法是把複雜的判斷做成 template binary_sensor:
- template:
- - binary_sensor:
- - name: 該開冷氣了
- state: >
- {{ is_state('binary_sensor.家裡真的有人','on')
- and states('sensor.客廳溫度') | float(0) > 28
- and not is_state('input_boolean.外出模式','on') }}
複製代碼
然後自動化的條件就只剩一行:
- conditions:
- - condition: state
- entity_id: binary_sensor.該開冷氣了
- state: "on"
複製代碼
好處:那個判斷可以被多個自動化共用,而且可以直接在介面上看它現在是不是 on。
---
條件寫錯最麻煩的是它不會報錯,只是安靜地不執行。
所以養成「寫完先去追蹤看一次」的習慣真的很重要。 |
|