#2 IoT Hub + Stream Analytics + PowerBI でストリーミングデータ分析してみました


# STEP-2．Azure Stream Analytics と　PowerBI の 設定 とリアルタイム分析の表示

## 概要
データは鮮度が命！ ということで、データストリーミングを手軽にAzureで実装をおこなってみました。構成は、Azureの 「IoT Hub + Stream Analytics + PowerBI」となります。　IoT疑似データ生成プログラムをPythonで実装し IoT Hub にデータを投げ、Stream Analytics　でストリーミング＋クエリ処理を行い、そのクエリ結果＝分析情報をリアルタイムにPowerBIに表示してみました。

データストリーミングのデファクトは「Apache kafka（商用版：Confluent）」で、「Azure HDInsight」で [Apache Kafak の実装](https://docs.microsoft.com/ja-jp/azure/hdinsight/kafka/apache-kafka-introduction)を行えますが、それより簡易にストリーミング処理を行うためのものとなります。

本題の構成は以下となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/26d34656-0730-b72a-949c-7d4bb8a5f7b7.png)

- 以下の２つのステップで順次説明します。今回は STEP-1 について説明します。
    - STEP-1．Azure IoT Hub の設定とデータ受信のモニタリング
    - STEP-2．Azure Stream Analytics と　PowerBI の 設定 とリアルタイム分析の表示

---

## ローカル環境
macOS Big Sur 11.3
python 3.8.3

---

## Stream Analytics の設定

### Stream Analytics の作成
Azure Portalにログインし、Stream Analytics を作成します。 ジョブ名に「sa-ituru-stream-test」を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/44709674-799f-b3e5-f389-feaaaf4d1a0c.png)

画面下部の「作成」ボタンを押します。

### 入力の定義
作成された「sa-ituru-stream-test」画面の左側から「入力」を選択後、画面上部の「＋ストリーム入力の追加」から「IoT Hub」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/cb51e703-c9f9-8cf7-2edc-2dee8cf4a0d9.png)

新たに表示される「IoT Hub」画面において、「入力のエイリアス」に「IothubStreamTestDummyInput」を、「コンシューマグループ」に「consumerdummy」と入力し、画面下部の「保存」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/068f2f4d-31df-d862-99f2-5b288e99d508.png)

ストリーム入力の追加後の画面は以下となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/d5d885a8-6d7c-3020-3197-ad8836c3f173.png)

### 出力の定義
作成された「sa-ituru-stream-test」画面の左側から「出力」を選択後、画面上部の「＋追加」から「Power BI」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/7ee962d3-aa37-2a37-08ce-21c86398365a.png)

新たに表示される「Power BI」画面において、「出力エイリアス」に「IothubStreamTestDummyOutputSsection」を、「データセット名」に「IoTDummyDataset」を、「テーブル名」に「iotvalue_tbl」と入力し、Power BI の接続承認を経て、画面下部の「保存」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/0d9e1203-304e-a491-cde5-deb6b3458da3.png)

ストリーム入力の追加後の画面は以下となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/a6367a68-3c2e-3520-b005-c4fa3d1ca163.png)

### クエリ定義
作成された「sa-ituru-stream-test」画面の左側から「クエリ」を選択し、「入力」に「IothubStreamTestDummyInput」を設定します。
テストのために「クエリ欄」に以下を記述します。

```
SELECT
    section,
    vol_1,
    Vol_2
INTO
    [YourOutputAlias]
FROM
    IothubStreamTestDummyInput
```

