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

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

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

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

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

無課金勢なので一日に送れるテレメトリ数の上限に達してる予感。

今回は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 テストクライアント」で「モノ」からの正常な通信を確認する。 image01

このままでは垂れ流したメッセージが失われるので「ルール」で DynamoDB に送ってデータベースに格納する。

IAM

ルート権限は強すぎるのでDynamoDBにアクセスするためのユーザーを追加する。

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

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

DynamoDB

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

「DynamoDB -> テーブル」から

  • テーブル名: measurements
  • パーティションキー: device_id, 文字列
  • ソートキー: timestamp, 数値

と設定したテーブルを作成する。 image02

ルール

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

  • ルール名: 任意
  • SQL ステートメント: “SELECT * FROM ‘device/+/data’”

image03

ルールアクションは

アクション1DynamoDB
テーブル名measurements
パーティションキーdevice_id
パーティションキーのタイプSTRING
パーティションキーの値${device_id}
ソートキーtimestamp
レンジキーのタイプNUMBER
レンジキーの値${floor(timestamp(measured_at) / 1E3)}
この列にメッセージデータを書き込むdata
オペレーションINSERT

image04

IAM ロールは image05

作ったルールは image06

PartiQLエディタ

ここまで済ませて待っているとAWS IoT Core経由でDynamoDBに格納される。
PartiQLエディタを使って確認するとM5StickCPlus + Wi-SUN HATで測定したデータがDynamoDBに入っているはず。 image07

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" "ユーザーのシークレットアクセスキー"

実行するとグラフができる 2022 09 04T0000to2359

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

追記

2022 09 05T0000to2359 2022 09 06T0000to2359

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

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

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

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

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

2022 09 12T0000to2359

2022 09 13T0000to2359

2022 09 14T0000to2359

2022 09 15T0000to2359

2022 09 16T0000to2359

2022 09 17T0000to2359

たび重なる改修の結果24時間連続運転ができるようになった。 2022 09 20T0000to2359

2022 09 21T0000to2359

2022 09 22T0000to2359

2022 09 23T0000to2359