スズハドットコム

IT関連や3Dプリンタの記事、たまに生活のメモを書いていきます。

スマートメーターから消費電力データを取得してグラフ化する ②スマートメーターからデータ取得編

こちらの続きです。 suzu-ha.com

スマートメーターから消費電力データを取得する部分を作ります。

もくじ


環境

  • Radxa ROCK 4C+
  • Debian bullseye (Radxa公式イメージの rock-4c-plus_debian_bullseye_kde_b60.img)
  • Wi-SUNモジュール(テセラ・テクノロジー RL7023 Stick-D/IPS)

※Raspberry Piでもほぼ同様の手順で出来ると思います。多分。

前提パッケージのインストール

keilogの実行には、python3、python3-serial、python3-requestsの各パッケージが必要です。
確認したところ、python3はインストール済み、他2つは未インストールでした。

radxa@rock-4c-plus:~$ sudo apt list python3 python3-serial python3-requests
python3-requests/jammy-security,jammy-updates 2.25.1+dfsg-2ubuntu0.1 all
python3-serial/jammy 3.5-1 all
python3/jammy-security,jammy-updates,now 3.10.6-1~22.04 arm64 [インストール済み]

足りないパッケージをインストールします。

radxa@rock-4c-plus:~$ sudo apt install python3-serial python3-requests

keilogのダウンロード

前の記事にも書きましたが、スマートメーターからデータ取得する部分はkjmat様のkeilogを使用します。

まずスクリプト配置用のディレクトリを作成します。当記事では「/script」とします。
ディレクトリの所有者を、スクリプトを実行するユーザであるradxaにします。

radxa@rock-4c-plus:~$ sudo mkdir /script
radxa@rock-4c-plus:~$ sudo chown radxa:radxa /script/

続いて、keilogをダウンロードします。

radxa@rock-4c-plus:~$ cd /script/
radxa@rock-4c-plus:/script$ git clone https://github.com/kjmat/keilog.git

/script/keilog ディレクトリが作成され、その中にスクリプトが入っています。

radxa@rock-4c-plus:/script$ ls -l
total 4
drwxrwxr-x 5 radxa radxa 4096  1月  3 16:43 keilog

radxa@rock-4c-plus:/script$ cd keilog/
radxa@rock-4c-plus:/script/keilog$ ls -l
total 36
-rw-rw-r-- 1 radxa radxa  1070  1月  3 16:43 LICENSE.txt
-rw-rw-r-- 1 radxa radxa 10835  1月  3 16:43 README.md
-rw-rw-r-- 1 radxa radxa  3562  1月  3 16:43 kei.py
-rw-rw-r-- 1 radxa radxa  2069  1月  3 16:43 keiconf_broute.py
-rw-rw-r-- 1 radxa radxa  1703  1月  3 16:43 keiconf_serial.py
drwxrwxr-x 2 radxa radxa  4096  1月  3 16:43 keilib
drwxrwxr-x 2 radxa radxa  4096  1月  3 16:43 php

keilog設定ファイル編集…の前にWi-SUNアダプタのデバイス確認

ROCK 4C+にWi-SUNアダプタをさして、デバイスを確認します。
「/dev/serial/by-id/usb-FTDI」くらいまで入力してTABキーを押せば補完してくれます。
後でこのデバイス名をkeilog設定ファイルに書くので、コピペできるようにしておきましょう。

radxa@rock-4c-plus:/script/keilog$ ls -l /dev/serial/by-id/usb-FTDI_FT230X_Basic_UART_DJ00RS8N-if00-port0
lrwxrwxrwx 1 root root 13  1月  3 16:22 /dev/serial/by-id/usb-FTDI_FT230X_Basic_UART_DJ00RS8N-if00-port0 -> ../../ttyUSB0

実体である /dev/ttyUSB0 も確認します。

radxa@rock-4c-plus:/script/keilog$ ls -l /dev/ttyUSB0 
crw-rw---- 1 root dialout 188, 0  1月  3 16:22 /dev/ttyUSB0

Wi-SUNアダプタを使用できるようグループ追加

/dev/ttyUSB0 のパーミッションを見ればわかりますが、rootユーザか、dialoutグループに属するユーザでなければデバイスの利用権限がありません。
スクリプト実行ユーザであるradxaをdialoutグループに所属させます。

radxa@rock-4c-plus:/script/keilog$ sudo usermod -G sudo,audio,video,plugdev,render,i2c,gpio,spidev,pwm,dialout radxa

なお、-Gオプションで指定するグループは、すでに所属しているグループ含めすべてです。
あらかじめ getent group コマンドなどで確認しておきましょう。
(一度、-G dialout とだけ指定してsudoグループから外れてしまい苦労しました。)

反映のため、一度ログアウトしてログインしなおします。

keilog設定ファイル編集

keilogの設定ファイルテンプレートとして、以下2つのファイルが用意されています。

  • keiconf_broute.py
  • keiconf_serial.py

今回はBルート用のテンプレートをコピーして設定ファイルを作ります。

radxa@rock-4c-plus:/script/keilog$ cp -p keiconf_broute.py keiconf.py

設定ファイルを編集します。

radxa@rock-4c-plus:/script/keilog$ vi keiconf.py

主な編集ポイントは以下のとおりです。

from keilib.broute import BrouteReader, WiSunRL7023

importが足りずエラーが出るので追記します。(赤字のところ)

fname_base = 'smartmeter-log'

