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

  • 18
    Like
  • 0
    Comment

一昨日は、Google HomeでつぶやくとTwitterでつぶやく連携がうまく動いた。これでかなり楽しくなってしまい、昨日はIFTTTのGoogle Assistant連携で家電をコントロールする方法をいろいろ試してみた。Home三昧の三連休である。

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

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

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

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

47D3977A-B674-4AA9-B1EA-2A84E2C23588.jpeg
IRKit

Belkin WeMoで家電をオンオフ

Belkin WeMoはBelkinが販売するホームオートメーション製品。WiFi経由でAC電源をオンオフするモジュールや、電球の明るさを調節するモジュールなどがあり、日本でもAmazonで購入できる。

普通はWeMoのスマホアプリからオンオフして使うのだが、IFTTT連携にも対応しており、「Google Assistantでトリガー→WeMoの指定デバイスをオンオフ」するAppletも簡単に作れる。Google Assistantをトリガーとする設定は前回説明した方法と同じ。ただし、今回はSay a simple phraseを選択して、固定のフレーズに反応してトリガーを起動する設定にする。

Screen Shot 2017-10-08 at 9.46.35 PM.png

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

Screen Shot 2017-10-08 at 9.38.47 PM.png

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

Screen Shot 2017-10-08 at 9.39.01 PM.png

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

IRKitで家電をリモコン制御

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

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

IRKitのdeviceidとclientkeyを取得する

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

まずは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サーバーからdeviceidclientkeyを取得する。この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が入る***"}

これでdeviceidclientkeyが手に入ったので、これらを使い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を指定する。

Screen Shot 2017-10-08 at 7.10.54 PM.png

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

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

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

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

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


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