先日、Google Nest Hub を購入しました。Google Nest Hub のようなスマートディスプレイでは Actions on Google と組み合わせて自作したアプリを動かせるようです。
ちょうど妻から Google Nest Hub に『ねずみタイマー』が欲しいというリクエストが。
apps.apple.com一応、Google Nest Hub にもタイマーはありますが、子供向けにもう少しかわいい感じのタイマーが欲しいということで、上記のチュートリアルを参考にねずみタイマーを作ってみました。基本的にチュートリアルの流れに沿って作れます。
シミュレーターで動かすとこんな感じ。3分はカップラーメン用。
タイマーが進むにつれてねずみがチーズに迫っていきます。(以下はテストのためタイマーを15秒固定にしてあります)
時間になったら終了。子供が宿題するときに使うことを考えてお疲れ様でしたのメッセージ付き。ここでタイマーをリセットできる。
一応、実機でも動かせますが、起動するときに「テスト用アプリにつないで」と言う必要がある。要調査。
アプリは Firebase にホストしています。ソースコードはこちら。
以下、備忘録。
> node -v v8.16.0 > npm -v 6.4.1 > firebase --version 7.6.1
タイマー終了
Dialogflow にタイマー終了のインテントを定義する。
タイマーは普通に JavaScript の setInterval
で実装。時間になったら interactiveCanvas#sendTextQuery
で Dialogflow のインテントにリクエストを投げる。画面の更新は interactiveCanvas
のイベントハンドラ (onUpdate
) の中に実装。
タイマーリセット
アプリの再開や終了には Follow-up インテントを使う。タイマーをリセットするためにタイマー終了のインテントに再開用の Follow-up インテントを追加。
中断
タイマーを途中で終了するための Dialogflow インテントを定義。
Default Fallback Intent
Default Fallback Intent は Dialogflow にデフォルトで定義されているインテント。どのインテントにもマッチしない場合に Default Fallback Intent が呼び出される。
で、タイマーが作動中に想定外のリクエストを受け付けると Default Fallback Intent が呼び出されてしまう。パッといいアイデアが思い付かなったのでインテントのハンドラの中で握りつぶす...。
app.intent('Default Fallback Intent', conv => { conv.ask(new HtmlResponse({ url: `https://${firebaseConfig.projectId}.firebaseapp.com/` })); });
一応、これでタイマーを動かしたままにできるが、次のリクエストを受け付けなくなってしまう。要調査。