Raspberry Pi + HomeKit + IRKit = Siriで家電を音声操作できるようにする

Mv1dT3JEGk7ztPxFc5Hgv4M11WXhiFyiMNUc1ShFo4c

こんにちは。NHNテコラスアドベントカレンダー 17日目担当、運用エンジニアのワタナベです。

運用という出社日時が不安定な事を逆手にとって、美味しいお店に行くことが趣味です。
23時から焼き肉食べ放題をしたり、17時の開店に合わせて人気焼肉店のホルモンを食べに行ったり、行列必至な牛カツ専門店に開店同時に食べに行ったりしています。いやぁ、肉って最高ですね。

さて、今回のアドベントカレンダーでは趣味のおうちハック、特にHomeKitについて話そうと思います。

はじめに

HomeKitとはAppleが提唱する家電の集中管理システムです。
そのコンセプトとしてSiriへの命令で家電を操作できることにあります。

例えば、
「Hey、Siri 部屋の明かりをつけて」と言えば部屋の明かりがオンになったり、
「Hey、Siri ベランダの温度は?」と言えばベランダに設置してるセンサから温度を取得して教えてくれたり、
「Hey、Siri おやすみ」と言えば部屋の明かりがすべて消え、エアコンを静音モードにしたりできます。

でも、こんなに便利なHomeKit、実は日本ではまだほとんど対応製品が売られていないのです。

・・・ずるくないですか?

海外ではもうiPhoneに話しかけるだけでエアコンがオンになったり、部屋の明かりがついたりして遊べるわけですよ?

ということで、小型LinuxマシンRaspberry PiAPIで操作可能な学習リモコンIRKitを使って
HomeKitを日本でも試してみようというのが今回の記事の内容になります!

Raspberry Piのセットアップから説明していくのでわかりやすい内容になってると思いますが、すごく長いのでお付き合い下さい。
最後までセットアップが出来たならば、あなたは下の動画のように部屋中の家電を操作可能になっていると思います。

Raspberry Piのセットアップ

さて、まずRaspberry Piをセットアップします。
・用意するもの
– HDMIケーブル+ディスプレイ
– USBマウス、USBキーボード
– microUSBケーブル、USB電源
– microSDカード、microSDカードライター
– LANケーブル、ネット接続しているルーター
– Raspberry Pi

OSインストール

公式サイトに従ってNOOBSというRaspberry PiのOSをインストールしていきます。
まず、Raspberry Piの公式サイトからNOOBSをダウンロードします。

858d3e454cb1261cf0b59ce15aa2d602
NOOBSダウンロード先
NOOBSのDownload ZIPからZIPファイルをダウンロードし、解凍します。

microSDカードカードフォーマット

先ほど解凍したフォルダの中身をSDカードにコピーすればRaspberry Piは起動するのですが、その前にmicroSDカードカードをフォーマットする必要があります。
下記リンクからSDフォーマッター4.0をダウンロードし、Raspberry Pi用のmicroSDカードをフォーマットしてください。

SDフォーマッター4.0ダウンロード先

ソフトに従いフォーマットが成功したら、「カードのフォーマットが正常に終了しました」と表示されますのでフォーマットは終了です。

40c6c153dce44e7afd1a602d899e2ef4

OSインストール

microSDカードに先ほど解凍したNOOBSのファイルをコピーします。

0ad8687ef39407ce51432a5e4ae2f3eb

このmicroSDカードをRaspberry Piに挿し、マウス、キーボード、LANケーブル、電源ケーブルを入れるとNOOBSが起動します。

WD_mba2q2e_Sx0X7xhY-7tsjUQDoo4_QGjStk_AxGHA,mdmh-VUNOFYbxnLl-hoit3zi4J8NPtX-pRVpGom_DZk

Raspbianにチェックを入れ上のInstallをクリックすることでインストールが始まります。
時間が結構かかりますが正常にインストールが出来たなら「OS(es) Installed Successfully」と表示され、自動的に再起動がかかりデスクトップ画面が表示されます。
これでOSインストールは終了です。

環境設定

