PythonでAzure IoT Hubへテレメトリ送信(Raspberry Pi使用)

最近、ちょいちょい使う機会のあるPython
そういえば、PythonからAzure IoT Hubへの送信ってどうやるんだっけ?と思い、調べて動作確認してみました。

PythonからAzure IoT Hubへテレメトリ送信する手順が、公式ドキュメントに公開されています。

docs.microsoft.com

タイトル「クイック スタート:デバイスから IoT ハブに利用統計情報を送信してバックエンド アプリケーションで読み取る (Python)」に違和感、、、
英語表示すると「telemetry」だった。
うーむ、あとでドキュメント変更のプルリクエスト出しておくか、、、

気を取り直して、公式ドキュメントを一通り確認します。

ポイントを箇条書きにすると、

  1. Pythonサンプルコードをgithubからダウンロード
  2. IoT Hub作成
  3. IoT Hubにデバイス追加
  4. Pythonサンプルコードを修正(上で作ったデバイスの情報に書き換え)
  5. Pythonサンプルコードを実行

ということらしい。

Azureの操作がAzure CLIで書かれていますが、、、最近のわたしはVSCode拡張のAzure IoT Hub Toolkit推しなので、脳内変換しながらやってみましょう。

Pythonサンプルコードをダウンロード

git cloneでサクッと。

$ git clone https://github.com/Azure-Samples/azure-iot-samples-python

IoT Hub作成

Azure PortalでIoT Hub作成ですね。
わたしは既に作成済みなのでスキップ。
これから作る人は、ここを参考に作成してください。

IoT Hubにデバイス追加

VSCode拡張のAzure IoT Hub Toolkitで、ポチっと作成します。

f:id:matsujirushix:20191013193846p:plain

わたしは、py-deviceという名前で作成しました。

f:id:matsujirushix:20191013193952p:plain

Pythonサンプルコードを修正

iot-hub\Quickstarts\simulated-device\SimulatedDevice.pyCONNECTION_STRINGに、デバイス接続文字列を書きます。

VSCode拡張のAzure IoT Hub Toolkitでデバイス接続文字列をコピーして、

f:id:matsujirushix:20191013194409p:plain

SimulatedDevice.pyを書き換え。

f:id:matsujirushix:20191013194555p:plain

Pythonサンプルコードを実行

さぁ、実行。

$ python SimulatedDevice.py

エラー!?!?

f:id:matsujirushix:20191013194921p:plain

Azureに接続するためのPython用パッケージazure-iot-deviceをインストールする部分を見逃していましたorz

azure-iot-deviceパッケージをインストール

pipコマンドで。

$ pip install azure-iot-device

Pythonサンプルコードを実行(2回目)

さぁ、実行。(2回目)

$ python SimulatedDevice.py

テレメトリ(D2Cメッセージ)がIoT Hubに届いているか確認

Python、ちゃんと動いているようなので、VSCode拡張のAzure IoT Hub Toolkitで、D2Cメッセージが届いているか確認します。

ちょっと用語がゴチャゴチャしますが、D2Cメッセージを確認したいときは、ビルトインエンドポイントのモニターを開始を選んでください。

f:id:matsujirushix:20191013195904p:plain

架空のtemperatureとhumidityが送られてきているのが確認できました。

f:id:matsujirushix:20191013200154p:plain

ソースをチラ見

せっかくなので、SimulatedDevice.pyの中身を軽く確認。

IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
while True:
    message = Message(msg_txt_formatted)
    client.send_message(message)

ほほぅ、Pythonとってもシンプル~。(普段は、Azure IoT Device SDK for Cなので)