Categories: IoT

「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で以下をインストール

$ 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.」といわれて起動を確認できた。

Nature Remoの設定確認

先に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の結果をメモしておく。

Homebridgeの家電設定

再び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

Homeアプリ登録

iPhoneで「ホーム」アプリを起動して、「アクセサリを追加」を押下。

「コードがないか、スキャンできませんか?」を押下

Homebridgeを選択

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を一層愛でたくなります!!!!!!!!

皆様も是非快適な近未来ライフをお楽しみください。

mogmet

View Comments

  • 最近RemoとHomebridgeを使い始めました。記事にあるスリープ問題に悩んでおります。良かったら具体的にどう対応したか教えていただけないでしょうか。

  • Your article helped me a lot, is there any more related content? Thanks!

Share
Published by
mogmet
Tags: IoT