Google Home＋IFTTTで、お手軽に家電コントロール

一昨日は、[Google HomeでつぶやくとTwitterでつぶやく連携](https://qiita.com/kazunori279/items/fdadbfde58ed133bb9d5)がうまく動いた。これでかなり楽しくなってしまい、昨日は[IFTTTのGoogle Assistant連携](https://ifttt.com/google_assistant)で家電をコントロールする方法をいろいろ試してみた。Home三昧の三連休である。

今回紹介するのは以下の2つ。

- Belkin WeMoで家電のAC電源をオンオフ
- IRKitで家電をリモコン制御

WeMoの方は、何も考えずにあっという間に設定できる。IRKitの方は若干のコマンド操作が必要だが、それでも15分くらいで終わる。

ちなみに、IRKitの方で使うIFTTTの[Webhooks](https://ifttt.com/maker_webhooks)は、HTTP/HTTPSで任意のURLを呼べるアクションである。家電のコントロールは使い方の一例にすぎず、REST APIを備えるいろんな対象を制御できてしまう。Google Home＋IFTTT、なんて強力なのだ。

![47D3977A-B674-4AA9-B1EA-2A84E2C23588.jpeg](https://qiita-image-store.s3.amazonaws.com/0/38290/b9911675-e0c3-4b60-493f-0b59e6be2552.jpeg)
IRKit


## Belkin WeMoで家電をオンオフ

[Belkin WeMo](http://www.belkin.com/us/Products/home-automation/c/wemo-home-automation/)はBelkinが販売するホームオートメーション製品。WiFi経由でAC電源をオンオフするモジュールや、電球の明るさを調節するモジュールなどがあり、日本でも[Amazonで購入](http://amzn.asia/8fvvZSF)できる。

![](https://images-na.ssl-images-amazon.com/images/I/31Hm-2cMnyL.jpg)

普通はWeMoのスマホアプリからオンオフして使うのだが、IFTTT連携にも対応しており、「Google Assistantでトリガー→WeMoの指定デバイスをオンオフ」するAppletも簡単に作れる。Google Assistantをトリガーとする設定は[前回説明した方法](https://qiita.com/kazunori279/items/fdadbfde58ed133bb9d5#ifttt%E3%81%AEapplet%E3%82%92%E4%BD%9C%E3%82%8B)と同じ。ただし、今回は`Say a simple phrase`を選択して、固定のフレーズに反応してトリガーを起動する設定にする。

<img width="340" alt="Screen Shot 2017-10-08 at 9.46.35 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38290/258506a8-c4dd-1bd7-e6a5-1e571cbf1316.png">

こののトリガーで起動する先としてWeMoを選択すると、WeMoで実行できるアクションの選択肢が表示される。

<img width="970" alt="Screen Shot 2017-10-08 at 9.38.47 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38290/4c15268a-9247-ad1f-9a45-f9e5fc50c046.png">

ここで`Turn on`を選び、電源オンしたいデバイスを指定する。

<img width="453" alt="Screen Shot 2017-10-08 at 9.39.01 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38290/475e5a18-22b7-3209-01dd-6ccc7f3c1b6d.png">

設定はこれだけ。`Finish`をクリックしてAppletを登録すれば、すぐにGoogle Homeで使えるようになる。

## IRKitで家電をリモコン制御

続いて、[IRKit](http://getirkit.com/)を使って赤外線リモコンに対応した家電を制御してみよう。IRKitはWiFiの付いた赤外線リモコンで、家電のリモコンの赤外線信号を学習させ、スマホアプリからコントロールできる。こちらも[Amazonから購入](http://amzn.asia/cd1qxtv)できる（ちょっとお高い）。

![](http://getirkit.com/images/composition.png)

我々がIRKitにそそられる点は、とてもお手軽な[REST API](http://getirkit.com/#IRKit-Device-API)が公開されていること。このAPIをIFTTTのWebhooksから呼び出せば、Google Homeを使ったリモコン制御を簡単に行える。

### IRKitのdeviceidとclientkeyを取得する

まずは、IRKitのマニュアルにしたがって専用アプリを使いWiFiに接続しておく。つづいて、APIドキュメントを参考に、以下の手順で`deviceid`と`clientkey`を取得する。

まずはIRKitのIPアドレスを調べよう。コンソールから以下のコマンドを実行すると、BonjourでIPアドレスを取得できる。

```
$ dns-sd -B _irkit._tcp
Browsing for _irkit._tcp
DATE: ---Sun 08 Oct 2017---
18:49:43.251  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
18:49:47.965  Add        2   5 local.               _irkit._tcp.         irkit6ff6

$ dns-sd -G v4 iRKit6ff6.local
DATE: ---Sun 08 Oct 2017---
18:52:17.599  ...STARTING...
Timestamp     A/R Flags if Hostname                               Address                                      TTL
18:52:18.316  Add     2  5 irkit6ff6.local.                       192.168.1.140                                10
```

つづいて、このIPアドレスを使って`clienttoken`を取得。

```
$ curl -i "http://192.168.1.140/keys" -d '' -H "X-Requested-With: curl"

HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/3.0.0.0.g85190b1
Content-Type: text/plain

{"clienttoken":"***clienttokenが入る***"}
```

この`clienttoken`を使い、IRKitのAPIサーバーから`deviceid`と`clientkey`を取得する。この2つはどこかにメモしておこう。

```
$ curl -i -d "clienttoken=***clienttokenが入る***" "https://api.getirkit.com/1/keys"

HTTP/1.1 200 OK
Server: openresty
Date: Sun, 08 Oct 2017 09:54:43 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 94
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
X-Content-Type-Options: nosniff

{"deviceid":"***deviceidが入る***","clientkey":"***clientkeyが入る***"}
```

これで`deviceid`と`clientkey`が手に入ったので、これらを使いIRKitのAPIサーバー経由でIRKitの機能をいろいろ呼び出せる。

### 赤外線信号を読みとる

では、家電のリモコンの赤外線信号を読み取ろう。以下のコマンドを実行すると、IRKitが外部からの赤外線信号を待機する状態になる。

```
$ curl -i "https://api.getirkit.com/1/messages?clientkey=***clientkeyが入る***&clear=1"
```

ここで家電のリモコンをIRKitに向けて読み取りたいボタンを押すと、以下のように赤外線信号を表す`message`プロパティを含むJSONが返る。

```
HTTP/1.1 200 OK
Server: openresty
Date: Sun, 08 Oct 2017 09:56:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 896
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
ETag: "-1823812453"
X-Content-Type-Options: nosniff

{"message":{"format":"raw","freq":38,"data":[4713,1037,2451,1073,1319,1037,2451,1037,1319,1037,2451,1037,1319,1037,1319,1037,2451,1073,1275,1073,1275,1073,1275,1073,1275,56112,4713,1073,2451,1073,1275,1073,2451,1037,1319,1037,2451,1073,1275,1073,1275,1073,2451,1037,1319,1073,1319,1073,1319,1073,1319,56112,4713,1037,2451,1037,1275,1073,2451,1037,1319,1037,2451,1073,1319,1073,1319,1073,2451,1037,1319,1073,1319,1073,1319,1073,1319,56112,4713,1073,2451,1073,1275,1073,2451,1037,1319,1037,2451,1073,1275,1073,1275,1073,2451,1037,1319,1073,1319,1073,1319,1073,1319,56112,4713,1037,2451,1037,1275,1073,2451,1037,1319,1037,2451,1073,1275,1073,1275,1073,2451,1037,1319,1037,1319,1037,1319,1037,1319,56112,4713,1073,2451,1073,1319,1037,2451,1073,1275,1073,2451,1037,1319,1037,1319,1037,2451,1073,1275,1073,1275,1073,1275,1073,1275]},"hostname":"IRKit6FF6","deviceid":"***deviceidが入る***"}
```

この`message`プロパティの値部分をメモしておく。

### curlでテスト

この段階で、IRKit経由で家電を制御できるかテストしておこう。まずは、赤外線信号を出力するためのURLを以下のように作っておく。

```
https://api.getirkit.com/1/messages?clientkey=***clientkeyが入る***&deviceid=***deviceidが入る***&message=
```
ここで、`message`クエリパラメータの値として、先程読み取った赤外線信号の`message`プロパティの値を埋め込み、以下のような`curl`コマンドを組み立てる。

```
$ curl -i 'https://api.getirkit.com/1/messages?clientkey=***clientkeyが入る***&deviceid=***deviceidが入る***&message={"format":"raw","freq":38,"data":[4713,1037,2451,1073,1319,1037,2451,1037,1319,1037,2451,1037,1319,1037,1319,1037,2451,1073,1275,1073,1275,1073,1275,1073,1275,56112,4713,1073,2451,1073,1275,1073,2451,1037,1319,1037,2451,1073,1275,1073,1275,1073,2451,1037,1319,1073,1319,1073,1319,1073,1319,56112,4713,1037,2451,1037,1275,1073,2451,1037,1319,1037,2451,1073,1319,1073,1319,1073,2451,1037,1319,1073,1319,1073,1319,1073,1319,56112,4713,1073,2451,1073,1275,1073,2451,1037,1319,1037,2451,1073,1275,1073,1275,1073,2451,1037,1319,1073,1319,1073,1319,1073,1319,56112,4713,1037,2451,1037,1275,1073,2451,1037,1319,1037,2451,1073,1275,1073,1275,1073,2451,1037,1319,1037,1319,1037,1319,1037,1319,56112,4713,1073,2451,1073,1319,1037,2451,1073,1275,1073,2451,1037,1319,1037,1319,1037,2451,1073,1275,1073,1275,1073,1275,1073,1275]}'
```

これを実行して、うまく家電が動くことを確認しておく。

ちなみに、このAPIはPOSTメソッドで呼び出すので本来はHTTPリクエストのBODY部分にこれらのパラメータを入れればよいはずだが、IFTTTのWebhookではなぜかうまく動作しなかったので上記のようなクエリパラメータ形式を使っている。

### IFTTTのWebhookで呼び出す。

最後に、IFTTTのAppletを作成する。Google Assistant連携部分はさきほどの説明とまったく同じで、トリガー時のアクションとしてWebhookを選択し、以下のようにIRKitのURLを指定する。

<img width="341" alt="Screen Shot 2017-10-08 at 7.10.54 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38290/ee50bc83-01a6-191b-9e24-534a44e985ef.png">

ここで、`Method`にはPOST、`ContentType`にはtext/plainを指定しておく。

以上で設定は完了。Google Homeから「テレビをつけて」等の指示を出すと、IRKitから赤外線信号が出て、テレビがオンになる。

ちなみに、ウチのソニーのテレビやシャープのエアコン等はこの仕組みでコントロールできたが、エアコン「白くまくん」はなぜかうまく動かなかった。なんだか高機能そうなリモコンで、赤外線信号も長いので、エアコンとリモコン間でなにかやり取りしているのかもしれない。それと、テレビから人の声が流れていると、Homeはそっちを認識してしまってうまく反応してくれない。テレビを見ながらHomeでザッピング、はあんまりうまくいかなかった。

とはいえ、部屋のどこからでも声だけで照明やテレビやエアコンをつけたり消したりできるのはなるほど便利である。お出かけのときに「電気消しといて」ってHomeに頼む感覚だ。

というわけで、IFTTTを使うとGoogle Homeからの家電のコントロールもあっけなく実現できた。ソファに寝そべったままの生活がどんどん推進されてしまいやばいのである。

-----

Disclaimer この記事は個人的なものです｡ここで述べられていることは私の個人的な意見に基づくものであり､私の雇用者には関係はありません｡