前回、 ECHONET Lite Emulatorを検証してみた! という記事でEmulatorのセットアップを行いました。
今回はNode-REDからEmulatorに接続して状態の取得や設備の操作をしていきたいと思います。
ECHONET LiteエミュレーターとNode-REDの接続イメージ

ECHONET LiteエミュレーターとNode-REDを動かくPCは別にする必要があります。理由はUDPのポート(3610)が重複してうまく動作しないからです。
0x013001:家庭用エアコンの0x83識別番号を取得するNode-REDのフロー

フローはこんな感じです。
[{"id":"d1a977c17c2e3c7c","type":"inject","z":"dfc8506620092dd0","name":"スタート","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":240,"y":240,"wires":[["10251af6ae0badf0"]]},{"id":"92b02c35b5b64cf4","type":"udp out","z":"dfc8506620092dd0","name":"UDP Send to elemU","addr":"192.168.1.14","iface":"","port":"3610","ipv":"udp4","outport":"","base64":false,"multicast":"false","x":910,"y":240,"wires":[]},{"id":"e4c308cd84d97ee7","type":"udp in","z":"dfc8506620092dd0","name":"UDP Receive Response","iface":"","port":"3610","ipv":"udp4","multicast":"false","group":"","datatype":"buffer","x":290,"y":400,"wires":[["58ec30c10ef7cc62"]]},{"id":"58ec30c10ef7cc62","type":"debug","z":"dfc8506620092dd0","name":"Show Response","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","statusVal":"","statusType":"auto","x":600,"y":400,"wires":[]},{"id":"10251af6ae0badf0","type":"function","z":"dfc8506620092dd0","name":"エアコンの識別番号を取得","func":"// ECHONET Lite Frame Manual Creation for 家庭用エアコンの識別番号取得\n\nconst buffer = Buffer.alloc(14);\n\n// EHD: ECHONET Lite ヘッダー (固定)\nbuffer[0] = 0x10; // EHD1 (固定値)\nbuffer[1] = 0x81; // EHD2 (固定値)\n\n// TID: トランザクションID(任意の連番、ここでは 0x00 0x01)\nbuffer[2] = 0x00;\nbuffer[3] = 0x01;\n\n// SEOJ: 送信元オブジェクト (コントローラー 05-FF-01)\nbuffer[4] = 0x05;\nbuffer[5] = 0xFF;\nbuffer[6] = 0x01;\n\n// DEOJ: 宛先オブジェクト (家庭用エアコン 01-30-01)\nbuffer[7] = 0x01;\nbuffer[8] = 0x30;\nbuffer[9] = 0x01;\n\n// ESV: サービスコード (0x62 = プロパティ取得要求)\nbuffer[10] = 0x62;\n\n// OPC: プロパティ数 (1個)\nbuffer[11] = 0x01;\n\n// EPC: 取得するプロパティ (識別番号 0x83)\nbuffer[12] = 0x83;\n\n// PDC: データ長 (0バイト)\nbuffer[13] = 0x00;\n\nmsg.payload = buffer;\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":240,"wires":[["92b02c35b5b64cf4"]]}]

udp outノードにはECHONET LiteエミュレーターPCのIPアドレスをいれてください。

[16,129,0,1,1,48,1,5,255,1,114,1,131,17,254,0,0,119,0,145,158,68,172,130,1,48,1,0,0,0,0]
このフローを実行すると上のようなレスポンスが返ってきます。

レスポンスを16進数表記にしました。
レスポンスの解説はこちら
バイト番号(0始まり) | 内容 | 説明 |
---|---|---|
0 | 0x10 | EHD1(固定: ECHONET Liteヘッダ) |
1 | 0x81 | EHD2(固定: ECHONET Liteヘッダ) |
2-3 | 0x0001 | TID(トランザクションID=1、リクエストと一致) |
4-6 | 0x01 0x30 0x01 | SEOJ(送信元:家庭用エアコンクラス) |
7-9 | 0x05 0xFF 0x01 | DEOJ(宛先:コントローラー) |
10 | 0x72 | ESV(応答:Get応答) |
11 | 0x01 | OPC(プロパティ数:1個) |
12 | 0x83 | EPC(応答するプロパティ:識別番号) |
13 | 0x11 | PDC(データ長:17バイト) |
14〜30 | 0xFE, 0x00, 0x00, 0x77, 0x00, 0x91, 0x9E, 0x44, 0xAC, 0x82, 0x01, 0x30, 0x01, 0x00, 0x00, 0x00, 0x00 | EDT(識別番号データ) |
上記のEDTというのが受け取ったデータです。

では、ECHONET Lite Emulatorの方をみてみましょう。

0x83 識別番号がレスポンスで受信したEDTと一致しています。
Node-REDから家庭用エアコンの動作状態をOFFにする

emulator側のエアコンの動作状態は上記の鉛筆マークをクリックするとON/OFFに変更できます。なにもしてなければONになっていると思います。(OFFであればONに変更してください。)

エアコンをOFFにするため、下記のコードにfunctionノードを変更します。
// ECHONET Lite Frame for 家庭用エアコンのOFF指示
const buffer = Buffer.alloc(15);
// EHD: ECHONET Lite ヘッダー (固定)
buffer[0] = 0x10; // EHD1
buffer[1] = 0x81; // EHD2
// TID: トランザクションID(例: 0x00 0x02)
buffer[2] = 0x00;
buffer[3] = 0x02;
// SEOJ: 送信元オブジェクト (コントローラー 05-FF-01)
buffer[4] = 0x05;
buffer[5] = 0xFF;
buffer[6] = 0x01;
// DEOJ: 宛先オブジェクト (家庭用エアコン 01-30-01)
buffer[7] = 0x01;
buffer[8] = 0x30;
buffer[9] = 0x01;
// ESV: サービスコード (0x61 = プロパティ書き込み要求)
buffer[10] = 0x61;
// OPC: プロパティ数 (1個)
buffer[11] = 0x01;
// EPC: 書き込み対象プロパティ (動作状態 0x80)
buffer[12] = 0x80;
// PDC: データ長 (1バイト)
buffer[13] = 0x01;
// EDT: 書き込む値 (0x31 = OFF)
buffer[14] = 0x31;
msg.payload = buffer;
return msg;
ちなみに

EDTのところを0x30にするとONになります。

Emulator側は再読込を押すと、動作状態がOFFになります。

フローを実行すると上記レスポンスが返ってきます。

レスポンスを16進数表記にしました。

こちらがレスポンスの解説です。このレスポンスは、
「家庭用エアコン(0x013001)の動作状態(0x80)に対して、値(0x31)を書き込むSet要求が成功した」
ことを意味します!!
つまり、
エアコンを正常に「OFF(停止)」できました!
ということになります。
まとめ
以上、Node-REDからECHONET Lite エミュレーターの状態取得と設備の操作を行いました。
次回はKNX見える化サーバーのComfortClickからEHONET Liteエミュレーターの操作する方法について検証してみます。あと、matter連携もやってみたいですね。