M5StickCPlusとWi-SUN HAT(BP35A1)でスマートメーターと通信してデータが取れたので、データベースに格納してみる。
以前にAzure Iot HubからAzure Cosmos DBにデータを格納したように, 一度Azure IoT Hubにつないでみたんだけど
こんなふうにやたらとデータが欠損する。
無課金勢なので一日に送れるテレメトリ数の上限に達してる予感。
なんとなくスマートメーター間とのセッションがきれているような。。。
今回はAWS IoT Hub + DynamoDBで同じことをしてみる。
AWS IoT Hub
AWSアカウントを用意。
続いて「AWS IoT -> すべてのデバイス -> モノ -> モノを作成」からモノを作る
ポリシーはこうで
|
|
モノを作って証明書とキーをダウンロードする。
前回のプログラムを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に入っているデータからグラフを作る。
|
|
|
|
実行するとグラフができる
いまはまだ一日分のデータがないので, あとで追記するつもり。
追記
この日はWiFi再接続シーケンスが無限ループしていた。
このあたりの日の値が欠損しているのはプログラムを改修している時間とか。
この日はWiFi再接続シーケンスとMQTT接続がまともに動いていなかった。
このあたりでうまく動くようになってきたと思う。
さらに追記
棒グラフに変更した
たび重なる改修の結果24時間連続運転ができるようになった。
自動でスマートメーターからデータ収集してDynamoDBへ格納してくれるので, 何もすることがない。
2022/9/20
2022/9/21
2022/9/22
2022/9/23
2022/9/24
2022/9/25
2022/9/26
2022/9/27
2022/9/28
2022/9/29
2022/9/30
2022/10/01
2022/10/02
2022/10/03
2022/10/04
2022/10/05
2022/10/06
2022/10/07
2022/10/08
2022/10/09
2022/10/10
2022/10/11
2022/10/12
2022/10/13
2022/10/14
2022/10/15
2022/10/16
2022/10/17
2022/10/18
2022/10/19
2022/10/20
2022/10/21
2022/10/24
2022/10/25
2022/10/26
2022/10/27
2022/10/28