jimaoka blog

ライトなインフラエンジニアです

Google HomeとIRKitで家電操作をする

f:id:jimaoka:20171009142404j:plain:w500

目次

Google Homeが日本で最近発売され、衝動買いしてしまったので、IRKitと連携して家電操作をできるようにします。
Google Homeに話しかける言葉はIFTTTのトリガー(Google Assistant)として利用できるので、IFTTTでトリガーを受けてIRKitへ渡していきます。
昔買ったのでよく覚えてないですが、IRKitはすこし高くなった気がします。

ifttt.com

www.amazon.co.jp

IRKitでの設定

IRKitの初期設定から書いていきます。

IPアドレスの判別

MacのTerminalからService DiscoveryでIPアドレスを判別します。

### Instance名の取得
% dns-sd -B _irkit._tcp
Browsing for _irkit._tcp
DATE: ---Mon 09 Oct 2017---
17:34:55.026  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
17:34:55.280  Add        2  10 local.               _irkit._tcp.         iRKitXXXX
^C
 
### IP Addressの取得
% dns-sd -G v4 iRKitXXXX.local
DATE: ---Mon 09 Oct 2017---
17:35:34.099  ...STARTING...
Timestamp     A/R Flags if Hostname                               Address                                      TTL
17:35:34.353  Add     2 10 iRKitXXXX.local.                       192.168.xx.xx                                10
^C
Client Tokenの取得

先ほど知ったIPアドレスから、ClientTokenの取得を行います。

% curl -i "http://192.168.xx.xx/keys" -d '' -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.2.0.g424fa95
Content-Type: text/plain
 
{"clienttoken":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}
DeviceIDとClientKeyの取得

先ほど入手したClientTokenから、外部からのアクセスのためにDeviceIDとClientKeyを取得します。これを知っていると外部から赤外線が送れるようになります。

% curl -i -d "clienttoken=XXXXXXXXXXXXXXXXXXXXX" "https://api.getirkit.com/1/keys"
HTTP/1.1 200 OK
Server: ngx_openresty
Date: Tue, 07 Jan 2014 08:46:06 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 94
Connection: keep-alive
X-Content-Type-Options: nosniff

{"deviceid":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","clientkey":"XXXXXXXXXXXXXXXXXXXXXXX"}
送信したい赤外線信号の取得

IRKitに対して最後に送信した赤外線信号のデータを取得します。送信したい赤外線信号をIRKitに送信したあとで下記のコマンドを打ちます。
(信号はhttp://getirkit.com/にあったものなので何の信号か不明です)

% curl -i "http://192.168.xx.xx/messages" -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.2.0.g424fa95
Content-Type: text/plain

{"format":"raw","freq":38,"data":[18031,8755,1190,1190,1190,3341,1190,3341,1190,3341,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,1190,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,65535,0,9379,18031,4400,1190]}

IFTTTでの設定

IFTTTからAppletを追加していきます。

New AppletボタンよりAppletを追加

f:id:jimaoka:20171009175918p:plain

Triggerの選択

TriggerとしてGoogle Assistantを選択します。

f:id:jimaoka:20171009175826p:plain

Triggerの種類を選択

Triggerの種類としては フレーズのみ、フレーズ+数値、フレーズ+何らかの言葉、フレーズ+数値+何らかの言葉、の4通りあるのですが、数値や言葉は赤外線信号送信ではちょっと使用できないので"Say a simple phrase"を選択します。

f:id:jimaoka:20171009180411p:plain

Phraseを設定

Phraseには3通り設定できるようです。また、Google Assistantの返答もここで設定します。
英語も日本語も選択可能です。

f:id:jimaoka:20171009181304p:plain

Actionの選択

ActionとしてWebhookを選択します。

f:id:jimaoka:20171009181545p:plain

f:id:jimaoka:20171009181646p:plain

Actionの設定

IRKitの設定時に取得したClientkey, DeviceID, 赤外線信号のデータをBodyに設定してWebRequestを作成します。

URL:           https://api.getirkit.com/1/messages
Method:        POST
Content Type:  application/x-www-form-urlencoded
Body:          clientkey=XXXXXXXXXXXXXXXXXXXXXXX&deviceid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&message={"format":"raw","freq":38,"data":[xxx,xxx,...]}

f:id:jimaoka:20171009182040p:plain

作成完了

これでGoogle Homeに話しかけるとIRKitから家電操作を行う設定が完了しました。

f:id:jimaoka:20171009182239p:plain

GoogleHome&IRKitでの家電操作のTips

少しこの仕組をいじってみてわかった、Tips的な使いかたを紹介します。

一度のWebhookで複数の信号を送る

TVの音量を2段階下げたい場合や、電気を消すために複数回信号を送る必要がある場合は、WebhookのBodyのmessage->data部分に同じ信号を繰り返しで入れることで複数回の赤外線操作が可能です。(一回のWebRequestで送信可能なBodyの長さに限界はあります)
連続でTVを点ける信号と電気を点ける信号を送ることも可能かと思います。

### 例: xxx,yyy,zzzの信号を3回送る
message={"format":"raw","freq":38,"data":[xxx,yyy,zzz,xxx,yyy,zzz,xxx,yyy,zzz]}
1つのGoogle Assistant Triggerに対して複数のActionを紐付ける

複数の信号送信は上に書いた方法で対応可能ですが、Requestしたい信号が長すぎたり、HueやWeMoなどの操作を同時に行いたいときは複数のActionを紐付ける必要があります。

1つのTriggerに複数のActionを紐付ける場合は、同じPhraseに反応するGoogle Assistant Triggerを複数作成して、それに異なるActionを紐付けることで実現できます。
ぼくの家ではTVの入力切替を戻すために入力切替ボタンを連打するActionが存在します。。

f:id:jimaoka:20171009183803p:plain

まとめ

Google HomeからIFTTTを経由して家電操作をする仕組みを設定してみましたが、GoogleHomeがIFTTTに対応しているお陰で、けっこう苦もなく設定することができました。

一点物足りなかったのは、IFTTTのActionからGoogle Homeの機能を呼び出せなかったことですが、これは将来的に対応すれば非常に嬉しいなと思いました。
(例: GoogleHomeで音楽を再生する、今日の予定を教えてくれる、など)

ひとまず、IFTTTを使えばさらに色々なデバイスやサービスと連携できるはずなので、Google Homeの色々な使い方が開拓できそうです。