太陽光の電力検出ユニットとモニターの内容をブラウザから見に行けるようにする方法（+α）

#1.はじめに
我が家の屋根には長州産業株式会社製の太陽光発電システムが載っている。太陽光発電システムでは発電量や売電量を見られるモニターが付属していることが多いと思う。
我が家ではCMCS-P04という型番のモニターと、ここに表示する情報を取得するための電力検出ユニットが付いてきた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1637818/bf97422f-ab1e-1bd7-15d8-6bceb376bb77.png)
※図は長州産業さんの広告から引用
　https://zz102.secure.ne.jp/~zz102035/pdf/pdf_g51_333w300w275w.pdf

入居当時、我が家にはWi-Fiルーターがなかったため、電力検出ユニットとモニターが直接、無線で接続されていた。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1637818/3c556acd-7de6-02d9-7c50-24cfb922cd1b.png">
単純に今の発電量を確認するだけなら問題ないのだが、履歴を出力するためにSDカードが必要だったり、モニターのタッチパネルがそれほど感度がよくなく操作性が悪かったりと使い心地がそれほどいいとは言えない。そこで、Wi-Fiルーターが導入できた段階でルーター経由で電力検出ユニットとモニターを接続し、ブラウザから発電量を見られるようにしようとした。
<img width="650" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1637818/00fc01ca-32fd-665c-948c-c34545917316.png">

しかし長州産業のCMCS-P04というモニターもMCSM-P04という電力検出ユニットも取扱説明書がWEB上に公開されていない。
ルーターとの接続設定にたどり着くまでに少し詰まったので記録に残しておきたい。
ルーターと接続ができた後はECHONET liteのプロパティマップを取得して遊んでみたので合わせて記録する。

#2.記事の概要（できたこと・できなかったこと）
##2.1 できたこと
* モニターの表示内容をスマホやPCのブラウザから閲覧（Wi-Fiがつながる家の中限定）
* 発電量・売電量のログ（30分値）をブラウザからCSVファイルで出力
* ECHONET liteコマンドで発電量・売電量の積算値を読みとり

##2.2 期待していたができなかったこと
* 宅外からの発電量の確認
* ECHONET liteコマンドでの30分値の履歴取得

