「OK, Google」から部屋の複数の照明を全部消す

この記事は [JustSystems Advent Calendar 2017](https://qiita.com/advent-calendar/2017/justsystems)  18日目の記事です。

# はじめに
<div align="center">
<img width=250 src="https://qiita-image-store.s3.amazonaws.com/0/120113/9037c1b7-8904-462d-d183-daa5385b85ec.png">
</div>
おうちハック初心者ながら、発売前から気になっていたスマートスピーカー。先日、我が家にも**GoogleHomeMini**さんがやってきました。（当然¥6,000の時に飛びついて購入したのですが、最近安くなったので勢いでもう一台購入…。）

いろいろな諸先輩方が面白い使い方をなさってるので、自分は初心に戻ってオーソドックスな使い方を紹介したいと思います。

# IRKitで部屋の照明を消す
今住んでいる部屋では、以前から[IRKit](http://getirkit.com/)を使ってスマホから部屋の照明を操作できるようにしていました。IRKitはスマホアプリやWebAPIを経由して、学習したリモコンの信号を飛ばせるデバイスです。現在は、[Nature Remo](http://nature.global/)という後継機が発売されています。

`アプリ上でボタンを押す` → `IRKit本体から赤外線信号が飛ぶ` → `部屋の照明が消える`

<img width=600 src="https://qiita-image-store.s3.amazonaws.com/0/120113/f7930888-4ff3-ca31-b7e8-7fc720e58342.png">

というように、赤外線リモコンを利用した機器であれば操作することが可能です。

アプリから部屋の照明を消せて便利なのですが、今の部屋には３つの照明が…。リモコン対応のシーリングライト、リモコンコンセントに繋がった間接照明、リモコン操作可能のベッドライトと、すべてIRKitから操作できるので消せるには消せますが3つのボタンをそれぞれ押すのは面倒くさい。ましてや３回も「OK, Google」って言うくらいなら手で消したほうが早そうです。

せっかく音声操作に切り替えるのだから、ここは解決する必要がありました。

# IFTTTと連携してGoogleHomeからIRKitを操作
まずはGoogleHomeからIRKitを経由して電気を消すまでを準備。GoogleHome自体にはIRKitを操作する機能はありませんが、GoogleHomeから[IFTTT](https://ifttt.com/)を経由してIRKitを操作することが可能なのでそれを採用します。

## GoogleHome側の設定
IFTTTで新しいAppletのifの方に**Google Assistant**を設定します。これでお使いのGoogleHomeからIFTTT経由で別のサービスを利用できるようになります。
今回は音声に対して単純な操作を行うだけなので、トリガーには`Say a simple phrase`を選択。GoogleHomeがキーワードに反応して**何か**してくれます。

トリガー側はだいたいこんな感じで設定
<img width=300 src="https://qiita-image-store.s3.amazonaws.com/0/120113/557c1d1d-e940-8ad0-3049-eef75a9e3a71.png">


**What do you want to say?**
`電気消して`
なんというキーワードに反応するかを指定します。

**What's another way to say it?(optional)**
`明かり消して`
別のキーワードを指定できます。GoogleHomeが認識する音声で漢字仮名遣いがブレる場合があるようなので、認識したりしなかったりがある場合はここでひらがな表記も指定します。

**And another way?(optional)**
`照明消して`
さらに別のキーワードを指定できます。

**What do you want the Assistant to say in response？**
`照明を消します`
このトリガーを認識した際に、GoogleHomeに喋らせる内容を指定します。なんでも好きなセリフをどうぞ。

**Language**
`Japanese`
言語を指定します。

## IRKit側の設定
IFTTTにはIRKitそのもののサービスはありませんが、**Webhooks**を使用してIRKitのWebAPIを叩くことで操作できます。
WebhooksのBodyでIRKitのクライアントキーとデバイスID、そしてリモコンの赤外線信号を指定することで実現できます。

**URL**
`https://api.getirkit.com/1/messages`
**Method**
`POST`
**Content Type(optional)**
`application/x-www-form-urlencoded`
**Body(optional)**
`clientkey=xxx&deviceid=xxx%message={xxx}`
（xxxに固有の文字列を指定します）

# GoogleAppsScriptに頼る
さて、単純にIFTTT連携しただけではまだ3回「OK, Google」する必要があります。そこで、GoogleAppsScript(GAS)を利用します。
GoogleAppsScriptを使うと、めんどうな環境構築や月額利用料金なしで、簡単に無料でWebAPIを作成することができます。

`IFTTTからGASを叩く` → `GASからIRKitのAPIを３つ分叩く` → `3つの照明がそれぞれ消える`
<img width=800 src="https://qiita-image-store.s3.amazonaws.com/0/120113/c504497c-796e-1d0e-932c-123f9da2fee0.png">


上記のような構成で、先ほどIFTTTからWebhooksで叩いていたIRKitの操作はGASにおまかせして、IFTTTからはそのGASのメソッドを呼び出すように変更します。
というわけで、簡単に以下のようなWebAPIを作成。

```js
function doPost(event) {
  function send(key) {
    sendHttpPost(照明１の赤外線信号);
    sendHttpPost(照明２の赤外線信号);
    sendHttpPost(照明３の赤外線信号);
  }
}
function sendHttpPost(message){
   var payload =
   {
     "clientkey" : 取得したクライアントキー,
     "deviceid" : 取得したデバイスID,
     "message" : message   
   };

   var options =
   {
     "method" : "post",
     "payload" : payload
   };

  UrlFetchApp.fetch("https://api.getirkit.com/1/messages", options);
}
```

IFTTTで設定したWebhooksのURLを**上記のAPIを呼び出すよう変更して設定する**と、GoogleHomeからGASを経由してIRKitまで貫通します。


# 「おやすみ」で寝る準備
ようやく準備ができたので、Google Assistantのトリガー側も以下のように変更して確認。

<img width=300 src="https://qiita-image-store.s3.amazonaws.com/0/120113/21b9bc63-f384-95ce-06fd-a67457fb78c7.png">


寝床に入ってから**「OK， Google。おやすみ。」**と声をかけると、部屋中の照明をそれぞれ消してくれるようになりました。いたわりの言葉も掛けてくれます！
3回分IRKitに対してAPI経由で操作を行っていますが、IRKit自体は順番に1つずつ赤外線信号を送信してくれます。なので、リモコン信号が混線する…といったこともなく徐々に部屋の照明が落ちていい感じになりました。

<img width=1000 src="https://qiita-image-store.s3.amazonaws.com/0/120113/c8b68886-3d2e-f4c2-39f0-515d39b71b41.png">
# おわりに
何番煎じの記事かわかりませんが、GoogleHomeの音声認識を使って複数の機器を操作する方法を紹介しました。GoogleHomeでできることは技術的に限られていますが、サービスや他のデバイスとの組み合わせを工夫し、何をさせるかということについてはまだまだ予知がありそうです。みなさんのアイデアを楽しみにしています！

今回オーソドックスな記事に落ち着いてしまったのは、いろいろやりたいことができなかったわけで…。また別の機会に記事を投稿しようかと思います。
ここまでお読みいただき、ありがとうございました。