• 温湿度センサーデータを、Amazon S3に直接保存する方法

本記事のポイント

IoTデバイスのセンサーデータを活用する前に、まずはデータを適切に保存する必要があります。本記事では温湿度センサーとAmazon Simple Storage Service(以下、S3)を用いて、センサーデータをクラウドに保存する方法をご紹介します。



1. はじめに

IoTの導入を検討する理由の一つとして、IoTデバイスから大量に取得、収集できるセンサーデータを活用したいことが挙げられるでしょう。収集したセンサーデータを有効活用するためには、データを蓄積することからはじまります。

IoT組込みエンジン NEQTOでは、NEQTO Consoleで用意されたサービスを利用して、センサーデータを保存することができます。今回は、センサーデータをデバイスから直接Amazon S3に保存する方法をご紹介します。一方、自身でお持ちのAmazon Web Services(以下、AWS)などのクラウドサービスに直接データを送信することも可能です。センサーデータ を 、実際にNEQTO Bridge に取り付けた温湿度センサーから収集してみます。

2. IoTのセンサーデータはどのように処理すべきか

IoTのセンサーから取得したデータ処理の手順は、データの保存と活用に分けて考えることができます。今回はデータの適切な保存方法に焦点を当ててみました。しかしながら、データは種類によって、適切な取得時間の間隔、保存形式など様々なため、そのデータをどのように活用したいかまでを考えることが必要となると思います。

今回は、センサーデータのIoT化がイメージがしやすい、温湿度センサーを使った例をあげます。センターデータの一定期間の気温と湿度の時間変化を分析することを想定し、保存するデータは、センサーから取得できるデータの温度(℃)と湿度(%)、計測時間の3種類に決めます。また、保存するファイル形式は、扱いやすいcsvを使うこととします。データの保存先としては、ファイルを大量に保存でき、可用性を考慮されたクラウドサービスとして、今回はリーズナブルで、容量無制限で使えるという観点から、Amazon S3を利用します。これらの簡易的に定義したデータの活用方法から、保存方法と保存形式を決定することとします。

用語解説

Amazon S3は、スケーラビリティ、データ可用性、セキュリティ、およびパフォーマンスを提供するオブジェクトストレージサービスです。

Amazon S3には、標準SQL言語によりデータを選択(Select)取得する機能があります。Amazon S3に保存された大量のデータは直接検索も可能です。AWSの分析サービス Amazon Athena や Amazon Redshift Spectrum とも互換性があります。今回は利用に関する説明はありませんが、収集したデータをこちらのサービスを使って、分析や活用をすることもできます。

3. 目標と構成の紹介

今回の目標は、NEQTOに取り付けたセンサーから定期的に収集したデータをAmazon S3にアップロードし、想定通りに保存されていることを確認することとします。今回使用する機器と構成は以下のようになっています。

機器

図: USBケーブルと、 NEQTO Bridge Wi-Fi Module、 温湿度センサーを取り付けたNEQTO Bridge Connector Board

図: USBケーブルと、 NEQTO Bridge Wi-Fi Module、 温湿度センサーを取り付けたNEQTO Bridge Connector Board

構成

  • NEQTO Console
  • NEQTO Bridge
  • Amazon S3
図: Neqto and Amazon S3 Diagram

言語、ライブラリ

* neqto.jsは、NEQTO Engine上で動作するJavaScript環境です。ECMAScript 5.1 Edition に対応しています

ターミナルソフトウェア

  • Tera Term

実装準備

NEQTO DOCSを読んでチュートリアルを含めた以下の初期設定を終わらせます。

次に、サンプルスクリプトを実行し、それぞれが実行できることを確認します。

4. 実装:S3への保存方法

実装に入ります。対応手順は、以下の2つとなります。

step1. 温湿度センサーから一定間隔で温度と湿度を取得し、ある期間まで収集する step2. Amazon S3にアップロードする

今回は3秒に1回温湿度を測定し、30秒後にファイルをS3にアップロードすることを繰り返すコードを書きたいと思います。基本は上記の実装準備のサンプルスクリプトを参考にしていますが、データをアップロード時のデータ保存形式に変換する必要があるので、データ整形処理を加えました。

データの整形

最終的なcsvファイルの中身は以下を目指します。

datetime, temperature, humidity
<datetime>, <温度>, <湿度>;
<datetime>, <温度>, <湿度>;
     …

