[Raspberry Pi]HAP-Node.JS 讓家裡的電器透過 Raspberry Pi 也能使用 HomeKit
[前言]
差點沒吐血 打這篇的時候Chrome崩潰一次 打的東西全部不見.....
我敢保證這篇絕對打得比較不認真 抱歉了
前陣子去美國找在加州工作的老姐
發現他的房間裡放了一台Google Home
如同發表會所展示的
可以透過簡單的語音 來達成許多事
回到台灣後 我仔細的思考了一下所謂的智能家庭
結論是 挺方便的啊
所以想也來試試看把家裡變得稍微智慧一點
我分析了一下各家智能管家的優缺點
- Google:優點是支援度高 而且提供的服務應該是最多的 缺點是如果希望在每間房間都可以進行控制 則每間房間都需要一台Google Home
不過似乎有Google的手機也可以透過手機
- Amazon:是三家裡最早推出智能管家的 總建置價格應該是最低的 缺點是能提供的服務應該是最少的
- Apple:優點是不需要額外購買管家系統 只需購買家電 缺點是規格特殊 支援的智慧家電價格都偏貴
但 有沒有辦法克服價格昂貴的問題呢
上網搜尋了一下還真的有
這就是這次的主題了
[該準備的東西]
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檔
這些就是預設的檔案
每個檔案分別代表一個家電
我們要新增一個自己的家電 並設定一些自己的參數
首先呢 先設定GPIO
分別是開燈和關燈的檔案
而我們對Siri下指令的時候
HAP-NodeJS會幫我們執行這兩個檔案
甚至是更為複雜的IO
之後在新建Accessory檔
至於裡面要打什麼 可以參考
https://drive.google.com/file/d/0B6GR9Hj5Ut61bDZlekRMNFdTVEE/view
python的部分打完之後請務必直接執行看看
看GPIO和LED燈是否有反應
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
這方面的中文文章真的挺少的
不過 這真的相當有趣啊
我不怎麼專精 只是喜歡自己亂搞亂玩
或許有些不正確的地方都可以一起討論討論
留言
張貼留言