ブログ

CactusphereRS485モデル:温湿度センサーから取得したデータをAzure SQL Database テーブルに格納してみる

at_naomi.todori
2021年7月30日 17時21分

※注意事項※
このブログは2021年7月26日時点のものです。Microsoft Azureの環境を構築する手順の一例としてご紹介しており、設定や手順等を推奨するものではありません。
また、仕様等が変更されていたとしても、弊社ではお問い合わせには対応できかねますので、ご了承願います。
詳しい手順や説明等は、公式のドキュメントをご参照願います。

Cactusphere RS485 モデルに下記の温湿度センサーを接続し取得した温度・湿度を Azure IoT Hub に送信、 Azure SQL Database のテーブルに格納してみました。
Prament RS485 RTU 温度・湿度トランスミッタ温度センサ XY-MD02

Azure SQL Database は Azure SQL (SQLクラウドデータベース)ファミリの一つであり、フルマネージド・スケーラブルなリレーショナルデータベースです。Azure SQL Database に蓄積したデータはWebアプリケーションで可視化したり、機械学習のモデル作成に用いることができます。

システムの構成

今回ご案内する手順は、以下の方を対象としております。

①MSアカウント作成済であること
②Azureアカウント作成済であること
③Cactusphereソフトウェアマニュアルのチュートリアルを既に実行済みであること

事前準備

1. ハードウェア接続・設定

1-1. Cactusphere DIPスイッチ設定

Cactusphere 100シリーズ ハードウェアマニュアル を参考に、Cactusphere の DIPスイッチ設定を行ってください。
今回は半二重(1,2ピン)、また終端抵抗をONに設定します(4ピン)。

1-2. Cactusphere と 温湿度センサー間の信号線接続

CactusphereRS485モデルを使ってアプリケーションを構築してみました(温湿度編) を参考に Cactusphere と温湿度センサーを信号線を接続してください。なお、こちらの記事で紹介している温湿度センサーと、本記事で使用している温湿度センサーは別の製品となります。ご注意ください。
詳細についてはCactusphere 100シリーズ ハードウェアマニュアル を参照してください。

2. Azure IoT Hub への接続

Cactusphere接点入力モデルをAzure IoT Hubに接続してみました を参考に、「②起動時に送信するデバイス情報の確認」までの手順を行い、Azure IoT Hub に接続してください。
ただし、「2. アプリケーションマニフェストの修正」に記載している内容はその後のアップデートで変更されているため、下記の通り置き換えてください。

"CmdArgs": [ "--ConnectionType", "DPS", "--ScopeID", "<DPSのスコープID>" ],
"AllowedConnections": [ "global.azure-devices-provisioning.net", "<DPSリンク設定済み Azure IoT HubのURL>" ],
"DeviceAuthentication":"Azure Sphere テナントID",

なお、本記事では Azure IoT Hub インスタンス名を cactusphere-iothub-atmark としています。

3. Azure SQL Database の設定

3-1. 単一データベースを作成

クイック スタート:Azure SQL Database の単一データベースを作成する を参考に、Azure SQL Database に単一データベースを作成してください。なお、手順中でファイアウォールの設定を行いますが、「Azure サービスおよびリソースにこのサーバー グループへのアクセスを許可する」については「はい」を設定してください。また、「追加設定」セクションの「データソース」は「なし」のままで問題ありません。

3-2. サーバーレベルのファイアウォール規則を作成

ファイアウォール設定については、データベース作成時に設定しています。
設定内容確認方法は クイック スタート:Azure Portal でサーバーレベルのファイアウォール規則を作成する を参照してください。

3-3. データ格納先テーブルを作成

データ格納先のテーブル CactusphereRS485Envsensor を作成します。

カラム名 概要
Temperature 温度
Humidity 湿度
DeviceID デバイスID
EnqueuedUtcTime Azure IoT Hubでイベントを受信した時間

Azure SQL Database メニューからクエリエディターを起動し、下記のクエリを入力、実行してください。

CREATE TABLE dbo.CactusphereRS485Envsensor (
 Temperature FLOAT NULL,
 Humidity FLOAT NULL,
 DeviceID NVARCHAR(150) NOT NULL,
 EnqueuedUtcTime DATETIME NOT NULL
)

