自製 HomeKit 智能家居#
Created: June 22, 2021 3:59 PM
Tags: HomeKit, 智能家居,樹莓派
此文曾發佈在知乎(https://zhuanlan.zhihu.com/p/31423265)和少數派上,此處是做一個歸檔,實際寫作時間是在 2017 年
序#
這篇文章是我半年前瞎折騰樹莓派的時候寫的,本來不適合放在這個專欄裡的,畢竟和我司其他大佬的文章比起來,這篇東西實在沒有什麼技術含量。不過它也不是那麼一無是處,至少任何人都可以輕易地讀懂並且實現這篇文章裡的東西,並且從中體驗到 coding 的樂趣。
HomeKit 是什麼?#
Homekit 是 Apple 自 iOS10 開始提供的智能家居組件,允許第三方將認證過的智能硬體接入 iOS 系統中,並且通過 Siri 控制。並且在局域網內使用端到端加密,在安全性上非常不錯。而缺點也顯而易見,認證硬體貴且少。不過這都不是問題,因為我們有 homebridge。
**HomeBridge是什麼?**#
根據蘋果 HomeKit 組前員工寫的破解論文,使用 NodeJS 寫的模擬 HomeKit API 的 server 框架,在 Github 上已有 7000 多個 Star。可以通過寫對應要求的插件將未被認證的智能設備接入 HomeKit。
目標#
- 低成本構建高體驗的智能家居,可以語音控制。
- 打造一個相對完整的智能家居體驗。
- 將不支持智能家居的舊設備也改造成智能設備。
- 可移植性強,方便搬家時帶走。
準備#
硬體準備:#
-
樹莓派 3 代 B 型 200 元
-
樹莓派電源 (5V 2.5A) 安卓的 2A 充電器也行,2.5A 可以支持高功率運行,算是為了日後準備吧。
-
16G SD 卡 (最好是 class 10 速度的) 50 元
-
網線一根
-
Yeelight 燈泡 99 元
-
小米網關二代 149 元
-
小米溫濕度感應器 49 元
-
小米人體動作感應器 59 元
-
小米門窗感應器 49 元
-
小米智能插座 Zigbee 版:控制熱水器 69 元
-
小米 空調伴侶 支持 homebridge 199 元 感謝評論區的提醒
-
羅技 Harmony Hub (控制接入家中一切的紅外設備:空調、電視機、音響、電扇、空氣淨化器、電動晾衣架。) 299 元
-
小米空氣淨化器 2 代 699 元
需要自備的其他硬體#
- 支持 IOS10 的手機或平板。
- 安卓手機一台(用來獲取網關密碼,因此借一台也可以)。
- 路由器。
Future work:#
- Aqara 牆壁開關 (可移植性差,以後考慮)
- 門鎖
- 電動窗簾:紅外遙控電動窗簾 + harmony 即可,或用小米的電動窗簾
- 攝像頭
- SSH 指令 (鏈接)
- 藍牙設備 (音箱)(鏈接)
- Home Assistant 支持設備
不計空調伴侶和淨化器,總共 1023 元。
軟體準備#
用於自己燒錄系統到 SD 卡
- Mac 下 ApplePi
- Windows 下 SDFormatter、Window32 Disk Image
- Linux 用戶。。。你們直接用 dd 命令就好
安裝#
Yeelight 燈泡#
下載 yeelight App,按照指示連接上燈泡,然後打開極客模式即可。
小米網關及相關感應器#
- 將小米網關插電,下載 “米家” App。將手機連入 2.4Ghz 的 Wi-Fi 網路 (現有的大多數智能家居都不支持 5Ghz Wi-Fi),按照指示添加網關,然後添加其他的感應器。
獲取網關的 MAC 地址及通訊密碼#
網關信息是之後的 homebridge 配置文件中需要的,但只能從安卓手機的 “米家” App 中可以獲得。
- 點擊 App 進入網關選項-> 進入螢幕右上角的 “...”-> 進入 “關於”-> 連續按機螢幕下方版本號區域激活開發者模式
- 點擊 “局域網通訊協議” 選項,打開局域網通訊協議,並記下密碼
- 返回上一级菜單,開發者模式中會出現一個 “網關信息” 的選項-> 記錄 MAC 地址('mac' 字段後面那一串 6 對的字母數字)
樹莓派#
樹莓派是英國劍橋大學教授主持的一個致力於推廣孩童計算機教育的硬體項目,主要使用的是 Linux 系統 raspbian 系統,也可以安裝 Debian GNU/Linux 、Fedora、Arch Linux 、RISC OS、二代 B 以上還支持 Window10 IoT。
3 代 model B 的配置:
- 搭載 1.2GHz 的 64 位四核處理器(ARM Cortex-A53 1.2GHz 64-bit quad-core ARMv7 CPU)。
- 增加 802.11 b/g/n 無線網卡。
- 增加低功耗藍牙 4.1 適配器。
主要是作為 homebridge 的伺服器,使不支持 homekit 的設備被 homekit 識別。
不熟悉 Linux 命令的朋友,只要跟著複製粘貼命令就好了。
安裝系統#
我是選擇在購買 SD 卡時讓商家給我拷貝了一份系統進去,實際上也可以自己下載燒錄到 SD 卡上。
- 下載的 raspbian jessie 版本系統( 現在升級為最新版 stretch)。[樹莓派系統下載地址](Index of /raspbian/images)
- Windows 下面可以採用 SDFormatter 對 SD 卡進行格式化,再使用 Window32 Disk Image 來燒入 SD 卡中。Mac 下推薦 ApplePi 這個軟體,可以用來燒製系統和備份。
- 樹莓派默認關閉了 SSH,開啟的方式也很簡單,就是在 SD 卡內系統的根目錄下創建一個空的 ssh 文件。
- 連上電源線 (mini USB)、網線直接連接到家裡的路由器上、插入 SD 卡。系統會自動開機安裝。
- 將樹莓派用網線連接上電腦,使用 SSH 登錄,默認密碼是 raspberry
- 配置 wifi,否則需要用網線將樹莓派連接在路由上。
不熟悉 vi 的朋友可以使用 nano 文本編輯器編輯源文件,操作接近於普通的文本編輯器。使用 ctrl+O 保存,ctrl+X 來退出。建議編輯前採用 cp 命令備份一份原文件。或者使用下面的命令一步將樹莓派官網和第三方源替換成清華源。
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
添加如下內容:
network={ ssid="wifiname" psk="password" }
保存後,斷開網線,幾秒內就會連上 wifi
- 修改鏡像源,原始的系統更新源在國內速度比較慢,導致安裝其他程序時超時報錯,可以更換成國內的或者開啟 SS 服務。
sudo sed -i 's#://archive.raspberrypi.org/debian#s://mirrors.tuna.tsinghua.edu.cn/raspberrypi#g' /etc/apt/sources.list.d/raspi.list sudo sed -i 's#://archive.raspberrypi.org/debian#s://mirrors.tuna.tsinghua.edu.cn/raspberrypi#g' /etc/apt/sources.list.d/raspi.list
- 更新更新庫並且重新組織依賴
sudo apt-get update && sudo apt-get upgrade
安裝 NodeJS 及依賴和 Homebridge 及相關插件#
安裝 NodeJS#
首先檢查一下,所用樹莓派的芯片版本
uname -a
我的返回芯片版本是 armv7l:
Linux raspberrypi 4.4.50-v7+ 970 SMP Mon Feb 20 19:18:29 GMT 2017 armv7l GNU/Linux
使用如下命令去下載安裝 node6,node7 還不太穩定,node5 對 homebridge 的兼容不是很好
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - sudo apt-get install -y nodejs
安裝 Avahi#
sudo apt-get install libavahi-compat-libdnssd-dev
安裝 Homebridge#
sudo npm install -g --unsafe-perm homebridge
如果如上命令無法順利跑完,那麼說明需要一些額外的配置,跑如下的命令:
sudo npm install -g --unsafe-perm homebridge hap-nodejs node-gyp cd /usr/local/lib/node_modules/homebridge/ sudo npm install --unsafe-perm bignum cd /usr/local/lib/node_modules/hap-nodejs/node_modules/mdns sudo node-gyp BUILDTYPE=Release rebuild
安裝 homebridge-aqara, aqara 協議的網關及感應器#
sudo npm install -g homebridge-aqara
安裝 homebridge-yeelight, yeelight 燈泡的插件#
sudo npm install -g homebridge-yeelight
安裝小米空氣淨化器插件#
npm install -g homebridge-mi-air-purifier miio
斷開其他智能設備,只保留空氣淨化器。再輸入下面的命令獲取淨化器的 IP 和 Token
miio --discover --sync
可能會返回多個下列格式的設備信息:
Device ID: 49466088 Model info: Unknown Address: 192.168.1.8 Token: 6f7a65786550386c700a6b526666744d via auto-token Support: Unknown
記下 address 和 token,之後要寫到配置文件中
安裝小米空調伴侶插件#
最新版 0.5.1 有 bug,暫時無法啟動,已經提了 issue,等待作者更新。
sudo npm install -g [email protected]
同樣使用上面的miio --discover --sync
來發現空調伴侶及關聯的溫濕度感應器的 device_id (填寫在 sensorSid 值 'lumi.' 後)
添加紅外設備進 Homekit#
後來發現了羅技 Harmony Hub 的紅外遙控器設備,支持 28 萬種設備 (支持紅外學習新設備),300 元以內,它也有插件接入 homebridge。安裝後,家中紅外設備,例如空調、電視機、空氣淨化器、电動晾衣架都可以通過 Siri 控制。根據說明接入紅外設備,最多 7 個。
安裝過程:
全程需要全局科 學 上 網
- 下載電腦客戶端 MyHarmony,有 Mac 和 Win 版。
- USB 連接 Hub 到電腦,識別 Hub。網路連接 2.4Ghz 的 WiFi。
- 識別到 WiFi,輸入 WiFi 密碼。
- 註冊賬戶用於在不同設備上管理設置,建議用郵箱。
- 提示你要連接 Remote 遙控器才可以繼續,點擊右下角的 Skip 鍵。雖然上面寫的是只有 Remote 的情況下的 Skip,實際上也適用於只有 Hub 的情況下。
- 識別完成,進入管理界面。會提示你給你的 Hub 起一個名字。然後提示你添加設備。
- 通過設備的品牌名和設備號 (model) 來添加,數據庫內搜索不到的,可以手動添加,並通過紅外學習遙控器。
- 左邊菜單欄有 Activity,可以設置自動化控制活動。例如:看電視 = 打開電視 + 機頂盒 + 音響 + 調整到你最喜歡的頻道。最後每個 Activity 會作為一個插座類設備添加到 Homekit 中。
- 下面是設置 Harmony 的插件和配置文件。
通過終端進入樹莓派終端,然後安裝 Harmony Hub 的插件
sudo npm -g install homebridge-harmonyhub
創建 homebridge 的配置文件 config.json#
mkdir /home/pi/.homebridge/ sudo nano /home/pi/.homebridge/config.json
Homebridge 配置文件的內容及格式#
需要將網關的密碼和 MAC 地址,以及 aqara 網關及 yeelight 的配置信息。#註釋部分請刪除
pin 之後用於加入 iphone 中的家庭 app
{ "bridge":{ "name":"YeeBridge", "username":"任意MAC地址", "port":51827, "pin":"031-45-157" }, "platforms":[ { "platform":"yeelight", "name":"yeelight" }, { "platform":"AqaraPlatform", "sid":[ "填寫網關的MAC地址,小寫,連寫" ], "password":[ "網關密碼" ] }, { "platform":"HarmonyHub", "name":"Harmony Hub" }, { "platform":"XiaoMiAcPartner", "ip":"空調伴侶ip", "token":"空調伴侶token", "accessories":[ { "name":"Ac Partner", "type":"climate", "sensorSid": "lumi.{device_id}" } ] } ], "accessories":[ { "accessory":"MiAirPurifier", "name":"Air Purifier", "ip":"淨化器IP", "token":"ADDRESS_OF_THE_AIR_PURIFIER", "showTemperature":true, "showHumidity":true, "showAirQuality":true } ] }
配置開機啟動 homebridge#
配置到這裡,只要在終端輸入 homebridge 就可以運行了。但是關閉終端後就會關閉,而且萬一出現斷電重啟的情況,服務就會關閉。因此我們要配置一個開機啟動 homekit 的配置。homebrige 的 github 頁面上推薦了三種方式,我採用裡面最方便的方式 init.d 的方法。
首先從這裡下載一個配置文件,並複製所有內容。下載
然後使用如下命令在 init.d 目錄下創建一個 homebridge 啟動的文件:
sudo nano /etc/init.d/homebridge
將下面的內容直接複製覆蓋文件中的部分,注意 cmd 後面填寫的位置是你 homebridge 所在的目錄,會出現兩種情況。查找 homebridge 的位置使用如下命令:
`which homebrige
#!/bin/sh
BEGIN INIT INFO#
Provides: homebridge#
Required-Start: $network $remote_fs $syslog#
Required-Stop: $remote_fs $syslog#
Default-Start: 2 3 4 5#
Default-Stop: 0 1 6#
Short-Description: Start daemon at boot time#
Description: Enable service provided by daemon.#
END INIT INFO#
dir="/home/pi"
cmd="DEBUG=* /usr/local/bin/homebridge"
user="pi"`
修改文件的權限:
sudo chmod 755 /etc/init.d/homebridge sudo update-rc.d homebridge defaults
重啟後就會自動啟動,或者手動啟動:
sudo /etc/init.d/homebridge start
添加設備進入家庭 App#
這裡可以參考 Apple 官方的 [操作指南](在 iPhone、iPad 和 iPod touch 上使用 “家庭” 應用)
將 iphone 連入同一個局域網,打開家庭 App,新建家庭就可以添加 homebridge 了。
這個時候你會發現,app 問你要一個驗證碼,用來驗證設備。正規的 homekit 設備是有這個的,但是我們的並沒有,這個東西我一開始找了 5 分鐘,才發現其實啟動 homebridge 伺服器的時候,終端就已經生成了,我們找到後手動輸入就好了。
就是配置文件裡 PIN 的部分。
此時,所有的設備都會出現在 App 裡,你可以按住,選擇編輯,修改他們所在房間和名字類別。
遠程控制及自動化#
遠程控制#
為了保證安全,Homekit 的默認支持環境是局域網下,但是如果你有 ipad 可以升級到 iOS10 的系統,或者 Apple TV 四代以上,就可以在設置裡將其配置為中控,這樣在家外也可以控制這些設備了。
如果沒有這些設備,也沒關係,米家 app 裡也有可以遠程控制的(就是非常難用而已)。
自動化#
自動化可以讓你設置各種規則,來自動控制你家中的設備。
例如:
IF (當):網關光感器檢測到暗,同時有人進入臥室
執行:打開臥室燈
IF (當):溫度檢測器檢測到超過 30 度,且門窗關閉,且家中感應到有人
執行:打開空調,設置為制冷模式 25 度。需要小米空調伴侶或者萬能遙控器
坑#
- 看官方文檔!看官方文檔!看官方文檔
- 折騰完以後,一定要用燒錄軟體備份一下 SD 卡裡的系統,然後再繼續折騰別的,別問我怎麼知道的。。。
- 除非有特殊需求,不要給樹莓派設置靜態 IP,因為 yeelight 採用 TCP 進行通訊,一旦路由器的 DHCP 給 Yeelight 設備配置了不同網段的 IP,會導致無法控制燈泡。在此鳴謝 Yeelight 的員工,晚上 8 點多還和我積極的溝通,幫我找到問題。
- NodeJs 6 最為合適,5 有兼容問題,7 還不是很穩定。
- 小米的其他設備加入 homebridge 的進度不是很快,在知乎上關注負責這塊的工程師,看他快有一個月沒有大改動了。但說會支持空調助手 (終於有第三方支持了),我覺得支持萬能遙控器比較重要,可以快速提高可玩性。
- 給樹莓派準備點散熱墊,或者金屬立柱散熱,風扇散熱效果不怎麼好。還很鬧。
最後效果#
最後附上一個第一次成功時錄的小視頻