#3. 太陽光の電力検出ユニットとモニターをルーター経由で接続する
長州産業の太陽光モニターと電力検出ユニットはPanasonicのOEMのようだ。Panasonic製のモニターと電力検出ユニットであればWeb上にも取説が公開されている。電力検出ユニットMCSM-P04に対応する製品はおそらくこちら（[太陽光モニタ用電力検出ユニットVBPW276](https://www2.panasonic.biz/scvb/a2A/opnItemDetail?use_obligation=scva&contents_view_flg=1&catalog_view_flg=1&item_cd=&item_no=VBPW276&b_cd=&hinban_kbn=1&s_hinban_key=VBPW276&s_end_flg=1&vcata_flg=1&simple_search_flg=)）。というわけで、あとは取説に従って設定していくだけ。
（実は今回、一番のハマりポイントが「代替の取説を見つける」までに食った時間）

<img width="650" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1637818/35aa6654-cdf4-efe8-710e-90e9c44edb9f.png">
（太陽光モニタ 電力検出ユニット 設定マニュアル 2020042400220048.pdfより引用）

ねじをあけて蓋を外し、DIP-2スイッチの2番、3番をOFFにして、無線設定スイッチを長押し。
LEDが緑色で点滅したらルーターのWPSボタンを押す。しばらく待ってLEDがオレンジ色に点灯すれば設定は完了。
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1637818/ef66c0f0-19a8-2b6e-3d87-6593b71b8eed.png">　<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1637818/6bb2b391-c8b3-7e61-bc95-be3ac03ce8e9.png">

次にモニターとルーターの接続を行う。これも取説の通り。
「メニュー」→「設定」→「ネットワーク設定」→「設定を始める」から画面の指示に従う。
<img width="650" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1637818/da717c46-65ce-78c9-d0ff-d0b1b6571a3a.png">　
以上で電力検出ユニットとモニターのルーターを介した接続が完了した。
早速、ブラウザから電力検出ユニットの表示を見てみる。
モニターにアクセス用のIPアドレスが表示されるので、アドレスバーに入力するか、「http\://solar-monitor.local/」と入力する。ログインでユーザー名とパスワードを聞かれるので、ユーザー名「user」（固定）、パスワード「12345678」（初期パスワード）を入力すれば閲覧できる。
パスワードについてはモニターからもブラウザからも変更できるので、変更しておいた方が無難だと思う。
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1637818/529463cd-ff2d-f474-6961-f150dc3aee33.png">　<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1637818/3ac33f75-f201-aa77-936a-25c281b1743a.png">

「メニュー」→「設定」→「発電量結果出力」を選べばCSV形式で積算電力量のログを出力することもできる。1時間値、30分値の2種類がZip形式で出力される。プロットしてみるとこんな感じ。
<img width="650" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1637818/1ce83c93-41b9-a62b-c83e-7af14640c82d.png">
ただし、残念ながらこの状態では宅内で無線LANルーターと接続している場合しか発電量を見ることはできない。外出先から発電量を確認するには別の方法が必要そうだ。

#4. 電力検出ユニットのECHONET Liteプロパティマップを見てみる
Panasonic製の電力検出ユニットはECHONET liteに対応している。せっかく電力検出ユニットがルーターにつながったのでプロパティマップをのぞいてみる。まず、ECHONET liteコマンドの送受信が簡単に行えるツールであるSSNGを使って情報を見る。
ECHONET Lite SDKs（http://sh-center.org/sdk ）

SSNGを開いて右上のSEARCHを押せば、無線LANルーターに接続されているECHONET lite対応機器の一覧がみられる。我が家ではエアコン、エコキュート、電力検出ユニットの種類の機器が接続されている。電力検出ユニットだけ、1つのIPアドレスに2つの機器が接続されているようだ。
<img width="650" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1637818/8b51026e-3057-8a25-6b0b-c2504d2ddecf.png">

電力検出ユニットのうち「分電盤メータリングクラス」のプロパティマップを解析してみたい。環境はJupyter Notebook上でPython3.8を利用した。
なお、PythonでのECHONET liteコマンドを使った電力検出ユニットとの通信にはこちらの記事を、
　[ECHONET Lite対応の部屋のエアコンをPython3から操作してみた](https://yomon.hatenablog.com/entry/2020/09/sharp_aircon_echonet_lite)
プロパティマップの解析にはこちらの記事を参考にさせていただいた。
　[ECHONET Lite のプロパティマップの解析](https://qiita.com/miyazawa_shi/items/4f11493079b5191bd5d5)

```python
#電力検出ユニット（分電盤メータリングクラス）のプロパティマップ確認
import socket

#プロパティマップ解析用のリストを準備
px = ["0xF","0xE","0xD","0xC","0xB","0xA","0x9","0x8"]
py = ["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"]
property_name=""

echonet_command="1081000005FF0102870162019F00" #最後の4桁を「9F00」にすればGetプロパティ、「9E00」にすればSetプロパティを取得できる
echonet_port = 3610
ip = "***.***.***.***"  #SSNGで確認した電力検出ユニットのIPアドレスを記入

# 応答待ち受け用ソケット
recv_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
recv_sock.bind(("0.0.0.0", echonet_port))

# 要求送信用ソケットでコマンド送信
send_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
send_sock.sendto(bytes.fromhex(echonet_command), (ip, echonet_port))

# 応答を受け取る
data, addr = recv_sock.recvfrom(4096)
send_sock.close()
recv_sock.close()

[f'{b:02x}' for b in data]

#プロパティマップの解析
if int(f'{data[14]:02x}',16) > 16:
    print("Getプロパティの個数："+str(int(f'{data[14]:02x}',16))+"個")
    for i in range(15, 31):
        for j in range(0,8):
            boolean_data='{:08b}'.format(data[i])[j]
            if boolean_data== "1":
                property_name=px[j]+py[i-15]
                print(property_name)

else:
    print("Getプロパティの個数："+str(int(f'{data[14]:02x}',16))+"個")
    for k in range (15,(int(f'{data[14]:02x}',16)+15)):
        print('0x{:02X}'.format(data[k]))}
```

得られた応答とECHONET lite規格書のAPPENDIX ECHONET機器オブジェクト詳細規定（https://echonet.jp/spec_old_lite/#standard-03 ）に記載されたプロパティ名称・プロパティ内容を照合することで、電力検出ユニットの分電盤メータリングクラスは以下のプロパティを持っていることが分かる。

0x80: 動作状態
0x81: 設置場所
0x82: 規格Ver.情報
0x83: 識別番号
0x88: 異常発生状態
0x8A: メーカーコード
0x8C: 商品コード
0x8D: 製造番号
0xB1: 計測チャンネル数
0xB2: 積算電力量計測チャンネル範囲指定（片方向）
0xB3: 積算電力量計測値リスト（片方向）
0xB4: 瞬時電流計測チャンネル範囲指定（片方向）
0xB5: 瞬時電流計測値リスト（片方向）
0xB6: 瞬時電圧計測チャンネル範囲指定（片方向）
0xB7: 瞬時電圧計測値リスト（片方向）
0xC0: **積算電力計測値（正方向）**
0xC1: **積算電力計測値（逆方向）** 
0xC2: **積算電力量単位**
0xC6: 瞬時電力計測値
0xC7: 瞬時電流計測値
0xC8: 瞬時電圧計測値
0x9D: 状変アナウンスプロパティマップ
0x9E: Setプロパティマップ
0x9F: Getプロパティマップ

この中で、継続的に値を取得して価値がありそうなものは太字で記した3種類ぐらいかもしれない。本当は「0xC3: 積算電力計測値履歴（正方向）」と「0xC4: 積算電力計測値履歴（逆方向）」が取得できると1日1回の通信でログが残せてありがたいのだが、Panasonicの電力検出ユニットは対応していないらしい。

#5. おわりに
どの太陽光パネルメーカーがどんなモニターを利用しているのかについては調査ができていないが、PanasonicのOEMと思われるモニターを利用している会社であれば、ブラウザから閲覧できるようになるはずだ（宅内限定だが…）。今後、ECHONET liteコマンドで発電量を取得して外からでも発電状況がみられるような形にできればいいなと考えている。