ECHONET Liteを本格的にスマートホームに組み込むことができるように、自宅の家庭用エアコン(白くまくん)にルームエアコン専用HEMSアダプター SPEM1を取り付けNode-REDからECHONET Liteのエアコンを操作するアプリケーションを作成します。
目次
ECHONET Liteデバイス探索フロー

[{"id":"a1e3b0a2e8c7e42b","type":"inject","z":"698af5dabf96aae0","name":"全ノード探索要求(D6)","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":270,"y":800,"wires":[["90f3fa423f0e8ae4"]]},{"id":"90f3fa423f0e8ae4","type":"function","z":"698af5dabf96aae0","name":"ECHONET: D6要求パケット生成","func":"// TID(任意の連番または乱数)\nconst tid = 0x0003;\n\nconst bytes = [\n 0x10, 0x81, // EHD\n (tid >> 8) & 0xFF, tid & 0xFF, // TID\n 0x05, 0xFF, 0x01, // SEOJ(コントローラ)\n 0x0E, 0xF0, 0x01, // DEOJ(ノードプロファイル)\n 0x62, // ESV(Get)\n 0x01, // OPC(プロパティ数)\n 0xD6, // EPC(インスタンスリスト)\n 0x00 // PDC(0=データなし)\n];\n\nmsg.payload = Buffer.from(bytes);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":560,"y":800,"wires":[["0f63f79d7b6ad6e0"]]},{"id":"0f63f79d7b6ad6e0","type":"udp out","z":"698af5dabf96aae0","name":"ECHONETマルチキャスト送信","addr":"224.0.23.0","iface":"","port":"3610","ipv":"udp4","outport":"","base64":false,"multicast":"false","x":910,"y":800,"wires":[]},{"id":"b86db9a7b2a7e7e3","type":"udp in","z":"698af5dabf96aae0","name":"UDP受信(ECHONET応答)","iface":"","port":"3610","ipv":"udp4","multicast":"false","group":"","datatype":"buffer","x":280,"y":920,"wires":[["be0dd92cb872bf8f"]]},{"id":"be0dd92cb872bf8f","type":"function","z":"698af5dabf96aae0","name":"応答解析(EOJ表示)","func":"const buf = msg.payload;\nconst ip = msg.ip || msg._msgid;\n\nif (buf.length < 14) return null; // 異常チェック\n\nconst epc = buf[12];\nconst pdc = buf[13];\n\nif (epc === 0xD6) {\n const eojs = [];\n for (let i = 0; i < pdc; i += 3) {\n const idx = 14 + i;\n const eoj = buf.slice(idx, idx + 3).toString('hex').toUpperCase();\n eojs.push(eoj);\n }\n node.warn(\"IP: \" + ip + \" → EOJs: \" + eojs.join(\", \"));\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":920,"wires":[["4fa3798c48972bca"]]},{"id":"4fa3798c48972bca","type":"debug","z":"698af5dabf96aae0","name":"UDPレスポンス","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":860,"y":920,"wires":[]}]
このNode-REDフローは、ECHONET Liteネットワーク上のすべてのデバイス(ノード)を探索し、それぞれの機器が持つEOJ(ECHONETオブジェクト)の一覧を取得・表示する構成です。
🧭 フローの全体構成
textコピーする編集する[Inject] → [Function: D6要求生成] → [UDP送信]
↓
[UDP受信] ← [ECHONET機器からの応答]
↓
[Function: EOJ解析] → [Debug表示]
📦 ノード別の詳細解説
① inject
ノード:全ノード探索要求(D6)
- 役割:ボタンを押すとフローを手動で実行
- 起動トリガー:EPC=0xD6(インスタンスリスト取得)のGet要求パケットを作成・送信させる
② function
ノード:ECHONET D6要求パケット生成
javascriptコピーする編集するconst tid = 0x0003;
const bytes = [
0x10, 0x81, // EHD
(tid >> 8) & 0xFF, tid & 0xFF, // TID
0x05, 0xFF, 0x01, // SEOJ(コントローラ)
0x0E, 0xF0, 0x01, // DEOJ(ノードプロファイル)
0x62, // ESV=Get
0x01, // OPC=1件
0xD6, // EPC=ノード内インスタンスリスト
0x00 // PDC=0(データなし)
];
msg.payload = Buffer.from(bytes);
return msg;
- 目的:EPC=0xD6 を対象にしたGet要求パケットを生成
- 送信先のEOJ:ノードプロファイル(
0x0EF001
) - 送信元のSEOJ:コントローラ(
0x05FF01
)
③ udp out
ノード:ECHONETマルチキャスト送信
- 宛先IP:
224.0.23.0
(ECHONET Lite 標準マルチキャスト) - ポート:3610(ECHONET Lite標準ポート)
- 機能:生成されたパケットをネットワーク上の全ECHONET対応機器にブロードキャスト送信
④ udp in
ノード:UDP受信(ECHONET応答)
- ポート:3610(応答もこのポートで返ってくる)
- 受信対象:すべてのECHONET機器からの応答
- データ形式:Buffer(バイナリ)
⑤ function
ノード:応答解析(EOJ表示)
javascriptコピーする編集するconst buf = msg.payload;
const ip = msg.ip || msg._msgid;
if (buf.length < 14) return null;
const epc = buf[12];
const pdc = buf[13];
if (epc === 0xD6) {
const eojs = [];
for (let i = 0; i < pdc; i += 3) {
const idx = 14 + i;
const eoj = buf.slice(idx, idx + 3).toString('hex').toUpperCase();
eojs.push(eoj);
}
node.warn("IP: " + ip + " → EOJs: " + eojs.join(", "));
}
return msg;
- 機能:
- 応答パケットから EPC=0xD6 を検出
- PDC に従って EOJ(3バイト単位)を抽出
- どのIPアドレスのノードがどんなEOJを持っているかをログ出力
⑥ debug
ノード:UDPレスポンス
- 内容:受信した
msg
全体を確認可能 - 活用:パケット内容の詳細確認やデバッグ用途
✅ このフローでできること
機能 | 説明 |
---|---|
ノード探索 | ネットワーク上のECHONETデバイスを自動で発見 |
EOJ抽出 | 各デバイスが持っている機器情報(例:013001など)を取得 |
IP識別 | 応答元のIPアドレスをログに表示 |
可視化 | Node-REDのDebugで内容をリアルタイム確認可能 |