8
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

.NET Core2.1でスマートメーターと戯れる Part1

Posted at

はじめに

家の電力メーターがスマートメーターに変わりました。
Bルートなるサービスで、瞬間電力量が取得できるらしいです。

Wi-SUNとECHONET Liteとかいう聞いたことなかったプロトコルを扱う必要がありますが、
C、Java、NodeあたりのSDKしか見つかりませんでした。

今回 .NET Coreで各プロトコルスタックをライブラリ化し、実装/公開しました。

前提知識

Bルートとは

  • スマートメーターが計量したデータを送るルートの種類
    • Aルートは電力会社(送配電事業者)
    • Bルートは家庭(HEMS)
  • 電力会社へ申し込みが必要。以下が詳しい

Wi-SUNとは

規格

ドングル

SK STACK IP

  • http://www.skyley.com/products/skstack_ip.html
  • Wi-SUN Profile for ECHONET Lite(TTC JJ-300.10 A方式)のリファレンス実装(らしい)
  • 上記ドングルはたいていこのコマンド内臓している(ぽい)
  • デュアルスタック系と、Bルートのみでコマンド体系が若干異なる(らしい)ので注意
  • SKSTACKを実装したデバイスをJavaで扱うためのライブラリが公開されています
  • ドングル買わないとコマンドリファレンスは見れないぽい。
    • BP35A1 コマンドリファレンスマニュアルでぐぐるといいよ

ECHONET Liteとは

  • Wikipediaによると、エコーネットコンソーシアムが策定した通信プロトコルで、スマートハウス向け制御プロトコルおよびセンサーネットプロトコルらしい。
  • OSI参照モデル的には、5~7が仕様上定義されていて、4以下は仕様がない。
  • 以下のオープンソース実装がある

ECHONET Lite 通信ミドルウェア仕様

  • ECHONET Lite規格書 第2部 ECHONET Lite 通信ミドルウェア仕様にて規定
  • フレームフォーマット(電文構成)、オブジェクト操作のシーケンスを規定している
  • ざっくりいうと、オブジェクトインスタンスがあって、そのプロパティをGET/SETもしくはANNOUCEする

ECHONET機器オブジェクト

  • 具体的な機器のこと。

  • クラスグループ

    • 機器クラスのグルーピング。1バイトのコードがグループに割り当てられており、以下のような分類となっている。
    • センサ関連機器、住宅設備関連機器(0x02)、健康関連機器、空調関連機器、管理操作関連機器、調理家事関連機器、AV関連機器
  • クラス

    • 具体的な機器の種類、全体で200強のクラスがある。1バイトのコードがクラスに割り当てられている。
    • 例えば、低圧スマート電力量メータは0x88(住宅設備関連機器(0x02))
  • APPENDIX ECHONET機器オブジェクト詳細規定

  • 550ページ以上あるPDFファイル

    • 公式データソースがPDFだけとか、普及させる気がないと思う。

本編

さて、前提知識はこのあたりにして、本題です

今回やりたいことはスマートメーターから瞬間電力量を取りたい

そのためには、Wi-SUNドングルを使って、SK STACK IPコマンドをたたき、
スマートメーターの認証を通して、ECHONETLiteフレームのやり取りを行う必要があります。

プロトコル/つくったもの 全体像

image.png

SK STACK IP(1~5層)

SK STACK IPはコマンド/レスポンス+イベント形式のプロトコルです。
USBドングルはOSからは、シリアル通信用のポートとして認識されます。
ですので、すべての通信はシリアルポート経由となります。

シリアル通信

.NET Core 2.1を使用するため、.NET Core 2.1では、Windowsしかシリアル通信ができません。
最終的にラズパイ上でも動作させたいため、今回はLinuxにも対応しているSerialPortStreamを使用します。

  • Linux上で動作させる場合
    • こちらに記載の通り、サポート・ライブラリーlibnserial.soをコンパイルする必要があります
    • また、libnserial.so.1.1をlibnserial.so.1にリネームして、アセンブリSkstackIpDotNet.dllと同じフォルダに配置する必要がありますこのへん?

出来上がったもの

SKSTACK-IPのAPIラッパーライブラリを作成しました。

RL7023 Stick-D/IPSに付属のコマンドリファレンスマニュアルをもとに全コマンドを実装しています。
GitHubにて公開しています。
SkstackIpDotNet

使い方ざっくり

抜粋
//Windows
string devicePort = "COM3";
//こんな分岐でいいのだろうか(不安) そもそも ポートってどう選択すべき…?
if (System.Environment.OSVersion.Platform.ToString() != "Win32NT")
{
    //Linux等(Raspbian Stretchで動作確認)
    devicePort = "/dev/ttyUSB0";
}
//SKDeviceクラスをインスタンス化します
using (var skdevice = serviceProvider.GetService<SKDevice>())
{
    //シリアル通信を開く
    skdevice.Open(devicePort, 115200, 8, Parity.None, StopBits.One);
    //EVENTのイベントハンドラを登録
    skdevice.OnEVENTReceived += (sender, e) =>
    {
        logger.LogDebug(e.ToString());
    };
    //ERXUDP(UDP受信)のイベントハンドラを登録
    skdevice.OnERXUDPReceived += (sender, e) =>
    {
        logger.LogDebug(e.ToString());
    };

    //各種コマンドはSKDeviceクラスにメソッドとして実装
    var eInfo = await skDevice.SKInfoAsync();
    logger.LogInformation(eInfo.ToString());

    var eVer = await skDevice.SKVerAsync();
    logger.LogInformation(eVer.ToString());
}

