2019年8月2日金曜日

8/2のゼミ

<<進捗状況の確認>>
平松:AIスピーカーに自発的に喋らすことができるのかどうかをやる
内田:Javaできるのかどうかをやる
小山:薬の種類が3つ上でQRコードが2つになってしまう問題発生
   googleカレンダーの予定の変更をAPIで行う(何が必要か学ぶ)
勇・谷口:googleカレンダーの予定を変更できるのかどうか

<<今日の進捗状況>>

<勇・谷口>
前回できたと思っていたIFTTTのレシピに欠陥があったことが分かった。
欠陥はAIスピーカーに”薬飲んだ”と言ったらGoogleカレンダーに予定が書かれてLINEに”おばあちゃんが薬を飲んだ”という内容が送られてくるというものを作成していたが、
カレンダーに手動で予定を入れてもLINEに”おばあちゃんが薬飲んだ”というのが送られてきたことだ。
これは、IFTTTのGoogleカレンダーのレシピの"search"を使用して、特定のキーワードに反応してLINEに送られるようにした。
ネットで調べると、IFTTTではカレンダーの予定の変更とキャンセル(削除)はできないとのことが載っていた。

<平松>
Googleカレンダーに繋ぐことができた。ここからnoti-fireもつなげて、googleカレンダーの内容をAIスピーカーに喋らせたい。

<内田>
Javaを使用してgoogleカレンダーにアクセスできるようにできるようになった
次回は書き込めるようにしたいと思う。

<小山>
Googleカレンダーの修正の方法を探した。GAS(GoogleAppsScript)を使用すれば中身の書き換えができそうです。
次回はどこの欄にスクリプトを書くのか調べようと思う。

いい感じに進んできていると思うのでみんなで頑張っていきましょう~!



【システム設計】


正常な場合の情報の流れを図1に示す。
図1.正常な場合の情報の流れ
 図中の①でQRコードから服薬情報を読み込んだスマホは,処方された用法と日数に基づいてGoogleカレンダーに服用スケジュールを書き込む。
たとえば,朝・昼・晩・就寝前に4日間処方された場合のカレンダーおよびイベントの情報は次の図のようになる。

図2.Googleカレンダーにおける服用スケジュール

 また,Google Homeからの「○○のお薬の時間ですよ」というリマインドに対して「○○のお薬飲みました」との応答がなかった場合の情報の流れを図2に示す。

図3.応答がない場合の情報の流れ
図中の⑧までは同じであるが,⑨の応答がないので事前に設定した時間だけ待ってからベアボーンサーバから⑦の服用通知依頼をGoogle Homeへ送る。応答があるまでこれを繰り返し,これが事前に設定した回数を超えた場合薬が服用されなかった旨のメッセージを家族のもとへLINEで送る。
図1,図3の情報についてまとめたものを下表に示す。

表1.流れる情報とその詳細
 朝・昼・晩・就寝前など,システムを稼働させる上で必要な値はパラメータとしてスマホに設定できるようにする。必要なパラメータとしては次のようなものがある。

表2.必要なパラメータ

【Google Apps Script:イベントの取得】

図1の「⑫カレンダー更新」は,「⑨服用完了通知」をIFTTTがトリガーにしてWebhookを利用することによって実現する。Webhookで作動するプログラムはGAS (Google Apps Script) で開発し,Webサービスとして公開する。
GASはGoogleドライブから[新規]→[その他]→[アプリを追加]で[Google Apps Script]をインストールすると利用できるようになる。
以降,Googleドライブから[新規]→[その他]→[Google Apps Script]で編集画面が表示されるようになる。

例えば,下記はGoogleカレンダーから当日のイベントを取得するスクリプトである。

//
// Google calendarから当日のイベントを取得する
// webapi_googleCal_getEventsForDay

function doGet(e) {

  var eventData = getEventsForDay();
  responseText = JSON.stringify(eventData);
  
  var out = ContentService.createTextOutput();

  //Mime Typeをapplication/jsonに設定
  out.setMimeType(ContentService.MimeType.JSON);
  
  //JSONPテキストをセットする
  out.setContent(responseText);
  
  return out;
}

//プログラム起動日の予定をすべて取得して予定タイトルをログに表示するコード
function getEventsForDay() {
  var date = new Date();
  var options = {
    'search': 'お薬の時間です',
  };
  var events = CalendarApp.getEventsForDay(date, options);
  var eventData = [];
  events.forEach(function(event){
    var data = {
      'title': event.getTitle(),
      'description': event.getDescription(),
      'id': event.getId(),
      'location': event.getLocation(),
      'startTime': event.getStartTime(),
      'endTime': event.getEndTime(),
      'color': event.getColor(),
    }
    eventData.push(data);
  });
  return eventData;
}
関数doGetはHTTP GETメソッドの実装関数である。これを外部に公開するには,メニューから[公開]→[Webアプリケーションとして導入...]を選択する。
作成したWebサービスは以下のURLで利用できる。

