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

樹莓派 + Home Assistant + HomeKit

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

提示:慎入!這是一篇非常無趣的基礎(chǔ)技術(shù)文缕题。

智能家居為人詬病的一點往往是它不夠“智能”截歉,而國內(nèi)的廠家又愛拿“智能”、“云”烟零、“物聯(lián)網(wǎng)+”之類高大上的詞語做噱頭瘪松,當(dāng)你將這些設(shè)備買回家后,你發(fā)現(xiàn)它沒有想象中的那么好用锨阿,難免就會失望宵睦。目前的智能家居系統(tǒng),與其強(qiáng)調(diào)“智能”(Smart)墅诡,我認(rèn)為不如 Home Assistant 中的描述的“自動化”(Automation)來的貼切状飞,事實上,在 HomeKit 以及 米家 App 中的都是以“自動化”來命名它們的书斜。

正是“自動化”的加入,使得 Home Assistant 不再呆板酵使,在特定情況下荐吉,你甚至可以不再使用那些操作界面,讓一切自動運轉(zhuǎn)口渔,真正的“智能”起來样屠。以我自己舉例,家中除了我,沒人搗鼓這些東西痪欲,都是靠“自動化”設(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á)這一時間點時立肘,系統(tǒng)自動執(zhí)行“打開餐廳落地?zé)簟边@一動作边坤。這樣一個最簡單的自動化,由三個不同的部分組成:觸發(fā)(Trigger)赛不、條件(Condition)惩嘉、動作(Action)

這里我們也可以看到一般為了簡化操作與保證設(shè)置的可行性踢故,如 HomeKit文黎、米家、阿里智能殿较,都僅提供了較少的觸發(fā)條件與可執(zhí)行項耸峭,這大大限制了我們發(fā)揮的余地。

自動化組成

觸發(fā):即觸發(fā)自動化規(guī)則淋纲,比如到達(dá)特定的時間點劳闹、到達(dá)某一地點、天氣變化洽瞬、系統(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 將所有自動化信息獨立出來执桌。

系統(tǒng)內(nèi)部參數(shù)

在上篇 Home Assistant 的進(jìn)階設(shè)置中我們講到過,Home Assistant 的每一個一個設(shè)備或服務(wù)芜赌,都是通過自身唯一的實例 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 實例的唯一標(biāo)識符亡问。 light.couch_lamp
State 設(shè)備的當(dāng)前狀態(tài) on、off
Attributes 設(shè)備的的 brightness

這些實例狀態(tài)變化肛宋,被用作觸發(fā)源州藕,而其實時狀態(tài)用作判斷能否執(zhí)行條件

在 Home Assistant 中酝陈,所有設(shè)備或服務(wù)床玻,包括燈、開關(guān)沉帮、人锈死,甚至太陽等等,都被視為一個實例(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)中找到你需要的實例 ID(Entity ID)癌椿、狀態(tài)(State)和服務(wù)(Service)的詳細(xì)信息并手動填入編輯器健蕊。

注意:自動化編輯器 Data 參數(shù)采用 JSON 格式,與配置文件 YAML 語法有所不同踢俄,請按開發(fā)者工具(Developer Tools)中的示例編寫缩功。

因為自動化編輯器需要調(diào)用 automations.yaml 文件,需要采用 automation: !include automations.yaml 將自動化信息獨立出來都办。

三嫡锌、自動化詳解

觸發(fā)(Trigger)

觸發(fā)是啟動自動化的規(guī)則,可以為同一規(guī)則設(shè)置多個觸發(fā)器琳钉。一旦觸發(fā)势木,Home Assistant 將驗證相關(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' # 可選項

數(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'
    # 可選項 狀態(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'  # 可選項噪窘,此例為日落前 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
  # 需要以下至少一項
  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ù)中需要指定實例 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ù)文當(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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市沈堡,隨后出現(xiàn)的幾起案子静陈,更是在濱河造成了極大的恐慌,老刑警劉巖诞丽,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲸拥,死亡現(xiàn)場離奇詭異拐格,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)刑赶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進(jìn)店門禁荒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人角撞,你說我怎么就攤上這事〔眨” “怎么了谒所?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沛申。 經(jīng)常有香客問我劣领,道長,這世上最難降的妖魔是什么铁材? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任尖淘,我火速辦了婚禮,結(jié)果婚禮上著觉,老公的妹妹穿的比我還像新娘村生。我一直安慰自己,他們只是感情好饼丘,可當(dāng)我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布趁桃。 她就那樣靜靜地躺著,像睡著了一般肄鸽。 火紅的嫁衣襯著肌膚如雪卫病。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天典徘,我揣著相機(jī)與錄音蟀苛,去河邊找鬼。 笑死逮诲,一個胖子當(dāng)著我的面吹牛帜平,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汛骂,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼罕模,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帘瞭?” 一聲冷哼從身側(cè)響起淑掌,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蝶念,沒想到半個月后抛腕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芋绸,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年担敌,在試婚紗的時候發(fā)現(xiàn)自己被綠了摔敛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡全封,死狀恐怖马昙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刹悴,我是刑警寧澤行楞,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站土匀,受9級特大地震影響子房,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜就轧,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一证杭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妒御,春花似錦解愤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梦鉴,卻和暖如春李茫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肥橙。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工魄宏, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人存筏。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓宠互,卻偏偏與公主長得像,于是被迫代替她去往敵國和親椭坚。 傳聞我的和親對象是個殘疾皇子予跌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,442評論 2 359

推薦閱讀更多精彩內(nèi)容