はじめに
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
を押せば発行される。
Herokuのアプリケーションを作成
https://dashboard.heroku.com/apps へアクセスしてNew > Create new app
を押せばよい。
そしてApp name
はgoogle-home-nature-remo
としたが、この命名はすでに筆者が利用してしまったので別の名称にしなければならない。このApp name
は後にコマンドライン上やURL上で利用するので、別の名前にした場合はこの記事のいろいろな部分を適宜修正する必要がある。この命名がコマンドラインやURLで必要になった場合は、《App name》
と表記する。
最後にCreate app
を押す。これでアプリケーションがデプロイできるようになる。そしてアプリケーションのために環境変数を設定する。https://dashboard.heroku.com/apps/《App name》/settingsへアクセスし次のように環境変数を入れる。
NATURE_REMO_TOKEN
は先ほど発行したNature RemoのアクセストークンでありBASIC_AUTH_USERNAME
とBASIC_AUTH_PASSWORD
はそれぞれGoogle Home(正確にはDialogflow)がこのHerokuアプリケーションにアクセスするためのBasic認証の情報である。これはURLが特定されると部屋の温度を取得される恐れがあるため、このように認証をかけておくことにする。
サーバーアプリケーションのデプロイ
HerokuのDockerアプリケーションをデプロイする。次のような流れを行う。
git clone https://github.com/y-yu/google-home-nature-remo-temperature.git
cd google-home-nature-remo-temperature
heroku login
- もしCLIの
heroku
がない場合はHomebrewなどで適宜インストールする
- もしCLIの
heroku container:login
heroku container:push web -a 《App name》
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
を選び、Webhook
をENABLE
にする。そして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アプリケーションの開発は、とにかく覚えることが多くて大変であった。この資料が他の方々の開発に役立てばよいと思う。
コメント
コメントを投稿