一昨日は、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、なんて強力なのだ。
Belkin WeMoで家電をオンオフ
Belkin WeMoはBelkinが販売するホームオートメーション製品。WiFi経由でAC電源をオンオフするモジュールや、電球の明るさを調節するモジュールなどがあり、日本でもAmazonで購入できる。
普通はWeMoのスマホアプリからオンオフして使うのだが、IFTTT連携にも対応しており、「Google Assistantでトリガー→WeMoの指定デバイスをオンオフ」するAppletも簡単に作れる。Google Assistantをトリガーとする設定は前回説明した方法と同じ。ただし、今回はSay a simple phrase
を選択して、固定のフレーズに反応してトリガーを起動する設定にする。
こののトリガーで起動する先としてWeMoを選択すると、WeMoで実行できるアクションの選択肢が表示される。
ここでTurn on
を選び、電源オンしたいデバイスを指定する。
設定はこれだけ。Finish
をクリックしてAppletを登録すれば、すぐにGoogle Homeで使えるようになる。
IRKitで家電をリモコン制御
続いて、IRKitを使って赤外線リモコンに対応した家電を制御してみよう。IRKitはWiFiの付いた赤外線リモコンで、家電のリモコンの赤外線信号を学習させ、スマホアプリからコントロールできる。こちらもAmazonから購入できる(ちょっとお高い)。
我々がIRKitにそそられる点は、とてもお手軽なREST 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を指定する。
ここで、Method
にはPOST、ContentType
にはtext/plainを指定しておく。
以上で設定は完了。Google Homeから「テレビをつけて」等の指示を出すと、IRKitから赤外線信号が出て、テレビがオンになる。
ちなみに、ウチのソニーのテレビやシャープのエアコン等はこの仕組みでコントロールできたが、エアコン「白くまくん」はなぜかうまく動かなかった。なんだか高機能そうなリモコンで、赤外線信号も長いので、エアコンとリモコン間でなにかやり取りしているのかもしれない。それと、テレビから人の声が流れていると、Homeはそっちを認識してしまってうまく反応してくれない。テレビを見ながらHomeでザッピング、はあんまりうまくいかなかった。
とはいえ、部屋のどこからでも声だけで照明やテレビやエアコンをつけたり消したりできるのはなるほど便利である。お出かけのときに「電気消しといて」ってHomeに頼む感覚だ。
というわけで、IFTTTを使うとGoogle Homeからの家電のコントロールもあっけなく実現できた。ソファに寝そべったままの生活がどんどん推進されてしまいやばいのである。
Disclaimer この記事は個人的なものです。ここで述べられていることは私の個人的な意見に基づくものであり、私の雇用者には関係はありません。