#教學 智慧家庭的精隨 - 自動化 ft. Home Assistant

在你買了任何的智慧家電後,你終於能用手機控制你的家電了,進階點用語音控制,你享受到了智慧生活的方便
但是這樣就是真正的智慧生活嗎?
當然不是,真正要達到智慧生活是要讓你去忘記 "控制" 這回事,當你不必再自己去用手機、語音將燈開啟時,它會知道要自己亮,什麼條件下要亮,這時才是達到智慧生活
這就是今天的主題 "自動化"
要設定自動化情境,智慧家電可以用自己的 app 做,或是直接整合在現成的智慧家庭生態圈來做,如小米米家、蘋果 HomeKit、Amazon Alexa、Google Assistant
但是不管是哪種方式,都只能做到簡單的自動化,如幾點開關電器、單一條件執行動作等等
如果是進階、複雜的自動化,舉我實際在用的幾個例子...
1. [腳本] 當我下 "我回到家了" 命令時,先自動開燈,如果房間內的溫度高於 27 度則開啟冷氣跟電扇。
2. [腳本] 當我下 "我要睡了" 命令時,將電腦桌的電扇關閉、將電腦螢幕關閉、將音響群組停止播放,如果有開冷氣則將溫度調至 27 度,沒開冷氣則不做任何事,如果電扇是關的則將他打開,如果原本就是開的則不做任何事,最後將燈關閉。
3. [自動化] 每天早上 7:50 關房間冷氣,如果室溫小於等於 26 度,則加關電扇,8:10 時如果電扇是開著的則關閉,如果已經在 7:50 被關掉的話則跳過,然後等房間的人體感應器沒有偵測到人時將電燈關閉。
4. [自動化] 當我進公司且時間介於 08:30 與 09:30 之間,則打開辦公桌的插座,當我離開公司且時間在 18:00 之後,則關閉辦公室插座。
5. [自動化] 當辦公室插座被打開,且我人不在公司時,先將插座關閉後傳送 LINE 通知給我
以上我現在正在使用的幾個自動化與腳本都不是單一情境的,但是都能在同一條自動化或腳本中設定完成
如果是市面上現成的智慧家電 app 或生態圈,不是無法這樣玩就是得拆成好幾個自動化才達成,而且可能成效沒有很好,這也是為什麼我非常推 Home Assistant,今天就來談 HA 的腳本 (Script) 與自動化 (Automation)
HA 的自動化包含三個部分,觸發 (trigger)、觸發判斷 (condition)、觸發後動作 (action)
[觸發] 跟 [觸發後動作] 是必填的,[觸發判斷] 是非必填
說到判斷條件一定得提及 and 跟 or,[觸發] 跟 [觸發判斷] 這兩者永遠為 and 關係,表示若有填 [觸發判斷] 的話,當某事件 [觸發] 後必須滿足 [觸發判斷] 後才能執行 [觸發後動作]
我之前一直沒有寫自動化的教學是因為 HA 的自動化有太多可以寫了,光是觸發類型從時間、事件、地理位置到日升日落都有,我不可能每種都寫,而且很多都是我沒在用的,本文我會以我有在用的來做教學,相信對於一般使用者也夠用了
啊一直提自動化,那腳本呢? HA 的腳本其實就是自動化的 "觸發後動作",所以只要自動化學會了,腳本直接複製貼上而已
開始進入教學吧
要建立自動化有兩種方式,HA 的老玩家熟知的 yaml 模式,另一種是自動化 UI 模式,我會先從自動化 UI 開始介紹,這對於新手來說是比較友善的,但我不會介紹太多 UI 的東西,自動化 UI 只是方便管理、簡易編輯自動化的介面,yaml 模式會是比較多人使用的,而且你會發現官方給出的自動化教學都是 yaml,網友分享的自動化也都是 yaml
打開 HA 的設定頁面就可以看到設定自動化的選項

點進去後就是自動化編輯器,在這裡你可以啟用/停用/編輯/建立自動化

按下右下角的+就可以建立新的自動化

在這裡你可以藉由選取的方式來選取你要的 [觸發]、[觸發判斷] 跟 [觸發後動作]



當你完成了一個自動化並儲存後,在 HA 的根目錄的 automations.yaml 中就會有你剛剛新增的自動化 yaml 語法
這是自動化 UI

這是 automations.yaml 中相對應的 yaml 語法

