以下の内容は Zenn からの転載です。
グラフをかいて、みえる化してみる
前々回, 前回とスマートメーターのBルートから現在の消費電力を確認した。
https://zenn.dev/akihiro_ya/articles/b771291bd872b0
https://zenn.dev/akihiro_ya/articles/0df610e514a9f9
まあ関西民にはサービスブレーカーが落ちる経験がないので現在の電力とか電流を気にする必要もない(もともと無いもんが落ちるわけ無いもんな)。
それはとにかく今回はこのM5StickC + WiSUN HATで1分毎にDynamoDBに記録しているテレメトリをグラフにしてみます。 https://ak1211.com/7729/
python + numpy + pandas で同じことをしているけど、今回はRustで高速化を目指すことにする。
実行するとこんなのが作られる。
ピークパワーは2828W 18時16分とわかる。 エアコンは運転開始時に最大の消費電力になるわけだから煖房運転を始めた時間が見た目でわかるし、だいたい30分で定常運転になったことがわかるな。
GitHubリポジトリ
plot/ディレクトリの内容がこの記事の物。 test/ディレクトリの内容が前の記事の物。 https://github.com/ak1211/m5stickc-wisunhat
Rustで書き換えるついでに2つの実行ファイルに分離しました。
- DynamoDBにクエリーを発行してCSVファイルを作るretrieve_plotdata
- CSVファイルからグラフを作るplotcharts
credentialsファイルを事前に準備する
|
|
リンク先の通り接続情報を~/.aws/credentialsとかに用意してください。
https://docs.aws.amazon.com/sdk-for-rust/latest/dg/credentials.html
DynamoDBにクエリーを発行してCSVファイルを作るretrieve_plotdata
このコマンドはDynamoDBからテレメトリデーターをCSVファイルでダウンロードするまでを行う。
Amazon DynamoDBを扱うのにaws_sdk_dynamodbを使います。 https://docs.rs/aws-sdk-dynamodb/latest/aws_sdk_dynamodb/ https://docs.aws.amazon.com/sdk-for-rust/latest/dg/rust_dynamodb_code_examples.html
データーフレームを扱うのにPolarsを使います。 https://www.pola.rs/
データーベースの最初と最後のアイテムを得る
|
|
ここでやっていることは パーティションキーのdevice_idとプログラムのDEVICE_IDが一致して data.sensor_idとプログラムのSENSOR_IDとが一致するレコードを1件取り出す。 timestampというAWSが追加したUTC時間がソートキーであるために ‘ScanIndexForward’を True / False に切り替えることで先頭と最後をそれぞれ得られるしかけ。
これをRustで書き換える。
|
|
ざっくり同じ。 dataは予約語なので#dataとかにしないとエラーとなる。
|
|
データーベースから一日分のデーターを得る
|
|
timestampはUTC時間なのでbegin,endをUTC時間に変換したbegin_, end_の範囲をBETWEENで指定してクエリーを発行する。 クエリーによっては分割して得られるためにずらしながらwhileループで取得している。
これをRustで書き換える。
|
|
ざっくり同じ。 気を付けるのはAttributeValueを適切なものにするくらいかな。
AttributeValueはDynamoDBでテーブルを作るときに指定したもの。
パーティションキー | device_id |
パーティションキーのタイプ | STRING |
これであるのでAttributeValue::Sと指定する。
|
|
データーフレームを作る
|
|
“measured_at"にDataType::Utf8を指定しているのはそのままCSVファイルにするため。
データーフレームからCSVファイルを作る。
このために polars::prelude::CsvWriter が用意されているのでそれを使う。
https://pola-rs.github.io/polars/polars/prelude/struct.CsvWriter.html
|
|
CSVファイルからグラフを作るplotcharts
ここから別のコマンド。
CSVファイルからデーターフレームを作る。
https://ijmacd.github.io/rfc3339-iso8601/
上のコマンドで作ったCSVファイルはRFC3339形式にしていて問題ないことを確認している。
|
|
読み込んだCSVファイルのmeasured_at列はIS08601形式?RFC3339形式?どっちかわからないけど、datetime型に変換するところで失敗するとパーになるのでよろしく。
|
|
プロットする
データーフレームをプロットするのにはplottersを使います。 https://github.com/plotters-rs/plotters
じつは例を参考にしただけであまりわかってないので、何をやっているのか説明するだけにする。
|
|
グラフエリアを縦に3分割する。
積算電力量(30分値)をグラフ化する
|
|
横軸が時間、縦軸が積算電力量瞬時電力(30分値)の棒グラフと折れ線グラフを作っている。
瞬時電力(1分値)をグラフ化する
|
|
横軸が時間、縦軸が瞬時電力(1分値)の棒グラフを作っている。
瞬時電流(1分値)をグラフ化する
|
|
横軸が時間、縦軸がR相とT相の瞬時電流(1分値)の積み上げ棒グラフを作っている。 Rustのソースファイルでコメント多めにしておいたので、ソースファイルも見てください。
感想
6月19日のグラフを例にするとNA値(欠損)が目立つ。
ピークパワーが浮いているのは横幅が狭いので省略されているだけなのでplotcharts -x1200とかで出力すると出てくる。
生データがこれ。
|
|
2023-06-19T15:28:00+09:00,smartmeter,65747,,,7.3,1.8 65748 欠損。 65749 欠損 2023-06-19T15:32:00+09:00,smartmeter,65750,,848.0,,
本来はこうであるはず。 2023-06-19T15:29:00+09:00,smartmeter,65748,,瞬時電力,, 2023-06-19T15:29:00+09:00,smartmeter,65749,,,R相電流値,T相電流値
再起動があるとmessege_idが0に戻るので再起動はしていないので、 スマートメーターに出した要求が破棄されているか1分以上遅延しているようで。 ECHONET TIDもDBに記録していたらわかるかもだけど。 それか 通信パケットが破棄されているとか。 MQTT Quality of Serviceが0つまり再送なしになっているのか?
QoSは1に指定しているんだが?。 https://pubsubclient.knolleary.net/api#connect
AWS IoT CoreはQoS 0または1をサポートしているわけで。 https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/mqtt.html
ちょっとよくわからない。 欠損値が気になるならスマート分電盤に交換したほうがいいようだ。
plottersのことがよくわかっていないので、わかったら追記するつもりです。