樹莓派 + Home Assistant + HomeKit 從零開始打造個人智能家居系統(6):自動化

樹莓派 + Home Assistant + HomeKit

通過本篇教程,你將了解 Home Assistant 自動化概念,以及自動化的組成,并通過一些例子學習如何編寫自己的自動化配置。( 官方文檔官方示例

提示:慎入!這是一篇非常無趣的基礎技術文。

智能家居為人詬病的一點往往是它不夠“智能”,而國內的廠家又愛拿“智能”、“云”、“物聯網+”之類高大上的詞語做噱頭,當你將這些設備買回家后,你發現它沒有想象中的那么好用,難免就會失望。目前的智能家居系統,與其強調“智能”(Smart),我認為不如 Home Assistant 中的描述的“自動化”(Automation)來的貼切,事實上,在 HomeKit 以及 米家 App 中的都是以“自動化”來命名它們的。

正是“自動化”的加入,使得 Home Assistant 不再呆板,在特定情況下,你甚至可以不再使用那些操作界面,讓一切自動運轉,真正的“智能”起來。以我自己舉例,家中除了我,沒人搗鼓這些東西,都是靠“自動化”設置,實現燈光、新風、監控、警戒、夜間空調等的日常使用。

一、自動化基礎

HomeKit 新建自動化

為了讓大家對相關概念有一個更直觀的認識,我先以 HomeKit 為例做一個展示。

HomeKit 新建自動化
HomeKit 新建自動化

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

HomeKit 自動化

在這個自動化中,我們的觸發條件是一個時間,即“落日”并且限制在“星期日”,當到達這一時間點時,系統自動執行“打開餐廳落地燈”這一動作。這樣一個最簡單的自動化,由三個不同的部分組成:觸發(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
獲取設備 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 的指定參數即可。

Services 工具

二、自動化編輯器

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

自動化編輯器

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

自動化“Rainy Day”

自動化編輯器能夠使得相關配置工作簡化,它提供了觸發、條件和動作的類別選擇,但是你還需要在開發者工具(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
Floorplan
HomeKit
Floorplan

▲Floorplan via Carlo

Floorplan

▲Floorplan via Carlo

PS:這種嵌入插座哪里能買得到……

當然,你也可以采用這樣的形式:

3D Floorplan
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容