這一章我們除了使用到上一章的 HomeBridge,還會使用 HomeAssistant。
那麼,問題來了:
0. HomeKit、HomeBridge、HomeAssistant 分別是什麼?關係是什麼?
HomeKit:蘋果於 2015 年 5 月發布的智能家居平臺。
HomeBridge:一個開源程序,用於讓 HomeKit 支持一些原生不支持 HomeKit 的設備(如米家家居)。
HomeAssistant:一個第三方的智能家居平臺。
0.2. 關係可以看到,上一章米家設備通過插件 HomeBridge-Mi-Aqara 來與 HomeBridge 溝通,讓我們的 iPhone 通過 Siri(HomeKit)來接入 HomeBridge 達到最終控制米家設備的目的。
可以看到,這一章將要介紹的情況,米家、IFTTT 這些智能家居並沒有直接接入到 HomeBridge,而是先接入到第三方智能家居平 HomeAssistant,然後 HomeAssistant 與 HomeBridge 通過插件 HomeBridge-HomeAssistant 進行交互溝通,最後把結果反饋到你的手機上。
因為接入了 HomeAssistant,能夠給你的家居智能化上升到一個新的高度,HomeAssistant 支持一系列的組件。
HomeBridge 因為自身的一些條件限制,以及條件束縛,只能夠一次控制一類家居,比如 HomeBridge-Mi-Aqara 就只能控制米家類家居。
而 HomeAssistant 能夠做到,「如果天氣預報說要下雨了,網關燈變紅,多雲變黃,晴天就變綠啊」,或者是「爸爸回家了手機自動聯入 Wi-Fi,會發推送告訴我不要看小視頻了」等等,可以說,讓更多的事情加入到智能化這一行列。
讓事情變得更好玩,更有趣,更智能,是我引入 HomeAssistant 的目的所在。
0.4. 我想告訴你的
如果你是希望「用 iPhone 或者 Siri 控制一些米家家居,或者回到家打開門檯燈自動亮起來歡迎你」,那麼其實 上一章內容 已經完全滿足你的需求,已經 OK 了。
這一章雖然帶來了很多新的有趣的「騷操作」,但是因為引入了 HomeAssistant,所以也會相應的增加了操作量,所以你要自我衡量考慮一下要不要繼續折騰噢~
涉及到的新操作 IFTTT、動態域名解析、Liunx 部分新命令。
1. 開始前的準備準備:
你需要有一個樹莓派,它是一個已知 IP 地址,開啟了 SSH,乾淨正常耐操的樹莓派。
希望你最好有 linux 的基礎。
通關路線:
如果對於上面兩條你已經做到了,那麼直接從往下看。
如果你是完全按照上一章內容操作,並且完成了所有功能實現,那麼請看這裡,為你跳過重複部分。
如果你對於這個準備毫無頭緒,不妨先回顧一下 上一章內容,在上一章的第 0~1 章有相應的手把手教學。
如果你已經配置好了 HomeAssistant & HomeBridge,可以直接拉到下面查看關於「聯動 IFTTT 的騷操作教程」。
2. 整個應用框架的安裝2.1. 安裝 NodeJS在終端中輸入
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - sudo apt-get install -y nodejs
安裝完要使用nodejs -v看看版本是不是 v6.xx,如果不是的話,再次執行這兩條命令。
在終端中輸入
sudo apt-get install libavahi-compat-libdnssd-dev
2.3. 安裝 HomeBridge在終端中輸入
sudo npm install -g --unsafe-perm homebridge
2.4. 安裝 HomeBridge-HomeAssistant
在終端中輸入
sudo npm install -g homebridge-homeassistant
2.5. 安裝 HomeAssistant
在終端中輸入
sudo pip3 install homeassistant
2.6. 配置 HomeAssistant
在終端中輸入
mkdir ~/.homeassistantvi ~/.homeassistant/configuration.yaml
在打開的編輯器中,單擊鍵盤的i鍵,進入輸入狀態。
複製以下初始化內容到文件中。
homeassistant: name: Home latitude: 42.7683 longitude: 129.3364 elevation: 0 unit_system: metric time_zone: Asia/Shanghaiintroduction:frontend:config:http: api_password: HaHb7890 updater: discovery:conversation:history:logbook:sun:sensor: - platform: yrtts: - platform: googlegroup: !include groups.yamlautomation: !include automations.yaml
然後點擊鍵盤 esc,輸入 :wq 進行保存並推出編輯器。
2.6.2. 安裝 HomeAssistant 初始化所需要的插件HomeAssistant 安裝完後,其實只是安裝了一個主體程序,實際上還需要安裝很多小控制項的安裝,往往需要 Root 權限,所以在終端中輸入
sudo hass --open-ui
等待程序自動運行,他會安裝一些 HomeAssistant 所需要的一些組件。
我們可以在瀏覽器中輸入http://樹莓派IP位址:8123 進行訪問,去了解 HomeAssistant 是否初始化成功。
當你的瀏覽器看到這個頁面,表示已經成功初始化插件安裝了。這個時候你需要多按幾次 Ctrl+C(Mac 電腦是 Control+C)來退出這個程序,一直按到你出到能輸出命令的終端頁面。如下圖所示:
ha-hb-8注意,以 Root 權限運行的 HomeAssistant 在實際操作中發現,並不能按照我們的配置文件進行配置,所以我們還需要以當前用戶 pi 權限來運行 HomeAssistant。
然後在終端中輸入
hass --open-ui
等待片刻,我們用瀏覽器訪問 http://樹莓派IP位址:8123,如果你在前面配置文件中有設置密碼 HaHb7890,就會顯示一個登陸頁面,說明你能夠正式使用 HomeAssistant 系統了。
2.6.3. 記錄米家智能家居硬體的相關信息
打開 米家 App(小米智能家居官方硬體),選擇智能網關設備,點選右上角的 ··· 功能符號,進入後點選 關於。
然後你看到的是下圖左邊的樣子,這時候你需要瘋狂輸出,要不斷的點擊空白處,片刻後界面就會變成右邊的樣子,多了區域網通信協議還有網關信息選項。
這時候,分別點選他們,記錄你的網關的區域網通信協議密碼以及網關的 MAC 地址,請記好噢。
2.6.4. 把 HomeAssistant 配置米家智能家居
需要注意的是,HomeAssistant 在 50.0 版本後,已經從官方上集成對小米智能家居,所以我們直接在 HomeAssistant 配置文件上配置即可。
在終端中輸入
vi ~/.homeassistant/configuration.yaml
進入編輯器後,按住 shift 然後單擊鍵盤 g 鍵,會自動跳轉到最後一行(Vim 的 G 鍵代表跳到最後一行)。然後單擊鍵盤 o 鍵,開始進入編輯模式。
輸入以下欄位:
xiaomi: gateways: - mac: B827EBDA70F9(你的小米網關MAC地址,地址中間如果加`-`會報錯) key: 通訊密碼(請全部大寫,不然只能看智能家居狀態不能控制)
然後,單擊鍵盤esc鍵,再輸入:wq進行保存退出。
Ok,配置好,就要軟重啟一下 HomeAssistant,進入 HomeAssistant 頁面,選擇左下角的Developer Tools(開發者工具)下的第一個圖標,然後在右邊的標籤頁中填寫相應的信息:
Domain: homeassistant
Service: restart
然後點擊CALL SERVICE來喚起 HomeAssistant 的重啟。
原理介紹:HomeAssistant 把很多功能都以組件來看待,然後我們就是調用了核心組件homeassistant裡面其中一個方法restart來對 HomeAssistant 進行重啟。這個時候,HomeAssistant 的頁面會告訴你已經與伺服器斷開連接了,事實上你只要靜靜地等待就好了,等到重新正常連接就 OK 了。但是耐不住寂寞的你肯定想看看進度如何對吧,這個時候,你知道打開剛剛輸入了hass --open-ui代碼的終端窗口,就可以看到實時情況,如下面的截圖就是說,我在安裝的過程中,而且安裝過程已經超過 10s 了。
稍安勿躁,去泡杯茶回來,網頁版的 HomeAssistant 已經能夠正常連接了,你點擊左邊欄的States按鈕,回到總覽頁面,你就可以看到,小!米!智!能!家!居!出!現!了!
OK,那說明你的小米智能家居已經成功的接入了 HomeAssistant 平臺了,恭喜你往高端玩家又進了一步請繼續閱讀下文哈。
在終端中輸入
mkdir ~/.homebridgecd ~/.homebridgevi config.json
在打開的文件界面中,單擊鍵盤的i鍵,進入輸入狀態。
複製以下內容到文件中。
{ "bridge": { "name":"Homebridge", "username":"B8:27:EB:DA:70:F9", "port":51826, "pin":"233-78-123" },"platforms": [ { "platform": "HomeAssistant", "name": "HomeAssistant", "host": "http://127.0.0.1:8123", "password": "HaHb7890", "supported_types": ["binary_sensor", "climate", "cover", "device_tracker", "fan", "group", "input_boolean", "light", "lock", "media_player", "remote", "scene", "sensor", "switch"] }]}
bridge-name : 你在 iPhone 的 HomeKit 上面看到橋接設備網關的名稱
bridge-username : 樹莓派 MAC 地址
bridge-port : HomeBridge 使用的埠,默認就好
bridge-pin : 在 iPhone 上認證 HomeBridge 網關的密碼,這個按照你自己喜好來輸入吧
platforms-host : 你訪問 HomeAssistant 的地址+埠
platforms-password : 你在 HomeAssistant 設置的登陸密碼
2.8. 配置 HomeBridge在終端中輸入
homebridge -D
運行成功後,會如下圖所示:
2.9. iOS 的 HomeKit 配置
進入家庭App,添加配件,你就可以看到 HomeBridge 了
把裡面的配件添加進來,你的 HomeKit 就已經具備了他應該有的功能了。
2.10. 設置長久運行的 Homebridge
事實上,你現在如果關閉了 SSH 連結,那麼你的 HomeKit 也會處於失效狀態,因為你的 Homebridge 隨著 SSH 的連接關閉導致被關閉了,如果解決?
使用SCREEN工具,在終端下輸入:
sudo apt-get install screen
然後輸入
SCREEN -dmS hb homebridge SCREEN -dmS ha hass --open-ui
在 screen 裡開啟的 Homebridge 不會隨著 SSH 關閉而被關閉。那麼如何暫時退出這個窗口呢?
先按Ctrl+A然後按完再按一下d就可以跳出來做其他事情了,如何回去?使用screen -x hb即可。
2.11. 設置開機自啟動 HomeBridge & HomeAssistant事實上,樹莓派關機後,兩個程序會被關閉,可以使用SCREEN工具,並且在rc.local裡面添加開機自啟動任務。
在終端中輸入
sudo vi /etc/rc.local
然後進入了編輯器,單擊鍵盤的i鍵進入編輯模式。在exit 0這一行前面添加:
su -c "screen -dmS hb homebridge" -s /bin/sh pisu -c "screen -dmS ha hass --open-ui" -s /bin/sh pi
然後單擊鍵盤esc退出編輯模式,然後輸入:wq保存文件並推出編輯器。
2.12. 設置遠程化運行的 HomeKit蘋果規定,HomeKit 一般情況下,只能在同一個 Wi-Fi 下操作,如果你要遠程化和自動化操作。請充(yao)值(mai)信(mai)仰(mai)!
遠程控制起步是iPad mini 2 或者 Apple TV 3
自動化起步是iPad mini2 或者 Apple TV 4
3. 聯動 IFTTT 的騷操作開始終於來到激動人心的時刻了,要開始真正的騷操作了。
3.1. 給 HomeAssistant 配置 IFTTT 組件類似小米智能家居的通信密鑰,IFTTT 有一個 key,從[Webhook 這個位置]獲取得到。
拿到之後,在終端中輸入以下命令:
vi ~/.homeassistant/configuration.yaml
進入編輯器後,按住shift然後單擊鍵盤g鍵,會自動跳轉到最後一行(vim 的 G 鍵代表跳到最後一行)。然後單擊鍵盤o鍵,開始進入編輯模式,輸入以下欄位:
ifttt: key: xxxxx_xxxxxxxxxxxxx
然後,單擊鍵盤esc鍵,再輸入:wq進行保存退出。
然後按照上面的教程,重新 restart 一下 HomeAssistant。
3.2. IFTTT 作為觸發條件做一個簡單演示,如果我們用 HomeAssistant 調用了 IFTTT,就給手機版的 IFTTT 發一條推送。
作為 IF 條件,Event Name 就是我們給這個事件聲明的名字,我們以HA_TEST來做這個事件的聲明名字。
然後觸發條件,選擇Notification,推送的內容,可以設置一些預設的變量函數,包含我們給這個事件聲明的名字Event Name,也可以包含我們傳過去的 Value 值。
創建完 IFTTT 的 Applets,我們回到 HomeAssistant 測試一下。在 HomeAssistant 的Developer Tools的第一個圖標,然後配置如圖。Data 一般是以JSON格式來傳輸的。
點擊調用後,幾秒鐘你的手機的 IFTTT 就會給你發來一條推送了。實際上,用 HomeAssistant 還能用內置的automation來調用 IFTTT,相當於內置的 IFTTT,但是支持的控制項沒 IFTTT 那麼豐富。
3.3. IFTTT 作為觸髮結果OK,前面是一個小的應用,最主要的還是要介紹 IFTTT 作為觸髮結果。
3.3.1. HomeAssistant APIHomeAssistant 支持豐富的 API,通俗來說,就是你訪問一個網絡地址就能控制你家的檯燈開與關。
OK,地址是http://樹莓派地址:8123/api/services?api_password=登陸密碼,你可以看到所有 HomeAssistant 能支持的 API,抽取其中一個給大家介紹一下。
其中一個是關於對燈光的 API 介紹。
{ domain: "light", services: { turn_on: { description: "Turn a light on", fields: { brightness: { description: "Number between 0..255 indicating brightness", example: 120 }, color_name: { description: "A human readable color name", example: "red" }, entity_id: { description: "Name(s) of entities to turn on", example: "light.kitchen" }, rgb_color: { description: "Color for the light in RGB-format", example: "[255, 100, 100]" } } } }}
所以你發起一個 POST 請求,我是使用了 Mac 版的 Paw 軟體來發起請求,當然你可以使用 Chrome 上面的 PostMan 擴展來做測試。
我請求的地址是/api/services/light/turn_on然後附上 URL 的 PARAMS 是entity_id代表要開的燈的 id,然後附上 API 調用密碼api_password.
然後在主體 BODY PARAMS 裡面寫入燈光的顏色color_name,以及亮度brightness。
POST 192.168.1.100:8123/api/services/light/turn_on?entity_id=Gateway_Light_34ce0088d139&api_password=HaHb7890Body Params {"color_name":"red","brightness":"50"}
ha-hb-19調用後,你家裡的網關燈就會變紅了,而且亮度設定在 50。
3.3.2. 如果明天下雨,我的網關燈要變紅流程圖
+ - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - -+' IFTTT: ' ' HomeAssistant: '' ' ' '' ++ ++ ' ' +----+ +-+ '' | 外面下雨 | --> | 調用事件 | ' --> ' | HomeAssistant API | --> | 燈亮 | '' ++ ++ ' ' +----+ +-+ '' ' ' '+ - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - -+
其實關於 HomeAssistant 部分,我們在3.4.1已經介紹了。現在需要介紹IFTTT設定以及IFTTT 如何調用HomeAssistant.
3.3.2.1. 域名動態解析我們現在調用的 API 地址是一個區域網的地址,形如192.168.x.x,這個在廣域網(網際網路)是無法調用的,簡單來說就是,你在公司的網絡是調用不了你在家裡的這臺樹莓派的 API 的,更何況 IFTTT。
所以,為了解決這個問題,你可以:
3.3.2.2. IFTTT 設置在IF條件,你可以選擇 IFTTT 中的Weather Underground中的Current condition changes to觸發器,選擇Rain。代表,如果天氣預報發現你那裡快要下雨了,就觸發這個事件。
在THEN條件,選擇IFTTT的webhook:
請求地址URL跟我們的3.4.1中的地址一樣,只是樹莓派的地址和埠換成動態解析後的域名與埠。
請求方法METHOD選擇POST,
傳輸內容類型Content Type選擇application/json,
傳輸內容Body寫關於燈光的詳細配置,顏色變紅亮度50{"color_name":"red","brightness":"50"}
點擊Creata action進行保存
最後,Review一下,給這個自動化設定一個名字,下面的按鈕的意思是每次出發了這個自動化,要不要給你手機的 IFTTT 發一個推送證明它發送了。
OK,那麼整個流程到這裡就算是完成搞掂了~
其實這個流程有 1 點不太安全的是,IFTTT 的 POST 請求明文調用了樹莓派的 API 密碼,我研究了一下好像 IFTTT 的 Applet 只會針對個人,不對外分享,所以還算是安全。然後動態解析儘量針對埠吧,對外開放太多埠容易受到攻擊,同時 API 密碼請申請的高強度一下,SSH 使用密鑰登陸。
4. 其他4.1. 已經完全實施了上一章的讀者因為上一章的完全實施,所以你已經安裝了 HomeBridge-Mi-aqara,Homebridge 對於插件好像有些蜜汁互斥,所以你需要先卸載他,再按照上面的教程繼續走。
在終端中輸入
sudo npm uninstall -g homebridge-mi-aqara
本文轉載自Or2=3的Blog