メッセージに「クエリが成功しました: Affected rows: 0」と表示されたら作成成功です。
テーブルリストの中に dbo.CactusphereRS485Envsensor テーブルが追加されています。

手順

1. Cactusphere通信設定

Azure IoT Hub の 「IoTデバイス」 画面で使用している Cactusphere のデバイスIDを選択し、「デバイスツイン」から Modbus RTU の 通信設定を行います。デバイスツインの設定方法についてはCactusphere接点入力モデルをAzure IoT Hubに接続してみました を参考にしてください。
今回は10秒おきに Data1 で温度・ Data2 で湿度を取得するため、デバイスツインの Desired properties セクションを以下のように設定しています。

(省略)
"desired": {
            "ModbusDevConfig": "{\"ModbusDevConfig\":{\"01\":{\"baudrate\":9600,\"parity\":\"None\",\"stop\":1}}}",
            "ModbusTelemetryConfig": "{\"ModbusTelemetryConfig\":{\"Data1\":{\"devID\" : \"01\",\"registerAddr\":\"0001\",\"registerCount\":\"1\",\"funcCode\":\"04\",\"interval\":\"10\",\"devider\" : 10,\"asFloat\":true},\"Data2\":{\"devID\":\"01\",\"registerAddr\":\"0002\",\"registerCount\":\"1\",\"funcCode\":\"04\",\"interval\":\"10\",\"devider\":10,\"asFloat\":true}}}",
(省略)

2. Stream Analytics ジョブ作成・実行

Azure Stream Analytics 統合を使用して Azure SQL Database にデータをストリーム配信する (プレビュー) の記述を参考に、Azure IoT Hub が受信したデータを Azure SQL Database のテーブルにデータをストアする Stream Analytics ジョブを作成・実行していきます。なお、この機能については現在 Preview となります。

以降の作業はCactusphereからAzure IoT Hubにデータを送信している状態で行ってください。

2-1.ジョブ作成

Stream Analytics ジョブを作成します。

入力・出力設定
入力

入力の種類はIoT Hubを選択、イベントハブ名ではCactusphereが接続するIoT Hubインスタンスを選択、エンドポイントは「メッセージング」を選択してください。

出力

データベースとサーバーについては、現在作業中のデータベース名とサーバー名が自動的に登録されています。
テーブルは「既存のものを使用」を選択し、作成したテーブル CactusphereRS485Envsensor を指定してください。
なお、「新規作成」を選択するとジョブ実行時にテーブルを自動作成することができます。

クエリ作成・テスト実行

設定が完了すると、クエリエディタが表示されます。
「入力のプレビュー」には Azure IoT Hubから受信したデータのスナップショットが表示されます。
クエリはジョブ作成時に入力した内容がINTO句やFROM句に自動的に適用されています。
SELECT句に指定されている「*」を下記の内容に置き換えてください。

Data1 AS [Temperature], Data2 AS [Humidity], IoTHub.ConnectionDeviceId AS [DeviceID], EventEnqueuedUtcTime AS [EnqueuedUtcTime]

クエリが下記の内容になっていることを確認し、「クエリのテスト」を実行してください。

SELECT
   Data1 AS [Temperature], Data2 AS [Humidity], IoTHub.ConnectionDeviceId AS [DeviceID], EventEnqueuedUtcTime AS [EnqueuedUtcTime]
INTO
   [CactusphereRS485Envsensor]
FROM
   [<IoT Hub名>]

クエリの結果が「テスト結果」に表示されます。
テスト結果が問題無い場合、「クエリの保存」を実行してください。

2-2.ジョブ実行

クエリの保存が完了すると、ジョブを実行できるようになります。
「Stream Analytics ジョブの開始」を実行し、ジョブを開始してください。

3.確認

ジョブを開始すると、実行中のジョブが一覧に表示されます。
「出力テーブルのプレビュー」では、クエリエディターでテーブルをプレビューすることができます。
正常に動作している場合、クエリに下記を入力して実行すると、Cactusphereから送信した温度・湿度のデータがデータベースに格納されていることがわかります。

SELECT TOP (25) * FROM [CactusphereRS485Envsensor] ORDER by EnqueuedUtcTime DESC

ジョブを停止する場合は、「Stream Analyticsで開く」を選択しジョブを停止してください。