この記事は 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つずつ赤外線信号を送信してくれます。なので、リモコン信号が混線する…といったこともなく徐々に部屋の照明が落ちていい感じになりました。
今回オーソドックスな記事に落ち着いてしまったのは、いろいろやりたいことができなかったわけで…。また別の機会に記事を投稿しようかと思います。
ここまでお読みいただき、ありがとうございました。