
通過本篇教程,你將了解 Home Assistant 自動化概念,以及自動化的組成,并通過一些例子學(xué)習(xí)如何編寫自己的自動化配置。( 官方文檔與官方示例 )
提示:慎入!這是一篇非常無趣的基礎(chǔ)技術(shù)文。
智能家居為人詬病的一點(diǎn)往往是它不夠“智能”,而國內(nèi)的廠家又愛拿“智能”、“云”、“物聯(lián)網(wǎng)+”之類高大上的詞語做噱頭,當(dāng)你將這些設(shè)備買回家后,你發(fā)現(xiàn)它沒有想象中的那么好用,難免就會失望。目前的智能家居系統(tǒng),與其強(qiáng)調(diào)“智能”(Smart),我認(rèn)為不如 Home Assistant 中的描述的“自動化”(Automation)來的貼切,事實(shí)上,在 HomeKit 以及 米家 App 中的都是以“自動化”來命名它們的。
正是“自動化”的加入,使得 Home Assistant 不再呆板,在特定情況下,你甚至可以不再使用那些操作界面,讓一切自動運(yùn)轉(zhuǎn),真正的“智能”起來。以我自己舉例,家中除了我,沒人搗鼓這些東西,都是靠“自動化”設(shè)置,實(shí)現(xiàn)燈光、新風(fēng)、監(jiān)控、警戒、夜間空調(diào)等的日常使用。
一、自動化基礎(chǔ)
HomeKit 新建自動化
為了讓大家對相關(guān)概念有一個更直觀的認(rèn)識,我先以 HomeKit 為例做一個展示。


如圖所示我新建了“星期日落日后就打開餐廳的落地?zé)簟边@樣一個自動化(僅作示例),可見 iOS 的家庭 App 新建自動化非常直觀。

在這個自動化中,我們的觸發(fā)條件是一個時間,即“落日”并且限制在“星期日”,當(dāng)?shù)竭_(dá)這一時間點(diǎn)時,系統(tǒng)自動執(zhí)行“打開餐廳落地?zé)簟边@一動作。這樣一個最簡單的自動化,由三個不同的部分組成:觸發(fā)(Trigger)、條件(Condition)、動作(Action)。
這里我們也可以看到一般為了簡化操作與保證設(shè)置的可行性,如 HomeKit、米家、阿里智能,都僅提供了較少的觸發(fā)條件與可執(zhí)行項(xiàng),這大大限制了我們發(fā)揮的余地。
自動化組成
觸發(fā):即觸發(fā)自動化規(guī)則,比如到達(dá)特定的時間點(diǎn)、到達(dá)某一地點(diǎn)、天氣變化、系統(tǒng)變化。
條件:條件是可選的,可以將自動化規(guī)則限制為僅在特定情況下執(zhí)行。如一周之中我們只在周日讓這個自動化起作用。
動作:當(dāng)規(guī)則被觸發(fā)并滿足所有條件,將被執(zhí)行,如開燈、調(diào)節(jié)溫度、激活場景。
以官方一個簡單的 Home Assistant 自動化配置為例,格式如下:
automation:
- alias: 'Rainy Day' #自動化名稱
trigger: #觸發(fā)
- 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
對應(yīng)流程如下:

這個自動化表示,在下雨天,下午到晚上有人在家的話,就打開燈。
自動化配置在
configuration.yaml中,automation:字段下,也可以使用automation: !include automations.yaml將所有自動化信息獨(dú)立出來。
系統(tǒng)內(nèi)部參數(shù)
在上篇 Home Assistant 的進(jìn)階設(shè)置中我們講到過,Home Assistant 的每一個一個設(shè)備或服務(wù),都是通過自身唯一的實(shí)例 ID(Entity ID)被系統(tǒng)調(diào)用的,而在自動化配置中,我們設(shè)置觸發(fā)、條件、動作的對象,也是如此。

