RM mini3(eRemote mini)とHomebridgeを使ってSiriでリモコン制御する

# やること

いわゆるスマートリモコン、**[RM mini3](https://www.amazon.co.jp/dp/B07JG97SW8)**を使ってSiriから家電を音声コントロールさせるところまでを解説します。RM mini3は**[eRemote mini](https://www.amazon.co.jp/dp/B01MA4W1YD)**とほぼ同じものですがeRemoteよりもずっと安く（2,500円程度）売られています(ただし多分技適がないのと、後述する日本のストアにあるアプリでは一部機能制限がかかります)。

本記事は、[別の記事](https://qiita.com/tattn/items/dc022890b686b6fd2a99)にあったWireSharkを使ってペイロードを取り出して……という方法がうまくいかなかったため新たに書き起こしました（キャプチャしたパケットを直接UDPで投げつけてもなぜかダメでした）。

# 前提

サーバーとしてローカルのWiFiに接続されているUNIXライクOSを使います。MacOSのターミナルやWindowsのUbuntu/Bashでもいけるはずです。もちろんサーバーの電源が入っている間しか使えませんので、Raspberry Piのような省電力の端末を選ぶのもよいでしょう。またnode.js/npmが使える前提で解説していくので、環境がない人は**[ここ](https://qiita.com/sinmetal/items/154e81823f386279b33c)**とか**[ここ](https://qiita.com/taketakekaho/items/dd08cf01b4fe86b2e218)**を見ながら設定しましょう。

# ペアリング

RM mini3にはボタンも何もないので、mini3からWiFiに接続するためにスマホ用のアプリを使います。Amazon Echoを購入した時最初にやるあれです。

iTunesストア(日本)にあるiPhoneアプリ**[e-Control](https://itunes.apple.com/jp/app/broadlink-e-control/id793152994?mt=8)**をダウンロードします。こいつはスマホの言語設定とRM mini3のMACアドレスを見て**機能を制限**してき~~やがり~~ますが、Homebridgeを使用するのに必要なWiFiへの接続設定までは問題なくできます(なおiPhoneの言語設定を英語にするとこの制限が外れて普通に使えます)。USアカウントをお持ちの方は[Intelligent Home Center](https://itunes.apple.com/us/app/intelligent-home-center/id1084990073?mt=8)を。日本語対応で機能制限もありません。

まずスマホをWiFiにつなぎます。なお**mini3は5GHzに対応していない**ので2.4GHzの電波を選びましょう(ここでめっちゃハマりました)。次にアプリを起動します。RM mini3をUSB電源につなぎ、USBの口の上にある小さな穴にボールペンの先やクリップなどで根気よく長押しをします。0.3/秒くらいの頻度で高速点滅しはじめたら、WiFiのパスフレーズをアプリに入力してペアリングしてください。ペアリング手順は**[ここ](http://chasuke.com/alexa-eremo/)**に詳しいです。

完了画面が出たらペアリング成功です。

# RM mini3のIPアドレスとMACアドレスを探す

**[後述する方法](https://qiita.com/canadie/items/3110a0f0ff4f4749e039#rm-mini3%E3%81%AE%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E6%8E%A2%E3%81%99)**で取得できます。うまく行かない時は下記の`ping`を使う方法を試してみてください。

<details><summary>`ping`と`arp`を使って取得する方法</summary><div>
素直にWiresharkなどを使ってもよいのですが、ネットワークからiPhoneとmini3以外の機器を切り離し、端末から片っ端から`ping`コマンドを打てば多分見つかります。iPhoneのIPアドレスはWiFi設定の詳細画面でが分かりますので、例えばiPhoneが192.168.10.5だった場合、192.168.10.[2〜20]くらい試せば当たると思います(多分)。`ping`を打つ端末をiPhoneやmini3と同じWiFiに接続するのを忘れないようにしましょう。

```
$ ping 192.168.10.3
PING 192.168.10.3 (192.168.10.3): 56 data bytes
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
↑ハズレです

$ ping 192.168.10.4
PING 192.168.10.4 (192.168.10.4): 56 data bytes
64 bytes from 192.168.10.4: icmp_seq=0 ttl=255 time=102.344 ms
64 bytes from 192.168.10.4: icmp_seq=1 ttl=255 time=146.518 ms
64 bytes from 192.168.10.4: icmp_seq=2 ttl=255 time=194.303 ms
↑何か機器がつながっています
```

IPアドレスが分かれば`arp`コマンドでMACアドレス（物理アドレス）が分かります。`arp`は`ping`コマンド使用時のキャッシュを使用するため、失敗する場合は再度`ping 'IPアドレス'`を実行してやり直してみてください。

```
$ arp 192.168.10.4
? (192.168.10.4) at 34:ea:34:40:xx:xx on en0 ifscope [ethernet]
```
</div></details>

IPアドレスとMACアドレスが判明したらそれぞれ控えておきましょう。

# homebridgeとプラグインをインストール

`nodebridge`を使っている場合はsudoは不要です。

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

一度homebridgeを起動します。

`$ homebridge`

起動したら`Ctrl-C`で一旦終了させます。こうすることで`~/.homebridge`に設定ディレクトリが出来ます。続いてプラグインをインストールします。

```
$ npm install -g homebridge-broadlink-rm
```

## RM mini3のアドレスを探す

インストールしたら、`homebridge-broadlink-rm`の配下にある`helpers/getDevice.js`でLAN上にあるRM mini3を探すことができます。`nodebrew`を使っている場合、

```
$ node ~/.nodebrew/current/lib/node_modules/homebridge-broadlink-rm/helpers/getDevice.js 
```
のようにコマンドを実行すれば、

```
Discovered Broadlink RM device at 192.168.10.4 (34:ea:34:40:XX:XX)
```

のように返答が返ってくるので控えておきましょう。上記の場合、`192.168.10.4`がIPアドレス、`34:ea:34:40:XX:XX`がMACアドレスになります。

これで`homebridge`+`RM mini3`が使えるようになります。次に設定をしていきます。`~/.homebridge/config.json`というファイルを以下の内容で作成します。

```json:config.json
{
  "bridge":{
    "name":"Homebridge",
    "username": "34:EA:34:40:XX:XX",
    "port":51826,
    "pin":"031-45-123"
  },
  "description":"Homebridge",
    "platforms": [
        {
            "platform": "BroadlinkRM",
            "name": "Broadlink RM",
            "accessories": [
                { 
                    "name": "エアコン",
                    "type": "switch",
                    "data": {
                         "on": "",
                         "off": ""
                    }
                }
            ]
       }
   ]
}
```

ここで`username`の部分をさっき調べたMACアドレスで置き換えます。またPINは適当に変更した方が良いかもしれません。ここで、MACアドレスの英字は大文字にしてください。（なおvimだと`Ctrl-v`で選択して`U`をタイプすると大文字に置き換わります）

再び起動します。

```
$ homebridge
```

QRコードのようなものが表示され待機状態になったら成功です。

あとはiPhoneの「ホーム」というプリインストールされているアプリを起動し「アクセサリを追加」でhomebridgeを追加します。

iPhone「ホーム」アプリの画面に「デフォルト…のLearn」というボタンが追加されるのでタップしてみましょう。

```logtalk:terminal
[2017-12-11 23:28:31] [Broadlink RM] Learn Code (ready)
```

と端末に出て、mini3の本体LEDが白く光ったらが赤外線信号を受信する準備ができています。mini3に向けてなにかリモコンのボタンを押してみましょう。

```logtalk:terminal
[2017-12-11 23:31:21] [Broadlink RM] Learn Code (learned hex code: 26006600091a083d091a091a081a093e081a091a091a081a091a093d083e081a091a0900060f091a083d091a091a081b081a093d093d083e093c093e081a091a083d093c08000584081a093e081a091a081b083d081b081a091a091a081a093e083e081b081a09000d050000)
```
この文字列がリモコンから発信された信号になります（パケットキャプチャで拾えるペイロードとは異なります）。ちなみにエアコンのリモコンを使うととても長い文字列になりますが、これはエアコンのリモコンが温度や風速などの情報を一度に全て送信しているためです。そのためエアコンの制御は細かく制御することが難しく、いくつかプリセットを覚えさせる必要があります。よく学習リモコンで「エアコン対応」とエアコンを特別枠にしているのはそのためです。

話がそれましたが、このリモコンの文字列（16進数列）をコピーし、`.homebridge/config.json`に

```javascript:.homebridge/config.json

    "platforms": [
        {
            "platform": "BroadlinkRM",
            "name": "Broadlink RM",
            "accessories": [
                {
                    "name": "エアコン",
                    "type": "switch",
                    "data": {
                         "on": "2600bc01713b0f0d0……",
                         "off": "2600bc01713b0e0e……"
                    }
                },
```

のようにセットしてhomebridgeを再起動するとiPhoneの「ホーム」アプリの画面からリモコンが操作できるようになっています。

この「ホーム」アプリはSiriと連携しているので、「**Hey Siri エアコンをオンにして**」というとエアコンの電源が入ります。

とりあえず以上! Enjoy!

＃まだ細かい説明を省いた状態ですが一旦公開します。

# 参考にしたもの
* [Google Homeに話しかけてエアコンを操作してみる - Qiita](https://qiita.com/miso_develop/items/204b2e16b1e58e52dc07)
* [raspberry pi でSiriからIR-KITを制御しようとしたときのトラブルメモ - Qiita](https://qiita.com/moka_r1200gs/items/513a8028b58ea348c3b3)
* [HomebridgeとWiresharkでAPI非公開の学習リモコンをHomeKit \(Siri\) 対応してみた \- Qiita](https://qiita.com/tattn/items/dc022890b686b6fd2a99)
* [スマートリモコンの価格破壊。eRemote(RM mini)なら1300円で家電をSiriで操作できる - おばかさんよね。](http://obakasanyo.net/siri-ir-remote-rm-mini3/)
* https://github.com/lprhodes/homebridge-broadlink-rm