Raspberry Pi 的應用 - Siri + HomeKit 讓我們的家電變自動也更智慧

by 11月 13, 2017 2 意見                


用手機來控制家電設備超方便,只要打開 App、按個按鈕就 OK;可是,能不能連按鈕就不用按,只要動動櫻桃小口,講句話就行呢?!

想像一下,我們要用手機把客廳的燈打開,整個操作流程是:
  1. 拿出手機。
  2. 將手機解鎖。
  3. 找到控制電燈的 App。
  4. 執行這支 App。
  5. 把電燈打開。
如果不只電燈,我們打算連電視、音響、房門、冷氣、風扇、插座、門鈴 ......等等的設備也要用手機控制,首先得為這一堆設備裝上一大堆的 App。

每一家的App 的操作介面、設備規格、傳輸協定、系統需求統統不一樣,事先得先做好一堆參數設定才能使用。

此外,設備之間通常沒辦法跟其他設備協同運作,例如晚上想睡覺了,人是躺在床上,不必起床沒錯,可是,我們得再執行這一堆,把這些設備一個一個關掉才能安心。

別說要使用,光是想想就覺得夠累了,那也不過是把原來一堆實體遙控器換成 App 罷了,而這也是智慧家庭設備目前最大的問題 - 操作與整合不易,難以自動化。

Apple 為了要切入這塊市場,在 WWDC 2014 跟著 iOS8 一起推出 HomeKit 這個新服務,簡單的說,透過 iPhone/iPad 加上 Siri,就可以輕鬆控制所有的家電設備。

設定簡單、介面統一、操作方便,不用動手,只要動口,更重要的是所有的設備都在同一個生態系,依照我們設定的條件,讓這些設備自動啟用或關閉,而所有的設備串連在一起,還可以依情境同時對多個設備下命令。

不過通過 Apple 認證的配件不多,而且不便宜,那要如何把那些沒有原生支援 HomeKit 的設備加到家庭 App 裡來用呢?

這就是我們這次要實作的主角 - Homebridge 最最最重要的用途了。


事前準備

  • Rasberry Pi,安裝 Raspbian Stretch 發行版,別忘了先做好 基本設定
  • 無線基地台,並且已經完成 Internet 的連線設定。
  • 支援 Wi-Fi 無線連接與控制的配件週邊。

開始安裝主程式


Homebridge 是用 JavaScript 撰寫,所以必須先把 Node.js 安裝起來才能執行。這次用的版本是 Node.js 8.x 版,相關說明請參閱 Node.js - Installing Node.js via package manager

先加入套件庫資訊。
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -

再安裝 Nods.js。
sudo apt-get install -y nodejs

由於 CPU 架構不同,使用 Raspberry Pi Zero / 1 來實作的朋友,Node.js 的安裝方式請參閱 Eddie Lee - Running node.js on a Raspberry Pi Zero,選擇各版本的安裝指令。

安裝 Homebridge 之前,還必須先安裝這些相依套件。
sudo apt-get install -y libavahi-compat-libdnssd-dev

才能開始安裝 Homebridge 主程式。
sudo npm install -g --unsafe-perm homebridge

稍等一下下,很快就安裝好了。


修改設定


先建立管理 Homebridge 專用的使用者帳號與目錄。
sudo useradd --system homebridge
sudo mkdir /etc/homebridge


把網路卡的 MAC Address 記下來,如果網路卡的名稱不同,或是使用無線網路卡,記得把 eth0 改成該設備的名稱。
ip address show eth0 | grep link/ether | cut -c16-32 | tr a-z A-Z

建立 Homebridge 的主設定檔,用的是 JSON 格式,各個名詞代表的意義請參閱 HomeKit Glossary of Terms
sudo vi /etc/homebridge/config.json

輸入下列的內容。
{
  "bridge": {
    "name": "Homebridge",
    "username": "XX:XX:XX:XX:XX:XX",
    "port": 54321,
    "pin": "123-45-678"
  }
}


要修改的設定值有:
  • username - 剛剛取得的 MAC Address,英文字一定要大寫。
  • port - 傳輸資料用的通訊埠,建議從 49152 ~ 65535 之間選一個來用。
  • pin - 用來讓家庭 App 加入配件的代碼,格式一定要是 XXX-XX-XXX,數字任選,不能用英文字母跟特殊符號。

如果在修改主設定檔之後,Homebridge 服務無法啟動,可以把設定值貼到 JSONLint 來檢查一下。

Vaild Json 代表語法格式沒錯,Parse error 的話就看看是哪一行出錯。

接著,
為了讓服務在開機後自動啟動,有不少網友的教學文章是用 screen 套件來執行,我不太喜歡這種方式,那只能執行,不能管理。所以,我選擇以 systemd 來管理,除了統一管理方式之外,啟動與停止服務也相對簡單多了。

建立 Homebridge 的相關服務設定檔。
sudo vi /etc/default/homebridge

輸入下列設定值。
# Defaults / Configuration options for homebridge
# The following settings tells homebridge where to find the config.json file and where to persist the data (i.e. pairing and others)
HOMEBRIDGE_OPTS=-U /etc/homebridge

# If you uncomment the following line, homebridge will log more
# You can display this via systemd's journalctl: journalctl -f -u homebridge
# DEBUG=*


sudo vi /etc/systemd/system/homebridge.service

輸入下列設定值。
[Unit]
Description=Node.js HomeKit Server
After=syslog.target network-online.target


