iPhone
Node.js
RaspberryPi
IoT
homekit

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


やること

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

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


前提

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


ペアリング

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

iTunesストア(日本)にあるiPhoneアプリe-Controlをダウンロードします。こいつはスマホの言語設定とRM mini3のMACアドレスを見て機能を制限してきやがりますが、Homebridgeを使用するのに必要なWiFiへの接続設定までは問題なくできます(なおiPhoneの言語設定を英語にするとこの制限が外れて普通に使えます)。USアカウントをお持ちの方はIntelligent Home Centerを。日本語対応で機能制限もありません。

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

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


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

後述する方法で取得できます。うまく行かない時は下記のpingを使う方法を試してみてください。

pingarpを使って取得する方法




素直に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アドレス(物理アドレス)が分かります。arppingコマンド使用時のキャッシュを使用するため、失敗する場合は再度ping 'IPアドレス'を実行してやり直してみてください。

$ arp 192.168.10.4

? (192.168.10.4) at 34:ea:34:40:xx:xx on en0 ifscope [ethernet]


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というファイルを以下の内容で作成します。


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」というボタンが追加されるのでタップしてみましょう。


terminal

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


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


terminal

[2017-12-11 23:31:21] [Broadlink RM] Learn Code (learned hex code: 26006600091a083d091a091a081a093e081a091a091a081a091a093d083e081a091a0900060f091a083d091a091a081b081a093d093d083e093c093e081a091a083d093c08000584081a093e081a091a081b083d081b081a091a091a081a093e083e081b081a09000d050000)


この文字列がリモコンから発信された信号になります(パケットキャプチャで拾えるペイロードとは異なります)。ちなみにエアコンのリモコンを使うととても長い文字列になりますが、これはエアコンのリモコンが温度や風速などの情報を一度に全て送信しているためです。そのためエアコンの制御は細かく制御することが難しく、いくつかプリセットを覚えさせる必要があります。よく学習リモコンで「エアコン対応」とエアコンを特別枠にしているのはそのためです。

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


.homebridge/config.json


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

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

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

とりあえず以上! Enjoy!

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


参考にしたもの