HomebridgeとWiresharkでAPI非公開の学習リモコンをHomeKit (Siri) 対応してみた

HomeKitで快適な生活を目指したいけれど、HomeKitに対応している製品はあまりないです。。。

そこで、なんとかして対応させたという話をつらつらと書きます。
同じ志のある方の知見になればと思います。
(LTのネタです。https://speakerdeck.com/tattn/ri-yao-hackdehomekittoxi-retahua)

## 学習リモコン編

カスタマイズ性のある学習リモコンといえば、[IRKit](http://getirkit.com)ですが、なかなか定価では手に入りません。。。

できるだけ安く遊んでみたかったので、[黒豆 (RM mini3)](https://www.amazon.co.jp/gp/product/B01K4B2BBA/)という格安(購入時は2500円)の学習リモコンをポチってなんとかすることにしました。(こちらも品薄です...)

アプリで操作するタイプの学習リモコンであれば大体なんとかできると思います。

## Wireshark編

情報系の大学に行くと一回は使いそうな老舗フリーソフトです。
学習リモコンにAPIがないので、これを使って専用アプリと学習リモコンの通信を読み取り、エミュレートすることにしました。

Windowsでしか使ったことがありませんでしたが、brew caskで入りました。

```
$ brew cask install wireshark
```

次にXcodeを開き、MacとiPhoneをつなぎます。
Window->Devicesを開き、接続したiPhoneを選択して、iPhoneのIdentifierをコピーします。

次に下のコマンドで仮想インターフェースを作成し、Wiresharkで読み取れるようにします。

```
$ rvictl -s <コピーしたIdentifier>
```

ここからWiresharkの出番です。
iPhoneとMacは同一のWifiに接続しておきます。

Wiresharkを起動し、先ほど作成した仮想インターフェースの`rvi0`を選択し、キャプチャを開始します。

フィルタを利用してiPhoneのIPアドレスで絞り込みます。(iPhoneのIPアドレスは設定アプリから確認できます)

![Kobito.86bTXx.png](https://qiita-image-store.s3.amazonaws.com/0/91631/8b731784-037d-3397-701c-7ce2ef0a4600.png "Kobito.86bTXx.png")

ここまでできたら、学習リモコンを操作する専用アプリを起動します。
黒豆はBroadlinkの製品なので、e-Controlというアプリでした。

専用アプリから学習したデータを送信し、その時の情報をWiresharkで読み取ります。


![Untitled1.png](https://qiita-image-store.s3.amazonaws.com/0/91631/2909ba26-b125-d36f-c818-954d78b280d5.png "Wireshark.png")

黒豆の場合はQUICプロトコルのペイロードにデータを載せて通信をしていました。

![Kobito.EXqZcx.png](https://qiita-image-store.s3.amazonaws.com/0/91631/77f16db3-3520-110f-3aa8-4408407b2d6f.png "Kobito.EXqZcx.png")

ペイロードを16進数ストリームとしてコピーしてHomebridgeで利用しました。

## Homebridge編

[Homebridge](https://github.com/nfarina/homebridge)は、HomeKitのAPIをNode.jsでエミュレートしてくれる素晴らしいツールです。

`npm`で入ります。

```
$ sudo npm install -g --unsafe-perm homebridge
```

実行します。

```
$ homebridge
```

しかし、認識したい機器 (ここでは学習リモコン) が登録されていないので、まだ何もできません。

Homebridgeにはプラグインというアクセサリ (機器) を追加する仕組みが提供されています。

例えば、有名なIRKitの場合は、下記のコマンドでインストールして、設定を記述すると操作可能になります。

```
$ sudo npm install -g homebridge-irkit
```

他にも[homebridge-plugin](https://www.npmjs.com/search?q=homebridge-plugin)でパッケージを検索すると、様々な機器用のプラグインが公開されています。

残念ながら、黒豆用のプラグインはなかったので自作しました。
https://github.com/tattn/homebridge-rm-mini3
(プラグインの作成手順は別途書こうと思っています...)

```
$ sudo npm install -g homebridge-rm-mini3
```

調べた学習リモコンのペイロードを設定ファイルに記述するとHomeKitからリモコン操作が可能になります。
設定ファイルのサンプルは[こちら](https://github.com/tattn/homebridge-rm-mini3/blob/master/config-sample.json)

```
$ vi ~/.homebridge/config.json
```

## Homeアプリ編
iOS10で登場したHomeアプリで登録すると、学習リモコンを操作できるようになりました。
またHomeアプリで登録をするとSiriでも操作可能になりました！！！

![home.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/91631/a884b79b-cf39-4d97-d361-a04024d734dd.jpeg "home.jpeg")


## 気づいたこと

機器を出来る限りこれで自動化したら楽しくなりそうだなぁというワクワク感がありました。

これを作って気が付きましたが、Homeアプリで機器を登録すると下を引っ張って出てくるコントロールセンターに3ページ目ができて、ここからも機器の操作ができました。
このショートカットはとても便利だと思います。

<img src="https://qiita-image-store.s3.amazonaws.com/0/91631/89051433-7572-7f2f-4fda-42118108f777.png" width="300px">


残念だった点はHomeKitの[Service](https://developer.apple.com/reference/homekit/hmservice)や[Characteristic](https://developer.apple.com/reference/homekit/hmcharacteristic)を既存に用意されているものではなく、自作した場合 (今回はTVのチャンネル) は公式のHomeアプリでは認識できませんでした。(2016/10/30現在)
サードパーティ製のHomeKitアプリからは利用することができました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/91631/eeb08d1a-6efd-68f4-7bfc-a138e066b5eb.png" width="300px">

<br>
こちらからは以上です。∠(｀・ω・´)