以上是自動化 UI 的簡單用法,但自動化 UI 並不是我本文的重點,自動化 UI 可以當作新手入門 yaml 模式的教學,如果在 yaml 模式不知道怎麼寫,也可以回來 UI 這邊用 UI 建立一個範例再把他修改成你要的自動化
但你其實會發現使用自動化 UI 在選擇時你也會不知道選擇了某項目該怎麼填他的數值,或者他該怎麼使用
沒關係,官方都有詳細的範例教學
[觸發]
[觸發判斷]
[觸發後動作]
看了官方的範例後你又會發現... 怎麼官方沒有 UI 的教學? 沒錯,這也是為什麼大家都用 yaml 模式居多XD
開始進入 yaml 模式的教學吧
在寫 yaml 自動化前,建議先有 HA 拆檔的預備知識,你可以不拆檔,但是你最後會發現你的自動化全部都擠在一個檔案內,相當雜亂
而在這篇教學文中,為了方便大家實作,我也會直接附上我的 yaml 檔,不是只有截圖
在剛剛由 UI 生成的 yaml 語法中就可以看出自動化的架構
做一下縮排跟註解會更容易理解

理解 yaml 自動化的架構後你就可以寫自動化了
接下來我會直接拿我的自動化當例子來解釋,每個 Lab 對應的 yaml 檔我都放在以下雲端資料夾內
.Lab1:
[觸發] 每天 00:00
[觸發判斷] 無
[觸發後動作] 執行 A、B 後等待 15 秒再執行 C

.Lab2:
[觸發] 物件狀態轉為 off
[觸發判斷] 時間介於 08:30 和 18:30
[觸發後動作] 單一動作

.Lab3:
[觸發] 物件狀態轉為 off
[觸發判斷] 周一至周五
[觸發後動作] 單一動作

.Lab4:
[觸發] 物件狀態轉為 off
[觸發判斷] 周一至周五時間介於 08:30 和 18:30
[觸發後動作] 單一動作

.Lab5:
[觸發] 當某人進入某區域
[觸發判斷] 周一至周五時間介於 18:25 和 00:00
[觸發後動作] 單一動作

.Lab6:
[觸發] 當某人離開某區域
[觸發判斷] 無
[觸發後動作] 單一動作

.Lab7:
[觸發] 每天 18:30
[觸發判斷] 周一至周五且某人在某區域中
[觸發後動作] 單一動作

以上都是些簡單的時間、週天數、狀態的自動化,接下來要開始進階了
HA 自動化強大的地方在於可以使用模板 template,加入模板可以使你的自動化更彈性
在進入 template 與 if ... elif ... else 的複雜世界前,你需要先建立一個幌子腳本,稍後我會說明為什麼需要幌子腳本,這個腳本一樣有放在雲端資料夾內
這個幌子腳本的內容很簡單,就只是執行一個延遲0秒鐘的動作

.Lab8:
[觸發] 每天 08:00
[觸發判斷] 周一至周五
[觸發後動作] 如果溫度感應器的溫度小於等於26度,則關閉電扇插座,否則就執行幌子腳本

由於 if ... else 的架構中,else 是必填的,小於等於的情況我們已經給他明確要關閉的動作,那大於的情況也必須給他一個東西去執行,也就是幌子腳本
除了 if、else 之外還有 elif,也就是說你可以有 N 個判斷式
{%- if ..... -%}
...
{%- elif ..... -%}
...
{%- elif ..... -%}
...
{%- else ..... -%}
...
{%- endif ..... -%}
.Lab9:
[觸發] 每天 08:10
[觸發判斷] 周一至周五
[觸發後動作] 若電扇插座是開的則將他關閉,否則執行幌子腳本。再等到人體感應器狀態變為 off 後關閉電燈

.Lab10:
[觸發] 掃地機狀態轉為清掃或是充電中時
[觸發判斷] 無
[觸發後動作] 執行 LINE 通知,若是掃地機狀態為清掃中則訊息內容為 "掃地機在 X點X分X秒 開始清掃",若是掃地機狀態為充電中則訊息內容為 "掃地機在 X點X分X秒 回到充電座"

藉由這個範例得知,template 可以彈性的發送通知內容
.Lab11:
[觸發] 當插座狀態轉為 on
[觸發判斷] 當我人不在公司時
[觸發後動作] 先將插座關閉後發送通知

許多智慧家電 app 中都可以很快地去修改自動化的執行時間跟週日子,你會發現 HA 不行,而且你若是使用拆設定檔的方式,你更不能直接從自動化 UI 中去修改時間跟週日子,你要修改時間就必須進入 yaml 檔中修改,這樣不是很麻煩嗎?
的確,所以我們要藉由別種方式來實做可以從介面上直接修改自動化時間跟週日子的自動化,實際畫面如下

