IoT機器で温湿度を測定してクラウドでグラフ化 DynamoDB設定編 (その3) | そう備忘録

IoT機器で温湿度を測定してクラウドでグラフ化 DynamoDB設定編 (その3)

温湿度推移のグラフ化

RaspberryPi Zeroと温湿度モジュール(DHT22)を使用して温湿度を指定した間隔(分)で測定してクラウド(AWS IoT Core)にデータをアップロードしてグラフ化するまでの3回目。

今回の記事の範囲はAWS DynamoDBの設定とする。

システム概要図

システム概要図と今回の記事の範囲は以下の通り。

温湿度測定システム構成図 今回の記事の範囲

主な実現したい機能は以下の通り。

  • 指定した間隔(分)で温湿度を測定する
  • 指定した間隔(分)でデータをサーバーにアップロードする
  • アップロードしたデータは集計、グラフ表示する
  • 温湿度のしきい値(上限、下限)を超えた場合はアラートを発信する
  • しきい値は場所毎に異なる値を指定出来るようにする
  • 設定情報はGoogle Sheetで一括指定して設定値を変更したら各端末に速やかに反映させる
  • それぞれの端末は遠隔で再起動等の操作が出来るようにする
  • 測定端末は複数台設置するが基本的に室内とする(屋外には設置しない)
  • 100V電源を確保できる場所とする(バッテリー駆動も一応試してみる)
  • 初期コスト、ランニングコストともに出来るだけローコストで実現する

DynamoDB

DynamoDBへデータを保存する

温湿度の通常データはElasticsearch Serviceに送ってkibanaでヴィジュアル化する同時にDynamoDBにも送信する仕様とする。

全てElasticsearch Serviceに保存するとデータが蓄積されてきた時にkibanaの表示のパフォーマンスに影響が出そうなのでElasticsearch Serviceには直近1ヶ月程度の保存として長期のデータ保存はDynamoDBを使うことにする。

DynamoDBはNoSQLデータベースサービスでリレーショナルデータベースの様にSQLは使えないがプライマリーキーによるデータの指定やソートキーやフィルターによる範囲指定等でデータを取り出すことができる。

またキャパシティ5(1秒間に5回の書き込み)程度だと1ヶ月で3.32ドル程度のローコストで利用できるのもありがたい。

DynamoDBの設定

DynamoDBでテーブルの作成を行う。

AWSにログインをしてサービスからDynamoDBを選択する。

サービスからDynamoDBを選択

テーブルの作成

”ダッシュボード”から「テーブルの作成」ボタンをクリックする。

DynamoDBテーブルの作成

  • テーブル名:temp_humi_record
  • プライマリキー:tempkeyindex
  • ソートキーの追加:チェックする
  • ソートキー:clientid
  • デフォルト設定の使用のチェックを外す

テーブル名とプライマリキーの設定

セカンダリインデックスやキャパシティなど

デフォルト設定の使用のチェックを外すと既定の設定が展開されるので、

  • セカンダリインデックス:未設定(後から追加で設定する事ができる)
  • 読み込み/書き込みキャパシティモード:プロビジョンド

を選択する。

インデックスやキャパシティなど

キャパシティ

キャパシティはDynamoDBの利用料金に影響する。

ざっくり言うと書き込みは1ユニット=1秒間に1回の書き込み、読み込みは1ユニット=1秒間に2回の読み込みが可能なので使用状況に応じて適切な値を設定する。

最初は大きめの値を設定してCloudWatchで状況を見ながら小さくしていくのが常套手段らしい。

画面ショットでは5(デフォルト値)だが読み書き共に2に変更した所、見積もり料金は1.33ドル/月になった。

キャパシティ

保管時の暗号化

保管時の暗号化はデフォルトのままで「作成」ボタンをクリックする。

よりセキュアなKMS(AWS Key Management Service)を使用する場合は別途料金が発生する。

保管時の暗号化

tep_humi_recordテーブルが作成された。

テーブルが作成された

IoT Core ACT

ルールの作成

続いてAWS IoT CoreのACTにルールの作成を行い、温湿度の通常データがIoT CoreにPublish(Edge端末からAWS IoT Coreへのデータの送信)された際に先ほど作成したDynamoDBのテーブルにデータ送信するように設定を行う。

IoT Coreのメニューより”ACT”、”ルール”、「作成」ボタンをクリックする。

ルールの作成

名前と説明

  • 名前:to_temp_dynamo
  • 説明:temp_himi DynamoDB(ここは日本語が使えない)

を入力する。

名前と説明

ルールクエリステートメント

ルールクエリステートメントにはTOPICの抽出条件を指定する。

通常データ(温湿度情報)の抽出を行いたいので以下のselect文を指定する。

SELECT * FROM 'dt/TempAndHumi/#'

「アクションの追加」ボタンをクリックする。

ルールクエリステートメント

DynamoDBにメッセージ送信

IoT Coreから送信可能なサービスの一覧が表示されるので”データベーステーブル(DynamoDBv2)の複数列にメッセージを分割する”を選択する。

JSON形式の1項目がテーブルの1項目に対応してメッセージ送信が行われる。

ひとつ上の”DynamoDBテーブルにメッセージを送信する”を選択するとDynamoDBの一つの項目にJSONデータの全ての項目を格納するレイアウトになる。

DynamoDBの複数列でデータ送信

下にスクロールして「アクションの設定」ボタンをクリックする。

アクションの設定

アクションの設定

テーブル名で先ほど作成した”temp_humi_record”をプルダウンメニューより選択する。

「ロールの作成」をクリックする。

リソースの選択

ロールの作成

  • 名前:dynamo_temp_humi_role

「ロールの作成」ボタンをクリックする。

ロールの作成

アクションの追加

自動で作成されたポリシーがアタッチされたロールが設定されるので「アクションの追加」ボタンをクリックする。

アクションの追加

ルールの作成

先程の画面に戻ってアクションが追加されているので「ルールの作成」ボタンをクリックする。

エラーアクションは今回は設定していないが、例えばDynamoDBへのメッセージの送信が失敗した場合にエラーメールを飛ばしたい時は「アクションの追加」でAmazon SNS(Simple Notification Service)などを指定する。

ルールの作成

ルールの有効化

ルールが作成されるので右端の”・・・”を選択して「有効化」をクリックすると有効化される。

ルールの有効化

テスト

実際にプログラムからIoT CoreにデータをPublishしてDynamoDBでデータが送信されるかを確認する。

尚、プログラムについては別記事とする。

IoT Coreのテスト

IoT Coreのメニューからテストを選択してトピックのサブスクリプションに”#”を指定して「トピックへのサブスクライブ」ボタンをクリックする。

トピックのサブスリプション

プログラムからIoT Coreがデータを受信すると画面中央に表示される。

尚、JSONデータの項目は本番時のプログラムとは若干異なる

IoT Coreのテスト

DynamoDBの”テーブル”、”項目”タブでデータが格納されていればテストは終了。

DynamoDBのテーブルに格納された

続く

長くなったので今回の記事はこれで終了。

次回はElasticsearch Serviceの設定の記事としたい。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。