Raspberry Piのインストールは成功しましたが、日本語フォントはインストールされておらず、各種ソフトウェアも古い状況です。
なのでRaspberry Piをアップデートしましょう。

まず、デスクトップ上の黒い画面のアイコンをクリックし、ターミナルを起動します。
そして、下記のコマンドを実行し、アップデートを実施します。

sudo apt-get update
sudo apt-get upgrade

アップデートが終了したら、次は日本語フォントをインストールします。
同じようにターミナルに日本語フォントのインストールコマンドを実行しましょう。

sudo apt-get install fonts-ipafont fonts-ipaexfont

日本語フォントをインストールしたらRaspberry Piを日本語設定に変更しましょう。

ターミナル画面を終了し、左上のメニューからRaspberry Pi Configurationを起動し、Localisationタブを選択し、Localeを日本語環境に、TimezoneをASIA/Tokyoにします。
DeDmcc65pyPOXcbUS0LYOu0UESeT6Qj0u-0P6IKTif0,_s8T9PvvHBvcY7xQig2farkS0EcZy33EeUXK7xaULH8

この設定を変更すると再起動を要求されるので再起動を実施します。
再起動後、日本語が表示可能になり、いくつかメニューが日本語になっています。

これでRaspberry Piの基本的なセットアップは終わりです。

IRKitセットアップ

・用意するもの
– IRKit
– microUSBケーブル、USB電源
– ネット接続しているルーター

IRKitをネットに接続

IRKitに電源をつなげると赤点滅してIRKitからWifiが飛びます。
IRKitの公式アプリに従い、IRKitとWifiを繋げば設定は完了します。
ものすごく簡単な説明ですが、ネット接続の詳細はアプリにわかりやすく記載してあるのでここでは省略します。

ここで注意しなければならないこととして、Raspberry Piと同じネットワークに接続することを心がけて下さい。Raspberry PiがWi-Fiで接続されているなら同じWi-Fiに、Raspberry Piが有線でルーターとつながっているならば同じルーターから出ているWi-Fiに接続してください。そうすることで、IRKitとRaspberry Piが通信可能になります。

IRKitとRaspberry Piの接続を確認してみる

さて、IRKitとRaspberry Piが同じネットワークにあるならば、
IRKitのIPアドレスわかればRaspberry Piから通信が出来るはずです。
IRKitのIPアドレスを調べるにはいくつか方法があります。

  1. ルーターの設定画面からIRKitの名前を探してIPアドレスを見つける
  2. 公式の手順に従い、IPアドレスを見つける
  3. Avahi(Bonjour)の機能を使ってIRKitのローカルドメインにpingを売ってIPアドレスを見つける

ここでは「3. Avahi(Bonjour)の機能を使ってIRKitのローカルドメインにpingを売ってIPアドレスを見つける」について軽く説明します。
実はRaspberry PiとIRKitにはXXXX.localという名前で通信できる仕組みが備われています。
試しにRaspberry Piのターミナルからホストを調べて、別のパソコンからpingを打ってみましょう。
もし、画面に「pi@raspberrypi:~ $」と記載されいるならば、
そのRaspberry Piには「raspberrypi.local」でpingが飛ぶはずです。

~ ❯❯❯ ping raspberrypi.local ⏎
PING raspberrypi.local (10.248.118.161): 56 data bytes
64 bytes from 10.248.118.161: icmp_seq=0 ttl=64 time=6.264 ms
64 bytes from 10.248.118.161: icmp_seq=1 ttl=64 time=7.852 ms

同じようにIRKitも名前が公式アプリ側から判断できます。
アプリのDevicesに記載されているIRKitの名前、例えばIRKit1234という名前が記載されいたならば、
同じく別のパソコンからIRKit1234.localにpingが飛ぶようになっているはずです。

~ ❯❯❯ ping IRKit1234.local ⏎
PING IRKit1234.local (10.248.120.47): 56 data bytes
64 bytes from 10.248.120.47: icmp_seq=0 ttl=255 time=10.682 ms
64 bytes from 10.248.120.47: icmp_seq=1 ttl=255 time=11.131 ms