[STEP-1](https://qiita.com/turupon/items/c6d7388c2aa89124abd7) の　IoT疑似データ生成プログラムを実行したあとに、Azure Stream Analytics でデータの受信とクエリ結果の確認のために、「クエリのテスト」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/a3887773-b20f-0353-7bba-0e37723feedb.png)

結果、受信したデータのクエリ処理を確認できたので、「出力」に「IothubStreamTestDummyOutputSsection」を設定します。
データ分析のために「クエリ欄」に以下を記述します。[Stream Analyticsのクエリ](https://blog.okazuki.jp/entry/2015/08/31/220406)を参考にさせていただき、section 毎に vol_2 値の10秒間の平均値を１秒スライドで表示させるクエリを作成しました。

```
SELECT
    section,
    AVG(vol_2)
INTO
    IothubStreamTestDummyOutputSsection
FROM
    IothubStreamTestDummyInput timestamp by time
GROUP BY
    section,
    SlidingWindow(second, 10)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/9939a1e5-1a66-5ccc-e426-8e899b611f48.png)


---

## Power BI の設定
「powerbi.microsoft.com」に接続しサインインします。サインイン後、画面上部の「Power BI Service」を選択します。
画面左側から「マイワークスペース」を選択し、画面上部の「＋新規」から「ダッシュボード」を選択します。
「ダッシュボードの作成」画面の「ダッシュボード名」に「IoTHubStream」を入力し、「作成」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/b7d62d36-f23c-da92-0c55-b06648982683.png)

「マイワークスペース」ー「ダッシュボード」ー「IoTHubStream」を選択し、画面右上の「編集」から「タイルの追加」を選択します。
「タイルの追加」画面から「カスタムストリーミングデータ」を選択し、「次へ」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/ce499be4-f9d5-2d81-997f-d1909aa6893e.png)

「カスタムストリーミングデータ タイルの追加」画面の「データセット」に「IoTDummyDataset」を入力し、「次へ」ボタンを押します。
次画面の「視覚化タイプ」に「集合横棒グラフ」を選択し、「軸」に「section」、「値」に「AVG」を選択し、「次へ」ボタンを押します。
「タイルの詳細」画面の「タイトル」に「IoTダミーデータ」、「サブタイトル」に「vol_2 AVG」と入力し、「適応」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/225786d4-3e9c-14e8-c687-648489e28d5e.png)

---

## ジョブの実行
Azure Stream Analytics の「sa-ituru-stream-test」ジョブ画面の上部にある「▷開始」ボタンを押し、新たに表示された「ジョブの開始」画面下部の「開始」ボタンを押し、ジョブを実行させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/149fd46e-ce29-6fc9-1a9b-aed6323b5a88.png)

---

## デバイス（IoTデータ生成プログラム）から IoT Hub へのデータ送信
[STEP-1](https://qiita.com/turupon/items/c6d7388c2aa89124abd7) の　IoT疑似データ生成プログラムを実行してみます。１秒間隔で120件のデータを IoT Hub へ送信します。

```
$ python IoTSampleData-v3.py --count 120 --mode ih --wait 1.0
```

送信されたデータは、同時に Power BI のダッシュボードで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/457a067d-bdf9-fde4-37ab-4bc853695536.png)

これで、IoTデバイス（Pythonプログラム）から送信されたデータが IoT Hub - Stream Analytics を経由し、クエリ処理された結果を Power BI でリアルタイム表示されることを確認できました。

---

## 参考情報
以下の情報を参考にさせていただきました。感謝申し上げます。
[Stream Analytics入門してみた #azurejp](https://blog.okazuki.jp/entry/2015/08/31/220406)
[Stream Analytics で 凝った集計処理を実装する](https://qiita.com/TsuyoshiUshio@github/items/d046a8820ab8e528c9b2)
[CO2濃度をAzureで可視化してみた](https://qiita.com/himorishuhei/items/320423abcada8fd0da2d)

## 本題のステップ
[STEP-1．Azure IoT Hub の設定とデータ受信のモニタリング](https://qiita.com/turupon/items/c6d7388c2aa89124abd7)
[STEP-2．Azure Stream Analytics と　PowerBI の 設定 とリアルタイム分析の表示](https://qiita.com/turupon/items/e0108f3cdecd10cfff19)