たねやつの木

Photographs, Keyboards and Programming

Google Home + IFTTT + Raspberry Piで家電を制御する

f:id:ibuquicallig:20190313171642p:plain

こんにちは、たねやつです。3記事目でこれがほぼほぼ最後の記事となります。

前の記事

準備

  • Google Homeの初期設定が完了していること
  • 前回記事までのExpressで作成したサーバーが起動していること
  • Expressが動いているサーバーへ外部からアクセスできること。 ドメインの取得、DNSへの登録、自宅に割り当てられたIPアドレスが変更された際にDNSへ再登録する仕組みが常時稼働させるために必要となります。

MyDNSを使用すれば毎回変化する自宅のIPアドレスをDNSサーバーに登録するのは簡単なのですが自宅で公開するためのセキュリティ面に関してはこの記事では触れません。

作業

IFTTTで設定

IFTTTに登録する部分は割愛します。登録フォームを使用しなくてもGoogleアカウントと連携することで簡単に登録できるようです。

左上のユーザーのドロップメニューを押してNew Appletを選択し、新規で登録します。thisの部分をクリックすると条件を指定する画面に移動します。そこでGoogle Assistantを選択し、次の画面でConnectをクリックします。

クリックすると初めて利用する場合、IFTTTとGoogleアカウントを紐づけるためのポップアップが出てきますので許可を押します。これで紐づけは完了です。

次に表示される画面は認識する語句の設定例について書いてあります。

f:id:ibuquicallig:20190314231415p:plain

数値や単語を含んだ文章(「おはよう」とツイートして)などが設定できるようです。今回使用するのはフレーズも単語も使用しない単純なものを使用します。(左上)

クリックすると認識する単語の設定に移ります。

f:id:ibuquicallig:20190314231419p:plain
項目 設定値
What do you want to say? Google Homeで認識する単語
What's another way to say it? (optional) 同上(必須ではない)
And another way? (optional) 同上(必須ではない)
What do you want the Assistant to say in response? Google Homeの返事
Language 日本語

という感じです。一つのコマンドに対して最大3パターンまで認識してくれるようです。IFTTTで連携する場合曖昧な命令に対しては反応してくれませんので注意してください!(「電気を消して」と設定して「電気消して」といっても反応しない)

Google Homeからのレスポンスの設定は空にしたままだとデフォルトの文言を発してきます(OK。アクションを実行します。)。レスポンスが必要ない場合は裏技的な感じになりますが¿を指定することで無音になります。¿は全角の?を変換することで入力できます。スペイン語の疑問文で使うやつですね(;'∀')

設定したらCreate triggerをクリックするとifの部分の設定が完了します。次にthatの設定を進めてきます。

thatをクリックしてWebhooksというサービスを選択します。これによりHTTPリクエストを送ったりすることができます。さらにMake a web requestをクリックして進めてきます。

f:id:ibuquicallig:20190314231411p:plain
項目 説明 値の例
URL HTTPリクエストを投げるURL http://example:5432/lightOn
Method HTTPメソッド GET
Content Type 取得できる値の種類 text/plain
Body ボディメッセージ (空)

今までで作成したExpressの処理はアクセスしたら処理を実行するだけのものだったのでメソッドはGETでOKです。認証としてPOSTで何かしらトークンをのっけて送るのもアリなのかもしれません(;'∀')

Create actionをクリックすると確認画面が表示されます。Receive notification when this Applet runsをオフにしておくといちいち通知が飛んで来ないようになります。

Finishを押して作成完了です。実際に話しかけてみて動作を確認しましょう!

ラグについて

一つ気になるのが発話してから実際にリモコン操作が行われるまでの 遅延です(;'∀')

私の環境では言い終わってから約6~7秒ほどかかります。Google Homeからの返事を空にしても約6秒かかります。Express内での処理で1秒ちょっとかかっているのでIFTTT側の処理(言語解析など?)で5秒ぐらいかかっている様子です。

GET /lightOff 200 1208.929 ms - 10
GET /lightOn 200 1713.517 ms - 10
GET /lightOff 200 1179.990 ms - 10
GET /lightOn 200 1727.170 ms - 10
GET /lightOff 200 1162.553 ms - 10

6秒の遅延といえばWEBページであれば致命的な大きさですがスマートスピーカーにおいては意外と気にならないものですね!もう少しレスポンスを改善しようかと思ったのですがこのままにしておきます。

最後に

Google HomeとIFTTT、Raspberry Piで動かすExpressによって安価に環境を作ることはできました!一番のネックは環境を外部にさらす部分かもしれませんが声で家電が操作できるようになるのはかなり便利ですね。正直こんなことしなくても対応している家電(Philips Fueなど)を購入すればもっと敷居は下がるのかもしれないですが。。。作ることに意義があるのです!(笑)

参考

https://www.reddit.com/r/ifttt/comments/9zu6to/google_home_no_response_option/