IBS-TH1 と Azure IoT Hub と Power BI を使って部屋の温湿度を可視化する
はじめに
GW の自己学習として IoT に取り組みたかったのですが、Raspberry Pi で電子工作は敷居が高いと感じたため、お手軽にできる方法を探しました。我が家には古い Intel NUC があり、これを使って何かできないかと考えたところ、Bluetooth を使った温湿度センサーと連携できることがわかりました。中でも Inkbird の IBS-TH1 が安価でよさそうだったので、これを購入して IoT を試してみることにしました。
アーキテクチャ
最終的な構成は次のとおりです。

Azure IoT Hub へのデータ送信
Intel NUC でバッチプログラムを実行し、IBS-TH1 から Bluetooth でデータを取得して Azure IoT Hub に送信します。最初は Windows サービスで作成しようとしましたが、データのキャッシュの問題でうまく動作しませんでした。そこで、シンプルにバッチ プログラムに変更し、タスク スケジューラーで定期的に呼び出す構成にしました。IBS-TH1 は Bluetooth Low Energy に対応しているため、ペアリングなしでデータを取得できます。IBS-TH1 からのデータ取得方法については先行記事が参考になります。
データ取得に必要なものは MAC アドレスと Attribute ハンドルです。MAC アドレスはモバイルアプリで確認できます。Attribute ハンドルは 0x2d とされていますが、こちらのコメント によると 0x28 だったり個体差があります。購入したものは 0x27 でした。データの 1-2 バイト目が温度、3-4 バイト目が湿度です。バッテリー残量も取得できるとありますが、購入したものではうまく取得できませんでした。
バッチプログラムのコードは以下で公開しています。
コードの中身はそれほど難しくないものの流れをまとめておきます。
- 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 時間のデータを表示するようにしました。可視化も良好です。

おわりに
Azure Functions を使えばよりシンプルな構成にできますが、Azure はノーコードで構成したかったため、このような構成になりました。あまり触ったことがないサービスばかりでしたが、いろいろと学びが多かったです。通信距離も意外と長いので、他の部屋向けにも購入したいです。
Discussion