0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

太陽光発電システムの通信を調べて ECHONET Lite でデータ取得してみた

0
Last updated at Posted at 2026-05-04

背景:太陽光発電を導入

先日、自宅に発電用の太陽光パネルと、蓄電池を備えた太陽光発電システムを導入しました。

宅内には、発電や充電の状況を表示するリモコンが設置されました。

さらに、スマホのアプリでもシステムの状況を確認できる状態になりました。

スマホで見れるということは、発電システムに関する情報をネットワークで通信しているはずです。一体どんな風に通信しているのだろうか。

本記事では、この疑問について調査してわかった内容を書いていきます。

事前知識:HEMSについて

はじめに、本記事を読む上で知っておいたほうがよい知識を簡単に説明します。

背景で紹介した、発電や充電などの状況を見える化するシステムは、HEMS(Home Energy Management System)と呼ばれます。

HEMSを導入すれば、「今どれくらい電気を使っているの?」とか「どの時間帯にたくさん電気を使っているの?」などを確認できるようになります。機器や構成によっては、宅外からの家電の遠隔操作や状況に応じた電力使用の自動制御もできるようです。ただ何ができるかはケースバイケースなので、導入時は十分に確認しておくことが重要です。

なお、HEMSは太陽光発電がなくても導入可能で、家庭の電力の見える化などの用途で利用されています。

発電量や消費電力などの情報を集約し、外部からの問い合わせや設定要求を受け付ける機器は、「HEMSコントローラー」と呼ばれます。宅内に設置されたリモコンやスマホアプリは、このHEMSコントローラーと通信して電力に関する様々な情報を提供しています。

ポートとプロトコルの調査

では、HEMSコントローラーはどのようにして要求を受け付けるのでしょうか?

リモコンやスマホアプリの設定を見るとIPアドレスが設定されているのを確認できるので、まずはそのIPアドレスで開放されているポートを確認します。

同じネットワークに接続しているLinuxマシンから、次の nmap コマンドを実行してみます。

