M5StickCPlus と Wi-SUN HAT(BP35A1)でスマートメーターと通信してデータが取れたので、データベースに格納してみる。
以前にAzure Iot Hub から Azure Cosmos DB にデータを格納したように, 一度 Azure IoT Hub につないでみたんだけど
こんなふうにやたらとデータが欠損する。
無課金勢なので一日に送れるテレメトリ数の上限に達してる予感。
なんとなくスマートメーター間とのセッションがきれているような。。。
今回は AWS IoT Hub + DynamoDB で同じことをしてみる。
AWS IoT Hub
AWS アカウントを用意。
続いて「AWS IoT -> すべてのデバイス -> モノ -> モノを作成」からモノを作る
ポリシーはこうで
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "iot:Publish",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "iot:Subscribe",
"Resource": "*"
}
]
}
モノを作って証明書とキーをダウンロードする。
前回のプログラムを AWS IoT Hub につなぐように改造した。
GitHub リポジトリ
実行すると AWS IoT Hub に"device/m5-WiSUN/data"に MQTT で接続するので 「MQTT テストクライアント」で「モノ」からの正常な通信を確認する。
このままでは垂れ流したメッセージが失われるので「ルール」で DynamoDB に送ってデータベースに格納する。
IAM
ルート権限は強すぎるので DynamoDB にアクセスするためのユーザーを追加する。
- 「IAM -> アクセス管理 -> ユーザー -> ユーザーを追加」からユーザーを追加する。
- 適当なユーザー名を入れて 「アクセスキー - プログラムによるアクセス」にチェックを入れて次のステップ
- 「既存のポリシーを直接アタッチ」-> 「AmazonDynamoDBReadOnlyAcccess」 にチェックを入れて次のステップ
- 「タグ」は無し。
以上のユーザーを追加して「アクセスキー ID 」と「シークレットアクセスキー」をどこか適切な場所に保存する。
DynamoDB
データを格納するテーブルを作る。
「DynamoDB -> テーブル」から
- テーブル名: measurements
- パーティションキー: device_id, 文字列
- ソートキー: timestamp, 数値
と設定したテーブルを作成する。
ルール
AWS IoT Core から DynamoDB に送る「ルール」を設定する。 「AWS IoT -> メッセージのルーティング -> ルール」から「ルール」を作る
- ルール名: 任意
- SQL ステートメント: “SELECT * FROM ‘device/+/data’”
ルールアクションは
アクション 1 | DynamoDB |
テーブル名 | measurements |
パーティションキー | device_id |
パーティションキーのタイプ | STRING |
パーティションキーの値 | ${device_id} |
ソートキー | timestamp |
レンジキーのタイプ | NUMBER |
レンジキーの値 | ${floor(timestamp(measured_at) / 1E3)} |
この列にメッセージデータを書き込む | data |
オペレーション | INSERT |
IAM ロールは
作ったルールは
PartiQL エディタ
ここまで済ませて待っていると AWS IoT Core 経由で DynamoDB に格納される。
PartiQL エディタを使って確認すると M5StickCPlus + Wi-SUN HAT で測定したデータが DynamoDB に入っているはず。
Python を使ってグラフを作る
リポジトリにある test/dynamodb_plot.py を使って DynamoDB に入っているデータからグラフを作る。
aki:/mnt/d/m5stickc-wisunhat/test$ ./dynamodb_plot.py "**************" "********************" "****************************************"
2022-09-04 00:00:00+09:00 -> 2022-09-04 23:59:59.999999+09:00
./dynamodb_plot.py "AWSリージョン名" "ユーザーのアクセスキーID" "ユーザーのシークレットアクセスキー"
実行するとグラフができる
いまはまだ一日分のデータがないので, あとで追記するつもり。
追記
この日は WiFi 再接続シーケンスが無限ループしていた。
このあたりの日の値が欠損しているのはプログラムを改修している時間とか。
この日は WiFi 再接続シーケンスと MQTT 接続がまともに動いていなかった。
このあたりでうまく動くようになってきたと思う。
さらに追記
棒グラフに変更した
たび重なる改修の結果 24 時間連続運転ができるようになった。
自動でスマートメーターからデータ収集して DynamoDB へ格納してくれるので, 何もすることがない。
コメント