Azure IoT HubにRaspberry Piで収集した温度データを送ってみた

2020-11-11Azure,IoT Hub,Raspberry Pi

今回は初めてのAzur IoTという事で、Raspberry Piで温度測定したデータをAzure IoT Hubで収集して受信データの確認までを試してみました。

Azure Iot Hub(公式サイト)

Raspberry Pi(Wiki)

ざっくりと言うと、Azure IoT HubはIoTデバイス(ラズパイ)からの情報をAzureに取り込むインターフェースで、Raspberry Piは温度や画像等の情報を取得してAzureに送るデバイスという所になります。

提供されているサンプルプログラムを活用しながら、初めてのIoTにチャレンジしてみました。言語はPhytonを利用しています。

スポンサーリンク

Azure IoT Hubの作成

まず最初にデータをAzure で受ける為の窓口としてAzure IoT Hubを作ってみます。

      • 実施した内容
        • Azure IoT Hubの作成
        • IoTデバイスの作成

1)Azure PoratalでAzure IoT Hubのメニューを開き追加をクリックします。。

2)IoT ハブの作成画面になります。リソースグループ、領域(リージョン)、IoT Hub名を適時設定します。

3)ネットワーク設定します。IoTデバイスがどこから接続されるのかの設定になります。今回はパブリックエンドポイント(すべてのネットワーク)を選択して進めます。

4)IoT Hubのスケールとサイズを選択します。

詳細は下記に記載されておりますが、StandardとBasicにより出来る機能が異なります。エディションにより処理量が異なります。

IoT Hubの価格とレベル

今回はF1:Freeレベル(Standard)を選択しています。

5)タグの設定を必要に応じて実施します。設定しない場合はそのまま次へ:確認および作成をクリックします。

6)確認画面が表示されます。内容に問題が無ければ作成をクリックします。

これでIoT Hubの作成は完了です。

次にIoTデバイスの設定を行います。IoTデバイス(今回の場合はラズパイ)はAzure IoT Hub接続とするための設定になります。作成したIoT Hubを表示します。

7)IoTデバイスのメニューを選択します。新規作成をクリックしIoTデバイスを追加します。

8)デバイスの作成を行います。デバイスのIDにIoTデバイス名を設定します。

X.509の証明書の利用も可能なようですが、今回はデフォルトの対称キーで進めます。主キーやセカンダリキーは自動(自動生成キーにチェックありの場合)払い出しされます。

IoTデバイスを確認すると作成されれている事が分かります。これでAzure側の準備は完了です。

Raspberry Piで温度/湿度測定を行う

今回はRaspberry Pi+DHT11(温度センサー)を利用して構成します。一番情報が多く、サンプルプログラムが提供されていたDHT11を利用しています。

実際の設定はこちらの記事を参考に進めました。

Raspberry PiとDHT11で温度・湿度を測る(Qiita)

 

記事を参考にして進めてサンプルでDHT11を使って温度/湿度データが取得出来ている所まで確認しました。

Raspberry Pi(DHT11)で取得した温度/湿度をAzure IoT Hubへのデータ転送

Raspberry Pi+DHT11(温度センサー)を利用して温度/湿度のデータが取得出来た前提で進めます。Phytonを使っています。

      • 今回実施した内容
        • Raspberry PiでAzure IoT用のモジュールインストール
        • サンプルプログラムダウンロード
        • サンプルプログラムを合体させてAzure IoTへデータ転送
        • Azure Cloud Shellを使ってデータ転送状況の確認

まず最初にRaspberry PiでAzure IoT用のモジュールをインストールします。Raspberry Pi上で下記コマンドを実行します。(権限に応じてSudoしてコマンドを実行します。)

  pip install azure-iot-device

次にサンプルプログラムをダウンロードします。ダウンロードしたのは2つになります。

Azure IoTサンプルプログラム(SimulatedDevice.py)

DHT11サンプルプログラム(example.py)

Pythonのデフォルト変更についてはこちらの記事に記載しております。

Azure IoTサンプルプログラムはランダムで値を生成しています。これをDHT11で取得したデータに置き換えます。

      • サンプルプログラムからの変更点
        • import部分は2つのプラグラムを統合
        • DHTStatでDHT11で得られる情報を取得し、DHT11Statusに格納
        • temperature、humidityにDHT11Statusから取得したデータを格納(サンプルプログラムではランダムの数値の部分を変更)
        • Port443を利用したかったのでwebsockets=Trueを追記
        • GPIOのピン番号4に変更(自分が作成した環境がGPIO4だったので。)

実際に利用したプログラムはこちらになります。(もっときれいになるとは思います。)

import RPi.GPIO as GPIO
import dht11
import time
import datetime
from azure.iot.device import IoTHubDeviceClient, Message

#Azure IoT Connection
CONNECTION_STRING = “Azure IoT 接続情報"

#DHT11設定
TMPGpio = 4
GPIO.setmode(GPIO.BCM)

#MSG TXT
MSG_TXT = '{{“temperature": {temperature},"humidity": {humidity}}}’

def iothub_client_init():

 # Create an IoT Hub client
 client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING, websockets=True)
 return client

def iothub_client_telemetry_sample_run():

 try:
  client = iothub_client_init()
  print ( “IoT Hub device sending periodic messages, press Ctrl-C to exit" )
  dhtStat = dht11.DHT11(pin = 4)

   while True:
    DHT11Status = dhtStat.read()
    DHT11Status.is_valid()
    temperature = DHT11Status.temperature
    humidity = DHT11Status.humidity
    msg_txt_formatted = MSG_TXT.format(temperature = temperature, humidity = humidity)
    message = Message(msg_txt_formatted)

# Add a custom application property to the message.
# An IoT hub can filter on these properties without access to the message body.
   if temperature > 30:
    message.custom_properties[“temperatureAlert"] = “true"
   else:
    message.custom_properties[“temperatureAlert"] = “false"

# Send the message.
   print( “Sending message: {}".format(message) )
   client.send_message(message)
   print ( “Message successfully sent" )
   time.sleep(5)

  except KeyboardInterrupt:
   print ( “IoTHubClient sample stopped" )

  if __name__ == '__main__’:
   print ( “IoT Hub Quickstart #1 – Simulated device" )
   print ( “Press Ctrl-C to exit" )
   iothub_client_telemetry_sample_run()

Azure IoTの接続情報は作成したIoTデバイスのプライマリ接続文字列を指定します。この中にAzure IoTデバイス名やキー情報等、Azure IoT Hubへの接続に関する必要な情報がすべて含まれています。

Raspberry Pi上で適当な名前を付けて保存(拡張子は.py)します。

Raspberry PiからAzure IoT Hub転送されたデータを確認する

Raspberry Pi上で先ほど作成したプログラムを実行します。

保存したプログラムをダブルクリックするとThonnyが開きます。Runをクリックすると下記のようにプログラムが実行されます。

次にAzure Cloud Shellを開き以下のiot hub monitor-eventsコマンドを実行します。このコマンドを実行するとIoT Hubデバイスを通じて取得されているデータをリアルタイムで確認出来ます。

 az iot hub monitor-events –device-id IoTデバイス名 –hub-name IoT Hub名

過去データを参照するわけではないので、Raspberry Pi上でプログラム実行した状態でコマンドを実行する必要があります。

コマンドを実行すると取得出来ているデータが確認出来ます。

Azure Stream Analyticsジョブ+Power BIを使った温度データグラフ作成はこちらで試してみました。

スポンサーリンク