勇・谷口
IFTTTでGoogleカレンダーとWebhook(GAS)との連携できることが分かった。
連携にはGASのURL(Web API)がいるため今回はまだできてない無い。
平松
example.jsが動くようになった。node.jsをrequestモジュールで通信する方法を調べた。
内田
Javaでどのように変更すればイベントの更新が出来るのかがわかった。
が、書き換え方がまだよく分かっていない。
小山
GASにてスクリプト入力中
テストカレンダーは作成できたが色の着いた予定などはまだ入っていないため次週する。
【お薬の時間を通知するプログラム】
下図はお薬を飲む時間を知らせるプログラムの動きを表したものである。このプログラムはベアボーンサーバ上でNodejsのスクリプトとして実装する。
|
図1.服用通知プログラムの状態遷移図 |
①初期化
- Googleカレンダーから当日のイベントを取得して,服用時刻になったら服用通知を行うタイマーを設定する。
- タイマーは当日分のうち,現在時刻より後で,かつ,未服用分のイベントに対して設定する。
- 翌日の早朝に日付変更通知が届くようにタイマーを設定する。
- 服用通知にはパラメータとしてイベントidと0に初期化したカウンタを渡す。
- 服用済みかどうかはイベントの色で判断する(赤:未服用,青:服用済み,黄:応答なし)。
②服用通知
- Googleカレンダーから当該idの服用イベントを取得して,服用済みかどうかを判定する。
- 服用済みでなければGoogle Homeに服用を促すメッセージを送り,事前に設定された時間後に服用確認通知が届くようにタイマーを設定する。
Googleカレンダーから当該idの服用イベントを取得して,服用済みかどうかを判定する。
- 服用確認通知にはパラメータとしてイベントidとカウンタを渡す。
③服用確認
- Googleカレンダーから当該idの服用イベントを取得して,服用済みかどうかを判定する。
- 服用済みでなければ服用通知回数カウンタを1upする。
- 服用通知回数カウンタが規定回数以下ならばGoogle Homeに服用を促すメッセージを送り,事前に設定された時間後に服用確認通知が届くようにタイマーを設定する。
- 服用通知回数カウンタが規定回数を超えていたらGoogleカレンダーの当該イベントを応答なし(黄)に設定する。
- 服用確認通知にはパラメータとしてイベントidとカウンタを渡す。
服用時:朝・昼・夜・就寝前
カレンダーの色:未服用=赤,服用済み=青,応答なし=黄
※応答なしの場合,親族にLINEすると同時に利用者にもLINEする
【QRコードから読み込む処方情報】
QRコードから読み込んだ処方情報は
JAHIS電子版お薬手帳データフォーマット仕様書Ver.2.2にしたがって記述する。その例を以下に示す。
1,鈴木 太郎,1,S330303,,東京都港区新橋1丁目△番 ○×ビル 5階,03-1234-1234,,B+,63.7,スズキ タロウ
2,1,乳製品,1
2,2,セフェム系(発熱),1
5,20190808,1
11,医療法人 オルカ医院,13,1,1234567,1130021,東京都文京区本駒込2-28-26,03-3946-0001,1
15,工業会 次郎,03-4567-4567,1
201,1,ノルバスク錠2.5mg,1,錠,1,,1
201,1,クラビット細粒10% 100mg(レボフロキシンとして),3,g,2,621925901,1
301,1,【1日3回毎食後に】,1,日分,1,1,,1
201,1,ペンニードル30Gテーパー,14,本,1,,1
201,1,バイアグラ,1,錠,1,,1
301,1,毎食後服用,3,日分,1,1,,1
リスト1.お薬手帳データフォーマット
リスト1に示すようなCSV形式だとプログラムからは扱いにくいので,これを以下のJSONフォーマットに変換する。
{
"patientInfo": {
"No1": {
"name": "鈴木 太郎",
"gender": "1",
"birthdate": "S330303",
"zipcode": "",
"address": "東京都港区新橋1丁目△番 ○×ビル 5階",
"phone": "03-1234-1234",
"emergencyContact": "",
"bloodType": "B+",
"weight": "63.7",
"kana": "スズキ タロウ"
},
"No2": [
{
"type": "1",
"content": "乳製品",
"creator": "1"
},
{
"type": "2",
"content": "セフェム系(発熱)",
"creator": "1"
}
]
},
"dispensing": [
{
"institution": {
"No5": {
"date": "20190808",
"creator": "1"
},
"No11": {
"name": "医療法人 オルカ医院",
"prefCode": "13",
"tensuCode": "1",
"code": "1234567",
"zipCode": "1130021",
"address": "東京都文京区本駒込2-28-26",
"phone": "03-3946-0001",
"creator": "1"
},
"No15": {
"name": "工業会 次郎",
"contact": "03-4567-4567",
"creator": "工業会 次郎"
}
},
"RPs": [
{
"drugs": [
{
"No201": {
"rp": "1",
"name": "ノルバスク錠2.5mg",
"dose": "1",
"unit": "錠",
"codeType": "1",
"code": "",
"creator": "1"
}
},
{
"No201": {
"rp": "1",
"name": "クラビット細粒10% 100mg(レボフロキシンとして)",
"dose": "3",
"unit": "g",
"codeType": "2",
"code": "621925901",
"creator": "1"
}
}
],
"dosage": {
"No301": {
"rp": "1",
"name": "【1日3回毎食後に】",
"quantity": "1",
"unit": "日分",
"formCode": "1",
"dosageType": "1",
"dosageCode": "",
"creator": "1"
}
}
},
{
"drugs": [
{
"No201": {
"rp": "1",
"name": "ペンニードル30Gテーパー",
"dose": "14",
"unit": "本",
"codeType": "1",
"code": "",
"creator": "1"
}
},
{
"No201": {
"rp": "1",
"name": "バイアグラ",
"dose": "1",
"unit": "錠",
"codeType": "1",
"code": "",
"creator": "1"
}
}
],
"dosage": {
"No301": {
"rp": "1",
"name": "毎食後服用",
"quantity": "3",
"unit": "日分",
"formCode": "1",
"dosageType": "1",
"dosageCode": "",
"creator": "1"
}
}
}
]
}
]
}
リスト2.JSON形式のお薬手帳データ
この変換を行うNodejsで書かれたスクリプトを以下に示す。
//-----------------------------------------------
//
// CSVファイルを解析する(構造化)※PR情報は1つのみ
//
//-----------------------------------------------
var csv_data = '';
csv_data += '1,鈴木 太郎,1,S330303,,東京都港区新橋1丁目△番 ○×ビル 5階,03-1234-1234,,B+,63.7,スズキ タロウ\r\l';
csv_data += '2,1,乳製品,1\r\l';
csv_data += '2,2,セフェム系(発熱),1\r\l';
csv_data += '5,20190808,1\r\l';
csv_data += '11,医療法人 オルカ医院,13,1,1234567,1130021,東京都文京区本駒込2-28-26,03-3946-0001,1\r\l';
csv_data += '15,工業会 次郎,03-4567-4567,1\r\l';
csv_data += '201,1,ノルバスク錠2.5mg,1,錠,1,,1\r\l';
csv_data += '201,1,クラビット細粒10% 100mg(レボフロキシンとして),3,g,2,621925901,1\r\l';
csv_data += '301,1,【1日3回毎食後に】,1,日分,1,1,,1\r\l';
csv_data += '201,1,ペンニードル30Gテーパー,14,本,1,,1\r\l';
csv_data += '201,1,バイアグラ,1,錠,1,,1\r\l';
csv_data += '301,1,毎食後服用,3,日分,1,1,,1';
function barcode2json(csv_data) {
var lines = csv_data.split('\r\l');
var prescription = {
patientInfo: {
No1: {},
No2: []
},
dispensing: [],
};
var dispensing = {
institution: {
No5: {},
No11: {},
No15: {},
},
RPs: [],
};
var RP = {
drugs: [],
dosage: '',
};
lines.forEach(function(line){
var items = line.split(',');
switch(items[0]) {
// 患者基本情報(レコードNo.1 患者情報レコード)
case "1":
prescription.patientInfo.No1 = {
name: items[1],
gender: items[2],
birthdate: items[3],
zipcode: items[4],
address: items[5],
phone: items[6],
emergencyContact: items[7],
bloodType: items[8],
weight: items[9],
kana: items[10],
};
break;
// 基本情報(レコードNo.2 患者特記レコード)
case "2":
prescription.patientInfo.No2.push({
type: items[1],
content: items[2],
creator: items[3],
});
break;
// 調剤-医療機関情報(レコードNo.5 調剤等年月日レコード)
case "5":
dispensing.institution.No5 = {
date: items[1],
creator: items[2],
};
break;
// 調剤-医療機関情報(レコードNo.11 調剤-医療機関等レコード)
case "11":
dispensing.institution.No11 = {
name: items[1],
prefCode: items[2],
tensuCode: items[3],
code: items[4],
zipCode: items[5],
address: items[6],
phone: items[7],
creator: items[8],
};
break;
// 調剤-医療機関情報(レコードNo.15 調剤-医師・薬剤師レコード)
case "15":
dispensing.institution.No15 = {
name: items[1],
contact: items[2],
creator: items[1],
};
break;
// 薬品情報(レコードNo.201 薬品レコード)
case "201":
RP.drugs.push({
No201: {
rp: items[1],
name: items[2],
dose: items[3],
unit: items[4],
codeType: items[5],
code: items[6],
creator: items[7],
}
});
break;
// 用法情報(レコードNo.301 用法レコード)
case "301":
RP.dosage = {
No301: {
rp: items[1],
name: items[2],
quantity: items[3],
unit: items[4],
formCode: items[5],
dosageType: items[6],
dosageCode: items[7],
creator: items[8],
}
};
dispensing.RPs.push(RP);
RP = {
drugs: [],
dosage: '',
};
break;
default:
console.log('default:' + items[0]);
break;
}
});
prescription.dispensing.push(dispensing);
return prescription;
}
var prescription = barcode2json(csv_data);
console.log(JSON.stringify(prescription, null, ' '));
リスト3.CSV形式の電子お薬手帳データをJSON形式に変換するNodejsのスクリプト