https://script.google.com/macros/s/XXX...X/exec
この結果,次のようなJSON形式のイベントデータが取得できる。
[
    {
        "title": "朝のお薬の時間です",
        "description": "クラビット細粒10% 100mg 3錠",
        "id": "t4s1bi3v05bhvcjp41rr89qulg@google.com",
        "location": "医療法人 川崎病院",
        "startTime": "2019-08-03T00:31:51.000Z",
        "endTime": "2019-08-03T01:01:51.000Z",
        "color": "11"
    },
    {
        "title": "夜のお薬の時間です",
        "description": "クラビット細粒10% 100mg",
        "id": "v84ho65ceseoja7257s1moj1o8@google.com",
        "location": "医療法人 オルカ医院",
        "startTime": "2019-08-03T09:00:00.000Z",
        "endTime": "2019-08-03T09:30:00.000Z",
        "color": "11"
    }
]

【Google Apps Script:イベントの登録】 

 Googleカレンダーにイベントを登録するプログラム例を以下に示す。
//
// Google calendarにイベントを登録する
// webapi_googleCal_createEvent

function doPost(e) {

  var parameter = e.parameter;
  
  var eventData = {
    'title': parameter.title,
    'description': parameter.description,
    'location': parameter.location,
    'color': parameter.color,
 
  }
  
  var id = createEvents(eventData);
  
  var result = {
    'id': id
  }
  
  var out = ContentService.createTextOutput();
  
  responseText = JSON.stringify(result);
  
  //Mime Typeをapplication/jsonに設定
  out.setMimeType(ContentService.MimeType.JSON);
  
  //JSONPテキストをセットする
  out.setContent(responseText);
  
  return out;
}

// イベントの作成
function createEvents(eventData) {
  var calendar = CalendarApp.getDefaultCalendar();
  var title = eventData.title;
  var startTime = new Date();
  var endTime = new Date();
  endTime.setMinutes(endTime.getMinutes() + 30);
  
  var option = {
    description: eventData.description,
    location: eventData.location
  }
  
  // イベントを登録
  var event = calendar.createEvent(title, startTime, endTime, option);

  // 色を設定(赤色)
  event.setColor(eventData.color);

  // idを取得
  var id = event.getId();

  return id;
}

function testCreateEvent() {

    var eventData = {
        'title': '朝のお薬の時間です',
        'description': 'クラビット細粒10% 100mg 3錠',
        'location': '医療法人 川崎病院',
        'color': 11,
    }
    var id = createEvents(eventData);
}
このスクリプトはPOSTメッセージでイベント情報(タイトル,説明,場所,色)を受け取り,イベントを登録している。関数testCreateEventはデバッグ用の関数で,doPostの動作テストに利用する。
イベントを登録するとイベントを一意に識別するイベントidを返すので,それをJSON形式に編集してHTTP POSTリクエストのレスポンスとする。

このスクリプトをWebサービスとして公開し,それをテストするために下記のHTMLファイルを作成して簡易イベント登録ページを作成した。

<!--
  Google Calendar にイベントを登録する
-->
<!DOCTYPE html>
<head>
  <meta charset="UTF-8">
  <title>Googleカレンダーにイベントを登録</title>
</head>
<body>
  <h1>webapi_googleCal_createEvent</h1>
  <!-- webapi_googleCal_createEvent -->
  <form method="post" action="https://script.google.com/macros/s/XXX...X/exec">
  
    <table>
  <tr><th align="left">タイトル:</th><td><input type="text" name="title" value="昼のお薬の時間です"></td></tr>
  <tr>
   <th align="left">お薬の内容:</th>
   <td>
    <textarea name="description" rows="5", cols="80">クラビット細粒10% 100mg 3錠</textarea>
   </td>
  </tr>
  <tr><th align="left">病院名:</th><td><input type="text" name="location" value="医療法人 川崎病院"></td></tr>
  <tr>
   <th align="left">色:</th>
   <td>
    <select name="color">
     <option value=0>0
     <option value=1>1
     <option value=2>2
     <option value=3>3
     <option value=4>4
     <option value=5>5
     <option value=6>6
     <option value=7>7
     <option value=8>8
     <option value=9>9
     <option value=10>10
     <option value=11>11
     <option value=12>12
    </select>
   </td>
  </tr>
    </table>
    <p>
      <input type="submit" value="送信">
    </p>
  </form>
</body>
</html>
このHTMLで作成したWebページを下図に示す。

図4.イベント登録のテスト用ページ

0 件のコメント:

コメントを投稿