在上圖所示界面,我們可以獲得一個設(shè)備或服務(wù)的ID(Entity ID)、狀態(tài)(State)及附加屬性(Attributes)。
▼設(shè)備參數(shù)
| 名稱 | 描述 | 示例 |
|---|---|---|
| Entity ID | 實(shí)例的唯一標(biāo)識符。 | light.couch_lamp |
| State | 設(shè)備的當(dāng)前狀態(tài) | on、off |
| Attributes | 設(shè)備的的 | brightness |
這些實(shí)例狀態(tài)的變化,被用作觸發(fā)源,而其實(shí)時狀態(tài)用作判斷能否執(zhí)行的條件。
在 Home Assistant 中,所有設(shè)備或服務(wù),包括燈、開關(guān)、人,甚至太陽等等,都被視為一個實(shí)例(Entity)。
所有的動作(Action)都被稱作服務(wù)(Services),所有可執(zhí)行的服務(wù)都可以在下圖開發(fā)者工具(Developer Tools)中找到,包括自定義的設(shè)備與服務(wù)。比如上例中的 light.turn_on 能夠打開系統(tǒng)中的任何燈,只需要添加類似 entity_id: light.couch_lamp 的指定參數(shù)即可。

二、自動化編輯器
0.45 版本之后,Home Assistant 還提供了一個自動化編輯器,在側(cè)邊欄找到 Configuration > Automations。

繼續(xù)以上個自動化為例,用圖像界面編輯器添加,如下圖所示:

