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

樹莓派 + Home Assistant + HomeKit

通過本篇教程,你將了解 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 為例做一個展示。

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

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

HomeKit 自動化

在這個自動化中,我們的觸發(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è)備 ID
獲取設(shè)備 ID

在上圖所示界面,我們可以獲得一個設(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ù)即可。

Services 工具

二、自動化編輯器

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

自動化編輯器

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

自動化“Rainy Day”

自動化編輯器能夠使得相關(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
Floorplan
HomeKit
Floorplan

▲Floorplan via Carlo

Floorplan

▲Floorplan via Carlo

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

當(dāng)然,你也可以采用這樣的形式:

3D Floorplan
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容