Cara menggunakan pemetaan CalculatedContentTemplate

Penting

Azure Healthcare APIs saat ini sedang dalam PRATINJAU. Ketentuan Penggunaan Tambahan untuk Pratinjau Microsoft Azure mencakup ketentuan hukum yang berlaku untuk fitur Azure dalam versi beta, pratinjau, atau belum dirilis ke ketersediaan umum.

Tip

Lihat alat Pemeta Data Konektor IoMT untuk mengedit, menguji, dan memecahkan masalah perangkat konektor IoT dan pemetaan tujuan FHIR. Ekspor pemetaan untuk mengunggah ke konektor IoT di portal Microsoft Azure atau gunakan dengan konektor IoT versi sumber terbuka.

Artikel ini menjelaskan cara menggunakan pemetaan CalculatedContentTemplate dengan templat pemetaan perangkat konektor IoT.

CalculatedContentTemplate

Konektor IoT menyediakan templat konten berbasis ekspresi agar sesuai dengan template yang diinginkan dan mengekstrak nilai. Ekspresi dapat digunakan oleh JSONPath atau JmesPath. Setiap ekspresi dalam template dapat memilih bahasa ekspresinya sendiri.

Catatan

Jika bahasa ekspresi tidak didefinisikan, bahasa ekspresi default yang dikonfigurasi untuk templat akan digunakan. Defaultnya adalah JSONPath tetapi dapat ditimpa jika diperlukan.

Sebuah ekspresi didefinisikan sebagai:

<name of expression> : {
        "value" : <the expression>,
        "language": <the expression language>
    }

Pada contoh di bawah ini, typeMatchExpression didefinisikan sebagai:

"templateType": "CalculatedContent",
    "template": {
        "typeName": "heartrate",
        "typeMatchExpression": {
            "value" : "$..[?(@heartRate)]",
            "language": "JsonPath"
        },
        ...
    }

Tip

Bahasa ekspresi default yang digunakan untuk templat pemetaan Perangkat adalah JsonPath. Jika Anda ingin menggunakan JsonPath, ekspresi saja dapat diberikan.

"templateType": "CalculatedContent",
    "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@heartRate)]",
        ...
    }

Bahasa ekspresi default yang digunakan untuk templat dapat diatur secara eksplisit menggunakan defaultExpressionLanguage parameter:

"templateType": "CalculatedContent",
    "template": {
        "typeName": "heartrate",
        "defaultExpressionLanguage": "JsonPath",
        "typeMatchExpression": "$..[?(@heartRate)]",
        ...
    }

CalculatedContentTemplate memungkinkan pencocokan dan mengekstraksi nilai dari pesan Azure Event Hub menggunakan Ekspresi sebagaimana didefinisikan di bawah ini:

Properti Deskripsi Contoh
TypeName Tipe yang harus dikaitkan dengan pengukuran yang cocok dengan templat heartrate
TypeMatchExpression Ekspresi yang dievaluasi terhadap payload EventData. Jika JToken yang cocok ditemukan, templat dianggap cocok. Semua ekspresi kemudian dievaluasi terhadap JToken yang diekstraksi yang cocok di sini. $..[?(@heartRate)]
TimestampExpression Ekspresi untuk mengekstrak nilai timestamp untuk OccurrenceTimeUtc pengukuran. $.matchedToken.endDate
DeviceIdExpression Ekspresi untuk mengekstrak pengidentifikasi perangkat. $.matchedToken.deviceId
PatientIdExpression Diperlukan saat IdentityResolution berada dalam mode Buat dan Opsional saat IdentityResolution berada dalam mode Pencarian. Ekspresi untuk mengekstrak pengidentifikasi pasien. $.matchedToken.patientId
EncounterIdExpression Opsional: Ekspresi untuk mengekstrak pengidentifikasi pertemuan. $.matchedToken.encounterId
Ekspresi CorrelationId Opsional: Ekspresi untuk mengekstrak pengidentifikasi korelasi. Output ini dapat digunakan untuk mengelompokkan nilai menjadi satu pengamatan dalam pemetaan tujuan FHIR. $.matchedToken.correlationId
Values[].ValueName Nama untuk dikaitkan dengan nilai yang diekstraksi oleh ekspresi berikutnya. Digunakan untuk mengikat nilai / komponen yang diinginkan dalam templat pemetaan tujuan FHIR. hr
Values[].ValueExpression Ekspresi untuk mengekstrak nilai yang diinginkan. $.matchedToken.heartRate
Values[].Required Akan membutuhkan nilai untuk hadir dalam payload. Jika tidak ditemukan, pengukuran tidak akan dihasilkan dan InvalidOperationException akan dibuat. true

Bahasa Ekspresi

Saat menentukan bahasa yang akan digunakan untuk ekspresi, nilai di bawah ini valid:

Bahasa Ekspresi Nilai
JSONPath JsonPath
JmesPath JmesPath

