11 November 2020

シリアル通信でスマートメーター(Bルートサービス)から電力測定値を読む

スマートメーターに無線接続(Wi-SUN Profile for ECHONET Lite)して、電力測定値を読み出す。

プログラムを作成する前に、まずはシリアル通信(シリアルコンソール)を使って、「手作業」で通信してみることとする。

まずは、今回購入したHEMS用 Wi-SUNモジュール, Wi-SUN Route-B 専用RL7023 Stick-D/IPS(税込み 8,060円)のSKコマンド・リファレンスマニュアルをダウンロード。 または、Googleで検索可能なROHMのBP35A11コマンドリファレンスマニュアルをダウンロードしておく。

ECHONET Liteの通信プロトコルは、公式ページから、

・ ECHONET Lite規格書 Ver.1.13(日本語版) 第2部 ECHONET Lite 通信ミドルウェア仕様
・ APPENDIX ECHONET機器オブジェクト詳細規定Release N

の2つを使うのでダウンロードしておく。

シリアル通信での全処理

個別のコマンドを細かく見ていく前に、今回のシリアル通信での全ての送受信記録をまず示す。

SKINFO
EINFO FE80:0000:0000:0000:1234:5678:1234:5678 1234567812345678 21 FFFF FFFE 
OK
SKSETRBID 12345678123456781234567812345678
OK
SKSETPWD c 1234567890ab
OK
SKSCAN 2 FFFFFFFF 6
EVENT 20 FE80:0000:0000:0000:1234:5678:1234:5678
EPANDESC
  Channel:39
  Channel Page:09
  Pan ID:9876
  Addr:1234567812345678
  LQI:2D
  PairID:12345678
EVENT 22 FE80:0000:0000:0000:1234:5678:1234:5678
SKSREG S2 39      ← Channel
OK
SKSREG S3 9876      ← Pan ID
OK
SKLL64 1234567812345678
FE80:0000:0000:0000:9876:5432:9876:5432
SKJOIN FE80:0000:0000:0000:9876:5432:9876:5432
OK
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 02
EVENT 02 FE80:0000:0000:0000:9876:5432:9876:5432
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 02CC 02CC 1234567812345678 0 0028 00000028C00000024A1F4DC0C99C3A6A00060000000400000000000500030000000400000000000C
〜 中略(いろいろなデータが返される) 〜
EVENT 25 FE80:0000:0000:0000:9876:5432:9876:5432
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FF02:0000:0000:0000:0000:0000:0000:0001 0E1A 0E1A 1234567812345678 1 0012 108100000EF0010EF0017301D50401028801
SKSENDTO 1 FE80:0000:0000:0000:9876:5432:9876:5432 0E1A 1 000E← 000Eの後ろにスペースを1つ入れ、ENTERキーではなく、ファイル送信する
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 0E1A 0E1A 1234567812345678 1 0012 1081000102880105FF017201E704000001D4
SKTERM
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 02CC 02CC 1234567812345678 0 0028 00000028000000034A1F4DC176A6152D00010000001000002DFC9362BA73BA85173C06D163A4B04B
EVENT 27 FE80:0000:0000:0000:9876:5432:9876:5432

マニュアルを参照しながら、1ステップずつ通信してみる

まずは、現在の設定値を表示することで、ちゃんとWi-SUN通信デバイスが機能しているかを見てみる。

SKINFO
EINFO FE80:0000:0000:0000:1234:5678:1234:5678 1234567812345678 21 FFFF FFFE 
OK

返されるデータは、デバイス自体のIPアドレス、デバイス自体のMACアドレス、利用中の周波数チャネル、PAN ID、固定値(FFFE)

IDとパスワードの設定

それでは、スマートメーターとの通信を始める。まず最初に行うのは、IDとパスワードを設定します。

20201111-sk-pwd.jpg
電力会社から通知されたIDとパスワードを送信するコマンド。

SKSETRBID 12345678123456781234567812345678
OK
SKSETPWD c 1234567890ab
OK

IDは16進数を文字列化した「32文字」、パスワードはASCIIの「12文字」。パスワードの文字数はSKSETPWDの第1引数に16進数でセットする。今回は12文字なので 0x0c 。

デバイスのスキャン

次に、(設定したIDに合致した)スマートメーターをスキャンします。

20201111-sk-scan.jpg

SKSCAN 2 FFFFFFFF 6
EVENT 20 FE80:0000:0000:0000:1234:5678:1234:5678
EPANDESC
  Channel:39
  Channel Page:09
  Pan ID:9876
  Addr:1234567812345678
  LQI:2D
  PairID:12345678
EVENT 22 FE80:0000:0000:0000:1234:5678:1234:5678

SKSCANの第1引数はスキャンモード = アクティブスキャン、第3引数チャンネルごとのスキャン時間 = 0.01 * (2^6+1) sec という設定だが、とにかくサンプルどおりやれば問題なし…