もし、IRKitの名前がわからなくても前述しましたとおり、いくつか対応方法がありますのでそれでIRKitのIPアドレスを見つけて下さい。
以降、IRKitのIPアドレスを10.248.120.47と仮定して話をすすめます。

Raspberry PiからIRKitを操作してみる

公式ページののGET /messagesに記載してあるとおり、
IRKitにリモコンを向けて目的のボタンを押してみましょう。
その後、ターミナルから下記コマンドを打つことで赤外線情報を取得できます。


pi@raspberrypi:~ $ curl -i "http://10.248.120.47/messages" -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/3.0.0.0.g85190b1
Content-Type: text/plain

{"format":"raw","freq":38,"data":[5049,5049,1679,1679,1679,1679,1679,1679,1679,3704,1679,3704,1679,3704,1679,3704,1679,1679,1679,65535,0,41171,5049,5049,1679,1679,1679,1679,1679,1679,1679,3704,1679,3704,1679,3704,1679,3704,1679,1679,1679]}
pi@raspberrypi:~ $

ここで、{“format”:”raw”,”freq”:~返ってきた内容が目的の赤外線信号です。
この信号をRaspberry PiからIRKitへ送信する場合は公式ページののPOST /messagesに記載してあるとおり、次のコマンドで送信できます。


pi@raspberrypi:~ $ curl -i "http://10.248.120.47/messages" -H "X-Requested-With: curl" -d '{"format":"raw","freq":38,"data":[5049,5049,1679,1679,1679,1679,1679,1679,1679,3704,1679,3704,1679,3704,1679,3704,1679,1679,1679,65535,0,41171,5049,5049,1679,1679,1679,1679,1679,1679,1679,3704,1679,3704,1679,3704,1679,3704,1679,1679,1679]}'

コマンド打った後、IRKitを確認してください。IRKitのLEDが点滅したら送信成功です。

これでIRKitセットアップとRaspberry Piとの接続確認は終わりです。

Homebridgeのセットアップ

さて、ようやくRaspberry PiにHomeKit機能を搭載します。

Raspberry PiにHomeKit機能を搭載するために、HomebridgeというHomeKit機能をエミュレーションするNodeJSサーバーを使用します。
このHomebridgeを使うことでIRKitをSiriから操作できるようになります。

ライブラリインストール

Homebridgeをインストールする前に、いくつかHomebridgeに必要なソフトウェアをインストールします。
ターミナルから下記のコマンドにてインストールできます。

avahiのライブラリをインストール

sudo apt-get install libavahi-compat-libdnssd-dev

node.jsのインストール

wget https://nodejs.org/dist/v4.0.0/node-v4.0.0-linux-armv6l.tar.gz
tar -xvf node-v4.0.0-linux-armv6l.tar.gz
cd node-v4.0.0-linux-armv6l
sudo cp -R * /usr/local/

これでインストールは完了です。念の為、ターミナルを一度終了させて、再度実行しください。
node.jsのバージョンを調べるコマンドが次のとおりに返ってきたインストールは成功しています。

pi@raspberrypi:~/ $ node -v
v4.0.0
pi@raspberrypi:~/ $ npm -v
2.14.2

Homebridgeのインストール

Homebridgeのインストールはターミナルから下記のコマンドを実行することでできます。
結構インストールには時間がかかるので気長に待ちましょう。

sudo npm install -g homebridge

次にIRKitとHomebridgeを接続するプラグインを下記のコマンドでインストールします。

sudo npm install -g homebridge-irkit

インストールが完了したら、次のコマンドで起動確認をしてみます。

pi@raspberrypi:~/ $ homebridge
*** WARNING *** The program 'node' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see
*** WARNING *** The program 'node' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see
Loaded plugin: homebridge-irkit
Registering accessory 'homebridge-irkit.IRKit'
---
Couldn't find a config.json file at '/home/pi/.homebridge/config.json'. Look at config-sample.json for examples of how to format your config.js and add your home accessories.

/home/pi/.homebridge/config.jsonが存在しないから起動ができないよ!って怒られたらひとまず起動は成功です。(まだ設定してないので)
次にconfig.jsonを設定します。
先ほど出たメッセージの通りに設定ファイルを作成します。

nano /home/pi/.homebridge/config.json

config.jsonの中身は次のように書きます。
必要な赤外線信号は事前に取得してください。今回はテレビのオン・オフを想定して設定ファイルを作成します。


{
    "bridge": {
        "name": "Homebridge",
        "username": "CC:22:3D:ED:CE:30",
        "port": 51826,
        "pin": "031-46-160"
    },

    "description": "IRKit Control",

    "accessories": [
        {
            "accessory": "IRKit",
            "name": "テレビ",
            "irkit_url": "http://10.248.120.47/messages",
            "on_form": {"format":"raw","freq":38,"data":[テレビごとに異なり、長いので省略]},
            "off_form": {"format":"raw","freq":38,"data":[テレビごとに異なり、長いので省略]}
         }
    ]
}

設定ファイルを保存したら、またhomebridgeコマンドを実行してください。「Scan this code with your HomeKit App on your iOS device to pair with Homebridge:」とメッセージがでて、設定ファイルにて指定したpinが現れたら起動成功です。


pi@raspberrypi:~ $ homebridge
*** WARNING *** The program 'node' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see 
*** WARNING *** The program 'node' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see 
Loaded plugin: homebridge-irkit
Registering accessory 'homebridge-irkit.IRKit'
---
Loaded config.json with 1 accessories and 0 platforms.
---
Loading 1 accessories...
[テレビ] Initializing IRKit accessory...
Scan this code with your HomeKit App on your iOS device to pair with Homebridge:

    ┌────────────┐
    │ 031-46-160 │
    └────────────┘

Homebridge is running on port 51826.

HomebridgeとiPhoneの接続

iPhoneでHomekitに対応するにはHomekit対応のアプリをインストールする必要があります。
今回はInsteon+をインストールしてください。
幾つかHomekit対応のアプリはありますので、好きなものを選んでもかまいません。

また、必ずiPhoneとRaspberry Piは同じネットワークに接続していることを確認してください。
同じネットワークにないとアプリがHomekitサーバーを見つけられず追加ができなくなります。

さて、インストールしたInsteon+アプリが起動したら、右上の+ボタンからAdd a Deviceをタッチし、
先ほど起動したHomebridgeサーバーを見つけます。同じネットワークにあるなら下に名前表れます。

Kw4bhh1IZs10Gwn4xSTDy5dAVtHNlGS5zHi7vb0XG0k

Homekitアクセサリを追加しますか?と聞かれるので「このまま追加」を選択するとアクセサリを追加画面が出ます。
そうしたら「コードを手動で入力」をタップしてください。

pdVYyaa4zQeJG3kfGxbl5hzsAz9G7ZGmON49LPc1R-U

そうしたら手動でpinを入力する画面がでますので、先ほどターミナルで出たpinを入力します。
これで登録は完了です。

TcNcr9Z94w34N08bC0XpUfpyweQs2vn5KAK2OufpQys

お疲れ様でした!あとはSiriに向かって「テレビの電源をオンにして」と頼むとオンにしましたと返事をくれるはずです!
Siriはとても賢いのである程度の言い間違いや表現の違いも受け取ってコマンドを実行してくれます。IoTの未来を是非体験してください。

終わりに

以上でRaspberry PiとIRKitで部屋のリモコン家電をSiriから操作するまでの紹介でした。
ここでは紹介してませんが、Raspberry PiにセットアップしたHomebridgeというソフトウェアには様々なプラグインが存在しております。
例えば、Philips hueというLED電球を操作したり、Macの音楽を再生したり、サーバにログインしてコマンドを実行したりも可能になります。
詳しくは参考リンク先やHomeBridgeのソースコードプラグインを調べてください。夢が広がりますよ。

参考

Siriで部屋中の家電を操作できるようにして未来のお部屋を作ってみた – ワタナベ書店
http://senyoltw.hatenablog.jp/entry/2015/12/07/052951

Running HomeBridge on a Raspberry Pi
https://github.com/nfarina/homebridge/wiki/Running-HomeBridge-on-a-Raspberry-Pi

あなたにおすすめの記事