まず、データ送信に使用するAWS S3 V2ライブラリの仕様を確認すると、S3にアップロードするときの形式が決まっています。.putメソッドではbodyはコールバック関数であり、データがなくなるまで4KB以下の [string/ArrayBuffer]チャンクでデータを返し、その後nullを返す必要があります。なお、今回はデータサイズが4KB以下であることを前提としています。

var s3 = new AWS_S3(config);
s3.put(path,userHeaders,body,callback);
var send = false;<br />
var body = function () {// Must return String, ArrayBuffer, or null.
  if (send) {
    return null;
  }
  send = true;
  var data = "string";
  return data;
}

取得したセンサーデータはS3ライブラリ仕様に合わせて、下記のような文字列で表します。改行は"\n"を使いました。これを上記コードのdataに格納することでS3にアップロードできる形式になります。

"datetime,temperature、humidity\n<datetime>, <温度>, <湿度>\n<datetime>, <温度>, <湿度>..."

データを整形するために必要な関数は以下のようになります。

図: Array for Temporary Data Storage

まず配列を用意し、initArr関数では初期化として各項目名を格納します。pushToArr関数では測定データを引数に、配列に追加していきます。getDatafromArr関数は一定間隔で呼び出し、各配列の要素を改行コードで繋げ、文字列に変換します。また次の期間の測定のために配列の初期化をします。

メインループ

今回の実装のメインループは以下のようになりました。大きく分けてStep1,2で構成されています。

図: Set params
図: Set params 2

Step1. 温湿度センサーから一定間隔で温度と湿度を取得し、ある期間まで収集する

Step1では温湿度センサーのデータを取得し、配列に格納します*1。測定はmeasurement関数で行います。

図: Step1. 温湿度センサーから一定間隔で温度と湿度を取得し、ある期間まで収集する

この時、timerIntervalの間隔で測定し、測定回数がnumOfTimesに達するまで繰り返します。今回は3秒に1回測定し、10回に達したらstep2に進みます。コード中のready変数はセンサーが初期化されているかのフラグとなっています*2

*1 ただし、確保できるリソースには限りがあります。今回の容量であれば問題ありません。DOCSのサンプルコードのようにその都度nqMqttオブジェクトを利用して、NEQTO Consoleや各クラウドに送信する方法もあります。
*2 詳しくはHTS221温湿度センサを制御してみましょう - Example 2を参照ください。

Step 2. Amazon S3にアップロードする

Step2では、AWS S3 V2ライブラリの.putメソッドを使用して、一定期間測定したデータをS3にアップロードします。前述のStep1で測定したデータが格納されている配列はgetDataFromArr関数で文字列に変換して、getData関数に渡します。getFilename関数は測定時間をもとに,保存するファイル名を定めています。

図: Step 2. Amazon S3にアップロードする

ここでStep2の挙動の説明をします。 busy変数はS3との通信が終了しているか判断するフラグとなります。S3のアップロードはこのbusy変数が偽の時に受け付けるようになっています。なお、.putメソッドのcallbackによって、通信の成功可否および通信の終了を判断することができます(*3)

最後に再びStep1に戻り継続して測定を行うための初期化処理を入れています (while文の前の定義と同じ状態に戻しています) 。これによりStep2は.putメソッドの通信完了を待たずにStep1処理に戻ります。そして30秒後に再びS3へのアップロードが行われます。その際、前回の通信が完了していなかった場合、測定データは破棄されます。

*3 .putメソッドの通信処理は非同期で行われているため、Step1に戻って次の期間の測定中にも行われている可能性があります。前の通信が滞っている状態で次々に通信を行おうとするとリソース不足が起きる可能性があります。

5. 結果

スクリプトを実行します。Tera Termでは以下のように200 OKと出ており,通信が成功していることが確認できました。

図: Tera Term

では、S3にファイルが適切にアップロードされているか確認してみます。

図: Amazon S3

ファイルの中身はこちらです。想定通り保存されていますね! temp-24-7-33-47.csv

図: Temperature

6. まとめ

いかがだったでしょうか。本記事ではIoTのセンサーから収集したデータをストレージに保存するまでの一例をご紹介しました。

保存したデータの活用法までには触れるスペースがありませんでしたが、グラフ化したり、機械学習の学習データにするなどが考えられそうです。収集したデータを分析することで新たな発見があるかもしれません。

また、今回はAmazon S3と連携させましたが、Google CloudやMicrosoft Azure、NEQTO Appsと連携することも可能です。neqto.jsには他にもいろいろなライブラリがあります。色々試してみるとアイディアも浮かんできて楽しいですね。