結果はEVENT 0x22 (アクティブスキャンが完了した) が返ってきていれば成功。そして、EPANDESCで返された値は、このあとの通信に使うから重要。

EVENTコードの定義は次のようになっている

20201111-sk-event.jpg

デバイスに接続

ここでは、3つのコマンドを使うので、まずはそのマニュアル…

20201111-sk-reg01.jpg

20201111-sk-reg02.jpg

Channel と Pan ID をレジスタに登録するSKREGコマンド

20201111-sk-mac2ip.jpg

MACアドレスをIPアドレスに変換するコマンド

20201111-sk-join.jpg

デバイス(今回はスマートメーター) に接続するSKJOINコマンド

では、順次コマンドを投入して、デバイス(スマートメーター)に接続する。 チャンネルとPan IDをレジスタにセットし、MACアドレスをIPアドレスに変換した後に、そのIPアドレスを指定してデバイスに接続する。

SKSREG S2 39      ← Channel
OK
SKSREG S3 9876      ← Pan ID
OK
SKLL64 1234567812345678
FE80:0000:0000:0000:9876:5432:9876:5432
SKJOIN FE80:0000:0000:0000:9876:5432:9876:5432
OK
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 02
EVENT 02 FE80:0000:0000:0000:9876:5432:9876:5432
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 02CC 02CC 1234567812345678 0 0028 00000028C00000024A1F4DC0C99C3A6A00060000000400000000000500030000000400000000000C
〜 中略(いろいろなデータが返される) 〜
EVENT 25 FE80:0000:0000:0000:9876:5432:9876:5432
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FF02:0000:0000:0000:0000:0000:0000:0001 0E1A 0E1A 1234567812345678 1 0012 108100000EF0010EF0017301D50401028801

EVENT 0x25が、「PANA による接続が完了した」というメッセージなので、これが現れるかどうかを確認する。

現在の電流値を試しに読み出してみる

ECHONET Liteでスマートメーターにコマンドを送るのは、SKSENDTO を用いる。

20201111-sk-send.jpg

この送信データ(DATA)部分は、次のようなバイナリデータである。

20201111-echonet-skframe.jpg

送信するデータはバイナリなので、バイナリエディタまたは、次のように端末でバイナリファイルを作成する。

echo -ne '\x10\x81\x00\x01\x05\xFF\x01\x02\x88\x01\x62\x01\xE7\x00' > data.bin

それぞれの値の説明は

EHD1 = 0x10
EHD2 = 0x81
TID = 0x00 0x01
SEOJ = 0x05 0xff 0x01 ... 送信側:管理操作機器クラス 0x05, コントローラ 0xff
DEOJ = 0x02 0x88 0x01 ... 受信側:住宅設備機器クラス 0x02, 低圧スマートメーター 0x88
ESV = 0x62 ... Get ( 0x60 = Set, 0x61 = Set with response, 0x62 = Get )
OPC = 0x01 ... 処理プロパティ数 は 1
EPC1 = 0xe7 ... 瞬時電力計測値(W)を4バイトで得る
PDC1 = 0x00 ... EDT1のバイト数
EDT1 設定なし(EDT1のバイト数がゼロ設定なので…)

そして、このデータを送信する (SKSENDTOコマンドの第6引数として、ターミナルソフトでdata.binを送信する)

SKSENDTO 1 FE80:0000:0000:0000:9876:5432:9876:5432 0E1A 1 000E← 000Eの後ろにスペースを1つ入れ、ENTERキーではなく、ファイル送信する
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 0E1A 0E1A 1234567812345678 1 0012 1081000102880105FF017201E704000001D4

EHD1 = 0x10
EHD2 = 0x81
TID = 0x00 0x01 ... パケット番号は1
SEOJ = 0x02 0x88 0x01 ... 受信側:住宅設備機器クラス 0x02, 低圧スマートメーター 0x88
DEOJ = 0x05 0xff 0x01 ... 送信側:管理操作機器クラス 0x05, コントローラ 0xff
ESV = 0x72 ... Get_Res プロパティ値読み出し応答
OPC = 0x01 ... 処理プロパティ数 は 1
EPC1 = 0xe7 ... 瞬時電力計測値(W)を4バイトで得る
PDC1 = 0x04 ... EDT1のバイト数
EDT1 = 0x00 0x00 0x01 0xd4 ... 0x1d4 = 468 Watt

現在の電力測定値が得られた !

EOJ や ESV の値は 「APPENDIX ECHONET機器オブジェクト詳細規定Release N」に掲載されている。一部を抜粋すると…

20201111-echonet-smartmeter.jpg
低圧スマートメーターの値の定義(一部分抜粋)

20201111-echonet-controller.jpg
管理操作機器の値の定義

