2021年8月28日土曜日

血圧の記録にトラブルが発生!

8/24のGoogle Home班の報告にある血圧記録のトラブルについて原因を究明して解決したので報告します。

【現象】

8/24以降に入力した血圧データが壊れている。最初は収縮期血圧のみが壊れていたが、その後確認すると拡張期血圧も壊れている。

薬シェア健康記録のスプレッドシート「血圧」に記録されたデータが下記のようになっている(血圧の数値が入るべきところが Ljava.lang.Object になっている)。

2021/08/27 20:04:14,[Ljava.lang.Object;@2570d431,[Ljava.lang.Object;@3e48722a

【原因調査】

Action consoleでテストしてREQUESTデータを入手した(下記)。

{
  "responseId": "17678248-26ed-4c5c-a581-65b716413a8f-b9889856",
  "queryResult": {
    "queryText": "上が129で、下が70です",
    "parameters": {
      "systole": [
        129
      ],
      "diastolic": [
        70
      ],
      "ketsuatsu": [
        "最高血圧",
        "最低血圧"
      ]
    },
    "allRequiredParamsPresent": true,
    "fulfillmentMessages": [
      {
        "text": {
          "text": [
            ""
          ]
        }
      }
    ],
    "outputContexts": [
      {
        "name": "projects/kusuri-141ad/agent/sessions/ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP/contexts/actions_capability_media_response_audio",
        "parameters": {
          "systole": [
            129
          ],
          "systole.original": [
            "129"
          ],
          "diastolic": [
            70
          ],
          "diastolic.original": [
            "70"
          ],
          "ketsuatsu": [
            "最高血圧",
            "最低血圧"
          ],
          "ketsuatsu.original": [
            "上",
            "下"
          ]
        }
      },
      {
        "name": "projects/kusuri-141ad/agent/sessions/ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP/contexts/actions_capability_screen_output",
        "parameters": {
          "systole": [
            129
          ],
          "systole.original": [
            "129"
          ],
          "diastolic": [
            70
          ],
          "diastolic.original": [
            "70"
          ],
          "ketsuatsu": [
            "最高血圧",
            "最低血圧"
          ],
          "ketsuatsu.original": [
            "上",
            "下"
          ]
        }
      },
      {
        "name": "projects/kusuri-141ad/agent/sessions/ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP/contexts/actions_capability_account_linking",
        "parameters": {
          "systole": [
            129
          ],
          "systole.original": [
            "129"
          ],
          "diastolic": [
            70
          ],
          "diastolic.original": [
            "70"
          ],
          "ketsuatsu": [
            "最高血圧",
            "最低血圧"
          ],
          "ketsuatsu.original": [
            "上",
            "下"
          ]
        }
      },
      {
        "name": "projects/kusuri-141ad/agent/sessions/ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP/contexts/actions_capability_audio_output",
        "parameters": {
          "systole": [
            129
          ],
          "systole.original": [
            "129"
          ],
          "diastolic": [
            70
          ],
          "diastolic.original": [
            "70"
          ],
          "ketsuatsu": [
            "最高血圧",
            "最低血圧"
          ],
          "ketsuatsu.original": [
            "上",
            "下"
          ]
        }
      },
      {
        "name": "projects/kusuri-141ad/agent/sessions/ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP/contexts/google_assistant_input_type_voice",
        "parameters": {
          "systole": [
            129
          ],
          "systole.original": [
            "129"
          ],
          "diastolic": [
            70
          ],
          "diastolic.original": [
            "70"
          ],
          "ketsuatsu": [
            "最高血圧",
            "最低血圧"
          ],
          "ketsuatsu.original": [
            "上",
            "下"
          ]
        }
      },
      {
        "name": "projects/kusuri-141ad/agent/sessions/ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP/contexts/__system_counters__",
        "parameters": {
          "no-input": 0,
          "no-match": 0,
          "systole": [
            129
          ],
          "systole.original": [
            "129"
          ],
          "diastolic": [
            70
          ],
          "diastolic.original": [
            "70"
          ],
          "ketsuatsu": [
            "最高血圧",
            "最低血圧"
          ],
          "ketsuatsu.original": [
            "上",
            "下"
          ]
        }
      }
    ],
    "intent": {
      "name": "projects/kusuri-141ad/agent/intents/a27fc1b7-5ddc-40c7-8c38-cbe1c79bafe4",
      "displayName": "ketsuatsu"
    },
    "intentDetectionConfidence": 1,
    "languageCode": "ja"
  },
  "originalDetectIntentRequest": {
    "source": "google",
    "version": "2",
    "payload": {
      "user": {
        "locale": "ja-JP",
        "lastSeen": "2021-08-27T23:23:51Z",
        "userVerificationStatus": "VERIFIED"
      },
      "conversation": {
        "conversationId": "ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP",
        "type": "ACTIVE",
        "conversationToken": "[]"
      },
      "inputs": [
        {
          "intent": "actions.intent.TEXT",
          "rawInputs": [
            {
              "inputType": "VOICE",
              "query": "上が129で、下が70です"
            }
          ],
          "arguments": [
            {
              "name": "text",
              "rawText": "上が129で、下が70です",
              "textValue": "上が129で、下が70です"
            }
          ]
        }
      ],
      "surface": {
        "capabilities": [
          {
            "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
          },
          {
            "name": "actions.capability.SCREEN_OUTPUT"
          },
          {
            "name": "actions.capability.ACCOUNT_LINKING"
          },
          {
            "name": "actions.capability.AUDIO_OUTPUT"
          }
        ]
      },
      "isInSandbox": true,
      "availableSurfaces": [
        {
          "capabilities": [
            {
              "name": "actions.capability.AUDIO_OUTPUT"
            },
            {
              "name": "actions.capability.SCREEN_OUTPUT"
            },
            {
              "name": "actions.capability.WEB_BROWSER"
            }
          ]
        }
      ],
      "requestType": "SIMULATOR"
    }
  },
  "session": "projects/kusuri-141ad/agent/sessions/ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP"
}

リスト1.Action consoleで取得したリクエストデータ

これをDialogflowとGoogle Assistantの統合のリスト2と比較すると、outputTexts[0].parameters内のパラメタが、以前はスカラーだったのに対して今はベクトル(配列)になっている(下記へ抜粋)。

"parameters": {
  "systole": [
    129
  ],
  "systole.original": [
    "129"
  ],
  "diastolic": [
    70
  ],
  "diastolic.original": [
    "70"
  ],
  "ketsuatsu": [
    "最高血圧",
    "最低血圧"
  ],
  "ketsuatsu.original": [
    "上",
    "下"
  ]
}

そのため、下記プログラムでスプレッドシートに血圧を書き込むとLjava.lang.Objectとなるようだ。

function handleWebhook(req) {
  const parameters = req.queryResult.outputContexts[0].parameters;
  const intent = req.queryResult.intent;
  var text = '';
  if (req.queryResult.intent.displayName == 'ketsuatsu'){
      text =  '今日の最高血圧' + parameters['systole.original'] + '、最低血圧' + parameters['diastolic.original'] + 'を記録しました。';
      recordBloodPressure(parameters['systole.original'], parameters['diastolic.original']);
  }
  ...(中略)...
  return res;
}

リスト2.関数handleWebhookの抜粋(血圧処理部分)

この中でparameters['systole.original']などが配列になっているために起きるトラブルである。

この問題を解決するために、以下のように、パラメタの配列要素のうち先頭要素のみを取り出すように修正した。

function handleWebhook(req) {
  debug('handleWebhook:req=\n' + JSON.stringify(req, null, ' '));
  const parameters = req.queryResult.outputContexts[0].parameters;
  const intent = req.queryResult.intent;
  var text = '';
  if (req.queryResult.intent.displayName == 'ketsuatsu'){
    const systole = parameters['systole.original'][0]; // ←修正!
    const diastolic = parameters['diastolic.original'][0]; //  ←修正!
    text =  '今日の最高血圧' + systole + '、最低血圧' + diastolic + 'を記録しました。';
    recordBloodPressure(systole, diastolic);
  }
  ...(中略)...
  return res;
}

リスト3.修正したプログラム

すなわち、最高血圧は parameters['systole.original'] を取り出してスプレッドシートへ書き込んでいたが、parameters['systole.original'] は配列になっていたので parameters['systole.original'][0] のように[0]を付けて先頭要素を取り出した。この修正で血圧データが記録されないという問題は解消した。

0 件のコメント:

コメントを投稿