GoogleAppsScript
ifttt
IRKit
おうちハック
GoogleHome

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

More than 1 year has passed since last update.

この記事は JustSystems Advent Calendar 2017 18日目の記事です。

はじめに

おうちハック初心者ながら、発売前から気になっていたスマートスピーカー。先日、我が家にもGoogleHomeMiniさんがやってきました。(当然¥6,000の時に飛びついて購入したのですが、最近安くなったので勢いでもう一台購入…。)

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

IRKitで部屋の照明を消す

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

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

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

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

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

IFTTTと連携してGoogleHomeからIRKitを操作

まずはGoogleHomeからIRKitを経由して電気を消すまでを準備。GoogleHome自体にはIRKitを操作する機能はありませんが、GoogleHomeからIFTTTを経由してIRKitを操作することが可能なのでそれを採用します。

GoogleHome側の設定

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

トリガー側はだいたいこんな感じで設定

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つ分叩く3つの照明がそれぞれ消える

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

function doPost(event) {
  function send(key) {
    sendHttpPost(照明1の赤外線信号);
    sendHttpPost(照明2の赤外線信号);
    sendHttpPost(照明3の赤外線信号);
  }
}
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のトリガー側も以下のように変更して確認。

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

おわりに

何番煎じの記事かわかりませんが、GoogleHomeの音声認識を使って複数の機器を操作する方法を紹介しました。GoogleHomeでできることは技術的に限られていますが、サービスや他のデバイスとの組み合わせを工夫し、何をさせるかということについてはまだまだ予知がありそうです。みなさんのアイデアを楽しみにしています!

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