MomongaはBルートサービスを利用してスマートメーターと通信するPythonモジュールです。今日はその使い方を説明します。
0. 電力会社にBルートの申請
兎にも角にも、まずBルートのIDとパスワードを入手してください。東京電力では自宅のスマートメーターならWebからピッピやるだけでできました。
1. Wi-SUNモジュールBP35C2を調達する
ラトックシステムのUSBドングルがAmazonで売ってます。USBドングルである必要は特にないのでUARTを使うタイプでもよいでしょう。
2. Raspberry Pi OS をインストールしたRPiにドングルを挿す
Raspberry Piじゃなくてもシリアル通信できればなんでもいいです。Windowsは試してないけど動くかもしれません。もし動かなかったら参考までに教えて下さい。
3. Momongaをインストールする
$ pip install momonga
ここで、シリアルデバイスが/dev/ttyUSB0とかにマウントされてると思うのですが、このデバイスファイルへの読書権限と、PythonモジュールであるMomongaがどのユーザーのためにインストールされているのかに留意してください。つまりユーザーにデバイスファイルへの読書権限がなく、sudoでpythonを実行しようとしたとき、Momongaもsudoでインストールしておく必要があったりします。しかし、sudoで環境を汚すのは些か憚られるので、venvを使うのがよいかもしれません。あるいはDockerを使います。
4. UDPペイロードをASCIIフォーマットで出力する設定
Momongaを使用するためには事前にWi-SUNモジュールにシリアル接続しWOPT 01\rコマンドを実行してUDPパケットのペイロードをASCIIフォーマットで出力するように設定してください。注意: WOPTコマンドは実行回数に制限がありますので初回のみ実行してください。設定は保存されます。
5. 瞬間電力測定値を表示してみる
はじめは裏でなにが起きてるのかわからないとおもうので、ログをすべて表示しながら動かしてみるのがいいでしょう。rbidとpwdにはBルートのIDとパスワードを入れてください。デバイスファイルへのパスは環境によって違いますので適宜書き換えましょう。
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 A ROUTE B ID'
pwd = 'SET A 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)
アクティブスキャンが失敗してMomongaSkScanFailureが送出されることがあります。これは使っていれば必発です。さらに実用するにあたってはPANAセッションの確立に失敗したときにMomongaSkJoinFailure、再送するも応答が返らないときにMomongaNeedToReopenが送出されます。これらをハンドリングし、適宜再接続してください。たとえばこんなふうに。
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
6. それをこうしてこう
で、Momongaで収集したデータをInfluxDBに突っ込んでそれをGrafanaでこうして可視化してこう。ね、簡単でしょ?

簡単じゃないと思った方、わたくしどもがお作りします。ぜひご用命ください。
