IoT Central アプリケーション内のデータをエクスポート用に変換する
IoT デバイスから送信されるデータにはさまざまな形式があります。 IoT ソリューションでデバイス データを使用するには、デバイス データを他のサービスにエクスポートする前に変換が必要になる場合があります。
この記事では、IoT Central アプリケーションでデータ エクスポート定義の一部としてデバイス データを変換する方法について説明します。
IoT Central データ エクスポート定義の変換により、デバイス データを変換先にエクスポートする前に、その形式と構造を操作できます。 エクスポート定義では、変換先別に変換を指定できます。 各メッセージは変換を経過して、宛先にエクスポートする出力レコードが作成されます。
変換を使用することで、JSON ペイロードの再構築、フィールド名の変更、フィールドのフィルター処理、テレメトリ値に対する単純な計算の実行ができます。 たとえば、変換を使用して、Azure Data Explorer テーブルなどの変換先のスキーマに一致する表形式にメッセージを変換します。
次のビデオでは、IoT Central のデータ変換について説明します。
変換を追加する
データ エクスポート定義で宛先に変換を追加するには、次のスクリーンショットに示すように、[+ 変換] を選択します。
変換は [データ変換] パネルで指定できます。 [1. Add your input message]\(1. 入力メッセージの追加\) セクションには、変換するサンプル メッセージを入力できます。 デバイス テンプレートを選択して、サンプル メッセージを生成することもできます。 [2. Build transformation query]\(2. 変換クエリの作成\) セクションでは、入力メッセージを変換するクエリを入力できます。 [3. Preview output messages(s)]\(3. 出力メッセージのプレビュー\) セクションには、変換の結果が表示されます。
ヒント
入力メッセージの形式がわからない場合は、クエリとして .
を使用して、Webhook などの変換先にメッセージをそのままエクスポートします。 次に、Webhook によって受信されたメッセージを [1.入力メッセージの追加] に貼り付けます。 次に、このメッセージを処理して必要な出力形式にする変換クエリを作成します。
変換クエリを作成する
変換エンジンは、オープンソースの JQ JSON プロセッサを使用して、JSON ペイロードを再構築してフォーマットします。 変換を指定するには、JQ の組み込みフィルター、関数、機能などを使用できる JQ クエリを作成します。 いくつかのクエリの例については、「変換クエリの例」をご覧ください。 JQ クエリの作成の詳細については、JQ のマニュアルをご覧ください。
変換前のメッセージ構造
IoT Central から次のデータ ストリームをエクスポートできます。テレメトリ、プロパティの変更、デバイス接続イベント、デバイス ライフサイクル イベント、デバイス テンプレートのライフサイクル イベント。 各種類のデータには、テレメトリ値、アプリケーション情報、デバイス メタデータ、プロパティ値などの情報を含む特定の構造があります。
次の例は、テレメトリ メッセージの形を示しています。 このデータはすべて、変換に使用できます。 メッセージの構造は、他のメッセージ型と似ていますが、型固有のフィールドもあります。 [入力メッセージの追加] 機能を使用すると、アプリケーションのデバイス テンプレートに基づいてサンプル メッセージを生成できます。
{
"applicationId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"device": {
"id": "31edabe6-e0b9-4c83-b0df-d12e95745b9f",
"name": "Scripted Device - 31edabe6-e0b9-4c83-b0df-d12e95745b9f",
"cloudProperties": [],
"properties": {
"reported": [
{
"id": "urn:smartKneeBrace:Smart_Vitals_Patch_wr:FirmwareVersion:1",
"name": "FirmwareVersion",
"value": 1.0
}
]
},
"templateId": "urn:sbq3croo:modelDefinition:nf7st1wn3",
"templateName": "Smart Knee Brace"
},
"telemetry": [
{
"id": "urn:continuousPatientMonitoringTemplate:Smart_Knee_Brace_6wm:Acceleration:1",
"name": "Acceleration",
"value": {
"x": 19.212770659918583,
"y": 20.596296675217335,
"z": 54.04859440697045
}
},
{
"id": "urn:continuousPatientMonitoringTemplate:Smart_Knee_Brace_6wm:RangeOfMotion:1",
"name": "RangeOfMotion",
"value": 110
}
],
"enqueuedTime": "2021-03-23T19:55:56.971Z",
"enrichments": {
"your-enrichment-key": "enrichment-value"
},
"messageProperties": {
"prop1": "prop-value"
},
"messageSource": "telemetry"
}
ヒント
IoT Central アプリケーション UI の [入力メッセージの追加] 機能を使用して、プロパティの変更など、他のデータ エクスポートの種類向けのサンプル メッセージ構造を表示します。
変換クエリの例
次のクエリの例では、前のセクションで示したテレメトリ メッセージを使用します。
例 1: 次の JQ クエリは、入力メッセージからテレメトリの各部分を個別の出力メッセージとして出力します。
.telemetry[]
JSON 出力:
{
"id": "urn:continuousPatientMonitoringTemplate:Smart_Knee_Brace_6wm:Acceleration:1",
"name": "Acceleration",
"value": {
"x": 19.212770659918583,
"y": 20.596296675217335,
"z": 54.04859440697045
}
},
{
"id": "urn:continuousPatientMonitoringTemplate:Smart_Knee_Brace_6wm:RangeOfMotion:1",
"name": "RangeOfMotion",
"value": 110
}
ヒント
テレメトリの種類の配列を使用して出力を 1 つのメッセージに変更するには、クエリ .telemetry
を使用します。
例 2: 次の JQ クエリは、入力テレメトリ配列を、キーとしてテレメトリ名を持つオブジェクトに変換します。
.telemetry | map({ key: .name, value: .value }) | from_entries
JSON 出力:
{
"Acceleration": {
"x": 19.212770659918583,
"y": 20.596296675217335,
"z": 54.04859440697045
},
"RangeOfMotion": 110
}
例 3: 次の JQ クエリでは、 RangeOfMotion テレメトリ値を検索し、式 rad = degree * pi / 180
を使用して次数からラジアンに変換します。 このクエリでは、iotc
モジュールをインポートして使用する方法も示しています。
import "iotc" as iotc;
{
rangeOfMotion: (
.telemetry
| iotc::find(.name == "RangeOfMotion").value
| . * 3.14159265358979323846 / 180
)
}
JSON 出力:
{
"rangeOfMotion": 1.9198621771937625
}
例 4: 入力メッセージを表形式で操作するために、エクスポートされた各メッセージを 1 つ以上の行にマップできます。 行の出力は、列名がキーで、列値が値である JSON オブジェクトとして論理的に表されます。
{
"<column 1 name>": "<column 1 value>",
"<column 2 name>": "<column 2 value>",
...
}
ヒント
Azure Data Explorer にエクスポートする場合は、表形式を使用します。
次の JQ クエリは、さまざまなデバイスの rangeOfMotion テレメトリを格納するテーブルに行を書き込みます。 このクエリは、次の列を含むテーブルにデバイス ID、エンキューされた時刻、モーションの範囲などをマップします。
import "iotc" as iotc;
{
deviceId: .deviceId,
timestamp: .enqueuedTime,
rangeOfMotion: .telemetry | iotc::find(.name == "RangeOfMotion").value
}
JSON 形式の出力:
{
"deviceId": "31edabe6-e0b9-4c83-b0df-d12e95745b9f",
"timestamp": "2021-03-23T19:55:56.971Z",
"rangeOfMotion": 110
}
IoT Central モジュール
JQ モジュールは、カスタム関数のコレクションです。 変換クエリの一部として、関数を含む組み込み IoT Central 固有モジュールをインポートして、クエリの作成をさらに簡単にすることができます。 IoT Central モジュールをインポートするには、次のディレクティブを使用します。
import "iotc" as iotc;
IoT Central モジュールには、次の関数が含まれています。
find(expression)
: find
関数を使用すると、テレメトリ値やプロパティ エントリなどの特定の配列要素をペイロードで検索できます。 関数入力は配列であり、パラメーターは配列内の各要素に対して実行する JQ フィルターを定義します。 関数は、フィルターが true と評価した各配列要素を返します。
たとえば、RangeOfMotion
という名前の特定のテレメトリ値を検索するには、次のように指定します。
.telemetry | iotc::find(.name == "RangeOfMotion")
シナリオ
次のシナリオでは、変換機能を使用して、特定の変換先のデバイス データ形式をカスタマイズします。
シナリオ 1: Azure Data Explorer にデバイス データをエクスポートする
このシナリオでは、Azure Data Explorer の固定スキーマに一致するようにデバイス データを変換します。各テレメトリ値はテーブルの列として表示され、各行は 1 つのメッセージを表します。 次に例を示します。
DeviceId | タイムスタンプ | T1 | T2 | T3 |
---|---|---|---|---|
"31edabe6-e0b9-4c83-b0df-d12e95745b9f" | "2021-03-23T19:55:56.971Z | 1.18898 | 1.434709 | 2.97008 |
このテーブルと互換性のあるデータをエクスポートするには、エクスポートされた各メッセージが次のオブジェクトのように表示される必要があります。 オブジェクトは 1 つの行を表し、キーは列名、値は各列に配置する値です。
{
"Timestamp": <value-of-Timestamp>,
"DeviceId": <value-of-deviceId>,
"T1": <value-of-T1>,
"T2": <value-of-T2>,
"T3": <value-of-T3>,
}
このシナリオでは、デバイスは t1
、t2
、t3
のテレメトリ値を、次の例のような入力メッセージで送信します。
{
"applicationId": "11112222-bbbb-3333-cccc-4444dddd5555",
"enqueuedTime": "1933-01-26T03:10:44.480001324Z",
"messageSource": "telemetry",
"telemetry": [
{
"id": "dtmi:temperaturesensor288:sensors1lr:t1;1",
"name": "t1",
"value": 1.1889838348731093e+308
},
{
"id": "dtmi:temperaturesensor288:sensors1lr:t2;1",
"name": "t2",
"value": 1.4347093391531383e+308
},
{
"id": "dtmi:temperaturesensor288:sensors1lr:t3;1",
"name": "t3",
"value": 2.9700885230380616e+307
}
],
"device": {
"id": "oozrnl1zs857",
"name": "haptic alarm",
"templateId": "dtmi:modelDefinition:nhhbjotee:qytxnp8hi",
"templateName": "hapticsensors",
"properties": {
"reported": []
},
"cloudProperties": [],
"simulated": true,
"approved": false,
"blocked": false,
"provisioned": true
}
}
次の JQ クエリでは T1
、 T2
、T3
テレメトリ値、Timestamp
および deviceId
を、Azure Data Explorer テーブルスキーマと一致するキーと値のペアを持つメッセージとして出力します。
import "iotc" as iotc;
{
deviceId: .device.id,
Timestamp: .enqueuedTime,
T1: .telemetry | iotc::find(.name == "t1").value,
T2: .telemetry | iotc::find(.name == "t2").value,
T3: .telemetry | iotc::find(.name == "t3").value,
}
JSON 出力:
{
"T1": 1.1889838348731093e+308,
"T2": 1.4347093391531383e+308,
"T3": 2.9700885230380616e+307,
"Timestamp": "1933-01-26T03:10:44.480001324Z",
"deviceId": "oozrnl1zs857"
}
Azure Data Explorer クラスターとデータベースをエクスポート先として追加する方法の詳細については、 「Azure Storage Explorer の宛先を作成する」をご覧ください。
シナリオ 2: テレメトリ配列を分割する
このシナリオでは、デバイスは次のテレメトリの配列を1つのメッセージで送信します。
{
"applicationId": "22223333-cccc-4444-dddd-5555eeee6666",
"enqueuedTime": "1909-10-10T07:11:56.078161042Z",
"messageSource": "telemetry",
"telemetry": [
{
"id": "dtmi:sample1:data;1",
"name": "data",
"value": [
{
"id": "subdevice1",
"values": {
"running": true,
"cycleCount": 2315
}
},
{
"id": "subdevice2",
"values": {
"running": false,
"cycleCount": 824567
}
}
]
},
{
"id": "dtmi:sample1:parentStatus;1",
"name": "parentStatus",
"value": "healthy"
}
],
"device": {
"id": "9xwhr7khkfri",
"name": "wireless port",
"templateId": "dtmi:hpzy1kfcbt2:umua7dplmbd",
"templateName": "Smart Vitals Patch",
"properties": {
"reported": [
{
"id": "dtmi:sample1:prop;1",
"name": "Connectivity",
"value": "Tenetur ut quasi minus ratione voluptatem."
}
]
},
"cloudProperties": [],
"simulated": true,
"approved": true,
"blocked": false,
"provisioned": false
}
}
このデバイス データを次のテーブル スキーマと一致するように変換します。
cycleCount | deviceId | enqueuedTime | parentStatus | 実行中 | subdeviceId |
---|---|---|---|---|---|
2315 | "9xwhr7khkfri" | "1909-10-10T07:11:56.078161042Z" | "healthy" | true | "subdevice1" |
824567 | "9xwhr7khkfri" | "1909-10-10T07:11:56.078161042Z" | "healthy" | false | "subdevice2" |
次の JQ クエリでは、メッセージ内のサブデバイス エントリごとに個別の出力メッセージが作成され、基本メッセージと親デバイスからの一般的ないくつかの情報が組み込まれます。 このクエリでは、出力がフラット化され、1 つのメッセージとして着信したデータ内の論理除算が分離されます。
import "iotc" as iotc;
{
enqueuedTime: .enqueuedTime,
deviceId: .device.id,
parentStatus: .telemetry | iotc::find(.name == "parentStatus").value
} + (
.telemetry
| iotc::find(.name == "data").value[]
| {
subdeviceId: .id,
running: .values.running,
cycleCount: .values.cycleCount
}
)
JSON 出力:
{
"cycleCount": 2315,
"deviceId": "9xwhr7khkfri",
"enqueuedTime": "1909-10-10T07:11:56.078161042Z",
"parentStatus": "healthy",
"running": true,
"subdeviceId": "subdevice1"
},
{
"cycleCount": 824567,
"deviceId": "9xwhr7khkfri",
"enqueuedTime": "1909-10-10T07:11:56.078161042Z",
"parentStatus": "healthy",
"running": false,
"subdeviceId": "subdevice2"
}
シナリオ 3: Power BI ストリーミング
Power BI のリアルタイム ストリーミング機能を使用すると、低待ち時間でリアルタイムに更新されるダッシュボードにデータを表示できます。 詳細については、「Power BI のリアルタイム ストリーミング」をご覧ください。
IoT Central を Power BI ストリーミングで使用するには、要求本文を特定の形式で送信する Webhook エクスポートを設定します。 この例では、次のスキーマで Power BI ストリーミング データセットがある場合を想定しています。
{
"bloodPressureDiastolic": 161438124,
"bloodPressureSystolic": -966387879,
"deviceId": "9xwhr7khkfri",
"deviceName": "wireless port",
"heartRate": -633994413,
"heartRateVariability": -37514094,
"respiratoryRate": 1582211310,
"timestamp": "1909-10-10T07:11:56.078161042Z"
}
Webhook エクスポート先を作成するには、Power BI ストリーミング データセット用の REST API URL エンドポイントが必要です。
このシナリオでは、デバイスは次の例のようなテレメトリ メッセージを送信します。
{
"applicationId": "22223333-cccc-4444-dddd-5555eeee6666",
"enqueuedTime": "1909-10-10T07:11:56.078161042Z",
"messageSource": "telemetry",
"telemetry": [
{
"id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:HeartRate;1",
"name": "HeartRate",
"value": -633994413
},
{
"id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:RespiratoryRate;1",
"name": "RespiratoryRate",
"value": 1582211310
},
{
"id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:HeartRateVariability;1",
"name": "HeartRateVariability",
"value": -37514094
},
{
"id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:BodyTemperature;1",
"name": "BodyTemperature",
"value": 5.323322666478241e+307
},
{
"id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:FallDetection;1",
"name": "FallDetection",
"value": "Earum est nobis at voluptas id qui."
},
{
"id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:BloodPressure;1",
"name": "BloodPressure",
"value": {
"Diastolic": 161438124,
"Systolic": -966387879
}
}
],
"device": {
"id": "9xwhr7khkfri",
"name": "wireless port",
"templateId": "dtmi:hpzy1kfcbt2:umua7dplmbd",
"templateName": "Smart Vitals Patch",
"properties": {
"reported": [
{
"id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_wr:DeviceStatus;1",
"name": "DeviceStatus",
"value": "Id optio iste vero et neque sit."
}
]
},
"cloudProperties": [],
"simulated": true,
"approved": true,
"blocked": false,
"provisioned": false
}
}
次の JQ クエリは、入力メッセージを、Webhook が Power BI ストリーミング データセットに送信するのに適した形式に変換します。 この例には、特定のデバイス テンプレートのメッセージのみを出力するフィルター条件が含まれています。 データ エクスポート フィルター機能を使用して、デバイス テンプレートでフィルター処理できます。
import "iotc" as iotc;
if .device.templateId == "dtmi:hpzy1kfcbt2:umua7dplmbd" then
{
deviceId: .device.id,
timestamp: .enqueuedTime,
deviceName: .device.name,
bloodPressureSystolic: .telemetry | iotc::find(.name == "BloodPressure").value.Systolic,
bloodPressureDiastolic: .telemetry | iotc::find(.name == "BloodPressure").value.Diastolic,
heartRate: .telemetry | iotc::find(.name == "HeartRate").value,
heartRateVariability: .telemetry | iotc::find(.name == "HeartRateVariability").value,
respiratoryRate: .telemetry | iotc::find(.name == "RespiratoryRate").value
}
else
empty
end
JSON 出力:
{
"bloodPressureDiastolic": 161438124,
"bloodPressureSystolic": -966387879,
"deviceId": "9xwhr7khkfri",
"deviceName": "wireless port",
"heartRate": -633994413,
"heartRateVariability": -37514094,
"respiratoryRate": 1582211310,
"timestamp": "1909-10-10T07:11:56.078161042Z"
}
シナリオ 4: データを Azure Data Explorer にエクスポートして Power BI で視覚化する
このシナリオでは、データを Azure Data Explorer にエクスポートしてから、 コネクタを使用して、Power BI のデータを視覚化します。 Azure Data Explorer クラスターとデータベースをエクスポート先として追加する方法の詳細については、 「Azure Storage Explorer の宛先を作成する」をご覧ください。
このシナリオでは、次のスキーマがある Azure Data Explorer テーブルを使用します。
.create table smartvitalspatch (
EnqueuedTime:datetime,
Message:string,
Application:string,
Device:string,
Simulated:boolean,
Template:string,
Module:string,
Component:string,
Capability:string,
Value:dynamic
)
このシナリオでは、デバイスは次の例のようなテレメトリ メッセージを送信します。
{
"applicationId": "22223333-cccc-4444-dddd-5555eeee6666",
"enqueuedTime": "1909-10-10T07:11:56.078161042Z",
"messageSource": "telemetry",
"telemetry": [
{
"id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:HeartRate;1",
"name": "HeartRate",
"value": -633994413
},
{
"id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:RespiratoryRate;1",
"name": "RespiratoryRate",
"value": 1582211310
},
{
"id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:HeartRateVariability;1",
"name": "HeartRateVariability",
"value": -37514094
},
{
"id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:BodyTemperature;1",
"name": "BodyTemperature",
"value": 5.323322666478241e+307
},
{
"id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:FallDetection;1",
"name": "FallDetection",
"value": "Earum est nobis at voluptas id qui."
},
{
"id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_37p:BloodPressure;1",
"name": "BloodPressure",
"value": {
"Diastolic": 161438124,
"Systolic": -966387879
}
}
],
"device": {
"id": "9xwhr7khkfri",
"name": "wireless port",
"templateId": "dtmi:hpzy1kfcbt2:umua7dplmbd",
"templateName": "Smart Vitals Patch",
"properties": {
"reported": [
{
"id": "dtmi:smartVitalsPatch:Smart_Vitals_Patch_wr:DeviceStatus;1",
"name": "DeviceStatus",
"value": "Id optio iste vero et neque sit."
}
]
},
"cloudProperties": [],
"simulated": true,
"approved": true,
"blocked": false,
"provisioned": false
}
}
次の JQ クエリは、各テレメトリ値の個別の出力メッセージに入力メッセージを変換します。 この変換では、Azure Data Explorer テーブル スキーマに一致する出力が生成されます。 変換では、エンティティ属性値スキーマが使用されます。各行には 1 つのテレメトリ値が保持され、テレメトリの名前は同じ行内の個別の列の値です。
. as $in | .telemetry[] | {
EnqueuedTime: $in.enqueuedTime,
Message: $in.messageId,
Application: $in.applicationId,
Device: $in.device.id,
Simulated: $in.device.simulated,
Template: ($in.device.templateName // ""),
Module: ($in.module // ""),
Component: ($in.component // ""),
Capability: .name,
Value: .value
}
JSON 出力:
{
"Application": "22223333-cccc-4444-dddd-5555eeee6666",
"Capability": "HeartRate",
"Component": "",
"Device": "9xwhr7khkfri",
"EnqueuedTime": "1909-10-10T07:11:56.078161042Z",
"Message": null,
"Module": "",
"Simulated": true,
"Template": "Smart Vitals Patch",
"Value": -633994413
},
{
"Application": "22223333-cccc-4444-dddd-5555eeee6666",
"Capability": "RespiratoryRate",
"Component": "",
"Device": "9xwhr7khkfri",
"EnqueuedTime": "1909-10-10T07:11:56.078161042Z",
"Message": null,
"Module": "",
"Simulated": true,
"Template": "Smart Vitals Patch",
"Value": 1582211310
},
{
"Application": "22223333-cccc-4444-dddd-5555eeee6666",
"Capability": "HeartRateVariability",
"Component": "",
"Device": "9xwhr7khkfri",
"EnqueuedTime": "1909-10-10T07:11:56.078161042Z",
"Message": null,
"Module": "",
"Simulated": true,
"Template": "Smart Vitals Patch",
"Value": -37514094
},
{
"Application": "22223333-cccc-4444-dddd-5555eeee6666",
"Capability": "BodyTemperature",
"Component": "",
"Device": "9xwhr7khkfri",
"EnqueuedTime": "1909-10-10T07:11:56.078161042Z",
"Message": null,
"Module": "",
"Simulated": true,
"Template": "Smart Vitals Patch",
"Value": 5.323322666478241e+307
},
{
"Application": "22223333-cccc-4444-dddd-5555eeee6666",
"Capability": "FallDetection",
"Component": "",
"Device": "9xwhr7khkfri",
"EnqueuedTime": "1909-10-10T07:11:56.078161042Z",
"Message": null,
"Module": "",
"Simulated": true,
"Template": "Smart Vitals Patch",
"Value": "Earum est nobis at voluptas id qui."
},
{
"Application": "22223333-cccc-4444-dddd-5555eeee6666",
"Capability": "BloodPressure",
"Component": "",
"Device": "9xwhr7khkfri",
"EnqueuedTime": "1909-10-10T07:11:56.078161042Z",
"Message": null,
"Module": "",
"Simulated": true,
"Template": "Smart Vitals Patch",
"Value": {
"Diastolic": 161438124,
"Systolic": -966387879
}
}
出力データは、Azure Data Explorer クラスターにエクスポートされます。 エクスポートされたデータを Power BI で視覚化するには、次の手順を実行します。
- Power BI アプリケーションをインストールします。 デスクトップ Power BI アプリケーションは、「データから洞察を得て、Power BI Desktop でアクションに移す」からダウンロードできます。
- Power BI Desktop の IoT Central ADX Connector.pbit ファイルを GitHub からダウンロードします。
- Power BI Desktop アプリを使用して、前のステップでダウンロードした IoT Central ADX Connector.pbit ファイルを開きます。 ダイアログが表示されたら、事前にメモを作成した Azure Data Explorer クラスター、データベース、テーブルなどの情報を入力します。
これで、Power BI でデータを視覚化できます。
次のステップ
IoT Central でデータを変換する方法を理解できたので、次のステップとして IoT Central で分析を使用する方法を学習することをお勧めします