Wi-SUN Bルートでスマートメーターに接続する

東京電力の電力メーター情報発信サービス(Bルートサービス)に申し込みました.
Bルートサービスはスマートメーターで計測したデータを HEMS 機器へ送信するサービスですが,Wi-SUN Bルートに対応した USB アダプターがあれば PC にデータを読み込めます.
今回は Wi-SUN 準拠のドングルである Wi-SUN USBアダプター RS-WSUHAシリーズ の RS-WSUHA-P を使います.

Bルートサービス申し込み

東京電力の場合,電力メーター情報発信サービスから申し込みができます.
スマートメーターが設置済みの場合は 1 週間程度で使えるようになるようです.
自分の場合は以下のようなスケジュールでした.

  • 9 月 09 日:申し込み
  • 9 月 11 日:パスワードがメールで届く
  • 9 月 16 日:認証 ID が郵便で届く

Tera Term を使った接続確認

接続可能か確認するだけなら Tera Term を使うのが簡単です.
なお,後述の Python コードではライブラリが必要な設定と接続処理を行うため,Tera Term での手動操作は不要です.

1. COM ポートの確認

RS-WSUHA-P を PC に接続します.
Windows 11 の場合,デバイスマネージャーの ポート(COM と LPT) に出てきます. アダプターを接続したときに追加された COM ポートを確認します.この環境では COM3 でした.

デバイスマネージャー

プロパティを開き,デバイスが正常に動作しているかを確認します.

USB Serial Port(COM3)のプロパティ

2. Tera Term の設定

まず,シリアルポートと端末の設定をします.
設定シリアルポート で,次のように設定します.

1
2
3
4
5
Speed:        115200 bps
Data:         8 bit
Parity:       none
Stop bits:    1 bit
Flow control: none

Tera Term:その他の設定 シリアルポート

設定その他の設定端末 で,受信・送信の改行コードをともに CR,ローカルエコーを無効にしておきます.

Tera Term:その他の設定 端末

Tera Term で RS-WSUHA-P に割り当てられた COM ポートを開きます.

Tera Term:新しい接続

3. RS-WSUHA-P との通信確認

次のコマンドを入力します.

1
SKVER

次のように EVEROK が返れば,PC と RS-WSUHA-P 間の通信は正常です.

1
2
EVER 1.5.2
OK

4. 受信データを 16 進 ASCII で表示する設定

この設定は Bルートへの接続そのものには必須ではありませんが,Tera Term から EDATA を確認する場合に扱いやすくするため設定します.
なお,後述の Momonga は必要に応じてこの設定を自動的に行います.
まず,現在の設定を確認します.

1
ROPT

次のように OK 00 と返る場合は,受信した EDATA を 16 進 ASCII に変換する機能が無効です.

1
OK 00

次のコマンドで有効にします. WOPT は書き込み回数に制限があるため,ROPT が 01 ならそのままで大丈夫です.

1
WOPT 01

設定後,もう一度 ROPT を実行します.

1
ROPT

次のように返れば設定完了です.

1
OK 01

5. Bルートのパスワードと認証 ID を設定

電力会社から通知された Bルート認証用のパスワードと認証 ID を設定します.
C は,パスワード長の 12(10進数)を 16 進数で表した値です.

1
2
SKSETPWD C <パスワード>
SKSETRBID <認証ID>

6. スマートメーターを探す

次のコマンドで Bルートのスマートメーターをスキャンします.

1
SKSCAN 2 FFFFFFFF 6 0

しばらく待つと,例えば次のような結果が返ります.

1
2
3
4
5
6
7
8
9
EPANDESC
  Channel:35
  Channel Page:09
  Pan ID:1234
  Addr:0011223344556677
  LQI:8E
  Side:0
  PairID:xxxxxxxx
EVENT 22 ...

EVENT 22 はスキャンの終了を表します.
以降で使用するのは ChannelPan IDAddr の 3 つです.

7. Channel と Pan ID を設定

EPANDESC で取得した Channel を S2 レジスタ,Pan ID を S3 レジスタに設定します.
以下は Channel35Pan ID1234 の場合の例です.

