からめもぶろぐ。

俺たちは雰囲気で OAuth をやっている

IBS-TH1 と Azure IoT Hub と Power BI を使って部屋の温湿度を可視化する

GW の自己学習として IoT に手を出してみたかったのですが、Raspberry Pi で電子工作は敷居が高かったので、お手軽にできる方法を探してみました。我が家には古い Intel NUC があり、これを使ってなんとかできないかと思ったところ、Bluetooth を使った温湿度センサーというのがあるらしいことがわかりました。なかでも Inkbird の IBS-TH1 というのが安価でいいみたいです。さっそくこれを購入して IoT してみることにしました。

アーキテクチャ

最終的にこんな感じになりました。

f:id:karamem0:20210505170925p:plain

Azure IoT Hub へのデータの送信

Intel NUC でバッチ プログラムを実行し、IBS-TH1 に対して Bluetooth でデータを取得し、Azure IoT Hub に送信します。最初は Windows サービスで作ろうとしたのですが、データのキャッシュの問題でうまくいかなかったので、シンプルにバッチ プログラムに変更し、タスク スケジューラーで定期的に呼び出すことにしました。IBS-TH1 は Bluetooth Low Energy に対応しているため、ペアリングなしでデータを取得することができます。IBS-TH1 からのデータの取り方についてはすでに先行の記事があるので参考にしていただければと思います。

qiita.com

データを取るのに必要なものは MAC アドレスと Attribute ハンドルです。MAC アドレスはモバイル アプリから確認できるようです。Attribute ハンドルは 0x2d とありますが、こちらのコメントを見ると 0x28 だったり個体差があります。購入したものは 0x27 でした。データの 1-2 バイト目が温度、3-4 バイト目が湿度です。バッテリーの残量も取れるとありましたが、購入したものだとうまく取れませんでした。

バッチ プログラムのコードは以下に公開しています。

github.com

それほど難しくないので見ればだいたい理解できると思いますが流れをまとめておきます。

  • BluetoothLEAdvertisementWatcher を使って Bluetooth Low Energy のデバイスをスキャンします。
  • MAC アドレスが一致する場合、デバイスの情報を取得します。
  • デバイスの GATT サービスを取得します。IBS-TH1 ではサービスは 1 つです。
  • サービスのキャラクタリスティックを取得します。先ほど書いた Attribute ハンドルに一致するものをフィルターします。
  • データを取得します。
  • 取得したデータを Azure IoT Hub に送信します。

Azure でのメッセージング

Azure IoT Hub はそれ自体はデータを溜め込むことができないので他のサービスに受け流す必要があります。Azure IoT Hub にもルーティングの機能はあるのですが Azure Stream Analytics を使うのが一般的なようです。Azure Stream Analytics は SQL に似た言語で入力をクエリして他のサービスに出力することができます。今回は Azure IoT Hub で受け取ったデータを Azure Table Storage と Azure Service Bus に転送します。Azure Stream Analytics には Power BI のストリーミング データセットに書き込む機能もあるのですが、後に述べるタイムゾーンの変換を行うために、あえて Azure Logic Apps を経由するようにしました。これはユーザー定義関数がすべてのリージョンで使えるようになればもう少し簡単にできると思います。

Azure Service Bus はシンプルに Azure Logic Apps と連携するためのハブとして存在します。Azure Logic Apps ではキューを読み込み、データの加工をしたのち Power BI のストリーミング データセットにレコードを追加します。Power BI のストリーミング データセットを使ったレポートでは、そのままの日時では UTC で表示されてしまい、Power Query を使った変換もできないため、ストリーミング データセットに入れるタイミングで JST に変換してあげる必要があります。

Power BI レポート

過去 24 時間のデータを表示するようにしてみました。いい感じに可視化されていますね。

f:id:karamem0:20210505213355p:plain

まとめ

Azure Functions を使うともう少しシンプルな構成にできたのですが、Azure はノーコードでやりたかったのでこのような構成になりました。あまり触ったことがないサービスばかりだったのでいろいろと勉強になることが多かったです。意外に通信距離が長そうなので他の部屋向けにも買ってみてもいいかなと思いました。