Azure IoT Centralの時系列データをAzure Time Series Insightsでデータ分析

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/599c0458-c984-0411-9ba5-dc27b1394522.png">


[既存の時系列データをAzure Time Series Insightsでデータ分析](https://qiita.com/matsujirushi/items/bd6affcc44c6b2719288)してみて、「**これはすごいぞAzure Time Series Insights。かなりのポテンシャルを感じる。**」となっているmatsujirushiです。

Azure Time Series Insightsを推していきたいところですが、、、これからAzure IoTやってみよう！という方には、デバイス -> Azure IoT Hub/Azure Event Hub -> Azure Time Series Insightsは少しハードルが高いのでは？と思うところもあります。パッと動かしてセンサーの測定値を表示したり、遠隔でデバイスを操作しようとするなら、**やっぱりAzure IoT Central**ですね。神サービス。

そこで、Azure IoT Centralのデータエクスポート機能を使って、**Azure IoT CentralとAzure Time Series Insightsを併用**できないか試してみました。

# Azure IoT CentralとAzure Time Series Insightsを繋ぐ

Azure Time Series Insightsの入力はAzure IoT HubもしくはAzure Event Hubだけです。Azure IoT Centralは選べません。Azure IoT Centralの入口はAzure IoT Hubじゃん！それを選べば、、、と一瞬思いますが、残念ながらAzure IoT Centralが使っているAzure IoT Hubの情報は公開されていません。

ではどうするのか？
ここで、データエクスポート機能の出番です。

データエクスポートとは、Azure IoT CentralのデータをAzure IoT Cetnral外部へ出力する機能です。左メニューの「Data export」でゴニョゴニョと設定することで、Azure Blob StorageやAzure Event Hubs、Webhookなどへデータを出力することができます。公式ドキュメントは[こちら](https://docs.microsoft.com/ja-jp/azure/iot-central/core/howto-export-data?WT.mc_id=AZ-MVP-5002686)。この機能、以前はContinous Data Exportsという名称で、操作した瞬間にデータをドカッと出力するものではなく、設定しておくと継続的にデータを出力してくれるものなんです。

というわけで、下図のように繋いでみました。

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/f30505f3-00c8-956b-32b6-ef091c312589.png">

# 結果

Azure IoT CentralとAzure Time Series Insightsを併用できました！！
下図の左がAzure IoT Central、右がAzure Time Series Insightsです。赤枠で囲った部分が同一データです。
（Azure IoT Centralのほうがデータが多いのは、、、繋ぐのに手間取ったからです:sweat_smile:）

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/a46e26b2-4786-3755-6ee8-098a72eb8306.png">

Azure IoT CentralのAnalyticsと比べてみると、時間範囲指定やグラフ表示の雰囲気は似ていますが、Azure Time Series Insightsは、より多くの機能がありそうです。

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/41634f1c-fa35-d22e-aa16-28a95ac623bb.png">

# まとめ

* Azure IoT CentralとAzure Time Series Insightsを併用できた。
* どちらか一方よりも、併用したほうが強力そう。（ダッシュボードはAzure IoT Centralが得意、時系列データ分析はAzure Time Series Insightsが得意）
* デバイスの設定や操作は、Azure IoT Centralで。
* データをAzure IoT CentralとAzure Time Series Insightsの二重持ちなのでもったいない感じ。（Azure IoT CentralでTelemetryの保存をストップできると気持ちいい。）

# 作り方

ちょっと雑に書きました。細かい部分を知りたいならば、[こちら](https://qiita.com/matsujirushi/items/bd6affcc44c6b2719288#%E4%BD%9C%E3%82%8A%E6%96%B9)もあわせて読んでください。

## Event Hub

Event Hubs NamespaceとEvent Hubを作ります。→[参考](https://qiita.com/matsujirushi/items/bd6affcc44c6b2719288#event-hub)

今回は既存のEvent Hubs Namespace「mjtsievent」に「iotc」というEvent Hubを作ることにしました。

* Name ... 「iotc」（適切に）

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/67014be7-d443-2a10-c75e-6caba3bb3057.png">

メッセージ投入のために外部（IoT Central）からEvent Hubへ接続があるので、念のためにそれ用のポリシーを作ります。

* Policy name ... 「iotc」（適切に）
* Send ... チェック

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/bd4991d4-cd55-3b93-fb86-700448ea61b0.png">

## Data Export

IoT Centralに、Event Hubへメッセージ投入するようData Exportを作ります。
実際は、投入先を指定したDestinationを作り、Data Exportを作る操作になります。

Destinationの作成は、IoT CentralのData export画面にある、Destinationsタブをクリックして、New destinationをクリックした先の画面を使います。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/d359c561-3333-16c5-6f62-0507983ea1b0.png">

* Name ... 「tsi」（適切に）
* Destination type ... 「Azure Event Hubs」
* Authorization ... 「Connection string」
* Connection string ... 先に作成したポリシーの接続文字列

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/8194b03c-3043-68de-1445-b4b2b8666ff2.png">

次はData Exportです。
IoT CentralのData export画面にある、Exportsタブをクリックして、New exportをクリックした先の画面を使います。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/f02229af-7464-f27f-1da6-f03e2c12f042.png">

* Name ... 「iotc」（適切に）
* Data
  * Type of data to export ... 「Telemetry」
* Destinations
    * Destination ... 「tsi」（作成したDestination）

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/538a8352-fcb1-438d-becf-119bbabc45fc.png">

## 確認

IoT CentralからEvent Hubに送られてくるメッセージがどのようなものかを、[Azure Event Hub Explorer](https://qiita.com/matsujirushi/items/8755050d361ab426922e#azure-event-hub-explorer)を使って確認します。

CO2モニターの[プログラム](https://github.com/SeeedJP/wioterminal-co2checker/blob/main/src/main.cpp#L89-L92)が書き出しているJSONは、

```JSON:プログラムが書いているJSON
{
  "co2": 588,
  "humi": 49,
  "temp": 29.33021,
  "wbgt": 25.62902
}
```

ですが、Event Hubに送られてきているJSONは、

```JSON:EventHubのメッセージ（JSON）
{
  "telemetry": {
    "co2": 588,
    "humi": 49,
    "temp": 29.33021,
    "wbgt": 25.62902
  },
  "schema": "default@v1",
  "enqueuedTime": "2021-10-05T11:49:55.331Z",
  "messageProperties": {},
  "enrichments": {},
  "deviceId": "WioTerminal",
  "messageSource": "telemetry",
  "templateId": "urn:modelDefinition:x9ouhewzg2:rc5yyo8l0",
  "applicationId": "aa0d558e-41c5-441f-a3f4-0002669722ac"
}
```

でした。

**ここ重要です！！**

IoT CentralのRaw dataで表示されているJSONと、Event Hubに送られてきているJSONには違いがあります。

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/ac0aad00-7f9a-4aaa-eda9-98b21cc9f5ea.png">

そして、

* プログラムが書いたJSONオブジェクトは**telemetryプロパティ**に入ります（入れ子）
* 日時は**enqueuedTimeプロパティ**
* IoT CentralにあるDevice IDは**deviceIdプロパティ**

です。

**重要なので、もう一度！！！！！**

* データ --> **telemetry**
* 日時 --> **enqueuedTime**
* Device ID --> **deviceId**

## Time Series Insights (+ Storage Account)

送られてくるメッセージが分かったところで、落ち着いてTime Series Insights EnvironmentとStorage Account、Event Sourceを作成します。

* Instance details
  * Environment name ... 「mjtsi2」（適切に）
  * Location ... 「Southeast Asia」（作成したResource GroupのRegion）
* Time series ID
  * Property name ... 「**deviceId**」（重要！！）
* Cold store
  * Storage account name ... 「mjtsistorage」（適切に）

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/64543fa1-feca-443f-c78d-325eb7348901.png"><img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/be97d7e4-fbe9-c7c9-ae74-deec4086bab0.png">

* Create an event source? ... 「Yes」
* Source type ... 「Event Hub」
* Name ... 「iotc」（適切に）
* Event Hub namespace ... 「mjtsievent」（作成したEvent Hub名前空間）
* Event Hub name ... 「iotc」（作成したEvent Hub）
* Event Hub access policy value ... 「RootManageSharedAccessKey」
* Event Hub consumer group ... 「$Default」
* Timestamp
  * Property name ... 「**enqueuedTime**」（重要！！）

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/6da2a98c-6cd2-a2d9-2424-af9d2b88c3cb.png">