時間跟週日子的設定方法不同,Lab12 為彈性時間的自動化,Lab13 為彈性時間+週日子的自動化,所有需要的設定 yaml 都有在雲端硬碟上
.Lab12:
在 configuration.yaml 中加入 sensor 元件,並加入 time_date 的感應器,這個感應器就是現實的時間、日期

在 configuration.yaml 中加入 input_datetime 元件,並加入你要彈性時間自動化的時間項目,比如說你要彈性的開關燈,你就必須設定 "開" 的 input_datetime 跟 "關" 的 input_datetime
因為我們只需要 "時間",所以 has_date 為 false

以上兩個都設置好後就可以來寫自動化
[觸發] 當 sensor.time 的時間等於 "開" 的 input_datetime 所設定的時間
[觸發判斷] 無
[觸發後動作] 執行單一動作
[觸發] 當 sensor.time 的時間等於 "關" 的 input_datetime 所設定的時間
[觸發判斷] 無
[觸發後動作] 執行單一動作

而怎麼設定時間? 在介面上呼叫出開跟關兩個 input_datetime 就可以直接設定時間了,若沒有設定預設就是 00:00
.Lab13:
由於 Lab13 需要解釋的東西比較多,所以我放到最後
在 Lab13 你一樣需要 Lab12 的 sensor.time

還有 input_datetime,這個 Lab 中我們要讓每個週日子的時間都能彈性設置,所以需要 7 個 input_datetime,也就是周一至周日

在 configuration.yaml 中加入 input_select 元件,並加入週一至週日的數值
週一為 0,週二 1,到週日 6,除了一到日本身的 0~6 之外每個週日子都必須加入 7 這個數值,為什麼? 等等會解釋~

在 configuration.yaml 中加入 input_boolean 元件,並加入週一至週日的布林值,這座什麼用? 等等會解釋

在 configuration.yaml 中加入 switch 元件,並加入週一至週日的開關,由於這個開關並不是一個實際的開關如插座,HA 能夠直接去撈插座的狀態進而得知插座是開是關,所以這時候我們的日期開關就得仰賴剛剛設定的 input_boolean 來讓 HA 參考每個週日子的開關狀態
這邊只截星期一的週日子開關,雲端資料夾中有完整的檔案

我解釋一下這個週日子開關,剛剛有提到週一至週日都有自己的數值,為 0~6,當週日子開關打開時就將那個週日子的 input_boolean 打開再將 input_select 設為那個週日子的數值,當週日子開關關閉時就將那個週日子的 input_boolean 關閉再將 input_select 設為 7,為什麼要設為 7,因為世界上沒有星期八這種東西對吧
比如說我將星期三的開關打開時,星期三的 input_boolean 被打開,input_select 設為 2,將星期三的開關關閉時,星期三的 input_boolean 被關閉,input_select 設為 7
以上都設定完就可以來寫自動化了
[觸發]
當 sensor.time 的時間等於 "週一" 的 input_datetime 所設定的時間
或
當 sensor.time 的時間等於 "週二" 的 input_datetime 所設定的時間
或
當 sensor.time 的時間等於 "週三" 的 input_datetime 所設定的時間
或
當 sensor.time 的時間等於 "週四" 的 input_datetime 所設定的時間
或
當 sensor.time 的時間等於 "週五" 的 input_datetime 所設定的時間
或
當 sensor.time 的時間等於 "週六" 的 input_datetime 所設定的時間
或
當 sensor.time 的時間等於 "週日" 的 input_datetime 所設定的時間
[觸發判斷]
當時間週日子函數等於 "週一" 的 input_select 所設定的數值
或
當時間週日子函數等於 "週二" 的 input_select 所設定的數值
或
當時間週日子函數等於 "週三" 的 input_select 所設定的數值
或
當時間週日子函數等於 "週四" 的 input_select 所設定的數值
或
當時間週日子函數等於 "週五" 的 input_select 所設定的數值
或
當時間週日子函數等於 "週六" 的 input_select 所設定的數值
或
當時間週日子函數等於 "週日" 的 input_select 所設定的數值
[觸發後動作] 執行單一動作

而怎麼設定時間在 Lab12 中提過了,那週日子開關呢? 在介面上呼叫出週一至週日的 switch 就可以直接設定週日子開關了
上述 Lab 中的東西都可以自由搭配運用,活用 template 會讓你的自動化更加強大,而且只需要一個自動化就能做到好幾條自動化加起來可能還做不到的事
而 HA 的自動化不只我提到的這些還有很多很多,光是 template 就可以寫非常的長,但我沒辦法一一介紹,有興趣的可以參考官方文件
這次分享就到這裡~ 有問題可以詢問~


