Python Route B Library: A Communicator for Low-voltage Smart Electric Energy Meters
MomongaはBルートサービスを利用してスマートメーターと通信するライブラリです。ターゲットデバイスはROHM社製Wi-SUNモジュールBP35C2を搭載したラトックシステムRS-WSUHA-Pです。
MomongaはWOPT 01\r
コマンドを実行して、Wi-SUNモジュールがUDPパケットのペイロードをASCIIフォーマットで出力するように設定します。注意: WOPTコマンドは実行回数に制限があるので初回のみ実行し、その設定はWi-SUNモジュールに保存されます。
$ pip install momonga
下記のコードはPANAセッションを確立し、瞬時電力計測値を取得して表示します。PANのスキャンは最大で約2分、セッション確立は最大で約1分かかります。 BルートID、パスワード、デバイスファイルへのパスは適宜変更してください。
import momonga
import time
rbid = 'SET YOUR ROUTE B ID'
pwd = 'SET YOUR ROUTE B PASSWORD'
dev = '/dev/ttyUSB0' # in a case of RaspberryPi OS
with momonga.Momonga(rbid, pwd, dev) as mo:
while True:
res = mo.get_instantaneous_power()
print('%0.1fW' % res)
time.sleep(60)
- rbid: BルートID
- pwd: Bルートパスワード
- dev: Wi-SUNモジュールのデバイスファイルへのパス
- baudrate: シリアル通信のボーレート(デフォルト: 11520)
- mo: Momongaクラスのインスタンス
Momongaには下記のロガーがあります。
ECHONET Liteスマートメータークラスを抽象化したレイヤのログ
PANAセッション管理レイヤのログ
Wi-SUNモジュールとの通信ログ
import momonga
import time
import logging
log_fmt = logging.Formatter('%(asctime)s | %(levelname)s | %(name)s - %(message)s')
log_hnd = logging.StreamHandler()
log_hnd.setFormatter(log_fmt)
momonga.logger.addHandler(log_hnd)
momonga.logger.setLevel(logging.DEBUG)
momonga.session_manager_logger.addHandler(log_hnd)
momonga.session_manager_logger.setLevel(logging.DEBUG)
momonga.sk_wrapper_logger.addHandler(log_hnd)
momonga.sk_wrapper_logger.setLevel(logging.DEBUG)
rbid = 'SET YOUR ROUTE B ID'
pwd = 'SET YOUR ROUTE B PASSWORD'
dev = '/dev/ttyUSB0' # in a case of RaspberryPi OS
with momonga.Momonga(rbid, pwd, dev) as mo:
while True:
res = mo.get_instantaneous_power()
print('%0.1fW' % res)
time.sleep(60)
主な例外は下記です。
PANをスキャンしたが見つからなかったときに送出される。スマートメーターと通信できるロケーションか、またBルートIDが正しく設定されているかを確認し、再試行すること。
PANAセッションを確立できなかったときに送出される。BルートIDとパスワードを確認し、再試行すること。
スマートメーターに対してコマンドを送信できなかったなどの理由で、スマートメーターに再接続が必要なときに送出される。
import momonga
import time
import sys
rbid = 'SET YOUR ROUTE B ID'
pwd = 'SET YOUR ROUTE B PASSWORD'
dev = '/dev/ttyUSB0' # in a case of RaspberryPi OS
while True:
try:
with momonga.Momonga(rbid, pwd, dev) as mo:
while True:
res = mo.get_instantaneous_power()
print('%0.1fW' % res)
time.sleep(60)
except (momonga.MomongaSkScanFailure,
momonga.MomongaSkJoinFailure,
momonga.MomongaNeedToReopen) as e:
print('%s: %s' % (type(e).__name__, e), file=sys.stderr)
continue
下記のイベントが発生したときMomongaはスマートメーターに対するコマンドの送信をブロッキングします。
- PANAセッションのライフタイムが近づきWi-SUNモジュールが自動再認証を試みているとき
- 送信データ量が規定値に達しWi-SUNモジュールが送信制限しているとき
- 何らかの理由でシリアルデバイスとの通信がブロッキングされたとき
したがって開発者はデータ設定または取得関数を呼び出したあと即座に応答が返ってこない可能性を考慮してください。
- 送信がブロッキングされるなど諸条件により関数呼び出しのあと応答が即座に返らないことがあるため、
momonga.get_historical_cumulative_energy_1()
は呼び出したときに期待した履歴の日付と結果の日付に齟齬が生じる可能性があることに注意してください。特にこの関数は日を跨ぐタイミングで実行すべきではありません。
Momongaクラスのインスタンス化。
- rbid: BルートID
- pwd: Bルートパスワード
- dev: デバイスファイルへのパス
- baudrate: シリアル通信のボーレート
- reset_dev: momonga.open()を実行するときSKRESETコマンドを実行するかどうか
PANをスキャンし、PANAセッションの確立を行う。
- Void
- None
PANAセッションを終了する。
- Void
- None
スマートメーターの状態を取得する。
- Void
- bool | None: スマートメーターの状態 (True: オン False: オフ None: 不明)
積算電力量計測値、履歴を実使用量に換算する係数を取得する。Momongaが出力する結果には適宜この値が乗じられている。
- Void
- int: 係数
積算電力量計測値の有効桁数を取得する。
- Void
- int: 有効桁数
積算電力量計測値を取得する。
- reverse: Trueのとき逆方向の積算電力量を取得する
- int | float: 積算電力量(kWh)
積算電力量計測値、履歴の乗率を取得する。Momongaが出力する結果には適宜この値が乗じられている。
- Void
- int | float: 積算電力量の乗率
積算電力量計測値履歴1を取得する。
- day: 積算履歴収集日(0:当日、1~:前日の日数)
- reverse: Trueのとき逆方向の積算電力量を取得する
- list: 収集日時と積算電力量(kWh)
e.g.
[{'timestamp': datetime.datetime,
'cumulative energy': int | float | None}]
注意: 収集日時はスマートメーター側で設定されたものではなくMomonga自身が設定しているため、実行中に日を跨ぐと収集日時に齟齬が生じる可能性がある。
積算履歴収集日1を設定する。
- day: 積算履歴収集日(0:当日、1~:前日の日数)
- None
積算履歴収集日1を設定する。
- Void
- int: 積算履歴収集日1
瞬時電力計測値を取得する。
- Void
- float: 瞬時電力測定値(W)
瞬時電流計測値を取得する。
- Void
- dict: R相瞬時電流(A)とT相瞬時電流(A)
e.g.
{'r phase current': float,
't phase current': float}
定時積算電力量計測値を取得する。
- reverse: Trueのとき逆方向の積算電力量を取得する
- dict: 収集日時と積算電力量(kWh)
e.g.
{'timestamp': datetime.datetime,
'cumulative energy': int | float}
momonga.get_historical_cumulative_energy_2(timestamp: datetime.datetime = None, num_of_data_points: int = 12)
積算履歴収集日時、収集コマ数ならびに積算電力量の計測結果履歴を、正・逆 30 分毎のデータで過去最大6時間分取得する。
- timestamp: 収集日時 (Noneのときは現時刻)
- num_of_data_points: 収集コマ数 1~12
- list: 収集日時と正方向および逆方向の積算電力量(kWh)
e.g.
[{'timestamp': datetime.datetime,
'cumulative energy': {'normal direction': int | float | None,
'reverse direction': int | float | None}}]
積算履歴収集日時ならびに収集コマ数を設定する。
- timestamp: 収集日時 (Noneのときは現時刻)
- num_of_data_points: 収集コマ数
- None
積算履歴収集日時ならびに収集コマ数を取得する。
- Void
- dict: 収集日時と収集コマ数
e.g.
{'timestamp': datetime.datetime | None,
'number of data points': int}
イシュー報告、プルリクエスト、コメント等、なんでもよいのでフィードバックお待ちしています。星をもらうと開発が活発になります。
If you have any problems, questions, suggestions or comments, please let me know. It can be in English. All feedback is welcome.