Google Home + Nature Remo API で室温を喋らせる

Google HomeTech

Google Home と Nature Remo の温度センサーを組み合わせることで、現在の室温を Google Home から喋らせることに成功しました。

実現方法

Google Home に任意の固定メッセージを喋らせるだけであれば IFTTT で実現できますが、今回は「室温」という動的な要素が含まれるため IFTTT 単体では不可能です。

通常であれば Google Home 用のアプリ開発が必要ですが、今回は少し変わったアプローチでチャレンジしてみました。以下の流れです。

Google Home + Nature Remo API で室温を喋らせる

  • (1) Google Home に室温を尋ねる
  • (2) IFTTT の Webhook で ngrok を叩く
  • (3) ngrok がローカルの node.js を呼び出し
  • (4) Nature Remo API から室温を取得
  • (5) google-home-notifier 経由で Google Home を喋らせる

準備するもの

1. google-home-notifier の準備

まずは google-home-notifier が動作する node.js 環境を用意します。
詳細な手順については、以前の記事 で解説しています。

簡単な動作確認スクリプトを実行し、Google Home が喋ることを確認。

// Google Home が「テストメッセージです。」と喋る
$ node step01.js

2. Nature Remo API の準備

室温を取得するため、Nature Remo API を準備します。
アクセストークンを用意し、curl で実行できることを確認します。

// 情報が取得できることを確認
$ curl https://api.nature.global/1/devices -H "Authorization: Bearer XXXXX"

// 室温のみに絞り込む
$ curl https://api.nature.global/1/devices -H "Authorization: Bearer XXXXX" | jq .[].newest_events.te.val

こちらも、以前の記事 で詳しい手順を紹介しています。

3. 室温取得スクリプト作成

まずは室温を取得する部分のみ、node.js で書いてみました。

12-14行目で Nature Remo API から取得、16行目で jq を使って絞り込んでいます。

$ node step02.js
現在の室温は27度です。

4. Google Home 応答処理追加

取得した室温を Google Home が喋るように書き換えます。

実行すると、Google Home が室温を喋ってくれました。

$ node step03.js
Device notified

5. ngrok 対応

このままではローカルでしか実行できないため、あまり意味がありません。
ngrok を利用して外部からのアクセスを待ち受けるようにします。

実行すると、ngrok のエンドポイントが表示されます。

$ node step04.js
Endpoint: https://123abcde.ngrok.io

この URL(https://123abcde.ngrok.io) にアクセスすることでスクリプトが実行され、Google Home が喋りだします。

6. IFTTT 登録

ここまで来たらあと一歩です。
Google Home をトリガーに Webhook を実行 するように、IFTTT の設定(アプレット)を作成します。

IFTTTのWebhookトリガー設定

IFTTT の登録手順については、以前の記事 にて画像付きで詳しく解説しています。

7. 完成

もう一度動画を貼っておきます。
多少のラグはありますが、Google Home が現在の室温を教えてくれるようになりました。

まとめ

  • Google Home + Nature Remo で室温を喋らせました
  • IFTTT, ngrok, nodejs, Nature Remo API, google-home-notifier を組み合わせました

Google Home から動的なメッセージを返したい場合、google-home-notifier を使うと楽に実現できるためオススメです。

関連記事



google-home-notifier ではなく Google Home アプリとして開発した例↓