Azure IoT実践（Azure IoT Edge for Linux on Windows）

# 概要
Azure IoT実践編としてRaspberry Piに温湿度センサーを付け、Azure IoT Hubへ温度と湿度を送信、PowerBIで可視化する構成で作ってみます。
デバイスからAzure IoT Hubへ直接情報を送ってもいいのですが、実際のところではAzure IoT Edgeを経由することが多い？と思うので、自宅のWindows PCをAzure IoT Edgeとして利用しAzure IoT Hubへ情報を流しています（データの加工などは行っていません）。

※Azure IoT Edgeでは、デバイスからの情報の不要部分の削除や集約などを行うことができ、必要なデータだけを送ることで帯域幅コスト削減などが期待できる。
※Raspberry Piに温湿度センサーを付ける、情報を読み取る方法は解説しませんのでそこは他のサイトを参照ください。

# 構成図と説明
①Raspberry Piから温度・湿度の値をWindows PC(Azure IoT Edge for Linux on WIndows)へ流す
②Windows PCからAzure IoT Hubへそのまま情報を受け渡す（3秒間隔）
③Azure IoT Hubで情報を受信
④Stream AnalyticsでAzure IoT Hubからデータを読み込み、ADLS（Azure Data Lake Storage Gen2）へファイルを出力
⑤DatabricksでADLSのファイルを読み込んで分単位の温度・湿度平均を算出
⑥PowerBIレポートで分毎の温度・湿度変化をグラフ化
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/1cae923a-f0f9-db0e-e1d7-a8f20346dc25.png)

# 環境
- デバイス：Raspberry Pi 4 Model B Rev 1.2（Raspbian 10）
- IoT Edge（Windows PC）：Windows10 Pro(21H1)
- IoT Hub：Edgeエージェント Ver1.4、Edgeハブ Ver1.4

# 構築手順
## 1.Azureサービスの作成
### 1.1 Azure IoT Hub
①Azure PortalからIoT Hubを検索
![IoT Hub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/9ef2d793-79e9-48b6-d373-50d431d8b2da.png)
②以下の設定で作成（記載以外はデフォルト）
- リソースグループ：任意
- IoT Hub名：任意
- リージョン：Japan East
- 価格とスケールティア：F1:Free レベル

### 1.2 Azure Stream Analytics
①Azure PortalからStream Analytics ジョブを検索
![Stream Analytics.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/28ad148a-3394-0694-3a77-74b0c4049a98.png)
②以下の設定で作成（記載以外はデフォルト）
- リソースグループ：Azure IoT Hubを作成したリソースグループ
- 名前：任意
- リージョン：Japan East
- ストリーミングユニット：1

### 1.3 Azure Data Lake Storage Gen2（ADLS）
①Azure Portalからストレージ アカウントを検索
![ADLS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/ec6937ea-f2d1-ffe1-e3f9-30c4810a95c7.png)
②以下の設定で作成（記載以外はデフォルト）
- リソースグループ：Azure IoT Hubを作成したリソースグループ
- ストレージ アカウント名：任意
- リージョン：Japan East
- 冗長性：ローカル冗長ストレージ（LRS）
- 階層型名前空間を有効にする：チェック

③デバイスからのメッセージ出力用のコンテナを作成しておく
![ADLS2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/93603f5f-4f03-7f8a-7dba-a25d99b43131.png)

### 1.4 Azure Databricks
①Azure PortalからAzure Databricksを検索
![Databricks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/273d6343-dae4-a987-393d-b12aeb5b1dcf.png)
②以下の設定で作成（記載以外はデフォルト）
- リソースグループ：Azure IoT Hubを作成したリソースグループ
- ワークスペース名：任意
- リージョン：Japan East
- 価格レベル：試用版

③クラスタ作成（お金があまりかからないように低スペックで作成）
![Databricks2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/350e6a97-f00b-e97d-4cc4-d3a58feb9ba2.png)

