M5StickCPlusとWi-SUN HATをAWS IoT Coreにつないでスマートメーターから得た電力量, 瞬時電力, 瞬時電流をDynamoDBに格納した。

M5StickCPlus と Wi-SUN HAT(BP35A1)でスマートメーターと通信してデータが取れたので、データベースに格納してみる。

以前にAzure Iot Hub から Azure Cosmos DB にデータを格納したように, 一度 Azure IoT Hub につないでみたんだけど

こんなふうにやたらとデータが欠損する。

無課金勢なので一日に送れるテレメトリ数の上限に達してる予感。
なんとなくスマートメーター間とのセッションがきれているような。。。

今回は AWS IoT Hub + DynamoDB で同じことをしてみる。

AWS IoT Hub

AWS アカウントを用意。
続いて「AWS IoT -> すべてのデバイス -> モノ -> モノを作成」からモノを作る

ポリシーはこうで

JSON
{
  "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 にアクセスするためのユーザーを追加する。

  1. 「IAM -> アクセス管理 -> ユーザー -> ユーザーを追加」からユーザーを追加する。
  2. 適当なユーザー名を入れて 「アクセスキー - プログラムによるアクセス」にチェックを入れて次のステップ
  3. 「既存のポリシーを直接アタッチ」-> 「AmazonDynamoDBReadOnlyAcccess」 にチェックを入れて次のステップ
  4. 「タグ」は無し。

以上のユーザーを追加して「アクセスキー ID 」と「シークレットアクセスキー」をどこか適切な場所に保存する。

DynamoDB

データを格納するテーブルを作る。

「DynamoDB -> テーブル」から

ルール

AWS IoT Core から DynamoDB に送る「ルール」を設定する。 「AWS IoT -> メッセージのルーティング -> ルール」から「ルール」を作る

ルールアクションは

アクション 1DynamoDB
テーブル名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 に入っているデータからグラフを作る。

BASH
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
クリックして展開し、詳細を表示
BASH
./dynamodb_plot.py "AWSリージョン名" "ユーザーのアクセスキーID" "ユーザーのシークレットアクセスキー"
クリックして展開し、詳細を表示

実行するとグラフができる

いまはまだ一日分のデータがないので, あとで追記するつもり。

追記

この日は WiFi 再接続シーケンスが無限ループしていた。

このあたりの日の値が欠損しているのはプログラムを改修している時間とか。

この日は WiFi 再接続シーケンスと MQTT 接続がまともに動いていなかった。

このあたりでうまく動くようになってきたと思う。

さらに追記
棒グラフに変更した

たび重なる改修の結果 24 時間連続運転ができるようになった。
自動でスマートメーターからデータ収集して DynamoDB へ格納してくれるので, 何もすることがない。

著作権表示

著者: Akihiro Yamamoto

リンク: https://ak1211.com/posts/7729/

ライセンス: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

コメント

検索を開始

キーワードを入力して記事を検索

↑↓
ESC
⌘K ショートカット