[Service]
Type=simple
User=homebridge
EnvironmentFile=/etc/default/homebridge
ExecStart=/usr/lib/node_modules/homebridge/bin/homebridge $HOMEBRIDGE_OPTS
Restart=on-failure
RestartSec=10
KillMode=process


[Install]
WantedBy=multi-user.target



從家庭 App 加入配件


第一次先手動啟動 Homebridge 服務,這裡才可以看到讓家庭 App 掃瞄用的 HomeKit 代碼。
sudo homebridge -U /etc/homebridge -D

打開 iPhone 裡的 家庭 App,更完整的操作方法請參閱 Apple - 在 iPhone、iPad 和 iPod touch 上使用「家庭」App

第一次開啟的歡迎畫面,點選「開始使用」。

點選「加入配件」。

掃描剛剛在畫面上的 HomeKit 代碼,或是點選「沒有代碼或無法掃瞄」,手動輸入代碼也可以。

因為沒有通過 Apple 的官方認證,所以只能點選「強制加入」。

HomeKit 認證配件的 Logo 長這樣,跟 MFi 一樣要向 Apple 進貢才行。

稍等一下,Homebridge 配件就會被加入家庭 App 裡面。

房間名稱可以自行修改,配件名稱就不用了,因為我們會從 Homebridge 主設定檔裡修改。

直接點選「下一步」。

在「房間」頁籤裡,就可以看到我們加入的 Homebridge 配件。

按「Ctrl+C」將 Homebridge 服務中止。

讓 homebridge 帳號擁有專用目錄的存取權限。
sudo chown -R homebridge:homebridge /etc/homebridge

最後,重新載入 Homebridge 服務,並且讓它在開機後自動啟動。
sudo systemctl daemon-reload
sudo systemctl enable homebridge
sudo systemctl restart homebridge


安裝插件 (Plugin)


除了主程式之外,為了讓不符合 HomeKit 協定的 SmartHome 配件加入,我們必須安裝對應的插件,我們可以在 npm 官網用 homebridge-plugin 為關鍵字去搜尋可用的插件,2017/11/11 為止已經有 817 個。

我們先用 homebridge-openweathermap-temperature 來小試牛刀,可以從 OpenWeatherMap 取得氣溫預測資料。

使用 npm 指令來安裝。
sudo npm install -g homebridge-openweathermap-temperature

到 OpenWeatherMap 註冊一個帳號,取得 API Key。
https://home.openweathermap.org/api_keys


如果不知道所在位置的城市英文名稱,可以從 Weather maps 裡看到。

編輯 Homebridge 主設定檔。
sudo vi /etc/homebridge/config.json

"accessories": [
  {
    "accessory": "OpenweathermapTemperature",
    "name": "室外氣溫",
    "url": "http://api.openweathermap.org/data/2.5/weather?q=Taichung,TW&appid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  }
]


要修改的設定值有:
  • name - 在家庭 App 裡所顯示的配件名稱。
  • url - 所在位置的城市、國家,和剛剛申請的 32 碼 API Key。

重新啟動服務後就生效了。
sudo systemctl restart homebridge

馬上可以在家庭 App 裡看到它。

也可以用 Siri 叫出來。

這些是我認為還蠻實用的插件。
很多朋友還會配合 小米的智能家庭套裝 來建置,例如:
如果自己的設備不支援 HomeKit,也找不到現成的插件,還可以參考 創客閣樓技術分享 - 用 RASPBERRY PI 打造專屬(偽)APPLE HOMEKIT 系統 釋出的原始碼,撰寫自己的專用插件。

最後,
再搭配 Apple TV 或 iPad ,讓它們成為家庭中樞之後,就可以在就可以在任何地方遙控這些配件,更可以讓它們依我們的要求自動化運作,而不需人為介入了。


注意事項

  • 一個 HomeBridge 服務最多只能加入 100 個 HomeKit 配件。

異常處理


常看到的錯誤訊息有這些:

*** WARNING *** The program 'nodejs' uses the Apple Bonjour compatibility layer of Avahi
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see http://0pointerde/avahi-compat?s=libdns_sd&e=nodejs
*** WARNING *** The program 'nodejs' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see http://0pointerde/avahi-compat?s=libdns_sd&e=nodejs&f=DNSServiceRegister
開發者說這些錯誤訊息直接無視即可,看不下去的神人請自行動手 ...... XD

No plugins found. See the README for information in installing plugins.
單純只是代表還沒安裝任何插件。

config.json (/etc/homebridge/config.json) not found.
找不到主設定檔,可能是還沒建立或是路徑指錯了。

gyp WARN EACCES user "root" does not have permission to access the dev dir "/root/.node-gyp/6.11.5"
用 sudo npm install -g homebridge 指令來安裝主程式時,若出現上面的錯誤訊息,就要改用 sudo npm install -g --unsafe-perm homebridge 指令才行。


參考資料

圖片來源

更新紀錄
  • 2017/11/13 撰文。
  • 2018/01/04 補充軟硬體需求。
  • 2018/03/02 更新 Nodejs 在 Raspberry Zero & 1 的參考連結。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

2 則留言 :

  1. 錯誤 HOMEBRIDGE_OPTS=-U /etc/homebridge
    正確 HOMEBRIDGE_OPTS=-U /etc/homebridge -D

    你的參數少了一個 "-D"

    回覆刪除
  2. 您好,依照您的文章教學都很順利,但是在 iPhone 家庭中 加入配件 卻一直失敗
    請問能協助排除嗎,謝謝。

    https://imgur.com/a/ck7rebU

    回覆刪除