Tip

Untuk informasi selengkapnya tentang JSONPath, lihat JSONPath. CalculatedContentTemplate menggunakan implementasi JSON .NET untuk menyelesaikan ekspresi JSONPath.

Untuk informasi selengkapnya tentang JmesPath, lihat JmesPath. CalculatedContentTemplate menggunakan implementasi JmesPath .NET untuk menyelesaikan ekspresi JmesPath.

Fungsi Kustom

Satu set konektor IoT Fungsi Kustom juga tersedia. Fungsi Kustom ini berada di luar fungsi yang disediakan sebagai bagian dari spesifikasi JmesPath. Untuk informasi selengkapnya tentang Fungsi Kustom, lihat Fungsi Kustom konektor IoT.

Token yang Cocok

TypeMatchExpression dievaluasi terhadap payload EventData yang masuk. Jika JToken yang cocok ditemukan, templat dianggap cocok.

Semua ekspresi kemudian dievaluasi terhadap JToken baru. JToken baru ini berisi muatan EventData asli dan JToken yang diekstraksi yang cocok di sini.

Dengan cara ini, muatan asli dan objek yang cocok tersedia untuk setiap ekspresi nanti. JToken yang diekstraksi akan tersedia saat properti cocoktoken.

Mengingat contoh pesan ini:

Pesan

{
  "Body": {
    "deviceId": "device123",
    "data": [
      {
        "systolic": "120", // Match
        "diastolic": "80", // Match 
        "date": "2021-07-13T17:29:01.061144Z"
      },
      {
        "systolic": "122", // Match
        "diastolic": "82", // Match
        "date": "2021-07-13T17:28:01.061122Z"
      }
    ]
  },
  "Properties": {},
  "SystemProperties": {}
}

Templat

{
  "templateType": "CollectionContent",
  "template": [
    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@systolic && @diastolic)]", // Expression
        "deviceIdExpression": "$.Body.deviceId", // This accesses the attribute 'deviceId' which belongs to the original event data
        "timestampExpression": "$.matchedToken.date", 
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.systolic",
            "valueName": "systolic"
          },
          {
            "required": "true",
            "valueExpression": "$.matchedToken.diastolic",
            "valueName": "diastolic"
          }
        ]
      }
    }
  ]
}

Dua pertandingan akan diekstraksi menggunakan ekspresi di atas dan digunakan untuk membuat JTokens. Ekspresi selanjutnya akan dievaluasi menggunakan JTokens berikut:

{
  "Body": {
    "deviceId": "device123",
    "data": [
      {
        "systolic": "120", 
        "diastolic": "80",
        "date": "2021-07-13T17:29:01.061144Z"
      },
      {
        "systolic": "122",
        "diastolic": "82",
        "date": "2021-07-13T17:28:01.061122Z"
      }
    ]
  },
  "Properties": {},
  "SystemProperties": {},
  "matchedToken" : {
      "systolic": "120",
      "diastolic": "80",
      "date": "2021-07-13T17:29:01.061144Z"
  }
}

Dan

{
  "Body": {
    "deviceId": "device123",
    "data": [
      {
        "systolic": "120",
        "diastolic": "80",
        "date": "2021-07-13T17:29:01.061144Z"
      },
      {
        "systolic": "122", 
        "diastolic": "82", 
        "date": "2021-07-13T17:28:01.061122Z"
      }
    ]
  },
  "Properties": {},
  "SystemProperties": {},
  "matchedToken" : {
      "systolic": "122",
      "diastolic": "82",
      "date": "2021-07-13T17:28:01.061122Z"
    }
  }
}

Contoh

Detak Jantung

Pesan

{
  "Body": {
    "heartRate": "78",
    "endDate": "2019-02-01T22:46:01.8750000Z",
    "deviceId": "device123"
  },
  "Properties": {},
  "SystemProperties": {}
}

Templat

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@heartRate)]",
        "deviceIdExpression": "$.matchedToken.deviceId",
        "timestampExpression": "$.matchedToken.endDate",
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.heartRate",
            "valueName": "hr"
          }
        ]
      }
    }

Tekanan darah

Pesan

{
    "Body": {
        "systolic": "123", // Match
        "diastolic" : "87", // Match
        "endDate": "2019-02-01T22:46:01.8750000Z",
        "deviceId": "device123"
    },
    "Properties": {},
    "SystemProperties": {}
}

Templat

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "bloodpressure",
        "typeMatchExpression": "$..[?(@systolic && @diastolic)]", // Expression
        "deviceIdExpression": "$.matchedToken.deviceId",
        "timestampExpression": "$.matchedToken.endDate",
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.systolic",
            "valueName": "systolic"
          },
          {
            "required": "true",
            "valueExpression": "$.matchedToken.diastolic",
            "valueName": "diastolic"
          }
        ]
      }
    }

Project Beberapa Pengukuran dari Pesan Tunggal

