GoogleHomeとminIRumを連携

# OK! Google 電気をつけて
9月19日、20日に行われたGoogle Cloud NEXT 18に参加してました。
ブレイクアウトセッションをメインに聴講してたので
すっかりGoogleHomeの魅力に憑りつかれました。

なので以前作ったminIRumをGoogleHomeと連携させてみました。

# minIRumとは？
9SQさんがOSSで公開してるIRkitの機能限定版？です。
[github - minIRum](https://github.com/9SQ/minIRum)
[ミニマルなIRKitクローンを作ってiOSから家電を制御する](http://eleclog.quitsq.com/2016/09/minirum.html)

元々はhomebridge + iOSを使用する想定で作られていたので
Google Assistantとの連携は色々回り道しましたのでここに残しておきます。

# やったこと
結論から言えばIFTTTでwebhookを呼んでbeebotteを経由しnode-redからcurlをたたくイメージです。
node-redの環境は自宅サーバとして動いてるubuntu 16.04を使っています。
もちろんスマートにラズパイでも動くはずです。
とりあえずnode-redが動く環境があれば大丈夫です。

# 実行環境
```
// サーバ
ubuntu 16.04

// ソフト・サービス
node-red (2.2.8)
beebotte
ifttt

// デバイス
google home mini
minIRum
```
# やり方
Google Assistant　→　IFTTT → beebotte → node-red → minIRum

## IFTTT → beebotte → node-redの道順を作る
Google AssistantとIFTTTとbeebotteの連携は前例が山ほどあったので省略します。
参考にしたのは以下の記事です。
[IFTTTとBeebotteを使ってGoogleHomeからRaspberryPiを操作する](https://qiita.com/msquare33/items/9f0312585bb4707c686b)
[IFTTTのトリガーおよびアクションをESP8266で実行する](https://qiita.com/mayfair/items/e761c788a9d8787bc610)
[IFTTT から Raspberry Pi に指示を出す](https://qiita.com/minatomirai21/items/4c4e777b43ede1e42900)

とにかくGoogleHomeを声で操作してnode-redを呼び出せればあとはなんでもできそうです。

## node-redでGUIプログラミング
初めて触ったnode-redでしたがGUIのおかげで覚えるのはそこまで苦労しませんでした。
とりあえず動かしたい人は以下を参考にしてもらえればと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257410/b2caa977-b0ca-89a1-01b2-659059ac6b56.png)

beebotteのレスポンスをmqttで受けて動作するようにin mqttを設定
IFTTTには以下のイメージの通りでjson形式のコマンドを送らせています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257410/b36f6c57-0053-ea35-59c9-df8561f7242c.png)

dataキーに

* All lights
* Lights off
* Night light
* Favorite
* Dark
* Brightky

を渡せるようにIFTTTのレシピを分けます。

その後コマンド判定のFunctionでどの赤外線コードを呼ぶかを分岐させています

```javascript:コマンド判定

msg.headers = {"content-type":"application/json"};

switch (msg.payload.data) {
    case 'All lights': // 全灯
        msg.payload = {
            "format": "raw",
            "freq": 38,
            "data": [9000, 4450, ...]
        };
        break;
    case 'Lights off': // 消灯
        msg.payload = {
            "format": "raw",
            "freq": 38,
            "data": [9000, 4450, ...]
        };
        break;
    case 'Night light': // 常夜灯
        msg.payload = {
            "format": "raw",
            "freq": 38,
            "data": [9000, 4450, ...]
        };
        break;
    case 'Favorite': // お気に入り
        msg.payload = {
            "format": "raw",
            "freq": 38,
            "data": [9000, 4450, ...]
        };
        break;
    case 'Brightly': // 明るく
        msg.payload = {
            "format": "raw",
            "freq": 38,
            "data": [9000, 4450, ...]
        };
        break;
    case 'Dark': // 暗く
        msg.payload = {
            "format": "raw",
            "freq": 38,
            "data": [9000, 4450, ...]
        };
        break;
    default:
        msg.payload = {
            "format": "raw",
            "freq": 38,
            "data": []
        };
        break;
}
return msg;
```

コマンドの数は各自の操作する赤外線リモコンに合わせて変更してください。
もちろん赤外線コードもです。

minIRumではpostで赤外線の操作をしているので
msg.headersにjsonのcontent-typeを渡しています。

node-redでPOST送信する時に躓きやすいポイントらしいので気を付けてください
そのあと機能にあるhttp requestのブロックをつないで
メソッドをPOST
URLにhttp://ローカルにあるminIRumのアドレス/messages
を設定します。

これで設定は完了します

# まとめ
殴り書きですみません。
まとめられるほど記事がまだまとまってないので時間を見て随時更新していきます。
何かのきっかけになれば幸いです。

編集リク、コメントで間違えている個所あれば是非教えてください。