「Hey!Siri、電気消して!」をできるようにしたらSiriが可愛くなった件について

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の設定
基本設定は前回記事「Raspberry Pi Zero Wをキーボードとマウスを使わずにインストールしてwifi設定する」で終えてネットワーク上に接続されていることが前提です。
RemoをiOSのHomeKitで扱えるようにするためにはHomebridgeというものをインストールする必要があるため、必要なものをインストールして設定していきます。
Raspberry Piで以下をインストール
| 1 | $ sudo apt-get install libavahi-compat-libdnssd-dev nodejs npm | 
このままだと古いnodeが入ってくるので最新のnodeが入るように以下を実施
cf: 第三回 Raspberry Pi 3に最新のNode.jsをインストールする
| 1 2 3 4 5 6 7 8 | $ 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のプラグインをインストールします。
| 1 | $ 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より、以下を実行した。
| 1 2 3 4 | ## 微妙に参考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.」といわれて起動を確認できた。
Nature Remoの設定確認
先にRemoのIPを確認する。Mac上で下記コマンドを実施する。
cf: RemoのIPアドレスを確認したい
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | % 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とわかったので、以下を実行して赤外線情報をゲットする。。。ができない
| 1 2 3 4 | % 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してみると無事取得できた。
| 1 2 3 4 5 6 | % 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の結果をメモしておく。
Homebridgeの家電設定
再びRaspberry Piに戻り、MACアドレスを確認する。
link/etherのところに記載されているのがMACアドレスなのでメモしておく。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $ ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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を生成する
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | $ 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番号が表示されていることを確認する。
| 1 2 3 4 5 6 7 8 9 | $ 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から家電コントロール
まずは、スクリプトの準備
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | $ 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 | 
自動起動の設定を行う
| 1 2 3 4 | $ sudo chmod 755 /etc/init.d/homebridge $ sudo insserv -d homebridge ## 以下のエラーが出ても無視できるため気にしない insserv: warning: script 'homebridge' missing LSB tags and overrides | 
最後に試しに起動してるのを確認してみる。
| 1 2 | $ sudo /etc/init.d/homebridge start $ tail -f /var/log/homebridge.log | 
Homeアプリ登録
iPhoneで「ホーム」アプリを起動して、「アクセサリを追加」を押下。

pin番号を入力すると認定されていないアクセサリと言われるが、「このまま追加」

無事追加されると登録できるアプリが出て来るので、よく使うものであれば「よく使う項目に含める」にチェックを入れて「次へ」をどんどん押していく。

Hey!! Siri!!
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を一層愛でたくなります!!!!!!!!
皆様も是非快適な近未来ライフをお楽しみください。







 
         
         
         
        