ログファイル名を指定します。
上記のように指定した場合、「20240103-smartmeter-log.txt」「sum20240103-smartmeter-log.txt」のような名前のログファイルが出力されます。

broute_port = '/dev/serial/by-id/usb-FTDI_FT230X_Basic_UART_DJ00RS8N-if00-port0'

先ほど確認したWi-SUNデバイス名を指定します。

broute_id = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
broute_pwd = 'xxxxxxxxxxxx'

電力会社(※)から発行されたBルートのIDとパスワードを指定します。
※正確には一般送配電事業者です。例えば東京電力エリアならば東京電力パワーグリッドから発行してもらいます
Softbankでんきやauでんきのような新電力を契約していたとしても、これは変わりません。

requests = [
{ 'epc':['D3','D7','E1'], 'cycle': 3600 }, # 係数(D3),有効桁数(D7),単位(E1),3600秒ごと
{ 'epc':['E7'], 'cycle': 10 }, # 瞬時電力(E7),10秒ごと
{ 'epc':['E0'], 'cycle': 300 }, # 積算電力量(E0),300秒ごと
],

requests の末尾にカンマがあるせいで、本当は「ディクショナリのリスト」のはずが「ディクショナリのリストのリスト」と認識されエラーが出てましたので、末尾のカンマを削除します。(見づらいですが、赤字のところ)

# {
# 'class': HttpPostUploader,
# 'args': {
# 'upload_que': upload_que,
# 'target_url': target_url,
# 'upload_key': upload_key
# }
# },

HttpPostUploaderは使わないのでコメントアウトします。(削除しても良いです。)

デバッグモードでテスト実行

keilogは通常実行すると標準出力に何も出ず状況が分かりにくいので、まずはデバッグモードで動かしてみます。

radxa@rock-4c-plus:/script/keilog$ DEBUG=1 python3 kei.py 

正常に動作すれば、以下のような出力が見えるはずです。(この後もどんどん出力されます。)

2024-01-03 17:00:58,284 - keilib.recorder - INFO - [START]
2024-01-03 17:00:58,286 - keilib.broute - INFO - [START]
2024-01-03 17:00:58,287 - root - INFO - start kei
2024-01-03 17:00:58,287 - keilib.broute - INFO - state = INITIAL
2024-01-03 17:00:58,306 - keilib.broute - INFO - SKDevice open port=/dev/serial/by-id/usb-FTDI_FT230X_Basic_UART_DJ00RS8N-if00-port0, baud=115200
2024-01-03 17:00:58,306 - keilib.broute - INFO - state => OPEN
2024-01-03 17:00:58,307 - keilib.broute - DEBUG - SKRESET
2024-01-03 17:00:58,344 - keilib.broute - DEBUG - OK

ログファイルも出力されました。
※「sum20240103-smartmeter-log.txt」の方は、10分くらい動作させないと出力されないようです。

radxa@rock-4c-plus:/script/keilog$ ls -ltr
total 52
(中略)
-rw-rw-r-- 1 radxa radxa   410  1月  3 17:03 20240103-smartmeter-log.txt

中身はこんな感じ。(後からスクショ撮ったので別の時刻のものです。)

古いログの処理

以下のスクリプトをlogcleaner.shという名前で保存し、実行権限を付与します。
また、ログファイルの移動先である /script/keilog/archive/ ディレクトリも作成しておきます。

#!/bin/bash
# move old file (24 hours)
find /script/keilog/ -maxdepth 1 -type f -name "????????-smartmeter-log.txt" -mmin +1440 | xargs -r -IXXX mv XXX /script/keilog/archive/
find /script/keilog/ -maxdepth 1 -type f -name "sum????????-smartmeter-log.txt" -mmin +1440 | xargs -r -IXXX mv XXX /script/keilog/archive/
# compress old file
TARGET=(/script/keilog/archive/*smartmeter-log.txt); if [ -f $TARGET ]; then gzip /script/keilog/archive/*smartmeter-log.txt; fi
# delete old file (30 days)
find /script/keilog/archive/ -maxdepth 1 -type f -name "*-smartmeter-log.txt.gz" -mtime +30 | xargs -r rm

自動起動の設定

keilogと古いログの処理をcronで自動起動するようにします。
※influxdbやGrafanaなど一通り設定できてから自動起動を仕掛けた方が良いと思いますよ。

まず、crontabがインストールされていなかったのでインストールします。

radxa@rock-4c-plus:/script/keilog$ sudo apt install cron

radxaユーザのcrontabを編集します。

radxa@rock-4c-plus:/script/keilog$ crontab -e

末尾に以下の定義を追記します。
起動タイミング(時、分など)を書くところに「@reboot」と指定すると、OS起動時に実行されます。
「@daily」と指定して1日1回実行させることもできますが、実行タイミングが0:00でありログファイルが切り替わる時刻と同時になってしまうので、今回は避けました。1:00実行としています。

@reboot cd /script/keilog; python3 kei.py &
0 1 * * * /script/keilog/logcleaner.sh

編集完了したら、以下のコマンドで反映されたことを確認しておきましょう。

radxa@rock-4c-plus:/script/keilog$ crontab -l

OSを再起動して、keilogが自動起動できていることを確認しましょう。
手段としては以下のようにプロセスの存在を確認するか、ログファイルの出力状態を確認するといいでしょう。

radxa@rock-4c-plus:/script/keilog$ ps -ef | grep kei.py
radxa        506       1  0  1月20 ?      00:05:53 python3 kei.py

スマートメーターから消費電力データを取得する部分の作成は以上です。