3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

この記事誰得? 私しか得しないニッチな技術で記事投稿!

M5Stack Toughと土壌水分量センサーでプランター菜園をモニタリングするVol.4(データ蓄積編)

Last updated at Posted at 2023-07-16

データ蓄積先の選定

前回までの記事で、電源、センサーとりつけ、AWS IoT へのデータ送信を行ってきました。

M5Stack Toughと土壌水分量センサーでプランター菜園をモニタリングするVol.1(電源編)
M5Stack Toughと土壌水分量センサーでプランター菜園をモニタリングするVol.2(センサー取り付け編)
M5Stack Toughと土壌水分量センサーでプランター菜園をモニタリングするVol.3(AWS IoT 編)

とりあえずAWS IoT にはデータが届いている状態なのでルールエンジンを用いてデータの蓄積を考えていくことになります。データ蓄積する際は、データベースを使ったりAmazon S3などのオブジェクトストレージを使ったりするケースが多いかと思います。最近だと、何でも貯めることができてデータ型とか気にしなくてよいオブジェクトストレージにとりあえず放り込み、その後どうするか考えるという蓄積系と分析系を分離(疎結合)にするデータレイクの考え方を取るケースも増えてきていると思います。今回は、リアルタイムに近い形で可視化したかったので、データレイクの形は取らず、データベースに直接投入する方法を選びました。

データベースを選定するにあたって、MySQLやPostgreSQLなどの一般的なRDBMSを使う方法もありますし、AWSだとDynamoDBやTimestreamといったNoSQL型のデータベースもあります。IoTの分野では時系列でデータを取り扱うことになるため、TimestreamやInfluxDBなどの時系列データベースが得意としています。

今回はAWSで組んでいることもあり、また、データベースのインフラのお世話や細かいことを考えたくなかったので、AWSの Amazon Timestream で構築することにしてみます。

Timestream の準備

データベースの構築は、AWS のマネジメントコンソールで Timestream の画面に移動したのち、標準データベース を選んで名前をつけ、データベースを作成 をクリックするだけです。

timestream01.png

テーブルは、作成したデータベースを選択してテーブル名を付け、パーティションキーにこだわりが無ければデフォルトパーティショニングを選択してテーブルを作成をクリックします。

timestream02.png

DBの細かいこと考えるのが面倒くさいと思ってしまう私にはちょうど良い感じです。

AWS IoT から Timestream にデータを投入する

AWS IoTに届いたメッセージをTimestreamのテーブルに投入する場合、IoT のマネジメントコンソールで 管理 - メッセージのルーティング - ルールにてルールの作成をクリックします。

iot_rule03.jpg

適当なルール名を設定し、次へをクリックします。

iot_rule04.jpg

今回は、iotfarm-m5t というトピックに対してメッセージを送っているため、SQL ステートメントに下記のクエリを設定します

SELECT * FROM 'iotfarm-m5t'

設定したら、次へをクリックします

iot_rule05.jpg

ルールアクションには下記のように設定していきます。

設定項目 設定値
アクション1 Timestream table
データベース名 demo-db
テーブル名 demo-table
ディメンション名 deviceid
ディメンション値 ${deviceid}
タイムスタンプ値-オプション ${sampletime}
タイムスタンプの単位 MILLISECONDS
IAMロール Timestreamへのアクセス権限を持つIAMロール

データベース名とテーブル名は上記で作成したものを利用します。
ディメンション名は時系列レコードの属性を表します。今回のようなデバイス名や、工場名などを付けてセンサの値を識別できるようにします。ディメンション値に ${deviceid} と記述することで、IoTのメッセージの deviceid に紐づく値を読み取ってくれるようになります。同様にメッセージに含んでおいたタイムスタンプ値は ${sampletime} で取得することが出来ます。今回タイムスタンプはミリ秒単位で送っているため、MILLISECONDS を選択します。

{
    "deviceid":"m5t01", <-- ${deviceid} で読み取れる
    "moisture":516,
    "temperature":28.3,
    "sampletime":"1688779815000" <-- ${sampletime} で読み取れる
}

下記のように設定出来たら、次へをクリックします。

iot_rule06.jpg

確認画面で設定を確認したのち、作成をクリックします。

Timestream への書き込みを確認

IoTでデータを受信している状態でTimestream のマネジメントコンソールにてクエリエディタを開きます。
Choose a database to query で作成したデータベースを選択し、下に表示されたテーブル名の横の3つの点をクリックしデータをプレビューをクリックします。

timestream04.png

クエリエディタに自動的にSQLクエリが記述されるので、実行 をクリックします。実行した結果、下記のように表示されれば成功です。

timestream03.png

表示されない場合はIoTのルールアクションでエラーアクションを設定し、CloudWatch Logs などにログを出力できるようにしておくことでトラブルシューティングに役立ちます。

ここまでのまとめ

IoTのデータはS3やRDBMSに蓄積するだけではなく、Timestreamのような時系列データベースに保管する方法もあります。サーバーレス型のデータベースを利用することで手軽に時系列データを保管してクエリで探索がかけられるようになるので、IoT系でのデータ蓄積の選択肢として入れていけそうです。

次回

Amazon Managed Grafana を活用してTimestreamに保管されたデータの可視化をしてみたいと思います。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?