Raspberry Pi Zero W + HomebridgeによるHomeKitエミュレートからの、Remo、Siriを使ってお家を近未来仕様にしてみました。
私は所以Apple信者です。
世の中ではGoogleHomeやAmazon Echo、Clova Waveが話題になっておりますが、私はHomePodがほしいんです。
そのため、将来に備えてHey! Siri!で色々できるように準備しておこうとお家をスマートホーム化頑張ってみました。
そしたら・・・Siriがかわいいんじゃ・・・と言った感じのお話。
以下「Hey!Siri電気つけて!」ができるまでの道のりを綴っていきます。
完成体はこんな感じになります。
基本はNature Remo と HomebridgeをインストールしたRaspberry Pi 3 で家電をSiri(音声)でコントロールしてみた!を参考にやっています。
構成イメージ図はこんな感じ。
SiriがHomebridgeを通してRemoに命令して家電操作する感じです。
物理的に必要なものはRaspberry Piと、Nature Remoが必要になります。HeySiri用のiPhoneやiPadとかはApple信者の皆様は言うまでもなくお持ちですよね?
Nature Remoの設定や使い方などは以前書いた「Remoを使ってあらゆるリモコンを排除してみた」を参照。
基本設定は前回記事「Raspberry Pi Zero Wをキーボードとマウスを使わずにインストールしてwifi設定する」で終えてネットワーク上に接続されていることが前提です。
RemoをiOSのHomeKitで扱えるようにするためにはHomebridgeというものをインストールする必要があるため、必要なものをインストールして設定していきます。
Raspberry Piで以下をインストール
$ sudo apt-get install libavahi-compat-libdnssd-dev nodejs npm
このままだと古いnodeが入ってくるので最新のnodeが入るように以下を実施
cf: 第三回 Raspberry Pi 3に最新のNode.jsをインストールする
$ sudo npm cache clean $ sudo npm install n -g $ sudo n stable $ sudo npm update -g npm ## インストールの確認。バージョンが新しいことを確認する $ node -v $ npm -v
いよいよHomebridgeとRemoの操作に使うhomebridge-irkitのプラグインをインストールします。
$ sudo npm install -g homebridge homebridge-irkit --unsafe-perm
※ちなみに–unsafe-permをつけないと、以下のエラーが大量に出た
gyp WARN EACCES attempting to reinstall using temporary dev dir “/usr/local/lib/node_modules/homebridge/node_modules/mdns/.node-gyp”
しかし、インストール後、homebridgeコマンドを実行すると、以下のエラーが出てしまった。
module.js:515
throw err;
^Error: Cannot find module ‘../build/Release/dns_sd_bindings’
at Function.Module._resolveFilename (module.js:513:15)
at Function.Module._load (module.js:463:25)
at Module.require (module.js:556:17)
at require (internal/module.js:11:18)
at Object. (/usr/local/lib/node_modules/homebridge/node_modules/mdns/lib/dns_sd.js:32:22)
at Module._compile (module.js:612:30)
at Object.Module._extensions..js (module.js:623:10)
at Module.load (module.js:531:32)
at tryModuleLoad (module.js:494:12)
at Function.Module._load (module.js:486:3)
Cannot find module ‘../build/Release/dns_sd_bindings’ #1315より、以下を実行した。
## 微妙に参考URLとはパスが違う $ cd /usr/local/lib/node_modules/homebridge $ sudo npm install --unsafe-perm mdns $ sudo npm rebuild --unsafe-perm
再度実行したら無事「[2017-10-29 04:42:09] config.json (/home/pi/.homebridge/config.json) not found.」といわれて起動を確認できた。
先にRemoのIPを確認する。Mac上で下記コマンドを実施する。
cf: RemoのIPアドレスを確認したい
% dns-sd -B _remo._tcp Browsing for _remo._tcp DATE: ---Sun 29 Oct 2017--- 11:07:03.591 ...STARTING... Timestamp A/R Flags if Domain Service Type Instance Name 11:07:07.835 Add 2 4 local. _remo._tcp. Remo-XXXXXX ## Remo-XXXXXXを確認して置き換えて実行する。 % dns-sd -G v4 Remo-XXXXXX.local DATE: ---Sun 29 Oct 2017--- 11:08:56.804 ...STARTING... Timestamp A/R Flags if Hostname Address TTL 11:08:56.806 Add 2 4 Remo-1FFDEF.local. 192.168.2.20 120
上記でIPは192.168.2.20とわかったので、以下を実行して赤外線情報をゲットする。。。ができない
% curl -i "http://192.168.2.20/messages" -H "X-Requested-With: curl" HTTP/1.0 404 Not Found Server: Remo/1.0.62-gabbf5bd Content-Type: text/plain
どうやら、物理リモコンを、Remoに当ててからでないとGETできないらしい。
試しにリモコンをRemoに直接照射してから再度GETしてみると無事取得できた。
% curl -i "http://192.168.2.20/messages" -H "X-Requested-With: curl" HTTP/1.0 200 OK Server: Remo/1.0.62-gabbf5bd Content-Type: application/json {"format":"us","freq":36,"data":[4339,4448,...]}
APIの結果をメモしておく。
再びRaspberry Piに戻り、MACアドレスを確認する。
link/etherのところに記載されているのがMACアドレスなのでメモしておく。
$ ip addr 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: wlan0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether b8:27:eb:52:77:5b brd ff:ff:ff:ff:ff:ff inet 192.168.2.200/24 brd 192.168.2.255 scope global wlan0 valid_lft forever preferred_lft forever inet 192.168.2.106/24 brd 192.168.2.255 scope global secondary wlan0 valid_lft forever preferred_lft forever inet6 fe80::cfea:b474:434:12b8/64 scope link valid_lft forever preferred_lft forever
configを生成する
$ vi /home/pi/.homebridge/config.json ## 以下を記載していく { "bridge": { "name": "Homebridge", "username": "B8:27:EB:52:77:5B", ## Raspberry Pi 3のMACアドレスを 大文字 で記載) "port": 51826, "pin": "123-45-678" ## (iOSのホームアプリに登録する際に入力するpinコードを決めて記載) }, "description": "Nature Remo Control", ## 設定名を自由に記載 "accessories": [ { "accessory": "IRKit", "name": "テレビ", ## テレビや証明など家電名を名付ける "irkit_host": "192.168.2.20", ## RemoのIPを記載 "on_form": {"format":"raw","freq":38,"data":... }, ##### APIの結果を貼り付ける "off_form": {"format":"raw","freq":38,"data":... } }, { "accessory": "IRKit", "name": "オーディオ", "irkit_host": "192.168.2.20", "on_form": {"format":"raw","freq":38,"data":... }, "off_form": {"format":"raw","freq":38,"data":... } } ... ## 他にもあれば上記塊を複数書いていきましょう。 ] }
MACアドレスは大文字なので要注意です。
あと、pinコードの途中の「-」は必須なので要注意。
homebridgeを起動しPIN番号が表示されていることを確認する。
$ homebridge ... Scan this code with your HomeKit App on your iOS device to pair with Homebridge: ┌────────────┐ │ 123-45-678 │ └────────────┘ [2017-10-29 09:15:36] Homebridge is running on port 51826.
このままではRaspberry Piが落ちるとhomebridgeも落ちてしまうため、自動起動するようにする。
cf: Running Homebridge on Bootup (init.d)
cf: homebridgeでsiriから家電コントロール
まずは、スクリプトの準備
$ sudo vi /etc/init.d/homebridge ## 以下を記載 #!/bin/sh ## 実行ユーザやディレクトリは環境により適宜ご変更ください。 dir="/home/pi" cmd="DEBUG=* /usr/local/bin/homebridge" user="pi" name=`basename $0` pid_file="/var/run/$name.pid" stdout_log="/var/log/$name.log" stderr_log="/var/log/$name.err" # load nvm export NVM_DIR="$dir/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm get_pid() { cat "$pid_file" } is_running() { [ -f "$pid_file" ] && ps `get_pid` > /dev/null 2>&1 } case "$1" in start) if is_running; then echo "Already started" else echo "Starting $name" cd "$dir" if [ -z "$user" ]; then sudo $cmd >> "$stdout_log" 2>> "$stderr_log" & else sudo -u "$user" $cmd >> "$stdout_log" 2>> "$stderr_log" & fi echo $! > "$pid_file" if ! is_running; then echo "Unable to start, see $stdout_log and $stderr_log" exit 1 fi fi ;; stop) if is_running; then echo -n "Stopping $name.." kill `get_pid` for i in {1..10} do if ! is_running; then break fi echo -n "." sleep 1 done echo if is_running; then echo "Not stopped; may still be shutting down or shutdown may have failed" exit 1 else echo "Stopped" if [ -f "$pid_file" ]; then rm "$pid_file" fi fi else echo "Not running" fi ;; restart) $0 stop if is_running; then echo "Unable to stop, will not attempt to start" exit 1 fi $0 start ;; status) if is_running; then echo "Running" else echo "Stopped" exit 1 fi ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 ;; esac exit 0
自動起動の設定を行う
$ sudo chmod 755 /etc/init.d/homebridge $ sudo insserv -d homebridge ## 以下のエラーが出ても無視できるため気にしない insserv: warning: script 'homebridge' missing LSB tags and overrides
最後に試しに起動してるのを確認してみる。
$ sudo /etc/init.d/homebridge start $ tail -f /var/log/homebridge.log
iPhoneで「ホーム」アプリを起動して、「アクセサリを追加」を押下。
pin番号を入力すると認定されていないアクセサリと言われるが、「このまま追加」
無事追加されると登録できるアプリが出て来るので、よく使うものであれば「よく使う項目に含める」にチェックを入れて「次へ」をどんどん押していく。
Hey,Siriしたあとに家電名に「エアコン」と登録していれば「エアコンつけて」とか言えばエアコンが起動します。
近未来の世界へようこそ!!!!
より複雑なことをした場合はHomeアプリの「シーン」を使う。
やりかたはまたhomebridgeを色々と弄る必要があるので別記事「homebridge-nremoを使ってホームアプリのシーンに対応してみた」参照。
おうちから返ってくるとHomebridgeからRemoに指示を送ってもRemoが赤く光って反応してくれず、しばらくなんどかチャレンジしてるとHeySiriからようやくRemoが反応してくれる状態だったので、なんだかRemoがスリープに入ってすぐ反応しないように見えました。
そのため、Raspberry Piから1時間に1回cronでrmeoに対して特に影響のないリモコン操作を送りつけるようにしたところ無事すぐ反応するようになりました。
ホームアプリには家に近づいたら電気をつけるみたいなことができます。
ただし、条件として第4世代のApple TVか、充電中にしているiPadをハブとして準備しておく必要があります。
我が家ではiPadをハブとして準備しているのですが、充電中にしていてもオートメーションが発動しません。。。
仕方ないので、Remoのルールで回避するようにしていますが、なんとかホームでやりたいです。。。
誰か原因等ご存知でしたら教えてくださいー!
スマートホーム化すると近未来をとても感じます。
さらに手を伸ばさなくていいのでリモコンをなくしても問題ない!!
とても便利です!!
更に、HeySiriを何度も呼びたくなってSiriを一層愛でたくなります!!!!!!!!
皆様も是非快適な近未来ライフをお楽しみください。
こんにちは。virapture…
View Comments
最近RemoとHomebridgeを使い始めました。記事にあるスリープ問題に悩んでおります。良かったら具体的にどう対応したか教えていただけないでしょうか。
Your article helped me a lot, is there any more related content? Thanks!
Thanks for sharing. I read many of your blog posts, cool, your blog is very good.