Pesan

{
    "Body": {
        "heartRate": "78", // Match (Template 1)
        "steps": "2", // Match (Template 2)
        "endDate": "2019-02-01T22:46:01.8750000Z",
        "deviceId": "device123"
    },
    "Properties": {},
    "SystemProperties": {}
}

Templat 1

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@heartRate)]", // Expression
        "deviceIdExpression": "$.matchedToken.deviceId",
        "timestampExpression": "$.matchedToken.endDate",
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.heartRate",
            "valueName": "hr"
          }
        ]
      }
    },

Templat 2

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "stepcount",
        "typeMatchExpression": "$..[?(@steps)]", // Expression
        "deviceIdExpression": "$.matchedToken.deviceId",
        "timestampExpression": "$.matchedToken.endDate",
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.steps",
            "valueName": "steps"
          }
        ]
      }
    }

Project Beberapa Pengukuran dari Array di Pesan

Pesan

{
  "Body": [
    {
      "heartRate": "78", // Match
      "endDate": "2019-02-01T20:46:01.8750000Z",
      "deviceId": "device123"
    },
    {
      "heartRate": "81", // Match
      "endDate": "2019-02-01T21:46:01.8750000Z",
      "deviceId": "device123"
    },
    {
      "heartRate": "72", // Match
      "endDate": "2019-02-01T22:46:01.8750000Z",
      "deviceId": "device123"
    }
  ],
  "Properties": {},
  "SystemProperties": {}
}

Templat

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@heartRate)]", // Expression
        "deviceIdExpression": "$.matchedToken.deviceId",
        "timestampExpression": "$.matchedToken.endDate",
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.heartRate",
            "valueName": "hr"
          }
        ]
      }
    }

Project Data Dari Token Yang Cocok Dan Acara Asli

Pesan

{
  "Body": {
    "deviceId": "device123",
    "data": [
      {
        "systolic": "120", // Match
        "diastolic": "80", // Match 
        "date": "2021-07-13T17:29:01.061144Z"
      },
      {
        "systolic": "122", // Match
        "diastolic": "82", // Match
        "date": "2021-07-13T17:28:01.061122Z"
      }
    ]
  },
  "Properties": {},
  "SystemProperties": {}
}

Templat

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@systolic && @diastolic)]", // Expression
        "deviceIdExpression": "$.Body.deviceId", // This accesses the attribute 'deviceId' which belongs to the original event data
        "timestampExpression": "$.matchedToken.date", 
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.systolic",
            "valueName": "systolic"
          },
          {
            "required": "true",
            "valueExpression": "$.matchedToken.diastolic",
            "valueName": "diastolic"
          }
        ]
      }
    }

Memilih dan mengubah data yang masuk

Dalam contoh di bawah ini, data ketinggian tiba di inci atau meter. Kami ingin semua data ketinggian yang dinormalisasi berada dalam meter. Untuk mencapai hasil ini, kami membuat template yang hanya menargetkan data ketinggian dalam inci dan mengubahnya menjadi meter. Template lain menargetkan data ketinggian dalam meter dan hanya menyimpannya apa pun.

Pesan

{
  "Body": [
    {
      "height": "78",
      "unit": "inches", // Match (Template 1)
      "endDate": "2019-02-01T22:46:01.8750000Z",
      "deviceId": "device123"
    },
    {
      "height": "1.9304",
      "unit": "meters", // Match (Template 2)
      "endDate": "2019-02-01T23:46:01.8750000Z",
      "deviceId": "device123"
    }
  ],
  "Properties": {},
  "SystemProperties": {}
}

Templat 1

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "heightInMeters",
        "typeMatchExpression": "$..[?(@unit == 'inches')]",
        "deviceIdExpression": "$.matchedToken.deviceId",
        "timestampExpression": "$.matchedToken.endDate",
        "values": [
          {
            "required": "true",
            "valueExpression": {
              "value": "multiply(to_number(matchedToken.height), `0.0254`)", // Convert inches to meters. Notice we utilize JmesPath as that gives us access to transformation functions
              "language": "JmesPath"
            },
            "valueName": "height"
          }
        ]
      }
    }

Templat 2

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "heightInMeters",
        "typeMatchExpression": "$..[?(@unit == 'meters')]",
        "deviceIdExpression": "$.matchedToken.deviceId",
        "timestampExpression": "$.matchedToken.endDate",
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.height", // Simply extract the height as it is already in meters
            "valueName": "height"
          }
        ]
      }
    }

Tip

Lihat panduan pemecahan masalah konektor IoT untuk bantuan memperbaiki kesalahan dan masalah umum.

Langkah berikutnya

Pada artikel ini, Anda belajar cara menggunakan pemetaan Perangkat. Untuk mempelajari cara menggunakan pemetaan tujuan FHIR, lihat

(FHIR®) adalah merek dagang terdaftar dari HL7 dan digunakan dengan izin HL7.