詳細は以下
SkstackIpDotNet.Example
EchoDotNetLiteSkstackIpBridge

ハマったポイント

UDP受信=ERXUDPイベントのペイロードは16進数文字列なのに、
UDP送信=SKSENDTOコマンドのペイロードはバイナリっていう。
コマンドリファレンス上は両方ともCHAR[]なのに…

SKコマンド

Bルートで必要となるSKコマンドはそこまで多くありません。

コマンド 説明 用途
SKINFO ドングルの通信設定値を取得するコマンド
レスポンスはEINFO
リンクローカルアドレスを取得し、
自ノードの識別に使用する
SKSETPWD パスワードを設定するコマンド Bルートのパスワードを設定する
SKSETRBID RouteBIDを設定するコマンド
PairingID(SAレジスタ)に値が設定される
(スキャン時の応答が該当メーターのみに絞られる?)
BルートのIDを設定する
SKSCAN PANをスキャンするコマンド。 メーターをスキャンする
SKSREG レジスタに値を設定するコマンド スキャンの結果から、S02(自端末が使用する周波数の論理チャンネル番号)、
S03(自端末の PAN ID)を設定する
SKLL64 64 ビット MAC アドレスを IPv6 リンクローカルアドレスに変換するコマンド スキャンの結果から、メーターのIPv6アドレスを取得する
SKJOIN PANA 認証クライアントとして、PANA接続シーケンスを行う
接続結果はイベント(EVENT)で通知される。
メーターへの接続、認証を行う
SKSENDTO UDPでデータを送信するコマンド ECHONETLiteフレームの送信を行う
ERXUDP コマンドではなく、イベント
UDP(マルチキャストも含む)を受信すると通知される
ECHONETLiteフレームの受信を行う

メーターとの接続完了までのコマンド/シーケンスの例

通信シーケンス
#自ノードIPv6アドレスの取得
> SKINFO
SKINFO
EINFO [自ノードIPv6アドレス] 100723FFFEA07461 3B 1094 FFFE
OK
#パスワードの設定
> SKSETPWD C XXXXXXXXXXXX
SKSETPWD C XXXXXXXXXXXX
OK
#IDの設定
> SKSETRBID XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
SKSETRBID XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
OK
#スキャン開始
#スキャン時間:4
> SKSCAN 2 FFFFFFFF 4
SKSCAN 2 FFFFFFFF 4
OK
EVENT 20 [自ノードIPv6アドレス]
EPANDESC
  Channel:3B
  Channel Page:09
  Pan ID:1094
  Addr:[メーターMACアドレス]
  LQI:1D
  PairID:005B23E3
EVENT 22 [自ノードIPv6アドレス]
#PAN発見: 論理チャンネル番号:3B,チャンネルページ:09,PAN ID:1094,アドレス:[メーターMACアドレス],RSSI:1D,PairingID:005B23E3
#S02(自端末が使用する周波数の論理チャンネル番号)設定
> SKSREG S2 3B
SKSREG S2 3B
OK
#S03(自端末の PAN ID)設定
> SKSREG S3 1094
SKSREG S3 1094
OK
#メーターのIPv6アドレスを取得
> SKLL64 [メーターMACアドレス]
SKLL64 [メーターMACアドレス]
[メーターIPv6アドレス]
#PANA接続シーケンス開始
> SKJOIN [メーターIPv6アドレス]
SKJOIN [メーターIPv6アドレス]
OK
EVENT 21 [メーターIPv6アドレス] 02
EVENT 02 [メーターIPv6アドレス]
# 鍵交換など(SKJOINのコマンドで勝手に行われる)
ERXUDP [メーターIPv6アドレス] [自ノードIPv6アドレス] 02CC 02CC [メーターMACアドレス] 0 0028 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
EVENT 21 [メーターIPv6アドレス] 00
ERXUDP [メーターIPv6アドレス] [自ノードIPv6アドレス] 02CC 02CC [メーターMACアドレス] 0 0068 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
EVENT 21 [メーターIPv6アドレス] 00
ERXUDP [メーターIPv6アドレス] [自ノードIPv6アドレス] 02CC 02CC [メーターMACアドレス] 0 0054 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
EVENT 21 [メーターIPv6アドレス] 00
ERXUDP [メーターIPv6アドレス] [自ノードIPv6アドレス] 02CC 02CC [メーターMACアドレス] 0 0058 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
EVENT 21 [メーターIPv6アドレス] 00
#EVENT ID=0x25:PANA による接続が完了
EVENT 25 [メーターIPv6アドレス]

ECHONET Lite(6~7層)

長くなったので次回に続きます

動作確認環境

  • OS:Windows10/Raspbian Stretch
  • ミドルウェア:.NET Core 2.1 Runtime v2.1.6
  • Wi-SUNモジュール: RL7023 Stick-D/IPS
  • 低圧スマート電力量メータ:中部電力管内(2機)

参考

8
10
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?