Google Homeとスマートでない家電を接続する

# 1. はじめに
Google Homeを買ったので、いろいろと接続してみようと思ったのですが、残念ながら家にある家電たちはあまりスマートでなくつながりませんでした。いろいろと調べてみたところ、Broadlink RM mini3という安価で面白そうなデバイスがスマートリモコンとして使えそうだったので、さっそく [GearBest](https://www.gearbest.com/)で購入して試してみることにしました。

![rm_mini_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/171276/72c5f61c-7318-e52f-4de3-85e6f593d284.jpeg)


# 2. 解説
## 2.1 使ったもの
- Google Home
- Broadlink RM mini3: 赤外線リモコンをエミュレートするデバイス
- Broadlink RM Server for IFTTT control: RM mini3を外部から操作するためソフトウェア
- iPhone + HomeBridge: 通信をキャプチャするために使用
- Raspberry Pi: Broadlink RM Server for IFTTT control、HomeBrigeを動かす環境として使用
- IFTTT: Google HomeからBroadlink RM Serverへ中継させるための仕組み
- ngrok: 外部から家のサーバへ接続させるための仕組み

最終形は、Google Home ⇒ IFTTT ⇒ ngrok ⇒ Broadlink RM Server for IFTTT control⇒RM mini3という形になります。


## 2.2 ステップ
大きく分けて、①RM mini3で機器を制御できるようにする、②Google HomeとRM mini3を接続する、という2つのステップで実現します。

### 2.2.1 RM mini3で機器を制御できるようにする
RM mini3の通信をキャプチャし、キャプチャしたRM mini3コマンドをサードパーティアプリへ埋め込みます。キャプチャおよびサードパーティアプリを動かすために、Node.jsの環境が必要です。今回は手元にあったRaspberry Piを使いました。

#### 2.2.1.1 Node.jsのバージョン
Node.jsは以下のバージョンを使いました。

```
$ node -v
v7.10.1
$ npm -v
4.2.0
```

#### 2.2.1.2 サードパーティアプリ
RM mini3を制御できるサードパーティアプリはいくつかありますが、今回はBroadlink RM Server for IFTTT controlをメインとして、Homebridge RM mini3をキャプチャ用に使用しました。

|アプリ    |特徴    |
|:--------|--------|
|[Broadlink RM Server for IFTTT control](https://github.com/jor3l/broadlinkrm-ifttt)|node.jsのアプリ、ngrokを使用してIFTTT連携が可能|
|[Homebridge RM mini3](https://github.com/tattn/homebridge-rm-mini3)|Homebridgeのplugin、Qiitaに日本語の情報がある([HomebridgeとWiresharkでAPI非公開の学習リモコンをHomeKit (Siri) 対応してみた](https://qiita.com/tattn/items/dc022890b686b6fd2a99))|
|[Homebridge Broadlink RM](https://github.com/lprhodes/homebridge-broadlink-rm)|Homebridgeのplugin、Broadlinkデバイスを自動で発見できる、通信のキャプチャができる、対応しているHomeKitアクセサリの種類が多い|


#### 2.2.1.3 RM mini3のコマンドのキャプチャ
まず、Homebridge Broadlink RMを使い、iPhoneのホームアプリから学習モードにしてリモコンをエミュレートさせるためのコマンドをキャプチャします。

```
# HomeBridgeのインストール
$ npm install -g homebridge

# Homebridge Broadlink RMのインストール
$ npm install -g homebridge-broadlink-rm
```

学習モードをオンにするだけなので、設定ファイルは枠だけで大丈夫です。

```~/.homebridge/config.json
{
    "bridge": {
        "name": "Homebridge",
        "username": "RM3 miniのMACアドレス",
        "port": 51826,
        "pin": "XXX-XX-XXX"
    },
    "description": "Homebridge",
    "platforms": [
        {
            "platform": "BroadlinkRM",
            "name": "Broadlink RM",
            "accessories": [
                {
                    "name": "TV",
                    "type": "switch",
                    "data": {
                         "on": "",
                         "off": ""
                    }
                }
            ]
        }
    ]
}
```

```
# homebrdigeを起動
$ homebridge
```

この状態で、iPhoneからHomeアプリを起動すると、アクササリのところに"Default Room Learn"というボタンが出てきます。このボタンを押してRM mini3を学習モードに設定し、リモコンを操作するとコンソールにRM mini3の制御するためのコマンドのキャプチャが表示されます(下記XXXXXXXXの部分)。

<img width="328" alt="home_learn.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/171276/560c0e29-9585-a18b-8244-1eb7cde3c7c5.png">

コンソール画面

```
...
[10/29/2017, 9:32:43 AM] [Broadlink RM] Learn Code (ready)
[10/29/2017, 9:32:50 AM] [Broadlink RM] Learn Code (learned hex code: XXXXXXXX)
[10/29/2017, 9:32:50 AM] [Broadlink RM] Learn Code (complete)
[10/29/2017, 9:32:50 AM] [Broadlink RM] Learn Code (stopped)
...
```


#### 2.2.1.4 Broadlink RM Server for IFTTT controlのインストールと設定
```
# homebridge-broadlink-rmのインストール
$ npm install -g homebridge-broadlink-rm
```

```~/.homebridge/config.js
module.exports = [{
        "command": "TV_On",
        "secret": "任意の文字列(パスワード)",
        "ip": "RM mini3のIPアドレス",
        "data": "キャプチャしたデータを埋め込み"
}];
```

```
# サーバの起動
$ npm start
```
これでRM3 mini側のセットアップは完了です。このタイミングで、postman等を使ってHTTP Postで通信できることを確認しておくとよいでしょう。


### 2.2.2 Google Homeとの連携
Google HomeはIFTTTと連携させることができるため、Google Home ⇒ IFTTT ⇒ ngrok ⇒ Broadlink RM Server for IFTTT controlという流れで連携します。

#### 2.2.2.1 IFTTTとBroadlink RM Server for IFTTT controlの連携
IFTTTから家のサーバに接続するため、ngrokを使用します。ngrokを使用すると、接続のための専用のパブリックなURL(下記 https://XXXXX.ngrok.io の部分)が用意されるため、このURLに対してIFTTTから接続します。

```
# ngrokを起動
$ ngrok http 1880
Session Status                online
Version                       2.2.8
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://XXXXX.ngrok.io -> localhost:1880
Forwarding                    https://XXXXX.ngrok.io -> localhost:1880
```

#### 2.2.2.2 Google HomeとIFTTTの連携
IFTTTには、[Google Assisitantとの連携機能](https://ifttt.com/google_assistant)が用意されていて、任意のキーワードからIFTTTのアクションを起動できるようになっています。

①トリガの作成
"Say a simple Phrase"を使い、話しかけるキーワードを設定します。
<img width="270" alt="ifttt_trigger.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/171276/8572b3b6-d0a9-486e-9ee9-ff360b48b290.png">

②アクションの作成
URL, Method, Content Type, Bodyを設定します。
<img width="273" alt="ifttt_action.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/171276/aa708ab2-638a-7813-d8ee-ab2b90987180.png">


これで、Google Homeに「テレビ」と話しかけると、テレビのon/offができるはずです。最初は「テレビをつけて」というキーワードにしたのですが、そうするとGoogle Homeのデフォルトのテレビ連携機能が動作してしまい、IFTTTに連携できませんでした。

# 参考
- [スマートリモコンの価格破壊。eRemote(RM mini)なら1300円で家電をSiriで操作できる](http://obakasanyo.net/siri-ir-remote-rm-mini3/)
- [Google HomeにつぶやくとTwitterでつぶやくやつ、IFTTTですぐできた。](https://qiita.com/kazunori279/items/fdadbfde58ed133bb9d5)
- https://medium.com/@drkatnz/home-automation-with-a-broadlink-rm-mini-3-and-google-home-712faa074254