通過本篇教程,你將了解 Home Assistant 自動化概念,以及自動化的組成,并通過一些例子學習如何編寫自己的自動化配置。( 官方文檔與官方示例 )
提示:慎入!這是一篇非常無趣的基礎技術文。
智能家居為人詬病的一點往往是它不夠“智能”,而國內的廠家又愛拿“智能”、“云”、“物聯網+”之類高大上的詞語做噱頭,當你將這些設備買回家后,你發現它沒有想象中的那么好用,難免就會失望。目前的智能家居系統,與其強調“智能”(Smart),我認為不如 Home Assistant 中的描述的“自動化”(Automation)來的貼切,事實上,在 HomeKit 以及 米家 App 中的都是以“自動化”來命名它們的。
正是“自動化”的加入,使得 Home Assistant 不再呆板,在特定情況下,你甚至可以不再使用那些操作界面,讓一切自動運轉,真正的“智能”起來。以我自己舉例,家中除了我,沒人搗鼓這些東西,都是靠“自動化”設置,實現燈光、新風、監控、警戒、夜間空調等的日常使用。
一、自動化基礎
HomeKit 新建自動化
為了讓大家對相關概念有一個更直觀的認識,我先以 HomeKit 為例做一個展示。
如圖所示我新建了“星期日落日后就打開餐廳的落地燈”這樣一個自動化(僅作示例),可見 iOS 的家庭 App 新建自動化非常直觀。
在這個自動化中,我們的觸發條件是一個時間,即“落日”并且限制在“星期日”,當到達這一時間點時,系統自動執行“打開餐廳落地燈”這一動作。這樣一個最簡單的自動化,由三個不同的部分組成:觸發(Trigger)、條件(Condition)、動作(Action)。
這里我們也可以看到一般為了簡化操作與保證設置的可行性,如 HomeKit、米家、阿里智能,都僅提供了較少的觸發條件與可執行項,這大大限制了我們發揮的余地。
自動化組成
觸發:即觸發自動化規則,比如到達特定的時間點、到達某一地點、天氣變化、系統變化。
條件:條件是可選的,可以將自動化規則限制為僅在特定情況下執行。如一周之中我們只在周日讓這個自動化起作用。
動作:當規則被觸發并滿足所有條件,將被執行,如開燈、調節溫度、激活場景。
以官方一個簡單的 Home Assistant 自動化配置為例,格式如下:
automation:
- alias: 'Rainy Day' #自動化名稱
trigger: #觸發
- platform: state
entity_id: sensor.precip_intensity
to: 'rain'
condition: #條件
- condition: state
entity_id: group.all_devices
state: 'home'
- condition: time
after: '14:00'
before: '23:00'
action: #動作
service: light.turn_on
entity_id: light.couch_lamp
對應流程如下:
這個自動化表示,在下雨天,下午到晚上有人在家的話,就打開燈。
自動化配置在
configuration.yaml
中,automation:
字段下,也可以使用automation: !include automations.yaml
將所有自動化信息獨立出來。
系統內部參數
在上篇 Home Assistant 的進階設置中我們講到過,Home Assistant 的每一個一個設備或服務,都是通過自身唯一的實例 ID(Entity ID)被系統調用的,而在自動化配置中,我們設置觸發、條件、動作的對象,也是如此。