自動化編輯器能夠使得相關(guān)配置工作簡化,它提供了觸發(fā)、條件和動作的類別選擇,但是你還需要在開發(fā)者工具(Developer Tools)中找到你需要的實(shí)例 ID(Entity ID)、狀態(tài)(State)和服務(wù)(Service)的詳細(xì)信息并手動填入編輯器。
注意:自動化編輯器 Data 參數(shù)采用 JSON 格式,與配置文件 YAML 語法有所不同,請按開發(fā)者工具(Developer Tools)中的示例編寫。
因?yàn)樽詣踊庉嬈餍枰{(diào)用
automations.yaml文件,需要采用automation: !include automations.yaml將自動化信息獨(dú)立出來。
三、自動化詳解
觸發(fā)(Trigger)
觸發(fā)是啟動自動化的規(guī)則,可以為同一規(guī)則設(shè)置多個觸發(fā)器。一旦觸發(fā),Home Assistant 將驗(yàn)證相關(guān)條件,并執(zhí)行動作。
事件觸發(fā)
automation:
trigger:
platform: event
event_type: MY_CUSTOM_EVENT
# 可選
event_data:
mood: happy
Home Assistant 觸發(fā)
由 Home Assistant 的啟動或停止來觸發(fā)。
automation:
trigger:
platform: homeassistant
event: start #或者是 'shutdown'
MQTT觸發(fā)
收到來自 topic 的消息后觸發(fā)。
automation:
trigger:
platform: mqtt
topic: living_room/switch/ac
payload: 'on' # 可選項(xiàng)
數(shù)值觸發(fā)
設(shè)備的狀態(tài)達(dá)到預(yù)設(shè)范圍時觸發(fā),如溫度低于xx度。
automation:
trigger:
platform: numeric_state
entity_id: sensor.temperature
value_template: '{{ state.attributes.battery }}' # 可選 定義數(shù)據(jù)格式
# above below 至少有一個
above: 17
below: 25
狀態(tài)觸發(fā)
設(shè)備的狀態(tài)變化來觸發(fā)。
automation:
trigger:
platform: state
entity_id: device_tracker.paulus, device_tracker.anne_therese
# from to 可選一個或全部
from: 'not_home'
to: 'home'
# 可選項(xiàng) 狀態(tài)為1:10:05時觸發(fā)
for:
hours: 1
minutes: 10
seconds: 5
日升日落觸發(fā)
顧名思義,日升或日落時觸發(fā),可設(shè)置提前或推遲時間。
automation:
trigger:
platform: sun
event: sunset # sunset或sunrise
offset: '-00:45:00' # 可選項(xiàng),此例為日落前 45 分鐘觸發(fā)
模板觸發(fā)
模板值為 True 時觸發(fā)。
automation:
trigger:
platform: template
value_template: "{% if is_state('device_tracker.paulus', 'home') %}true{% endif %}"
時間觸發(fā)
在某時刻觸發(fā)。
automation:
trigger:
platform: time
# 每小時的第5分鐘觸發(fā)
minutes: 5
seconds: 00
automation 2:
trigger:
platform: time
# 15:32:00 觸發(fā)
at: '15:32:00'
automation 3:
trigger:
platform: time
# 每 5分鐘 觸發(fā)一次
minutes: '/5'
seconds: 00
區(qū)域觸發(fā)
到達(dá)或離開某地時觸發(fā),目前僅支持 OwnTracks 平臺以及 iCloud 平臺。
automation:
trigger:
platform: zone
entity_id: device_tracker.paulus # 此設(shè)備到達(dá) home 時觸發(fā)
zone: zone.home
# 到達(dá)或離開時觸發(fā)
event: enter # or "leave"
多個觸發(fā)
觸發(fā)其中一個,自動化就會被被執(zhí)行。
automation:
trigger:
# 第一個
- platform: time
minutes: 5
seconds: 00
# 第二個
- platform: sun
event: sunset
條件(Condition)
條件是自動化規(guī)則的可選部分,用來限制觸發(fā)后的執(zhí)行,防止誤操作。
邏輯關(guān)系
與(AND)
同時滿足所有條件才執(zhí)行。
condition:
condition: and
conditions:
- condition: state
entity_id: 'device_tracker.paulus'
state: 'home'
- condition: numeric_state
entity_id: 'sensor.temperature'
below: '20'
或(OR)
只要滿足一個條件就執(zhí)行。
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℃,同時有人在家時執(zhí)行。
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'
條件類型
數(shù)值條件
condition:
condition: numeric_state
entity_id: sensor.temperature
above: 17
below: 25
# 可選
value_template: {{ float(state.state) + 2 }}
狀態(tài)條件
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
# 需要以下至少一項(xiàng)
after: '15:00:00'
before: '02:00:00'
weekday:
- mon
- wed
- fri
區(qū)域條件
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)
動作通過服務(wù)或事件與其他內(nèi)容進(jìn)行交互。在服務(wù)中需要指定實(shí)例 ID(entity_id)和可選的參數(shù)(data)。
automation:
# 日落后將廚房與客廳的燈打開,并調(diào)到 亮度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.
四、后期預(yù)告
說實(shí)話,沒有想到大家有如此高的熱情,畢竟除開一些演示圖片,技術(shù)文當(dāng)真是枯燥又無趣,而自動化這一篇更是其中的巔峰,還好到這里整個系列文章算是告一段落。
每個人的情況不同、設(shè)備不同,由于篇幅有限,基礎(chǔ)篇章中我沒有非常具體的講一些設(shè)備和組件,當(dāng)然我也不可能做到面面俱到,但是我希望通過之前的文章能夠引領(lǐng)大家入門,能夠讓大家少走些彎路。除了官方文檔、官方論壇,大家還可以到中文論壇瀚思彼岸進(jìn)行 Home Assistant 相關(guān)討論,其中有很多具體的設(shè)備接入與插件配置。
這個系列不會結(jié)束,但是應(yīng)該不會如此密集地發(fā)文了,后期或許會做一兩期個性化的內(nèi)容,比如 Floorplan 或是 HADashboard,有機(jī)會再做智能音箱接入的內(nèi)容。同時希望能與大家分享更多關(guān)于智能家居的內(nèi)容,用心打造我們每一個人自己的智能家居與生活。
效果展示:




▲Floorplan via Carlo

▲Floorplan via Carlo
PS:這種嵌入插座哪里能買得到……
當(dāng)然,你也可以采用這樣的形式:
