Azure
SensorTag
IoT
AzureMachineLearning
SORACOM

Check! SORACOM Funnel を使って Azure ML まで連携する 〜 アーキテクチャ編

More than 1 year has passed since last update.

こんばんは、オークファンの @dz_ こと大平かづみです。

Prologue - はじめに

本記事は、SORAOCM さんの Software Design 誌 巻頭特集記念リレーブログ の 5月13日分として投稿いたします。

今回は、SORACOM を使って Microsoft Azure にデータを送り、最終的に Azure Machine Learning (Azure ML) でセンサーデータを機械学習に繋げられるアーキテクチャを検討してみました!

大分ボリュームが出てしまったので、今回は、アーキテクチャのご紹介と、 SORACOM Funnel を利用して、 Azure ML が使えるようデータを蓄積する方法をご紹介いたします。

全体像

20160513_azureml_003.png

使っているもの

SORACOM 関連

役割 サービス・プロダクト
データ通信 SORACOM Air
Azure への仲介 SORACOM Funnel

クラウド関連

役割 サービス・プロダクト
プラットフォーム Microsoft Azure
データの受け口 Azure Event Hubs
データの転送 Azure Stream Analytics
データの蓄積 Azure Table Storage

デバイス関連

役割 サービス・プロダクト
ゲートウェイ Raspberry Pi 2 Model B
センサー SensorTag
SIMアダプタ FS01BU

概要解説

まずは全体の概要をご紹介します。既知のことが多いので、さらっと書きます。

SORACOM Funnel → Auzre のつまづきポイントについては、後述の「要SORACOMチェックポイント詳説」をご参照くださいませ!

SensorTag から Bluetooth 経由でデータを取得する

SensorTag は、10種のセンサーを持つデバイスで、Bluetooth などを介してデータを取得・書込みすることができます。

私の場合は、復習もかねて、 Python で実装を試みました。その準備編(サンプルコードへのリンク含む)は以下にまとめましたので、ご参考になれば幸いです。

SORACOM Air の使い方

SORACOM Air と FS01BU の使い方はすでにたくさんの方が情報を上げてくださっています。

私はコチラの記事を参考にしました。

また、余談ですが WiFi と併用して FS01BU を利用する場合は、ネットワークのルーティングを調整しなければならない場合があるようです。以下にまとめましたので、ご参考になれば幸いです。

SORACOM Funnel から Azure Event Hubs へ

基本的には、下記の SORACOM 開発者サイトを参考にすれば、SORACOM Funnel を介して Event Hubs へ JSON データを送信することができます。

Azure Event Hubs から Azure Table Storage へ

Azure Event Hubs から Azure Table Storage へデータを転送するには、 Azure Stream Analytics を用います。

また、Azure Stream Analytics は、出力するデータを整形することができます。配列からの抽出や、データ型の変換などができます。公式ドキュメントで 一般的なクエリ例 が紹介されていますので、ご参考になるかと思います。

Azure Table Storage にデータを蓄積する理由

Azure ML で使える入力ソースはいくつかありますが、比較的安価で扱いやすいものとして Azure Table Storage を採用しました。

なお、Azure Table Storage は、 Azure Storage Explorer (Windows 向け)や Microsoft Azure Storage Explorer (Win, Mac, Linux から利用可能) などを利用して読み書きが可能です。

Azure ML への入力

Azure ML の利用の仕方は割愛しますが、入力方法についてご紹介します。

Azure ML で Azure Table Storage からデータを取得するには、 Import Data モジュールを利用します。

左ペインから Import Data モジュールをドラッグ&ドロップし、右の「Properties」で Azure Table Storage の設定を行います。

20160513_azureml_002.png

設定項目 設定値
Data source Azure Table
Authentication type Storage Account
Account name [出力先のストレージアカウント名]
Account key [出力先のストレージアカウントのキー]
Table name [出力先のテーブルストレージ名]
Rows to scan for property names ScanAll (任意)

要SORACOMチェックポイント詳説

SORACOM Funnel x Azure 連携で私がつまづいたポイントについて、もう少し詳しくご紹介します。

SORACOM Funnel を介したデータは Azure Event Hubs にどう届くのか?

作業していて、これが一番悩みました。なぜかというと、自分が送信したデータ構造を想定してクエリを書いても、どうも取得できないのです。

いろいろ確認してみると、どうやらSORACOM Funnel を経由する段階でいくつかの情報が付与され、自分が設定したデータは payloads に内包されていることがわかりました。

実際には、Event Hubs には、このようなデータが届きます。

key value
payloads 自分が設定した JSON データ を内包する
credentialsId SORACOM 「セキュリティ」>「認証情報ストア」>「認証情報ID」
imsi SORACOM Air (SIM) の IMSI
sourceProtocol 送信形式

ですので、Event Hubs に届いたデータを利用する際は、 payloads からデータを取れば良いことがわかりました。

※ ちなみに、これは一度 Stream Analytics 経由で Power BI に出力してデータ構造を確認しました。上記のほかにも、 destination, operatorId, PartionId, timestamp が出力されていたのですが、SORACOM のものなのか、それ以外のものなのかわからないため追って確認します。

SORACOM Funnel からのデータを出力するには?

上記のように、SORACOM Funnel から受け取ったデータは payloads に含まれてることが分かったのですが、配列の形になっているので、そのままでは Stream Analytics から Azure Storage に出力することができません。

そこで、Stream Analytics のクエリを利用して、配列を展開してから出力することができます。

送信したデータの例
{"deviceId":"Sensor1","data":{"temp":"20"}}
StreamAnalyticsのクエリ
SELECT
    e.payloads.deviceId AS deviceId,
    CAST(e.payloads.data.temp AS float) AS temp,
FROM
    eventhubs AS e
INTO
    tablestorage

この場合、入力を e として扱い、 e.payloads.deviceIde.payloads.data.temp というようにデータを読み取ります。また temp は数値なので、 CAST( AS float) で浮動小数点型に変換しました。

Epilogue - おわりに

詳しい手順は、本記事では書ききれなかったので、追って公開していく予定です。

また、 Azure ML の詳説は、 Microsoft MVP for Data Platform の @tottokug にご教示いただいて挑戦します!