1
2
SKSREG S2 35
SKSREG S3 1234

8. スマートメーターの IPv6 アドレスを取得

EPANDESCAddr を指定して,スマートメーターの IPv6 リンクローカルアドレスを取得します.
実行すると IPv6 アドレスが返るので,次の手順で使用します.

1
SKLL64 0011223344556677

9. スマートメーターへ接続

SKLL64 で取得した IPv6 アドレスを指定して接続します.

1
SKJOIN FE80:0000:0000:0000:0211:2233:4455:6677

しばらく待ち,次のように EVENT 25 が返れば,RS-WSUHA-P とスマートメーター間の Wi-SUN Bルート接続は成功です.

1
EVENT 25 FE80:0000:0000:0000:0211:2233:4455:6677 0

Python を使ったデータ取得

Momonga というライブラリを使ってスマートメーターからデータを取得できます. いくつかサンプルを試します.
Python は v3.13 で,Momonga は v0.7.0 を使用しています.
Tera Term を使った場合は切断か終了してから実行します.

瞬時電力の取得

現在の使用電力を取得します.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import datetime
import momonga
import time

rbid = 'SET YOUR ROUTE B ID'
pwd  = 'SET YOUR ROUTE B PASSWORD'
dev  = 'COM3'

with momonga.Momonga(rbid, pwd, dev) as mo:
    while True:
        res = mo.get_instantaneous_power()
        timestamp = datetime.datetime.now().strftime("%H:%M:%S")
        print(f'{timestamp}','no data' if res is None else '%0.1fW' % res)
        time.sleep(5)

以下のようなデータが取得できました.途中で急激に上がっているのは電気ケトルを使ったためです.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
16:31:27 272.0W
16:31:34 272.0W
16:31:40 272.0W
16:31:47 1436.0W
16:31:54 1440.0W
16:32:00 1436.0W
16:32:07 1428.0W
16:32:13 1428.0W
16:32:20 1432.0W
16:32:26 1436.0W
16:32:34 1432.0W
16:32:41 1428.0W
16:32:47 1436.0W
16:32:54 1452.0W
16:33:00 1436.0W
16:33:07 1444.0W
16:33:14 1444.0W
16:33:20 1444.0W
16:33:27 1436.0W
16:33:33 280.0W
16:33:40 272.0W
16:33:46 272.0W
16:33:54 276.0W

特定の日付のデータを取得

スマートメーターには最大で 99 日前までのデータが保持されており,30 分ごとの積算電力量が取得できます.
get_historical_cumulative_energy_1 で取得できます.対象日は相対的に指定します.前日なら day=1 です.
取得できるのは積算データなので,取得対象日の 0 時の値を引いて,0 時から各時刻までの累計使用量を表示します.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import momonga

rbid = 'SET YOUR ROUTE B ID'
pwd  = 'SET YOUR ROUTE B PASSWORD'
dev  = 'COM3'

with momonga.Momonga(rbid, pwd, dev) as mo:
    history = mo.get_historical_cumulative_energy_1(day=1)
    base = history[0]['cumulative energy']
    for x in history:
        energy = x['cumulative energy'] - base
        print(
            x['timestamp'].strftime('%H:%M'),
            f'{energy:.1f} kWh'
        )

以下のようなデータが取得できました.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
00:00 0.0 kWh
00:30 0.1 kWh
01:00 0.2 kWh
01:30 0.3 kWh
02:00 0.4 kWh
02:30 0.4 kWh
03:00 0.5 kWh
03:30 0.6 kWh
04:00 0.6 kWh
04:30 0.7 kWh
...省略...
19:00 5.6 kWh
19:30 5.8 kWh
20:00 5.9 kWh
20:30 5.9 kWh
21:00 6.0 kWh
21:30 6.4 kWh
22:00 6.5 kWh
22:30 6.6 kWh
23:00 6.7 kWh
23:30 6.8 kWh

参考

Hugo で構築されています。
テーマ StackJimmy によって設計されています。