(今回の記事も息子くんではなく母の開発記録です。息子くんのことを知りたくて読んでる方(いる?)すみません)
M5StickCとGoogleスプレッドシートで服薬管理
シリーズ第3弾です。これまでの記事はこちら ↓
siroitori.hatenablog.com
siroitori.hatenablog.com
Google Homeに教えてほしい
うちのGoogleHomeさんは私にいろいろなことを教えてくれ助けてくれます。
今日の天気、あと何分でゆでたまごができるか(タイマー用途)、〇〇を英語でなんというか、めんどくさい計算の結果、など。
前回服薬日時についてもGoogleHomeに尋ねて教えてくれたらいいなぁと思いました。
やり方としては下の二つが考えられます。
パターンA
IFTTTを使ったやり方。
IFTTTからWebhookでWebリクエストを投げる。
ただしIFTTTでは戻ってきたデータ(前回服薬日時)をうけとって処理できません。
戻りデータの処理を考えるとプッシュ発話させることが必要になり、サーバマシン(Windowsかラズパイか…)が必要になります。
この方式での実装は当時小5の息子くんが調べて作ってたので教えてもらって知っていましたが、サーバを使うのは、うーんちょっと面倒。
↓ 以前この方式で息子くんの作ったシステム「ご飯の時間よ」(2018年のコンテスト受賞作品)
siroitori.hatenablog.com
パターンB
思い切って、Google Homeで動作するGoogle Assistantアプリを作る方法!
Googleアシスタントアプリを作ること自体はActions ConsoleとDialogflowのWeb画面上でわりと簡単に行えて、そう難しくないんです。
ただ、Google Assistantのアプリというのは前提として「公開するもの」なんですよね。
今回のものは自分用のスプレッドシートを使っていて自分用に使いたいものであって、アプリにするのは間違いなんです。私の認識では。
だけど、アプリを公開しないで開発中のものとして自分だけ使うことも可能です。
Google Assistantからの音声に「テストバージョン」という余計な言葉は入りますが。
それと、たぶん、公開しないで使い続けていたらいつのまにか使えなくなってます。
(今から5か月前の去年11月に今まで作ってた公開していないアプリがいつのまにか使えなくなってたので。ちなみにActions Consoleを更新しなおすと使えるようになってました。)
パターンBのアプリを作る方向で実現
検討の結果、とりあえずGoogle Assistantアプリを作ってみることにしました。
Google Assistant アプリを製作
アプリの概要としては、私がGoogle Homeに尋ねると前回の日時を言ってくれるだけの簡単なものを作成します。
アプリの名前は「お薬の情報」にしました。
※Google Assistant アプリの基本的なつくりかたについては省略しているのでちょっと不親切です。ほかのかたの記事・ブログをご参照ください。
ここでは、Google スプレッドシートをつかって値を戻す取得の仕方についてどなたかの参考になるように&自分があとで思い出せるように、記載します。
スプレッドシートへの値の受け渡しはwebhook一発でOK!
DialogFlowのIntents
DialogFlowのIntentsの設定で、
- Fulfillmentの項目を Enable webhook call for this intent をON
こうすることで、DialogFlowのFulfillmentでデータをこねくり回すことが出来ます。
また、Responsesの項目を Set this intent as end of conversation をON にして、返答時に終了させるようにしました。
DialogFlowのFulfillment
ここが驚きでした!
今まではInline Editor(上記画面の下のほう)でデータをあれこれするコードを書いていたのですが、試しにと思って、WebhookのURLに直接GoogleスプレッドシートのデプロイしたURLを入れてみたらそれだけで動作しました。(ArduinoからのときのようにリダイレクトのためPost後Getなどしなくて良かったです!)
戻ってきた値(json)も取得できています。→ jsonは後述するテスト画面で確認できます。
Googleスプレッドシート(GAS)
GAS側では戻すjsonに以下の項目を足さないといけません。(Dialogflow バージョン V2 の場合)
{ "fulfillmentText": "レスポンス" }
「レスポンス」に書かれた文字がGoogleHomeの読み上げ音声になります。
GASを以下のように修正しました。
function doPost(e) { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1'); var params = JSON.parse(e.postData.getDataAsString()); var id = params.id; if (id == "rec"){ // 記録モード(Aボタン押下)時のみデータをシートに追加 sheet.insertRows(2,1); sheet.getRange(2, 1).setValue(new Date()); // 受信日時を記録 } // 最新行の日時セル内容を取得してフォーマット var targetDate = sheet.getRange(2,1).getValue(); var dateString = ""; var timeString = ""; var speechString = ""; if (targetDate != null){ dateString = Utilities.formatDate(targetDate,"JST","yyyy/MM/dd"); timeString = Utilities.formatDate(targetDate,"JST","HH:mm:ss"); speechString = Utilities.formatDate(targetDate,"JST","前回は、yyyy年MM月dd日 HH時mm分ss秒に飲んだようです"); } // 戻り値を設定 var output = ContentService.createTextOutput(); output.setMimeType(ContentService.MimeType.JSON); // 最新行の日時セル内容とGoogleAssistant情報を取得して戻す // Dialogflow V2 仕様 output.setContent(JSON.stringify({ previnfo_date : dateString , previnfo_time : timeString , fulfillmentText: speechString})); return output; }
修正後はバージョンを上げてデプロイすることを忘れずに(前回記事参照)
実機で動作
@kohzy99さん
— しろいとり子 (@siroitori0413) 2020年4月17日
実装方法が浮かぶとかいったけどIFTTTで作っても結局プッシュ発話が必要なことに気づく💦
んでもってプッシュ発話させる為にサーバーも立てないといけないので面倒だなぁと思って、Google Assistantのアプリにしちゃいました! pic.twitter.com/dAvzwFM7vH
私:
「OK Google, お薬の情報につないで」
GoogleHome:
「はい。お薬の情報のテストバージョンです。
前回は、2020年04月17日 08時40分38秒に飲んだようです」
「テストバージョン」って言っちゃってるのが、Google Assistant アプリなのに公開していないのでこうなっています。
申請出して正式に公開するようになればこのテストバージョンのくだりは無くなります。
が、最初にも書いた通り今回作ったのは公開してみんなに使ってもらうようなものではないので、公開申請しません。
さいごに
今回はGoogleAssistantアプリを作ってみた記事でした。
でもこの用途ではやっぱりパターンAで作ってプッシュ発話させるべきだろうなーって思ってます。
今回までで服薬を記録出来て、前回いつ服薬したかを確認できるようになったので私の神経痛のお薬ライフが劇的に良くなりました♪
というわけでシリーズ完結!(たぶん)
次はなにをしようかな~^^