はじめに
やっと自宅での実験環境が整いました。ベアボーンサーバは昔買った安物のマシンで代用しています。ESCというメーカーが開発しているLIVAというマシンです。仕様は以下のとおりです。
- Processor: Intel(R) Celeron(R) CPU N2807 @ 1.58GHz
- Memory: 2GB (DIMM DDR3 65535 MHz)
- Storage: eMMC 64GB
- OS: Ubuntu 16.04 LTS
- node 10.16.3
- npm 6.9.0
- google-home-notifier 1.2.0
- ngrok 3.2.5
- GAS (Google Apps Script)
- Monaca
- IFTTT
図1.ベアボーンサーバとGoogle Home Mini |
実験の設定
以下の設定で実験を行う。
- 処方内容:
- ディオバン錠20mg 1錠
- メバロチン錠10 1錠
- 用法:1日3回毎食後と就寝前
- 投与期間:毎日
所感
- 服用状況がカレンダーに残るので、これを集計して定期的に服用記録をメールでかかりつけの病院(医師)や薬剤師(薬局)へ送ってはどうか
- 薬品名がカレンダーのdescriptionに書かれているので患者からの問い合わせに応じて薬の名前や効用・副作用の情報などについて回答したらどうか
- 薬局でもらった薬が切れかかったら事前にそのことを伝えて受診を促す機能を付けたらどうか
トラブル1
催促が止まらない
さっそくトラブル発生。AIスピーカーの呼びかけに対して薬を飲んだと伝えたあとも催促が続く。原因は、発話依頼プログラム(pill-reminder.js)がWebAPI A3から受信したデータ内のtaiking_statusが0のままになっているから。
発話依頼プログラム(pill-reminder.js)の起動時は、その日のGoogleカレンダーに登録されている予定を正しく取り込んでいるが、id指定で取り込んだ場合は、古い予定(WebAPI A2による更新前)を取り込んでいる。
原因判明
WebAPI A3では、下記のようにしてid指定でカレンダーからイベントを取得しようとしている。
var event = CalendarApp.getEventById(id)ところが、eventはnullになり、予定を取得できなかった。
「CalendarAppのgetEventByIdメソッドを完全マスター」を読むと、getEventByIdを使えばid指定でイベントを取得できるはずだったのだが・・・。
開発中にもid指定でイベントを取得しようとすると古いイベントのままだったという現象が起きていた。きっとこれが原因だったのだろう。
そこで、id指定でイベントを取得するCalendarApp.getEventById関数の使用は諦めて、下記のようにその日の全イベントを取得して、その中から指定したidに一致するイベントのみ取り出す方式に変えた。
/** * IDを指定してイベントを取得する * * @param {String} id イベントid * @param {Integer} num_reminder 催促カウント * */ function getEventsById(id,num_reminder) { debug("getEventsById(" + id + "," + num_reminder + ")"); //「の薬」とつくイベントの取得 //var event = CalendarApp.getEventById(id); var event = null; //「の薬」とつくイベントの取得 var events = CalendarApp.getDefaultCalendar().getEventsForDay( new Date(), {search:'の薬'} ); events.forEach(function(e, i, array){ if(e.getId() == id) { event = e; } }); //ジェイソン形式にする var pills = [{ "title":event.getTitle(), "description":event.getDescription(), "id":event.getId(), "location":event.getLocation(), "startTime":event.getStartTime(), "endTime":event.getEndTime(), "color":event.getColor() }]; var response = { "drug_notifies": pills, "num_reminder": num_reminder, // 催促回数 "taiking_status": event.getTitle().indexOf("(済)") < 0 ? '0' : '1', // 服用状況 (0:未服用, 1:服用済) "status": "0" // 0=成功, 1:失敗 } debug('response=\n' + JSON.stringify(response,null,' ')); // 催促の回数が5回以上になったらタイトルに「(応答無)」に変更し、色を黄色に変える if(num_reminder >= 5){ result = event.getTitle().indexOf("("); //"("以降の文字を切り取る。 results = event.getTitle().substr(0,result); //タイトルを○○の薬(応答無)に変更する。 event.setTitle(results+'(応答無)'); //色を黄に変更する。 event.setColor(CalendarApp.EventColor.YELLOW); // LINEにメッセージを送る LINE_notify('お薬を飲むように' + num_reminder + '回催促しましたが応答がありません。'); } return response; }
リスト1.指定したidのイベントを取得する関数(WebAPI A3)
この変更によって今回のトラブルは解消した。
0 件のコメント:
コメントを投稿