在上圖所示界面,我們可以獲得一個設備或服務的ID(Entity ID)、狀態(State)及附加屬性(Attributes)。
▼設備參數
名稱 | 描述 | 示例 |
---|---|---|
Entity ID | 實例的唯一標識符。 | light.couch_lamp |
State | 設備的當前狀態 | on、off |
Attributes | 設備的的 | brightness |
這些實例狀態的變化,被用作觸發源,而其實時狀態用作判斷能否執行的條件。
在 Home Assistant 中,所有設備或服務,包括燈、開關、人,甚至太陽等等,都被視為一個實例(Entity)。
所有的動作(Action)都被稱作服務(Services),所有可執行的服務都可以在下圖開發者工具(Developer Tools)中找到,包括自定義的設備與服務。比如上例中的 light.turn_on
能夠打開系統中的任何燈,只需要添加類似 entity_id: light.couch_lamp
的指定參數即可。
二、自動化編輯器
0.45 版本之后,Home Assistant 還提供了一個自動化編輯器,在側邊欄找到 Configuration > Automations
。
繼續以上個自動化為例,用圖像界面編輯器添加,如下圖所示:
自動化編輯器能夠使得相關配置工作簡化,它提供了觸發、條件和動作的類別選擇,但是你還需要在開發者工具(Developer Tools)中找到你需要的實例 ID(Entity ID)、狀態(State)和服務(Service)的詳細信息并手動填入編輯器。
注意:自動化編輯器 Data 參數采用 JSON 格式,與配置文件 YAML 語法有所不同,請按開發者工具(Developer Tools)中的示例編寫。
因為自動化編輯器需要調用
automations.yaml
文件,需要采用automation: !include automations.yaml
將自動化信息獨立出來。
三、自動化詳解
觸發(Trigger)
觸發是啟動自動化的規則,可以為同一規則設置多個觸發器。一旦觸發,Home Assistant 將驗證相關條件,并執行動作。
事件觸發
automation:
trigger:
platform: event
event_type: MY_CUSTOM_EVENT
# 可選
event_data:
mood: happy
Home Assistant 觸發
由 Home Assistant 的啟動或停止來觸發。
automation:
trigger:
platform: homeassistant
event: start #或者是 'shutdown'
MQTT觸發
收到來自 topic 的消息后觸發。
automation:
trigger:
platform: mqtt
topic: living_room/switch/ac
payload: 'on' # 可選項
數值觸發
設備的狀態達到預設范圍時觸發,如溫度低于xx度。
automation:
trigger:
platform: numeric_state
entity_id: sensor.temperature
value_template: '{{ state.attributes.battery }}' # 可選 定義數據格式
# above below 至少有一個
above: 17
below: 25
狀態觸發
設備的狀態變化來觸發。
automation:
trigger:
platform: state
entity_id: device_tracker.paulus, device_tracker.anne_therese
# from to 可選一個或全部
from: 'not_home'
to: 'home'
# 可選項 狀態為1:10:05時觸發
for:
hours: 1
minutes: 10
seconds: 5
日升日落觸發
顧名思義,日升或日落時觸發,可設置提前或推遲時間。
automation:
trigger:
platform: sun
event: sunset # sunset或sunrise
offset: '-00:45:00' # 可選項,此例為日落前 45 分鐘觸發
模板觸發
模板值為 True 時觸發。
automation:
trigger:
platform: template
value_template: "{% if is_state('device_tracker.paulus', 'home') %}true{% endif %}"
時間觸發
在某時刻觸發。
automation:
trigger:
platform: time
# 每小時的第5分鐘觸發
minutes: 5
seconds: 00
automation 2:
trigger:
platform: time
# 15:32:00 觸發
at: '15:32:00'
automation 3:
trigger:
platform: time
# 每 5分鐘 觸發一次
minutes: '/5'
seconds: 00
區域觸發
到達或離開某地時觸發,目前僅支持 OwnTracks 平臺以及 iCloud 平臺。
automation:
trigger:
platform: zone
entity_id: device_tracker.paulus # 此設備到達 home 時觸發
zone: zone.home
# 到達或離開時觸發
event: enter # or "leave"
多個觸發
觸發其中一個,自動化就會被被執行。
automation:
trigger:
# 第一個
- platform: time
minutes: 5
seconds: 00
# 第二個
- platform: sun
event: sunset
條件(Condition)
條件是自動化規則的可選部分,用來限制觸發后的執行,防止誤操作。
邏輯關系
與(AND)
同時滿足所有條件才執行。
condition:
condition: and
conditions:
- condition: state
entity_id: 'device_tracker.paulus'
state: 'home'
- condition: numeric_state
entity_id: 'sensor.temperature'
below: '20'
或(OR)
只要滿足一個條件就執行。
condition:
condition: or
conditions:
- condition: state
entity_id: 'device_tracker.paulus'
state: 'home'
- condition: numeric_state
entity_id: 'sensor.temperature'
below: '20'
混合 AND 和 OR
示例:下雨或者溫度低于20℃,同時有人在家時執行。
condition:
condition: and
conditions:
- condition: state
entity_id: 'device_tracker.paulus'
state: 'home'
- condition: or
conditions:
- condition: state
entity_id: sensor.weather_precip
state: 'rain'
- condition: numeric_state
entity_id: 'sensor.temperature'
below: '20'
條件類型
數值條件
condition:
condition: numeric_state
entity_id: sensor.temperature
above: 17
below: 25
# 可選
value_template: {{ float(state.state) + 2 }}
狀態條件
condition:
condition: state
entity_id: device_tracker.paulus
state: not_home
# 可選
for:
hours: 1
minutes: 10
seconds: 5
日升日落條件
condition:
condition: sun
after: sunset
# 可選
after_offset: "-1:00:00"
模板條件
condition:
condition: template
value_template: '{{ states.device_tracker.iphone.attributes.battery > 50 }}'
時間條件
condition:
condition: time
# 需要以下至少一項
after: '15:00:00'
before: '02:00:00'
weekday:
- mon
- wed
- fri
區域條件
condition:
condition: zone
entity_id: device_tracker.paulus
zone: zone.home
示例
condition:
- condition: numeric_state
entity_id: sun.sun
value_template: ''
below: 1
- condition: state
entity_id: light.living_room
state: 'off'
- condition: time
before: '23:00:00'
after: '14:00:00'
- condition: state
entity_id: script.light_turned_off_5min
state: 'off'
動作(Action)
動作通過服務或事件與其他內容進行交互。在服務中需要指定實例 ID(entity_id)和可選的參數(data)。
automation:
# 日落后將廚房與客廳的燈打開,并調到 亮度150,紅色。
trigger:
platform: sun
event: sunset
action:
service: light.turn_on
entity_id:
- light.kitchen
- light.living_room
data:
brightness: 150
rgb_color: [255, 0, 0]
automation 2:
# 推送消息
trigger:
platform: sun
event: sunset
offset: -00:30
action:
# 可以有多個service
- service: notify.notify
data:
message: Beautiful sunset!
- delay: 0:35
- service: notify.notify
data:
message: Oh wow you really missed something great.
四、后期預告
說實話,沒有想到大家有如此高的熱情,畢竟除開一些演示圖片,技術文當真是枯燥又無趣,而自動化這一篇更是其中的巔峰,還好到這里整個系列文章算是告一段落。
每個人的情況不同、設備不同,由于篇幅有限,基礎篇章中我沒有非常具體的講一些設備和組件,當然我也不可能做到面面俱到,但是我希望通過之前的文章能夠引領大家入門,能夠讓大家少走些彎路。除了官方文檔、官方論壇,大家還可以到中文論壇瀚思彼岸進行 Home Assistant 相關討論,其中有很多具體的設備接入與插件配置。
這個系列不會結束,但是應該不會如此密集地發文了,后期或許會做一兩期個性化的內容,比如 Floorplan 或是 HADashboard,有機會再做智能音箱接入的內容。同時希望能與大家分享更多關于智能家居的內容,用心打造我們每一個人自己的智能家居與生活。
效果展示:
▲Floorplan via Carlo
▲Floorplan via Carlo
PS:這種嵌入插座哪里能買得到……
當然,你也可以采用這樣的形式: