2019年11月16日土曜日

ROHM BP35A1 ローム製Wi-SUN通信モジュールを使ってスマートメーターにBルート接続する

TwitterでM5StickC用にRohmのBP35A1を取り付けるアダプターを
作っておられる方がいて、BOOTHで購入できたので買ってみました。


サンプルコードも配布されていますが、開いてみるとMicroPythonだったので、Arduinoのスケッチを書いてArduinoで使ってみました


そもそもBルートとはなにか?
電力会社の設置している、各家庭にある電力量計は、アラゴの円板を使っていたアナログのものからデジタル化されています。
デジタル化されたメーターは、サブギガ(920MHzあたり)を使う無線で通信ができるようになっています。

なんのために無線通信できるのか?
毎月の検針を、検針員がメーターを直接読み取らなくても手元のプリンターで積算電力量を受信して印刷できます。
植栽や建物の密集度の関係上検針しにくい住宅や、集合住宅などでは集合ポスト前で一括受信・印刷することができるのだと思います。検針員はとても省力化できると思います。実際のところ、電波の到達距離も大したことがないため、どのような運用をしているのかはわかりません。
また、遠隔で電力供給の休止を行えるとされています。

これらはすべて電力会社が電力の使用を監視・制御するための通信で、Aルートと呼ばれています。
今回の話題であるBルートは、需要家(ユーザー)ごとにスマートハウスのようなHEMS機器とスマートメーターを直接無線接続して、使用電力のマネジメントなどを行うための仕組みです。

現在の使用電力量や各電力機器の動作状況をHEMS機器同士で共有することで、効率的に電力の使用ができるとされています。

今回使ったモジュールはこのようなHEMS対応機器を開発するための通信モジュールです。

スマートメーターと通信モジュールをBルート接続して使うためには電力会社にBルート接続用ID、パスワードを発行してもらう必要があります。
東京電力の場合、スマートメーター化されていない電力量計であっても、ID発行の申請を行うことでスマートメーターへの切り替えも行えるようです。(要工事)

BP35A1はUARTでシリアル通信コマンドを使って制御します。
公式のコマンドリファレンスは日本語ですが、この手のモジュールを使ったことがないと、読んでも心が折れそうだと思います。

ざっくりとした流れとしては

Bルート接続用ID/パスワードを設定
スマートメーターの電波をスキャン
スキャン結果からスマートメーターの接続情報を調べる
スキャン結果の接続情報を接続先として設定
接続開始・完了
電力取得コマンド送信
結果受信

と、初期化シーケンスがいろいろあってめんどくさいです。
とりあえずシリアルターミナルで手打ちして接続までいけるようにこれら一連の流れをメモしておきます。
上記のWi-SUN HATの場合、ピンを下にして裏面を向けて、
左側のピンから
GND/NC/NC/TX/RX/NC/3.3V/NC
というピン配置になっているため、電源とUARTを接続すればUSBシリアル変換などを使って使うこともできます。
115200bps 3.3VのUART 改行コード\r\nです。

以下コマンドでスマートメーターの接続までを行います。

Bルートのパスワードを設定
SKSETPWD C passwordhere

BルートのIDを設定
SKSETBID idhere

アクティブスキャンを実行
SKSCAN 2 FFFFFFFF 6

結果が返ってくる
EVENT 20 FE80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx
EPANDESC
   Channel:31
   Channel Page:09
   Pan ID:ABCD
   Addr:xxxxxxxxxxxxxx
   LQI:93
   PairID:00E79995
 EVENT 22 FE80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx


取得したスマートメーターのアドレスをIPv6アドレスに変換
 SKLL64 xxxxxxxxxxxxxx  //Addrの値
 FE80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx

チャンネルを設定
SKSREG S2 31  //Channelの値

Pan IDを設定
SKSREG S3 ABCD  //Pan IDの値

接続開始
SKJOIN FE80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx  //IPv6アドレスに変換後の値

EVENT 25が来ると接続成功です。
私は当初、EVENT 24で接続失敗しかしなかったのですが、
東電のフォームでパスワードを変更依頼したところ、以降つながるようになりました。
以前のパスワードではスマートメーターの設定がうまくできていなかったのかもしれません。

接続完了後、電力取得のコマンドを送信します。

SKSENDTO 1  FE80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx 0E1A 1 000E
000Eのあとに半角スペースを入れて、続いてバイナリで
{0x10, 0x81, 0x00, 0x01, 0x05, 0xFF, 0x01, 0x02, 0x88, 0x01, 0x62, 0x01, 0xE7, 0x00} + \r\n
を送信すると瞬時電力が取得できます。

成功すると
ERXUDP FE80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx
FE80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx 0E1A 0E1A xxxxxxxxxxxxxxx 1 0012 xxxxxxxxxxxxxxxxxxxxxxxxxxxx000000BA
のようなレスポンスが返ってきます。
ここで見るのは最後の8桁、000000BAです。
これをそのまま10進に変換して、0xBA=瞬時電力186W
というような感じで読むようです。
上記サンプルコードでは、M5StickCで本体の液晶画面にこの数字を取得表示するようにしています。
Arduinoのスケッチなので、これを改良して、Wi-Fi経由でデータ送信して、
遠隔地から電力量を確認するような使い方も可能です。

それほど死ぬほど難しいわけではないですが、まだまだ情報量が少なく、
活用例も乏しいためもっと使う人が増えると楽しいのかなと思います。