$ nmap -p1-10000 192.168.1.xxx
Starting Nmap 7.80 ( https://nmap.org ) at 2026-05-04 06:36 JST
Nmap scan report for 192.168.1.xxx
Host is up (0.014s latency).
Not shown: 9772 closed ports, 226 filtered ports
PORT     STATE SERVICE
443/tcp  open  https
3610/tcp open  echonet

Nmap done: 1 IP address (1 host up) scanned in 7.12 seconds

出力より、443/tcpと3610/tcpで待ち受けているがわかります。調査していくと、3610は「ECHONET Lite」でよく使われるポート番号ということがわかりました。

どうやら、宅内のHEMSコントローラーが 3610/tcp でECHONET Liteを用いた通信を受け付けている可能性が高そうです。ちなみに443にもアクセスしましたが、今回はその用途を特定できませんでした。

ECHONET Liteのプロトコルでアクセスしてみる

リクエスト方法の確認

早速、ECHONET Liteで3610ポートにアクセスしてみましょう。

そもそも通信方法がわからないのでWeb調査をすると、以下のようなサイトにヒットしました。

要約すると、ECHONET Liteでは以下の要領で通信されるようです。

  • (1) 規定のフォーマットにしたがって、リクエスト用のバイナリデータを作る
  • (2) 3610/tcpでホストにリクエストする
  • (3) レスポンスが、規定のフォーマットで返ってくる

まずは、リクエスト用のバイナリデータを以下のように作ってみます。各値の詳しい説明は割愛します。

フィールド バイト数 値(16進) 備考
EHD1 1 10 固定値
EHD2 1 81 固定値
TID 2 0001 任意の値でOK
SEOJ 3 05FF01 「送信元がコントローラー」の意味
DEOJ 3 0EF001 「相手先がNode Profile」の意味
ESV 1 62 GETの意味
OPC 1 01 固定値
EPC 1 D6 ノード内のインスタンス一覧を取得するプロパティ
PDC 1 00 固定値

これは「Node Profile Object に対してインスタンス一覧を表すプロパティの取得を要求するデータ」です。

リクエストを実行する

このデータを送信して、レスポンスを取得するPythonのソースコードを作ってみます。

echonet_tcp_sample.py
from __future__ import annotations

import socket


HOST = "192.168.1.xxx"
PORT = 3610
TIMEOUT_SECONDS = 15.0

EHD1 = "10"
EHD2 = "81"
TID = "0001"
SEOJ = "05FF01"
DEOJ = "0EF001"
ESV = "62"
OPC = "01"
EPC = "D6"
PDC = "00"


def build_request_packet() -> bytes:
    packet_hex = EHD1 + EHD2 + TID + SEOJ + DEOJ + ESV + OPC + EPC + PDC
    return bytes.fromhex(packet_hex)


def send_tcp_request(host: str, port: int, packet: bytes, timeout: float) -> bytes:
    with socket.create_connection((host, port), timeout=timeout) as conn:
        conn.settimeout(timeout)
        conn.sendall(packet)
        return conn.recv(4096)


def main() -> None:
    request_packet = build_request_packet()
    response_packet = send_tcp_request(
        host=HOST,
        port=PORT,
        packet=request_packet,
        timeout=TIMEOUT_SECONDS,
    )

    print(f"request : {request_packet.hex().upper()}")
    print(f"response: {response_packet.hex().upper()}")


if __name__ == "__main__":
    main()

実行すると、次のような出力が返ります。

$ python echonet_tcp_sample.py
request : 1081000105FF010EF0016201D600
response: 108100010EF00105FF017201D60A03027D0102790102A501

レスポンスの理解

出力されたresponseは、以下を意味します。

フィールド バイト数 値(16進) 備考
EHD1 1 10 固定値
EHD2 1 81 固定値
TID 2 0001 リクエスト時と同じトランザクションID
SEOJ 3 0EF001 送信元はNode Profile Object
DEOJ 3 05FF01 宛先はコントローラー
ESV 1 72 GET_RES。GETに対する応答
OPC 1 01 固定値
EPC 1 D6 インスタンス一覧を表すプロパティ
PDC 1 0A EDTのデータ長は10バイト
EDT[0] 1 03 インスタンス数は3個
EDT[1:3] 3 027D01 蓄電池のインスタンス
EDT[4:6] 3 027901 太陽光発電のインスタンス
EDT[7:9] 3 02A501 マルチ入力PCSのインスタンス

このレスポンスから、HEMSコントローラーは「蓄電池」「太陽光発電パネル」「マルチ入力PCS」の3つにつながっていることがわかります。

「レスポンスの各3バイトがどのインスタンスに対応するのか」は、ECHONET Lite Web API ガイドライン 機器仕様部 Version 1.6.1に記載があります。これを読むと、各3バイトデータの先頭2バイトが「027D は蓄電池」「0279は住宅用太陽光発電」「02A5はマルチ入力PCS」を表していると理解できます。

インスタンスで有効なプロパティ一覧を取得する

続いて、各インスタンスにアクセスして情報を取得したいです。先ほどインスタンス一覧を取得した時と同じ要領でリクエストしますが、送信するデータの値を少し変える必要があります。今回は、蓄電池で試してみましょう。

まず、宛先を表すDEOJの値を変更します。先ほどはNode Profile Objectを表す 0EF001 を書いていましたが、ここを蓄電池のID 027D01 にします。

続いて、インスタンスから欲しいデータのプロパティを表すEPCも、先ほどのD6から変更します。指定可能なプロパティはインスタンスによるので、まずは以下のプロパティを指定してそれらを確認する必要があります。

  • 9F: Get プロパティマップ
    • 読み取り可能な EPC 一覧
  • 9E: Set プロパティマップ
    • 書き込み可能な EPC 一覧
  • 9D: 状態変化アナウンスプロパティマップ
    • 通知可能な EPC 一覧

今回は、9FのGetプロパティマップを取得してみます。先ほどのソースコードで、以下の値を変更します。

...
DEOJ = "027D01" # 蓄電池
...
EPC = "9F" # Get プロパティマップ
...

実行すると、以下のような出力が返ってきました。

$ python echonet_tcp_sample.py
request : 1081000105FF01027D0162019F00
response: 10810001027D0105FF0172019F1134A515F525C4C46142F715256461230212

responseの後半部分(PDC以降)は、以下を意味します。

フィールド バイト数 値(16進) 備考
PDC 1 11 EDTのデータ長は17バイト
EDT 17 34A5.. Get可能なプロパティ一覧を表すデータ

最後のEDTを全て書くと、以下です。

34A515F525C4C46142F715256461230212

上記のデータ長は17バイトですが、先頭1バイトの34と2バイト目以降のA5...を併せたデータは、ECHONET Liteの「プロパティマップ記述形式」で表現されたものです。詳細は、以下の情報が参考になります。

仕様に従ってデコードすると、次の52個のプロパティが取得可能とわかります。

80 81 82 83 86 88 89 8A 8C 8D 97 98 9D 9E 9F
A0 A1 A2 A3 A4 A5 A8 A9 AA AB
C1 C2 C8 C9 CF
D0 D2 D3 D6 D8 DA DB DC DD
E2 E4 E5 E6 E7 E8
EB EC F0 F2 F4 F5 F8

蓄電池 027D01では、これら52個のうちのどれかを EPC に指定すると、何らかの意味のあるレスポンスが返ってくるということです。

蓄電池のプロパティを取得する

蓄電池のプロパティについては、APPENDIX ECHONET機器オブジェクト詳細規定Release R rev.4 の「3.3.17 蓄電池クラス規定」(282ページ)に詳細が書かれています。

これを見ると、EPCに E4 を指定した場合は「蓄電池の残量」がchar型で単位%で返ってくることがわかります。先ほどリクエストに使ったソースコードを以下のように修正します。

...
DEOJ = "027D01" # 蓄電池
...
EPC = "E4" # 蓄電残量(%)
...

変更後にpythonを実行すると、次の出力になります。

$ python work/src/echonet_tcp_sample.py
request : 1081000105FF01027D016201E400
response: 10810001027D0105FF017201E40164

responseの前半はこれまで同じなので、後半の 0164 の出力内容を表にします。

フィールド バイト数 値(16進) 備考
PDC 1 01 EDTのデータ長は1バイト
EDT 1 64 10進法で100を表す

10進法での値100が返ってきたので、「蓄電池の残量は100%」ということがわかりました。記事を執筆していた時間帯が午後でその前に日光が当たっていることが多かったので、蓄電池が満タンになっていたようです。

同じ要領で、各インスタンスの様々なプロパティを取得可能です。背景で紹介した宅内リモコンやアプリも、ここに書いたようなやりとりをHEMSコントローラーと行いながら情報表示していると考えられます。

おわりに

太陽光発電システムの導入とともに可視化されるようになった電力データが、どのような仕組みで取得できるのかを手を動かしながら理解することができました。また、その背後にはHEMSが存在して、ECHONET Liteというプロトコルで通信されていることもわかりました。

ECHONET Liteによる通信は電力機器だけではなく、エアコン等の白物家電でも使われているようなので、自宅にある他の家電でどのような通信が出来るのかを試してみると面白そうです。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?