通信切断

SKTERM
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 02CC 02CC 1234567812345678 0 0028 00000028000000034A1F4DC176A6152D00010000001000002DFC9362BA73BA85173C06D163A4B04B
EVENT 27 FE80:0000:0000:0000:9876:5432:9876:5432

EVENT 0x27 が受信されたら、通信切断が確認されている。

主だった値をスマートメーターから読み出してみる

0x80 : 動作状態

送信データ EDT は、 10 81 00 01 05 FF 01 02 88 01 62 01 80 00 の14バイト

SKSENDTO 1 FE80:0000:0000:0000:9876:5432:9876:5432 0E1A 1 000E [EDTバイナリデータ]
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 0E1A 0E1A 1234567812345678 1 000F 1081000102880105FF017201800130

応答は
EPC1 = 0x80 ... 動作状態
PDC1 = 0x01 ... EDT1のバイト数
EDT1 = 0x30 ... スマートメーター ON

0xd3 : 係数

送信データ EDT は、 10 81 00 01 05 FF 01 02 88 01 62 01 d3 00 の14バイト

SKSENDTO 1 FE80:0000:0000:0000:9876:5432:9876:5432 0E1A 1 000E [EDTバイナリデータ]
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 0E1A 0E1A 1234567812345678 1 000E 1081000102880105FF015201D300

応答は
EPC1 = 0xd3 ... 係数
PDC1 = 0x00 ... EDT1のバイト数
EDT1 ... 設定なし

0xd7 : 積算電力量 有効桁数

送信データ EDT は、 10 81 00 01 05 FF 01 02 88 01 62 01 d7 00 の14バイト

SKSENDTO 1 FE80:0000:0000:0000:9876:5432:9876:5432 0E1A 1 000E [EDTバイナリデータ]
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 0E1A 0E1A 1234567812345678 1 000F 1081000102880105FF017201D70107

応答は
EPC1 = 0xd7 ... 積算電力量 有効桁数
PDC1 = 0x01 ... EDT1のバイト数
EDT1 = 0x07 ... 積算電力の有効桁数は7桁

0xe0 : 積算電力量 計測値

送信データ EDT は、 10 81 00 01 05 FF 01 02 88 01 62 01 e0 00 の14バイト

SKSENDTO 1 FE80:0000:0000:0000:9876:5432:9876:5432 0E1A 1 000E [EDTバイナリデータ]
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 0E1A 0E1A 1234567812345678 1 0012 1081000102880105FF017201E00400180ACF

応答は
EPC1 = 0xe0 ... 積算電力量 計測値
PDC1 = 0x04 ... EDT1のバイト数
EDT1 = 0x00 0x18 0x0a 0xcf ... 0x00180acf = 15756.31 kWh ← 単位が0.01kWh設定(0xe1のプロパティ読み出しより)

0xe1 : 積算電力量 単位

送信データ EDT は、 10 81 00 01 05 FF 01 02 88 01 62 01 e1 00 の14バイト

SKSENDTO 1 FE80:0000:0000:0000:9876:5432:9876:5432 0E1A 1 000E [EDTバイナリデータ]
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 0E1A 0E1A 1234567812345678 1 000F 1081000102880105FF017201E10102

応答は
EPC1 = 0xe1 ... 積算電力量 単位
PDC1 = 0x01 ... EDT1のバイト数
EDT1 = 0x02 ... 単位は0.01kWh

0xe2 : 積算電力量 計測値履歴1

送信データ EDT は、 10 81 00 01 05 FF 01 02 88 01 62 01 e2 00 の14バイト

SKSENDTO 1 FE80:0000:0000:0000:9876:5432:9876:5432 0E1A 1 000E [EDTバイナリデータ]
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 0E1A 0E1A 1234567812345678 1 00D0 1081000102880105FF017201E2C20000001807A4001807B8001807CB001807D9001807DC001807DF001807E3001807E7001807EA001807EE001807F2001807F6001807FC0018081100180833001808450018085E0018087700180899001808AB001808C9001808FE001809360018096000180988001809910018099B001809B5001809CF001809DC001809EF00180A0900180A2B00180A5600180A6900180A7C00180A9900180AB500180AC5FFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFE

応答は
EPC1 = 0xe2 ... 積算電力量 単位
PDC1 = 0xc2 ... EDT1のバイト数 0xc2 = 194バイト
EDT1 = 0x00 0x00 ... 最初の2バイトは、収集日(現在からマイナス日)
0x00 0x18 0x07 0xa4 ... 0x001807a4 = 15748.20 kWh (0:00の値)
0x00 0x18 0x07 0xb8 ... 0x001807b8 = 15748.40 kWh (0:30の値)
0x00 0x18 0x07 0xcb ... 0x001807cb = 15748.59 kWh (1:00の値)
0x00 0x18 0x07 0xd9 ... 0x001807d9 = 15748.73 kWh (1:30の値)
〜 以下省略
0xff 0xff 0xff 0xfe ... 未測定 (23:30の値)

