[Raspberry Pi]HAP-Node.JS 讓家裡的電器透過 Raspberry Pi 也能使用 HomeKit

[前言]

差點沒吐血 打這篇的時候Chrome崩潰一次 打的東西全部不見.....

我敢保證這篇絕對打得比較不認真 抱歉了

前陣子去美國找在加州工作的老姐
發現他的房間裡放了一台Google Home
如同發表會所展示的
可以透過簡單的語音 來達成許多事

回到台灣後 我仔細的思考了一下所謂的智能家庭
結論是  挺方便的啊
所以想也來試試看把家裡變得稍微智慧一點


我分析了一下各家智能管家的優缺點
  • Google:優點是支援度高 而且提供的服務應該是最多的
  • 缺點是如果希望在每間房間都可以進行控制 則每間房間都需要一台Google Home
    不過似乎有Google的手機也可以透過手機
  • Amazon:是三家裡最早推出智能管家的 總建置價格應該是最低的
  • 缺點是能提供的服務應該是最少的
  • Apple:優點是不需要額外購買管家系統 只需購買家電
  • 缺點是規格特殊 支援的智慧家電價格都偏貴
由於我的家人都是使用iPhone  因此照這樣看選擇Apple的HomeKit是最好的選擇
但 有沒有辦法克服價格昂貴的問題呢
上網搜尋了一下還真的有

這就是這次的主題了

[該準備的東西]

1.一台具網路功能的Raspberry Pi (以下簡稱Pi 無線網路更好)
2.一台電腦 (透過電腦下指令會比較方便一點 不過也可以不用)
3.麵包版、Led燈泡、杜邦線等

Pi的設定我就不多做說明了
可以參考葉難大大的文章 都有相當詳細的教學
我使用的是1代 Model B
是沒有內建無線網卡的
所以我先安裝好映像之後
先進去連上網路 開好SSH之後就都在電腦這邊作業了

這次的目標其實不是操控家電
而是用Siri透過GPIO控制LED
只要成功了 就可以使用像繼電器等工具來對家店進行控制

[Step by Step]

安裝Node.JS

首先先對Pi進行更新
sudo apt-get update
sudo apt-get upgrade
安裝必要套件
sudo apt-get install python-dev python-pip
sudo apt-get install libavahi-compat-libdnssd-dev 

安裝Node.JS

Node.JS已經提供了已編譯過的ARM版本
所以我們只要直接下載下來並複製就可以使用了
由於我的Pi是1代 ARM版本是v6
所以我需要下載的是v6版本的Node.js
可以使用
uname
來看自己是什麼版本的ARM
請注意 我所使用的代碼都是在我的環境下的指令
千萬別一股腦的複製貼上

sudo wget https://nodejs.org/dist/v6.9.5/node-v6.9.5-linux-armv6l.tar.gz 
//下載Node.js
sudo tar -xvf node-v6.9.5-linux-armv6l.tar.gz 
//解壓縮
cd node-v6.9.5-linux-armv6l
//進入資料夾
sudo cp -R * /usr/local/
//複製到 /usr/local/
sudo reboot
//重開機

如果安裝成功執行以下指令應該要出現版本資訊
node -v
>v6.9.5
npm -v
>3.10.10

安裝HAP-NodeJS

git clone https://github.com/KhaosT/HAP-NodeJS.git
cd HAP-NodeJS

接下來要安裝HAP-NodeJS所需的套件
不過我自己在安裝幾個套件的時候
不斷的出現錯誤
後來是直接忽略
反正 最後是可以執行就好了

npm install -g node-gyp
//-------一行版本
npm install node-persist && npm install srp && npm install mdns && npm install ed25519 && npm install curve25519 && npm install debug && npm install python-shell
//-------分行版本
npm install node-persist 
npm install srp 
npm install mdns 
npm install ed25519
npm install curve25519 
npm install debug 
npm install python-shell
//重建
npm rebuild

我有看到另一個教學
因為我們要執行的檔案是BridgedCore.js和Core.js
所以我們可以夠過執行這兩個檔案
node BridgedCore.js
node Core.js
來檢測是不是有缺少什麼套件
有缺少就再回頭安裝
沒有那就算了吧哈
如果正確執行 應該要有HAP-NodeJS Starting之類的字出現
到這裡算是完成一大部分了
接下來就是要設定家電的部分了

設定家電 Accessory檔

完成之後我們要對家電設定Accessory檔
cd accessories 
ls
進入資料夾後 應該可以看到一堆檔案
這些就是預設的檔案
每個檔案分別代表一個家電
我們要新增一個自己的家電 並設定一些自己的參數
首先呢 先設定GPIO
cd ..     //回到HAP-NodeJS根目錄
mkdir python
nano light1.py
nano light0.py
我們要在python資料夾中新建兩個檔案
分別是開燈和關燈的檔案
而我們對Siri下指令的時候
HAP-NodeJS會幫我們執行這兩個檔案
甚至是更為複雜的IO
之後在新建Accessory檔
cd accessories 
nano 檔名_accessory.js
檔名是隨意的 不過後面一定要_accessory結尾 否則會讀不到
至於裡面要打什麼 可以參考
https://drive.google.com/file/d/0B6GR9Hj5Ut61bDZlekRMNFdTVEE/view
python的部分打完之後請務必直接執行看看
看GPIO和LED燈是否有反應

accessory檔基本上不需要做什麼修改
唯一要修改的地方是檔案一開始的附近

exports.accessory = {
  displayName: "Light 1",
//燈的名字 可以改成自己想要的 不確定中文可不可以
  username: "1A:2B:3C:4D:5E:FF",
//燈的MAC? 總之隨便改一下不要跟其他配件重複 否則會無法顯示
  pincode: "031-45-154",
//再加入配件時要打的密碼 我看的教學是建議不要更改 不過更改了應該也沒關係
  services: [{

還有在中下部份
sType: types.LIGHTBULB_STYPE, 
    characteristics: [{
     cType: types.NAME_CTYPE,
     onUpdate: null,
     perms: ["pr"],
  format: "string",
  initialValue: "Light 1 Light Service", //這個是在Siri中顯示的名字
  supportEvents: false,
  supportBonjour: false,
  manfDescription: "Bla",
  designedMaxLength: 255   
    },{
     cType: types.POWER_STATE_CTYPE,
     onUpdate: function(value)
 { 
      console.log("Change:",value);
      if (value) {
   PythonShell.run('light1.py', function (err) { //這個要填剛剛我們建的python檔的檔名 我的是/python/light1.py
     console.log('On Success');
   });
      } else {
       PythonShell.run('light0.py', function (err) { //這裡也要改
        console.log("Off Success");
        
       });
      }
     },


好了之後執行看看
然後用iOS的家庭app看看有沒有在上面
之後沒錯誤的話就是成功了
Done

這方面的中文文章真的挺少的
不過 這真的相當有趣啊
我不怎麼專精 只是喜歡自己亂搞亂玩
或許有些不正確的地方都可以一起討論討論

參考資料

留言

這個網誌中的熱門文章

[Windows 10] WSL 安裝流程,美化與心得(包含個人優缺點等..)

[Raspberry Pi]在Pi上編譯 OpenCV 和多語言支援(C++&Python2,3) (2019/9/20更)

[MAC] Macbook pro 2011 Late 更換SSD