こちらの続きです。 suzu-ha.com
スマートメーターから消費電力データを取得する部分を作ります。
もくじ
- 環境
- 前提パッケージのインストール
- keilogのダウンロード
- keilog設定ファイル編集…の前にWi-SUNアダプタのデバイス確認
- Wi-SUNアダプタを使用できるようグループ追加
- keilog設定ファイル編集
- デバッグモードでテスト実行
- 古いログの処理
- 自動起動の設定
環境
- 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
スマートメーターから消費電力データを取得する部分の作成は以上です。