iOS10の「ホーム」アプリを使って家電を操作出来る様にしてみました。Node.js(一部Python)でサーバーを立てるだけで外出先からエアコンを点けたり消したり出来る様になりましたのでまとめてみます。
環境
- Raspberry Pi3 と Raspberry Pi2
- raspbian-jessie(4.4)
- Node.js(6.6.0)
- Python(2.7.9)
- git(2.2.2)
- irMagician
- 大宮技研の赤外線リモコンシステム
- Swich Scienceで購入
- Appleの機器
- iPhone6S(iOS10.0.1)
- AppleTV第3世代(7.2.1)
仕組み
Appleが推奨するHomekit対応のホームオートメション家電(Philips Hueなど)をiOSの「ホーム」アプリに登録することで、同じWifi内のiOS端末から電源のオンオフなどを操作することができる様になります。
更に、AppleTVやiPadのiCloudアカウントを利用して外部の回線からそれらの家電を操作することが出来ます。
Homekitを利用してそれらは開発されているのですが、Node.jsを利用したAPIライブラリが公開されています。
これを利用してRaspberry PiにNode.jsでサーバーを立て、iOSからのリクエストに対して実行処理を行うことが出来ます。
「irKit」などの学習リモコンに実効処理を行う際はHTTPリクエストが必要になりますが、今回はRaspberry Piに接続した赤外線リモコンシステム「irMagician」を利用するのでコマンドラインから直接家電を操作することが出来ます。
「irMagician」の接続が出来れば記述はシンプルに行えます。homebridgeからコマンドラインを操作するプラグインを作ってくれた方がいますのでそちらを使わせていただきます。
では早速取り掛かります。
irMagician
登録したいリモコンの赤外線をスキャンして、その赤外線データをjsonデータに書き出すことが出来ます。コマンドラインからjsonデータを照射することができる様になります。
こちらを利用します。RaspberryPiのデフォルトで入っている2系で動作します。適当なディレクトリを作り、以下をインストール。
$ git clone https://github.com/netbuffalo/irmcli.git
必要なライブラリをインストールします。
$ sudo apt-get install python-pip
$ sudo pip install pyserial
これでスキャン・照射が可能になります。
これはおもちゃのR2D2のリモコンをスキャンしているところなのですが、コマンドラインで以下の様にしてスキャンします。(irmcli.py
をirm.py
へ名前を変更しています。)
$ sudo python irm.py -c
これをjsonファイルとして書き出します。
$ sudo python irm.py -s -f r2d2_on.json
こんな感じでjsonファイルが生成されます。
{"postscale": 100, "freq": 38, "data": [51, 1, 29, 31, 6, 9, 5, 9, 6, 9, 6, 16, 6, 8, 6, 16, 168, 31, 6, 9, 5, 8, 5, 9, 6, 16, 5, 9, 5, 16, 194, 32, 6, 9, 6, 9, 6, 9, 6, 16, 6, 9, 6, 16, 168, 31, 5, 9, 6, 9, 6, 9, 6, 16, 6, 9, 6, 16, 194, 32, 5, 9, 5, 9, 6, 9, 5, 16, 5, 8, 6, 16, 167, 32, 5, 9, 5, 9, 5, 9, 6, 16, 6, 9, 5, 16, 194, 32, 5, 9, 5, 9, 5, 9, 5, 16, 5, 9, 6, 16, 168, 31, 5, 9, 6, 9, 6, 9, 6, 16, 6, 9, 5, 16, 193, 31, 6, 9, 5, 9, 6, 9, 5, 16, 6, 8, 6, 16, 168, 31, 6, 9, 6, 8, 6, 8, 6, 16, 6, 8, 6, 16, 192, 31, 6, 8, 6, 8, 6, 8, 6, 15, 6, 8, 6, 16, 168, 30, 6, 8, 6, 8, 6, 8, 7, 16, 6, 8, 6, 16, 193, 31, 6, 8, 6, 8, 6, 8, 6, 16, 6, 8, 6, 15, 169, 30, 6, 8, 6, 8, 6, 8, 6, 16, 6, 8, 6, 16, 194, 31, 6, 8, 6, 8, 6, 8, 7, 15, 6, 8, 6, 16, 169, 29, 7, 8, 7, 7, 7, 8, 6, 16, 6, 8, 6, 15, 154, 31, 6, 8, 6, 8, 6, 15, 6, 15, 6, 16, 7, 15, 168, 30, 7, 7, 7, 7, 7, 15, 7, 15, 7, 16, 6, 15, 196, 29, 7, 7, 7, 7, 6, 16, 6, 15, 7, 15, 6, 16, 169, 30, 7, 8, 6, 8, 6, 16, 6, 15, 7, 15, 6, 16], "format": "raw"}
このファイルはこの様に実行します。
$ sudo python irm.py -p -f r2d2_on.json
必要なリモコンな情報はこの段階でまとめてjsonファイルにしてしまいます。
さて、このコマンドラインを「ホーム」経由で実行できる様にします。
homebridge
必要なライブラリを入れます。
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
$ sudo apt-get install libavahi-compat-libdnssd-dev screen
グローバル領域にインストール後、実行します。
$ sudo npm install -g homebridge
$ homebridge
ここでは設定ファイルconfig.json
が設定されていませんが、実行することで、.homebridge
フォルダが生成されるので、ここにconfig.json
を設置します。
homebridge-cmd
config.json
を設置する前にコマンドラインを実行させるプラグインをインストールします。
$ sudo npm install homebridge-cmd -g
プラグインもグローバル領域にインストールします。プラグインのサンプルを基に設定をしていきます。
username
でIPアドレスを設定するので、ifconfig
で調べておくと良いでしょう。
{
"bridge": {
"name": "Raspi3_Jules",
"username": "B8:27:EB:9C:0D:20",
"port": 51821,
"pin": "031-45-155"
},
"description": "papa's Room",
"accessories": [
{
"accessory": "CMD",
"name": "電気",
"on_cmd": "sudo python /home/pi/irm/irm.py -p -f /home/pi/irm/stand_on.json && sudo python /home/pi/irm/irm.py -p -f /home/pi/irm/light_on.json",
"off_cmd": "sudo python /home/pi/irm/irm.py -p -f /home/pi/irm/stand_off.json && sudo python /home/pi/irm/irm.py -p -f /home/pi/irm/light_off.json"
},
{
"accessory": "CMD",
"name": "ドロイド",
"on_cmd": "sudo mpg321 /home/pi/irm/sounds/r2d2_1.mp3 && sudo python /home/pi/irm/irm.py -p -f /home/pi/irm/r2d2_on.json",
"off_cmd": "sudo mpg321 /home/pi/irm/sounds/r2d2_2.mp3 && sudo python /home/pi/irm/irm.py -p -f /home/pi/irm/r2d2_off.json"
}
]
}
テンプレートに沿って設定すれば良いのですが、ポイントがいくつかあります。bridge
にあるusername
は上述のようにIPアドレスを入力します。その他は任意で入力すれば良いでしょう。
accessories
の中にある、accessory
のみ注意が必要です。プラグイン毎に指定するワードが異なります。(ここではCMD
)
Node.jsのchild_process
を利用するのでパイプでコマンドをつなげることも可能です。「ホーム」側でアクセサリのグループ化は行えるのですが、一緒に実行したいこと(ここではR2D2のおもちゃを動かすのと音声の再生をパイプでつないでいます)はこの時点でまとめることも可能です。
赤外線受信のタイミングによってはエラーになることもあるので、パイプを使って、時間差を考えて処理をするのもアリだと思います。(ここでは時間の掛かる電気スタンドを先に、照明を後に点灯させています。)
実行後こんな表示がされれば成功です。
$ 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 <http://0pointer.de/avahi-compat?s=libdns_sd&e=node>
*** 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 <http://0pointer.de/avahi-compat?s=libdns_sd&e=node&f=DNSServiceRegister>
[9/19/2016, 12:09:20 AM] Loaded plugin: homebridge-cmd
[9/19/2016, 12:09:20 AM] Registering accessory 'homebridge-cmd.CMD'
[9/19/2016, 12:09:20 AM] ---
[9/19/2016, 12:09:20 AM] Loaded config.json with 2 accessories and 0 platforms.
[9/19/2016, 12:09:20 AM] ---
[9/19/2016, 12:09:20 AM] Loading 2 accessories...
[9/19/2016, 12:09:20 AM] [電気] Initializing CMD accessory...
[9/19/2016, 12:09:20 AM] [ドロイド] Initializing CMD accessory...
Scan this code with your HomeKit App on your iOS device to pair with Homebridge:
┌────────────┐
│ 031-45-155 │
└────────────┘
[9/19/2016, 12:09:20 AM] Homebridge is running on port 51827.
iOS側でアクセサリを追加するとこんな画面になると思います。
これで成功です。
homebridgeのデーモン化はNode.jsのライブラリPM2
を利用しました。
まとめ
ラズパイを2台づつ用意して、1台は居間に・もう一台は自分の部屋に設置してみました。
自室は4畳半ほどの狭い部屋なので赤外線が部屋じゅうに届きますが、居間はテレビ・エアコン・照明全部に赤外線を当てようとすると工夫が必要ですね。(部屋のど真ん中にラズパイを置く羽目になる)
意外と照射角は狭く、距離も短いです。(3m位かな)
この冬にはirKitの後継機種が発売だそうです。温湿度計と連動して操作ができるみたいなんで、湿度に合わせて加湿器をオンオフさせたり出来ると便利だな。と思います。