スマートメーターからリアルタイムに消費電力を取得する

少し前からスマートメーターの導入が始まっています。東電は2020年度末までに一般家庭などへの導入を完了させるそう。
http://www.tepco.co.jp/smartmeter/index-j.html


東電の場合、電力メーター情報発信サービス(Bルートサービス)を申し込むと、優先的にスマートメーターに交換してくれます。特に費用はかかりません。スマートメーターが設置されるとでんき家計簿から30分毎の電力使用状況グラフ(0.1kWh単位)を見ることができるようになりますが、加えて上記サービスに申し込むと、スマートメーターと家庭内のHEMS機器との間(これをBルートと言います)で通信を行うことが可能になり、リアルタイムで詳細な電力使用状況(瞬時電力値(W)、瞬時電流値(A)など)が取得できるようになります。


利用にあたってHEMS機器やサービスの導入に費用がかかるのがネックですが、HEMSに使われている無線通信方式(Wi-SUN)やプロトコル(ECHONET Lite)はオープンな規格であり対応する通信モジュールも一般販売されているため、自作の機器でもBルートで通信を行って電力使用状況の取得ができるはずです。


というわけで瞬時電力値の取得に挑戦してみました。


作ったのは、7セグにリアルタイムに瞬時電力(W)が表示されるというもの。シリアルでPCからも値を読み取れます。

まずはBルートサービスに申し込み

自宅の場合、スマートメーターへの交換は申し込んで1週間ほど(週末を指定したので)でやってくれました。要立会い、作業は15分くらい、そのうち5分くらい停電しました。交換後、翌々週くらいにBルート接続用のIDとパスワードが送られてきました。トータル3週間ほど。

使用した機器

その間にWi-SUN関係の通信機器をこちらなどで購入しました。→ https://www.zaikostore.com/zaikostore/itstoreWireless?cid=3#c2

 (DT101EACV101の方が簡単に使えますが、購入できない場合は BP35A7A でもOKと思います。)


BP35A1は電圧が3.3Vで、5Vには対応していませんので、USBシリアルやArduinoも3.3Vに合わせる必要があります(または適切に分圧やレベル変換が必要です)。


シリアル対応7セグは手持ちの古い版なので、真似する場合は適当に別のものに置き換えた方がいいでしょう。(その場合、下記のスケッチの dig というキーワードが出てくる部分の書き換えも必要でしょう。)


なおPCで使う場合は、WSR35A1-00 というUSBシリアルとBP35A1を一体化したUSBデバイスも売られているので、これが一番簡単でしょう。


Wi-SUN通信モジュールBP35A1のデータシート等は以下にあります。
http://micro.rohm.com/jp/download_support/wi-sun/

追記

Arduinoではなく、RaspberryPiなどのLinuxボードを使う場合はこちらの記事もみてください。
スマートメーターの瞬時電力や履歴をWebブラウザで見る - Okiraku Programming

事前準備

BP35A1はDT101EACV101を噛ませ、さらに XBeeの載る「C基板」上に乗せました。
C基盤にはArduino Pro MiniのUSBシリアル接続と同配置になるようピンヘッダに配線し、PCと簡単につなげるようになっています。


BP35A1とArduinoは直接シリアル通信で利用できます。ただ、Arduino Pro Miniは一系統しかハードウェアシリアル(UART)を持っていないので、ここにBP35A1を繋いでしまうとPCとシリアル通信ができなくなり、デバッグ等が困難になってしまいます。そこで、BP35A1はArduinoのソフトウェアシリアルを使って接続することにします。*1

ソフトウェアシリアルの欠点として、半二重なので送信と受信が同時にできない、通信速度が高速だと不安定になりやすいという問題があります。BP35A1のデフォルト設定は115200bpsなのですが、3.3V/8MHzのArduinoでは文字が化けたりして正常に動作しませんでした。そこで,事前に通信速度の設定を9600bpsにし、さらに文字間にウェイト400μsを入れるように変更しておきます。


これは、BP35A1をPCにUSBシリアルの3.3V, GND, TX<->RXの4本で接続して、ターミナルソフトを115200bps設定で起動します。
Arduino IDEのシリアルモニターでも改行コードをCRにすれば通信できますので、これが手っ取り早いでしょう。

WUART 43

というコマンドを実行すればシリアル設定はOKです。一度設定すると内蔵のフラッシュに保存され、電源を再投入すると以後は9600bpsでの通信になります。


PCに直接繋いで利用する場合はこのシリアル設定は不要です。また、設定変更後にデフォルトの設定に戻したい時は WUART 00 を実行すればOKです。

配線

こんな感じでブレッドボード上に配線しました。

スケッチ

ArduinoのスケッチはGist上に置いてあります。
https://gist.github.com/NeoCat/72390f357d3ee2ce339d

Bルート用のID・パスワードをスケッチの先頭のID, PASSWORDに設定し、Arduinoに書き込みます。

//#define DEBUG

と書かれた部分のコメントアウトを外すと、詳細な通信状況がシリアルに出力されるようになります。


概ね以下の処理を行っています。

  • setup
    1. 初期設定(バージョン取得、ASCII出力モードへの設定、ID・passwordの設定)
    2. PANのスキャン(スマートメーターとの通信チャンネルやIPv6アドレスなどの取得)
    3. スマートメーターとの通信セッションを確立(ID・passwordによるPANA認証。以降、自動的に暗号化通信になります)
    4. ECHONET Lite (UDP port 3610)を使ってスマートメーターの状態を確認
      • EPC 0x80 (動作状態) = 0x30: ON、 0x31: OFF
      • EPC 0x88 (異常状態) = 0x41: 異常あり、 0x42: 異常なし
  • loop
    1. 3秒ごとにスマートメーターから瞬時電力(EPC 0xe7)を取得,シリアルおよび7セグに表示


ちなみに自宅のスマートメーターは最初なぜか異常状態になっており、セッションの確立は出来るものの、EPC 0x88 = 0x41 (異常あり)を返し、かつ瞬時電力や累積電力なども取得しようとすると"非対応"のエラーを返してきていました。電力会社のスマートメーター推進室ということろに問い合わせてEPC等の状態を伝えたところ、遠隔でスマートメーターの通信機能のログ確認やリブートを行ってくれ、その結果無事に瞬時電力等が取れるようになりました。言ってみるものですね。

参考資料

スケッチ

*1:Arduino LeonardoであればUSB用とハードウェアシリアルが分かれているので簡単だったかも。