Node-REDでECHONET Liteのアプリケーションをつくる

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マルチキャスト送信

  • 宛先IP224.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で内容をリアルタイム確認可能