Google HomeにNature Remoから取得した室温を教えてもらう

はじめに

Google Home miniを購入したので、前から持っていたNature Remo miniと連携して、部屋の温度を教えてくれる機能を実装した。このような記事はすでにいくつかネット上に存在するが、次の点が気になったので改めて書くことにした。

  • 情報が古くなって後述するDialogflowの使い方が変っている
  • ローカルネットワーク内にサーバーを構築する必要がある
    • Google HomeもNature Remoもインターネットからアクセス可能なAPIがあるため、実はローカルサーバーは不要である
  • DockerでHerokuにデプロイできる仕組みがない

このためこの記事ではこれらが解決されて次のようになることを目指した。

  • 執筆時点でのUIをキャプチャした(Dialogflowは所見ではごちゃごちゃしているので、解説とUIが違うと手間がかかる)
  • サーバーアプリケーションはDockerで起動できるようにし、Herokuにデプロイすることで動作する
    • サーバーアプリケーションはPython + Flaskで実装した

この記事で作ったプログラムは下記に置かれている。

この記事を読んで何か分かりにくいことや改善点を見つけた場合、気軽にコメントなどで教えてほしい。

追記(2019/10/12)

公式で温度を教えてもらう機能が実装されました🎉 したがってこの記事の方法を使わなくても温度をスマートスピーカーから教えてもらえます。

準備

Nature Remoのアクセストークンの取得

https://home.nature.global/home へアクセスしてGenerate access tokenを押せば発行される。

accesstoken.png

Herokuのアプリケーションを作成

https://dashboard.heroku.com/apps へアクセスしてNew > Create new appを押せばよい。

そしてApp namegoogle-home-nature-remoとしたが、この命名はすでに筆者が利用してしまったので別の名称にしなければならない。このApp nameは後にコマンドライン上やURL上で利用するので、別の名前にした場合はこの記事のいろいろな部分を適宜修正する必要がある。この命名がコマンドラインやURLで必要になった場合は、《App name》と表記する。

最後にCreate appを押す。これでアプリケーションがデプロイできるようになる。そしてアプリケーションのために環境変数を設定する。https://dashboard.heroku.com/apps/《App name》/settingsへアクセスし次のように環境変数を入れる。

env.png

NATURE_REMO_TOKENは先ほど発行したNature RemoのアクセストークンでありBASIC_AUTH_USERNAMEBASIC_AUTH_PASSWORDはそれぞれGoogle Home(正確にはDialogflow)がこのHerokuアプリケーションにアクセスするためのBasic認証の情報である。これはURLが特定されると部屋の温度を取得される恐れがあるため、このように認証をかけておくことにする。

サーバーアプリケーションのデプロイ

HerokuのDockerアプリケーションをデプロイする。次のような流れを行う。

  1. git clone https://github.com/y-yu/google-home-nature-remo-temperature.git
  2. cd google-home-nature-remo-temperature
  3. heroku login
    • もしCLIのherokuがない場合はHomebrewなどで適宜インストールする
  4. heroku container:login
  5. heroku container:push web -a 《App name》
  6. heroku container:release web -a 《App name》

これでサーバーサイド側は完成のはずである。次のコマンドでテストするとよい。

$ curl -XPOST --basic -u "user:*******" https://google-home-nature-remo.herokuapp.com/temperature | jq
{
  "payload": {
    "google": {
      "expectUserResponse": false,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "現在の室温は24.39度です"
            }
          }
        ]
      }
    }
  }
}

このようなJSONが表示されれば成功である。

Google Assistantアプリケーションの作成

https://console.actions.google.com/ へアクセスしNew projectを押すと、次のような画面があらわれる。

言語を日本語、地域を日本にしてCreate projectする。するとWelcomeページが表示される。

ここからGoogle Homeで呼びだすための設定をしていくので、上のタブのDevelopを押す。

Invocationの設定

左のタブにInvocationというのがあるので、まずはこれを設定する。これは「OK, Google. ○○○○○につないで」の○○○○○を決めることで、さきほど作ったアプリケーションを呼び出すことができるようになる。ここでは部屋の温度にした。

これで「OK, Google. 部屋の温度につないで」と言うとこのGoogle Assistantアプリケーションが起動するようになる。

Actionの追加

それではDialogflowを使ってどのようなときにどうするのかを定義していく。あらかじめゴールを述べておくと「このアプリケーションが起動した時に、さきほど作ったHerokuアプリケーションに問い合わせてその情報を発言する」というものである。 まずは左側のタブからActionを選び、Add actionを押す。

今回はbuilt-inではないので、Custom intentを作るため、画像のようなBUILDボタンを押してDialogflowへ移動する。

Dialogflowの設定

次からはCreate new agentで新しい設定を作成し、適当な名前をつける。ここからDialogflowを設定していく。

Default Welcome Intentの無効化

このアプリケーションはデフォルトで「OK, Google. ○○○○○につないで」の後にやることであるWelcome Intentが決っているが、今回このGoogle Assistantアプリケーションは温度を返す機能しかないため、このデフォルト機能は必要ない。

そこで上の画像のようにEventsに設定してあったWelcomeを削除して空にしておく。

Fulfillmentの設定

次にHerokuアプリケーションへ問い合わせる部分を定義する。左側のタブからFulfillmentを選び、WebhookENABLEにする。そしてHeroku側の環境変数に従ってBasic認証の情報とアプリケーションのURLを入力する。

そして画面右下のSAVEを押す。

Intentの設定

Dialogflowの左側のタプからIntentを押し、右上にあるCREATE INTENTを押す。Intent nameは適当に入れておけばよい。ここはユーザーのどういうアクションに対して何をするかを定義する部分であり、今回は機能が1つ(部屋の温度を返すだけ)なので、起動した瞬間にHerokuアプリケーションへ問い合わせてもらえばよい。 したがって、まずはEventを設定する。

このようにWelcomeを設定した。そして一番下にあるEnable webhook call for this intentを有効にすればHerokuアプリケーションへの問い合わせが行われる。

Integrationsの設定

最後に追加したIntentをGoogle Homeで使う設定を書いておく。もうDefault Welcome Intentはいらないので削除し、いま作ったroom temperatureを入れる。

またAuto-preview changesを入れておけば修正したときに、明示的な操作なく変更が適用されて便利である。ここでTESTボタンを押してシミュレーターでテストしてみる。

このようになれば成功である。この時点でもう部屋のGoogle Homeから利用できる状態にあるので、たとえばこの例では「OK, Google. 部屋の温度につないで」と言えばきちんと応答される。

おわりに

Google Homeアプリケーションの開発は、とにかく覚えることが多くて大変であった。この資料が他の方々の開発に役立てばよいと思う。

参考文献

コメント