0xe5 : 積算履歴収集日 1

送信データ EDT は、 10 81 00 01 05 FF 01 02 88 01 62 01 e5 00 の14バイト

SKSENDTO 1 FE80:0000:0000:0000:9876:5432:9876:5432 0E1A 1 000E [EDTバイナリデータ]
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 0E1A 0E1A 1234567812345678 1 000F 1081000102880105FF017201E50100

応答は
EPC1 = 0xe5 ... 積算履歴収集日
PDC1 = 0x01 ... EDT1のバイト数
EDT1 = 0x00 ... 0は当日

0xe7 : 瞬時電力計測値

送信データ EDT は、 10 81 00 01 05 FF 01 02 88 01 62 01 e7 00 の14バイト

SKSENDTO 1 FE80:0000:0000:0000:9876:5432:9876:5432 0E1A 1 000E [EDTバイナリデータ]
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 0E1A 0E1A 1234567812345678 1 0012 1081000102880105FF017201E7040000011C

応答は
EPC1 = 0xe7 ... 瞬時電流計測値
PDC1 = 0x04 ... EDT1のバイト数
EDT1 = 0x00 0x00 0x01 0x1c ... 0x0000011c = 284 Watt

0xe8 : 瞬時電流計測値

送信データ EDT は、 10 81 00 01 05 FF 01 02 88 01 62 01 e8 00 の14バイト

SKSENDTO 1 FE80:0000:0000:0000:9876:5432:9876:5432 0E1A 1 000E [EDTバイナリデータ]
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 0E1A 0E1A 1234567812345678 1 0012 1081000102880105FF017201E804000F0011

応答は
EPC1 = 0xe8 ... 瞬時電流計測値
PDC1 = 0x04 ... EDT1のバイト数
EDT1 = 0x00 0x0f ... R相 1.5 A (単位は0.1A固定)
0x00 0x11 ... T相 1.7 A (単位は0.1A固定)

○○日前の「積算電力量 計測値履歴1」を読み出す

0xe5 : ○○日前を設定する

たとえば、2日前は次のようなデータを送信する

送信データ EDT は、 10 81 00 01 05 FF 01 02 88 01 61 01 e5 01 02 の15バイト

ESV = 0x61 ... Set ( 0x60 = Set, 0x61 = Set with response, 0x62 = Get )
OPC = 0x01 ... 処理プロパティ数 は 1
EPC1 = 0xe5 ... 瞬時電力計測値(W)を4バイトで得る
PDC1 = 0x01 ... EDT1のバイト数
EDT1 = 0x02 ... 2日前 (初期値は 0 で当日)

送信データサイズが15バイトなので、上述の(値読み取り)例と違い、SKSENDTOの第4引数は 000F と指定する。

SKSENDTO 1 FE80:0000:0000:0000:9876:5432:9876:5432 0E1A 1 000F [EDTバイナリデータ]
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 0E1A 0E1A 1234567812345678 1 000F 1081000102880105FF017101E500

そして、その設定が正しく反映しているか調べる

送信データ EDT は、 10 81 00 01 05 FF 01 02 88 01 62 01 e5 00 の14バイト

SKSENDTO 1 FE80:0000:0000:0000:9876:5432:9876:5432 0E1A 1 000E [EDTバイナリデータ]
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 0E1A 0E1A 1234567812345678 1 000F 1081000102880105FF017201E50102

応答は
EPC1 = 0xe5 ... 積算履歴収集日
PDC1 = 0x01 ... EDT1のバイト数
EDT1 = 0x02 ... 0は当日

0xe2 : 積算電力量 計測値履歴1

送信データ EDT は、 10 81 00 01 05 FF 01 02 88 01 62 01 e2 00 の14バイト

SKSENDTO 1 FE80:0000:0000:0000:9876:5432:9876:5432 0E1A 1 000E [EDTバイナリデータ]
EVENT 21 FE80:0000:0000:0000:9876:5432:9876:5432 00
OK
ERXUDP FE80:0000:0000:0000:9876:5432:9876:5432 FE80:0000:0000:0000:1234:5678:1234:5678 0E1A 0E1A 1234567812345678 1 00D0 1081000102880105FF017201E2C200020018039F001803B2001803C5001803D5001803D9001803DB001803DF001803E4001803E8001803EC001803F0001803F4001803F80018040C0018042F001804490018046400180482001804A6001804E1001805010018052C00180550001805640018056E00180592001805C0001805DC001805F5001806010018061A0018061F0018062E00180644001806540018066B001806770018068A00180698001806AB001806CB001806E9001807060018072A00180742001807570018076C00180788