## 2.Azure IoT Hub設定
①IoT Edge デバイスの追加
　デバイス IDは任意のものを指定し、その他はデフォルト設定
![IoT Hub_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/2e72bc2c-7785-84a3-967f-46d3ca4cffd3.png)
![IoT Hub_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/32b34e8a-7e8c-2485-58cb-c0c991a66939.png)
　プライマリ接続文字列は後で使うので保管しておいてください。
![IoT Hub_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/7d07ec15-6141-9d8c-6b73-5d6fda64c6c9.png)
　IoT Edgeに届いたメッセージをIoT Hubに転送するよう設定する
![IoT Hub_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/502284c9-581b-c005-bd2f-086e2ff23cf7.png)
　↓
![IoT Hub_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/2b8ca772-1390-0a3b-b6a8-723b8c2271d6.png)
　↓　名前：allMessagesToHub、値：FROM /messages/* INTO $upstream　を設定
![IoT Hub_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/931a9991-69b7-e243-a2c8-795c11e94dd4.png)

②デバイスの追加
　デバイス IDは任意、親デバイスに①で作成したIoT Edgeを指定し、その他はデフォルト設定
![IoT Hub_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/2e52705b-52f9-002a-9625-8db4cce83267.png)
![IoT Hub_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/02153cca-b9c6-396b-f23c-0792cf485792.png)
　こちらも同様にプライマリ接続文字列は後で使うので保管しておく。
![IoT Hub_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/50ca8f27-819b-7e25-5f6c-7b2dd85011b6.png)

## 3.Raspberry Pi設定①
①以下のコマンドでRaspberry PiにAzure IoT SDKをインストール
```bash:Bash
pip3 install azure-iot-device
pip3 install azure-iot-hub
```
②Gitリポジトリもクローン
```bash:Bash
git clone https://github.com/Azure/azure-iot-sdk-python.git
```

## 4.Windows PC設定
### 4.1 Azure IoT Edge for Linux on Windowsをインストール
参考サイト：[対称キーを使用して IoT Edge for Linux on Windows デバイスを作成してプロビジョニングする](https://learn.microsoft.com/ja-jp/azure/iot-edge/how-to-provision-single-device-linux-on-windows-symmetric?view=iotedge-1.4&tabs=azure-portal%2Cpowershell)

①PowerShellスクリプト実行ポリシー設定
```powershell:PowerShellプロンプト
Set-ExecutionPolicy -ExecutionPolicy AllSigned -Force
```
②IoT Edge for Linux on Windows をダウンロード
```powershell:PowerShellプロンプト
$msiPath = $([io.Path]::Combine($env:TEMP, 'AzureIoTEdge.msi'))
$ProgressPreference = 'SilentlyContinue'
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest "https://aka.ms/AzEFLOWMSI-CR-X64" -OutFile $msiPath
```
③IoT Edge for Linux on Windows をインストール
```powershell:PowerShellプロンプト
Start-Process -Wait msiexec -ArgumentList "/i","$([io.Path]::Combine($env:TEMP, 'AzureIoTEdge.msi'))","/qn"
```
④IoT Edge for Linux on Windows のデプロイ
　ライセンス条項はYで同意。Optional diagnostic dataはRを入力。
　「Deployment successful」が表示されれば成功。
```powershell:PowerShellプロンプト
Deploy-Eflow
```
<img width="800" alt="IoT Edge_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/a83a3834-e464-1505-f703-020ffea44601.png">

⑤デバイスをプロビジョニング
　`PASTE_DEVICE_CONNECTION_STRING_HERE`には2-①で保管していたプライマリ接続文字列を設定
```powershell:PowerShellプロンプト
Provision-EflowVm -provisioningType ManualConnectionString -devConnString "PASTE_DEVICE_CONNECTION_STRING_HERE"
```
⑥IoT Edge仮想マシンにログインしモジュールの状態を確認
```powershell:PowerShellプロンプト
Connect-EflowVm
```
```bash:Bash
sudo iotedge list
```
　edgeAgent、edgeHubともにrunningになっていればOK（edgeHubが出てこなければしばらく待って再度確認）。
<img width="800" alt="IoT Edge_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/33b02a80-f73b-5fd4-3d84-58be06b81b54.png">
　IoT HubのIoT Edgeデバイスもrunningになる。
![IoT Edge_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/d869e863-f97d-2d52-2bf2-9abab8bb8343.png)

### 4.2 証明書の作成
4.1でとりあえずIoT HubとIoT Edgeが繋がりましたが、デバイスからIoT Edgeに繋げるのに証明書が必要になるためデモ用証明書（30日間のみ使用可能）を作成します。
参考サイト：[IoT Edge デバイスの機能をテストするためのデモ用の証明書を作成する](https://learn.microsoft.com/ja-jp/azure/iot-edge/how-to-create-test-certificates?view=iotedge-1.4&tabs=windows)

①OpenSSL のインストール
　参考サイト参照

②証明書作成スクリプト実行のための準備
```powershell:PowerShellプロンプト
git clone https://github.com/Azure/iotedge.git

mkdir wrkdir
cd .\wrkdir\
cp ..\iotedge\tools\CACertificates\*.cnf .
cp ..\iotedge\tools\CACertificates\ca-certs.ps1 .

Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser

. .\ca-certs.ps1
```
③ルート CA 証明書の作成
```powershell:PowerShellプロンプト
New-CACertsCertChain rsa
```
④エッジ CA 証明書の作成
　※ `CA cert name`は任意ではあるが、IoT HubのデバイスIDと同じにしない方がよいらしい。
　　　今回は「iotEdgeMyPCCACert」にした。

```powershell:PowerShellプロンプト
New-CACertsEdgeDevice "<CA cert name>"
```

### 4.3 証明書をIoT Edge仮想マシンに配置
参考サイト：[透過的なゲートウェイとして機能するように IoT Edge デバイスを構成する](https://learn.microsoft.com/ja-jp/azure/iot-edge/how-to-create-transparent-gateway?view=iotedge-1.4&tabs=eflow)

①IoT Edge仮想マシンに証明書配置用ディレクトリを作成
```powershell:PowerShellプロンプト
Connect-EflowVm
```
```bash:Bash
cd ~
mkdir certs
cd certs
mkdir certs
mkdir private
exit
```

②証明書をIoT Edge仮想マシンにコピー
　`path`は4.2-②で作成したwrkdirのパス。`CA cert name`は4.2-④で決めた名前。
```powershell:PowerShellプロンプト
# Copy the IoT Edge device CA certificates
Copy-EflowVMFile -fromFile <path>\certs\iot-edge-device-ca-<CA cert name>-full-chain.cert.pem -toFile /home/iotedge-user/certs/certs/iot-edge-device-ca-<CA cert name>-full-chain.cert.pem -pushFile
Copy-EflowVMFile -fromFile <path>\private\iot-edge-device-ca-<CA cert name>.key.pem -toFile /home/iotedge-user/certs/private/iot-edge-device-ca-<CA cert name>.key.pem -pushFile

# Copy the root CA certificate
Copy-EflowVMFile -fromFile <path>\certs\azure-iot-test-only.root.ca.cert.pem -toFile /home/iotedge-user/certs/certs/azure-iot-test-only.root.ca.cert.pem -pushFile
```

③証明書へのアクセス権付与
　参考サイトの設定だとうまくいかなかったので、以下のようにした。
```powershell:PowerShellプロンプト
Invoke-EflowVmCommand "sudo chmod 755 -R /home/iotedge-user/"
```

④IoT Edgeの構成ファイルに証明書を設定する
　既存の構成ファイルの内容はEdge用になっていない場合があるためリネームして使われないようにし、Edge用テンプレートを構成ファイルにする。
```powershell:PowerShellプロンプト
Connect-EflowVm
```
```bash:Bash
#構成ファイルの場所に移動
cd /etc/aziot

#既存の構成ファイルをリネーム
sudo mv config.toml config.toml.bk

#Edge用テンプレートを構成ファイルにする
sudo cp config.toml.edge.template config.toml
```

　構成ファイルを開いて、以下のように編集する。
```bash:Bash
sudo vim config.toml
```

　・`provisioning`部分のコメントを外し、`connection_string`を2-①で保管していたプライマリ接続文字列を設定
![IoT Edge_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/05f87bfc-bf20-197e-1ddd-a6128bbcae30.png)

　・`trust_bundle_cert`部分のコメントを外し、ルートCA証明書のパスを設定
![IoT Edge_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/306554ea-1658-05e8-105d-9f8bd51bd0ae.png)

　・`edge_ca`部分のコメントを外し、デバイスCA証明書とデバイスCA秘密キーのパスを設定
![IoT Edge_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/4ef402f0-1358-13d6-9c14-0efa90271bc9.png)

　構成ファイルの変更を適用。
```bash:Bash
sudo iotedge config apply
```

　モジュールの状態がrunningになっていることを`sudo iotedge list`コマンドで確認。
　runningになっていない場合は`sudo iotedge check`コマンドを実行しエラー内容を確認。
<img width="800" alt="IoT Edge_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/33b02a80-f73b-5fd4-3d84-58be06b81b54.png">

### 4.4 IoT Edge仮想マシンのポート開放
　今回はMQTTプロトコルで通信するため8883ポートだけ開放。
```powershell:PowerShellプロンプト
# Open MQTT port
Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 8883 -j ACCEPT"

# Save the iptables rules
Invoke-EflowVmCommand "sudo iptables-save | sudo tee /etc/systemd/scripts/ip4save"
```

### 4.5 Windows PCのポート開放とポート転送設定
　FWの受信設定で8883ポートを許可
![IoT Edge_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/f785d0f6-c3bb-6adc-b2de-992f1848762e.png)

　デバイスからIoT Edge仮想マシンに通信するにはWindows PCを経由する必要があるため、デバイス⇒Windows PC⇒IoT Edge仮想マシンという流れになる。
　Windows PCはデバイスからのアクセスをIoT Edge仮想マシンに流す必要があるためその設定を入れる。
```powershell:PowerShellプロンプト
netsh interface portproxy add v4tov4 listenport=8883 listenaddr=<Windows PCのIPアドレス> connectport=8883 connectaddress=<IoT Edge仮想マシンのIPアドレス>
```
　`IoT Edge仮想マシンのIPアドレス`は以下のコマンドで確認できる。
```powershell:PowerShellプロンプト
Get-EflowVmAddr
```

## 5.Raspberry Pi設定②
①IoT Edge仮想マシンに配置したルート CA 証明書をデバイス側にも配置
![Raspberry_1_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/bdf9e01b-f55c-56f2-ebfb-4f92084dcab9.png)

②IoT Edgeとの通信プログラム作成
　3-②でクローン下azure-iot-sdk-python内のサンプルプログラムを少し書き換えて作ります。
![Raspberry_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/9488635c-e206-1213-5424-63f159c0ddb8.png)

```bash:simple_send_message.sh（プログラム実行用のシェル）
#! /bin/bash

echo "Run simple_send_message.py"

#引数:接続文字列
export IOTHUB_DEVICE_CONNECTION_STRING="<2-②で保管したプライマリ接続文字列>;GatewayHostName=<IoT Edge仮想マシン名>"

#引数:ルートCA証明書パス
export IOTHUB_CA_CERTIFICATE_PATH="/home/pi/Desktop/Azure IoT/azure-iot-test-only.root.ca.cert.pem.iotEdgeMyPC"

python3 simple_send_message.py

read -p "Press [Enter] key to resume."
```

```python:simple_send_message.py（プログラム本体）
import osimport time
import asyncio
import Adafruit_DHT as DHT
from azure.iot.device.aio import IoTHubDeviceClient

async def main():
    # IoT Edge -> Hub Connection Ver
    conn_str = os.getenv("IOTHUB_DEVICE_CONNECTION_STRING")
    ca_path_str = os.getenv("IOTHUB_CA_CERTIFICATE_PATH")
    certfile = open(ca_path_str)
    root_ca_cert = certfile.read()
    
    #MQTT(port:8883)
    device_client = IoTHubDeviceClient.create_from_connection_string(connection_string=conn_str, server_verification_cert=root_ca_cert)
    
    # Connect the device client.
    await device_client.connect()

    while True:
      # Send a single message
      print("Sending message...")
      SENSOR_TYPE = DHT.DHT22
      DHT_GPIO = 4
      h,t = DHT.read_retry(SENSOR_TYPE, DHT_GPIO)
      send_message = "{\"temprature\":" + "{0:0.1f}".format(t) + ", \"humidity\":" + "{0:0.1f}".format(h) + "}"
      print(send_message)
      await device_client.send_message(send_message)
      print("Message successfully sent!")

      time.sleep(3)

    # Finally, shut down the client
    await device_client.shutdown()

if __name__ == "__main__":    asyncio.run(main())
```

　simple_send_message.shの`<IoT Edge仮想マシン名>`は`Get-EflowVmName`コマンドで取得できます。
```powershell:PowerShellプロンプト
Get-EflowVmName
```

　simple_send_message.pyの7～11行目では引数を取得して、証明書を読み込んでいます。
```python:simple_send_message.pyの7～11行目
    # IoT Edge -> Hub Connection Ver
    conn_str = os.getenv("IOTHUB_DEVICE_CONNECTION_STRING")
    ca_path_str = os.getenv("IOTHUB_CA_CERTIFICATE_PATH")
    certfile = open(ca_path_str)
    root_ca_cert = certfile.read()
```

　simple_send_message.pyの13～17行目ではIoT Edge仮想マシンに接続しています。
```python:simple_send_message.pyの13～17行目
    #MQTT(port:8883)
    device_client = IoTHubDeviceClient.create_from_connection_string(connection_string=conn_str, server_verification_cert=root_ca_cert)
    
    # Connect the device client.
    await device_client.connect()
```

　simple_send_message.pyの19～30行目は、3秒おきに温湿度センサーの情報を取得し、温度と湿度をIoT Edge仮想マシンに送り続ける内容になっています。
　`h,t = DHT.read_retry(SENSOR_TYPE, DHT_GPIO)`：温湿度センサーから温度、湿度を取得
　`send_message = "{\"temprature\":" + "{0:0.1f}".format(t) + ", \"humidity\":" + "{0:0.1f}".format(h) + "}"`：JSON形式のメッセージを作成
　`await device_client.send_message(send_message)`：IoT Edge仮想マシンにメッセージを送信
```python:simple_send_message.pyの19～30行目
    while True:
      # Send a single message
      print("Sending message...")
      SENSOR_TYPE = DHT.DHT22
      DHT_GPIO = 4
      h,t = DHT.read_retry(SENSOR_TYPE, DHT_GPIO)
      send_message = "{\"temprature\":" + "{0:0.1f}".format(t) + ", \"humidity\":" + "{0:0.1f}".format(h) + "}"
      print(send_message)
      await device_client.send_message(send_message)
      print("Message successfully sent!")

      time.sleep(3)
```

③Host設定
　②で設定した`IoT Edge仮想マシン名`の名前解決ができないのでとりあえずHostsに記載
　IPはWindows PCに投げるのでWindows PCのものにする。
```bash:Bash
sudo vim /etc/hosts
```
<img width="600" alt="Raspberry_3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/bb144889-bd81-2ef3-e3b2-dedd419d7d95.png">

④simple_send_message.shの実行
　simple_send_message.shを実行し正常に送信できていることを確認。
![Raspberry_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/8fcff082-12de-3948-e5e7-24e5d368e50b.png)

## 6.Azure IoT Explorer
送信はできているとしてIoT Hubまでメッセージがに届いているかをAzure IoT Explorerで確認してみる。
①インストール
　参考サイト参照：[Azure IoT エクスプローラーをインストールして使用する](https://learn.microsoft.com/ja-jp/azure/iot-fundamentals/howto-use-iot-explorer)

②IoT Hubを登録
　IoT Hubの共有アクセスポリシーの接続文字列を使うのでコピーしておく
![IoT Explorer_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/9fa9f40c-6e73-227e-f2dc-8da74ed31380.png)
　IoT ExplorerのConnection_stringに接続文字列を貼り付けてSave
![IoT Explorer_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/6bbdd460-bd40-b61c-6e47-d8765bd0ec71.png)

③メッセージ監視
　②で登録したIoT Hubを選択
![IoT Explorer_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/7519a183-4be6-6105-f8b5-c44a4e07750d.png)
　デバイスを選択
![IoT Explorer_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/c6bda602-d8f4-0975-0ece-b4193bfc73f9.png)
　TelemetryでStartをクリックし、下の欄にメッセージ内容が表示されればデバイス⇒IoT Edge⇒IoT Hubへと正常にメッセージが流れてきたことを確認できる。
　※simple_send_message.shを実行し、メッセージ送信中の状態であること
![IoT Explorer_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/5f35fb9a-59d4-c539-ac69-ed1968d78561.png)

## 7.Azure Stream Analytics設定
①入力の設定
![Stream Analytics_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/364e86a0-3afe-b3ef-04f4-1686283c1b0f.png)
![Stream Analytics_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/d140229d-1253-bee0-441b-07afd9f670b5.png)
　以下を設定（記載以外はデフォルト）
- 入力のエイリアス：任意
- サブスクリプションからIoT Hubを選択する：チェック
- サブスクリプション：自身のサブスクリプション
- IoT Hub：1.1で作成したIoT Hub
- コンシューマーグループ：$Default
- 共有アクセスポリシー名：iothubowner

②出力の設定
![Stream Analytics_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/722578ca-13e2-f20e-a2c8-d93b865beec1.png)
![Stream Analytics_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/0f1ef393-31e4-e107-20d5-2274b8375ad9.png)
　以下を設定（記載以外はデフォルト）
- 出力のエイリアス：任意
- サブスクリプションからBlob StorageまたはADLS Gen2を選択する：チェック
- サブスクリプション：自身のサブスクリプション
- ストレージアカウント：1.3で作成したADLS
- コンテナー：既存のものを使用にチェックし、1.3で作成したコンテナを選択

③クエリの設定
　`入力のエイリアス名`と`出力のエイリアス名`には①②で決めた名前を設定
![Stream Analytics_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/e196eb67-56bd-0574-be3e-706e22a21a62.png)
　クエリのテストを実行すると結果が表示されればOK（simple_send_message.shは実行中であること）
![Stream Analytics_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/d811e07e-9fd3-74cd-20ea-3e60eb6c4fa0.png)

④ジョブを開始
![Stream Analytics_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/264813da-3d66-fa05-a4ce-59ec6afb036e.png)

## 8.Azure Data Lake Storage Gen2（ADLS）確認
jsonファイルが作成されていればOK
![ADLS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/6b935e0b-44d9-9758-2369-a73411b7a847.png)

## 9.Azure Databricksコード実行
　DatabricksにADLSのiotコンテナーをマウントしておき以下のようなコードで、JSON読み込み⇒3秒おきのデータを分単位の平均値に変換したiot_avgテーブルを作成
　マウント方法は[参考サイト](https://azure-recipe.kc-cloud.jp/2019/07/azure-databricks-3-2-dbfs%e3%81%abazure-data-lake-storage-gen2%e3%82%92%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88/)などを参考
![Databricks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/c95688a1-b25d-1c0b-9893-5110edb8b7f8.png)
　


## 10.PowerBIレポート作成
　Databricksにアクセスしてiot_avgテーブルを読み込んでグラフ化
![PowerBI_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/9776d254-9bc3-e08a-2c77-10d27f0a5dcd.png)
![PowerBI_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/9252e15f-07db-3e97-8d7f-077b8a182eea.png)
![PowerBI_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/3c0b1127-18a9-bb85-1f13-63caadca9211.png)
　↑`サーバホスト名`と`HTTPパス`にはDatabricksのクラスタの`Server Hostname`と`HTTP Path`を設定
![PowerBI_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/99168d28-88df-d747-ba3c-14f5443865c7.png)
　サインインして接続
![PowerBI_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/8d3cb3b5-56ea-55eb-a901-79547d940682.png)
　iot_avgテーブルを読み込んで任意のグラフを作成
![PowerBI_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911662/5a084da7-4159-d3ef-f4dc-9e20e3f28bf3.png)

最後まで読んでいただきありがとうございました。
Azure IoT Edge for Linux on Windowsを経由させるというだけで結構四苦八苦したので備忘も兼ねて残しておきます。