EF5600-DN1 LoRaWAN Electrical Fire Monitor User Guide
Device Information: Model EF5600-DN1, devEui ffffff100004e99f, gateway IP 192.168.31.205, Modbus Slave ID 7, BACnet Device ID 106
1 Protocol Overview
The EF5600-DN1 reports three-phase voltage, current, power, power factor, energy, leakage current, temperature sensors, environment conditions, and alarm status on Fport 210.
1.1 Uplink Data Protocol (Fport 210)
Payload format (Fport 210):
| Byte | Field | Description |
|---|---|---|
| 0 | Reserved | Always 0x00 (protocol version) |
| 1 … N | TLV pairs | [Type(1 B)][Value(N B)] … repeating until end |
Each Type byte determines the field name and the number of following value bytes:
| Type | Value Bytes | Field Name | Encoding | Scale | Unit | Notes |
|---|---|---|---|---|---|---|
0x01 |
1 | model |
uint8 | — | — | Model code = 0x5B |
0x6D |
1 | packetType |
uint8 | — | — | 0x00=heartbeat 0x01=data report |
0x22 |
1 | switch |
uint8 | — | — | 0=breaker open (OFF) 1=breaker closed (ON) |
0xC6 |
1+N | elecData |
block | — | — | Length byte (0x66=102) + 102-byte electrical data block; see sub-table below |
0xC7 |
2 | alarmAttribute |
bitfield16 BE | — | — | Alarm attribute bitfield; see alarm bit definitions below |
0xC8 |
2 | alarmEvent |
bitfield16 BE | — | — | Alarm event bitfield (same bit layout as 0xC7) |
EF5600-DN1 0xC6 Electrical Data Block (102 bytes after length byte)
| Offset | Bytes | Field | Encoding | Scale | Unit |
|---|---|---|---|---|---|
| 0 | 2 | voltageA | uint16 BE | ÷10 | V |
| 2 | 2 | voltageB | uint16 BE | ÷10 | V |
| 4 | 2 | voltageC | uint16 BE | ÷10 | V |
| 6 | 2 | currentA | uint16 BE | ÷10 | A |
| 8 | 2 | currentB | uint16 BE | ÷10 | A |
| 10 | 2 | currentC | uint16 BE | ÷10 | A |
| 12 | 2 | leakageCurrent | uint16 BE | ÷10 | mA |
| 14 | 2 | tempSensor1 | int16 BE | ÷10 | °C |
| 16 | 2 | tempSensor2 | int16 BE | ÷10 | °C |
| 18 | 2 | tempSensor3 | int16 BE | ÷10 | °C |
| 20 | 2 | tempSensor4 | int16 BE | ÷10 | °C |
| 22 | 2 | envTemperature | int16 BE | ÷10 | °C |
| 24 | 2 | envHumidity | uint16 BE | ÷10 | % |
| 26 | 4 | activePowerA | float32 BE | — | W |
| 30 | 4 | activePowerB | float32 BE | — | W |
| 34 | 4 | activePowerC | float32 BE | — | W |
| 38 | 4 | activePowerTotal | float32 BE | — | W |
| 42 | 4 | reactivePowerA | float32 BE | — | var |
| 46 | 4 | reactivePowerB | float32 BE | — | var |
| 50 | 4 | reactivePowerC | float32 BE | — | var |
| 54 | 4 | reactivePowerTotal | float32 BE | — | var |
| 58 | 4 | apparentPowerA | float32 BE | — | VA |
| 62 | 4 | apparentPowerB | float32 BE | — | VA |
| 66 | 4 | apparentPowerC | float32 BE | — | VA |
| 70 | 4 | apparentPowerTotal | float32 BE | — | VA |
| 74 | 4 | powerFactorA | float32 BE | — | — |
| 78 | 4 | powerFactorB | float32 BE | — | — |
| 82 | 4 | powerFactorC | float32 BE | — | — |
| 86 | 4 | powerFactorTotal | float32 BE | — | — |
| 90 | 4 | activeEnergy | float32 BE | — | kWh |
| 94 | 4 | reactiveEnergy | float32 BE | — | kvarh |
| 98 | 4 | apparentEnergy | float32 BE | — | kVAh |
0xC7 / 0xC8 Alarm Bitfield (16-bit, big-endian):
| Bit | Field |
|---|---|
| 0 | Overcurrent Phase A |
| 1 | Overcurrent Phase B |
| 2 | Overcurrent Phase C |
| 3 | Overvoltage Phase A |
| 4 | Overvoltage Phase B |
| 5 | Overvoltage Phase C |
| 6 | Undervoltage Phase A |
| 7 | Undervoltage Phase B |
| 8 | Undervoltage Phase C |
| 9 | Short circuit |
| 10 | Temp sensor 1 alarm |
| 11 | Temp sensor 2 alarm |
| 12 | Temp sensor 3 alarm |
| 13 | Temp sensor 4 alarm |
| 14 | Leakage current alarm |
JavaScript Decoder Example:
// EF5600-DN1 Electrical Fire Monitor — Fport 210 uplink decoder
function decodeUplink(bytes) {
var i = 1, r = {};
function u16(b,o){ return (b[o]<<8)|b[o+1]; }
function i16(b,o){ var v=u16(b,o); return v>32767?v-65536:v; }
function flt(b,o){ // IEEE 754 float32 big-endian
var bits=((b[o]<<24)|(b[o+1]<<16)|(b[o+2]<<8)|b[o+3])>>>0;
var s=(bits>>>31)?-1:1, e=(bits>>>23)&0xFF, m=bits&0x7FFFFF;
if(e===255) return m?NaN:s*Infinity;
return s*(e?1+m/8388608:m/8388608)*Math.pow(2,e?e-127:-126);
}
function alarmBits(bits){
return {
alarmOvercurrentA:(bits&0x0001)!==0, alarmOvercurrentB:(bits&0x0002)!==0,
alarmOvercurrentC:(bits&0x0004)!==0, alarmOvervoltageA:(bits&0x0008)!==0,
alarmOvervoltageB:(bits&0x0010)!==0, alarmOvervoltageC:(bits&0x0020)!==0,
alarmUndervoltageA:(bits&0x0040)!==0, alarmLeakage:(bits&0x4000)!==0
};
}
while (i < bytes.length) {
var t = bytes[i++];
switch (t) {
case 0x01: r.model = bytes[i++]; break;
case 0x22: r.switch = bytes[i++]; break; // 0=open 1=closed
case 0x6D: r.packetType= bytes[i++]; break;
case 0xC6: {
var len = bytes[i++], o = i;
r.voltageA = u16(bytes,o)/10; r.voltageB=u16(bytes,o+2)/10; r.voltageC=u16(bytes,o+4)/10;
r.currentA = u16(bytes,o+6)/10; r.currentB=u16(bytes,o+8)/10; r.currentC=u16(bytes,o+10)/10;
r.leakageCurrent = u16(bytes,o+12)/10;
r.tempSensor1= i16(bytes,o+14)/10; r.tempSensor2=i16(bytes,o+16)/10;
r.tempSensor3= i16(bytes,o+18)/10; r.tempSensor4=i16(bytes,o+20)/10;
r.envTemperature=i16(bytes,o+22)/10; r.envHumidity=u16(bytes,o+24)/10;
r.activePowerA=flt(bytes,o+26); r.activePowerB=flt(bytes,o+30);
r.activePowerC=flt(bytes,o+34); r.activePowerTotal=flt(bytes,o+38);
r.activeEnergy=flt(bytes,o+90);
i += len; break;
}
case 0xC7: { r.alarmAttribute = Object.assign(alarmBits(u16(bytes,i)),{raw:u16(bytes,i)}); i+=2; break; }
case 0xC8: { r.alarmEvent = Object.assign(alarmBits(u16(bytes,i)),{raw:u16(bytes,i)}); i+=2; break; }
default: i++; break;
}
}
return r;
}
Script download: LPP.zip
Compatibility note: LPP.js is developed and tested against ChirpStack v4.17.0. The ChirpStack JavaScript codec API may differ across versions — if you are running a different ChirpStack version, review and adjust the script as needed before deployment.
1.2 Downlink Control Protocol
The EF5600-DN1 supports breaker open and breaker close commands via Fport 2.
Fport: 2 — 0x09 0x5B (model device header)
Packet format: 09 5B [ActionCode] [Params...] Setting address A and value V are uint16 BE. The addresses 0x1001–0x1007 correspond to thresholds (overcurrent %, overvoltage %, undervoltage %, overtemperature, temp/humidity, leakage).
| CmdCode | Packet Bytes | Description |
|---|---|---|
0x01 |
09 5B 01 |
Reset device |
0x02 |
09 5B 02 |
Self-test |
0x03 |
09 5B 03 |
Silence alarm |
0x04 |
09 5B 04 |
Breaker OPEN (cut power) |
0x05 |
09 5B 05 |
Breaker CLOSE (restore power) |
0x06 |
09 5B 06 A1 A0 |
Query setting at address A (uint16 BE) |
0x07 |
09 5B 07 A1 A0 V1 V0 |
Write setting: address A = value V (both uint16 BE) |
JavaScript Encoder Example:
// EF5600-DN1 Electrical Fire Monitor — Fport 2 downlink encoder
function encodeDownlink(data) {
// data.command : 'reset'|'selfTest'|'silence'|'breakerOpen'|'breakerClose'
// data.queryAddress (optional uint16) : address to query
// data.setAddress (optional uint16) : address to write
// data.setValue (optional uint16) : value to write
var H = [0x09, 0x5B];
var u16 = function(n){ return [(n>>8)&0xFF, n&0xFF]; };
var cmd = String(data.command||'').trim().toLowerCase();
switch(cmd) {
case 'reset': return H.concat([0x01]);
case 'selftest': case 'self_test': return H.concat([0x02]);
case 'silence': return H.concat([0x03]);
case 'breakeropen': case 'open': return H.concat([0x04]);
case 'breakerclose': case 'close': return H.concat([0x05]);
case 'query':
if (data.queryAddress === undefined) return [];
return H.concat([0x06]).concat(u16(Number(data.queryAddress)));
case 'set': case 'write':
if (data.setAddress === undefined || data.setValue === undefined) return [];
return H.concat([0x07]).concat(u16(Number(data.setAddress))).concat(u16(Number(data.setValue)));
default: return [];
}
}
// Examples:
// encodeDownlink({command:'breakerClose'}) → [0x09,0x5B,0x05]
// encodeDownlink({command:'query', queryAddress:0x1002}) → [0x09,0x5B,0x06,0x10,0x02]
// encodeDownlink({command:'set', setAddress:0x1002, setValue:120}) → [0x09,0x5B,0x07,0x10,0x02,0x00,0x78]
2 Getting Uplink Data
⚠️ The IP addresses (192.168.31.205/192.168.31.193), ChirpStack API token, Slave ID, BACnet Device ID, and devEui in the examples below are for demonstration only. Replace them with your actual gateway IP, ChirpStack API token, and device parameters.
2.1 ChirpStack MQTT Subscription
Subscribe to the MQTT topic to receive real-time uplink frames:
Application ID —3ef9e6b9-ec54-4eda-86b8-a5fb46899f39is the factory-default ChirpStack
application built into the gateway. Replace it with your actual application
ID if you have created a different one.
Gateway IP —192.168.31.205is the gateway WAN port IP shown as an
example. Replace it with your actual gateway IP address.
Device EUI —ffffff100004e99fis the EUI of the example device.
Replace it with the EUI shown in the gateway device list, or use+
as a wildcard to subscribe to all devices at once.
# Subscribe to one specific device
mosquitto_sub -h 192.168.31.205 -p 1883 \
-u gateway -P mqtt88888888 \
-t "application/3ef9e6b9-ec54-4eda-86b8-a5fb46899f39/device/ffffff100004e99f/event/up"
# Subscribe to ALL devices on ALL applications (wildcard)
mosquitto_sub -h 192.168.31.205 -p 1883 \
-u gateway -P mqtt88888888 \
-t "application/+/device/+/event/up"
Example uplink payload (JSON):
{
"devEui": "ffffff100004e99f",
"fPort": 210,
"object": {
... (decoded LPP fields)
}
}
2.2 IoT Hub HTTP API
Send a GET request to retrieve the latest device state:
curl -s "http://192.168.31.205:8070/api/getStatus?devEui=ffffff100004e99f"
{
"success": true,
"result": {
"switch": true,
"voltageA": 236.7,
"voltageB": 235.8,
"voltageC": 237,
"voltageAvg": 236.5,
"currentA": 0,
"currentB": 0,
"currentC": 0,
"currentAvg": 0,
"activePowerA": 0,
"activePowerB": 0,
"activePowerC": 0,
"activePowerTotal": 0,
"reactivePowerA": 0,
"reactivePowerB": 0,
"reactivePowerC": 0,
"reactivePowerTotal": 0,
"apparentPowerA": 0,
"apparentPowerB": 0,
"apparentPowerC": 0,
"apparentPowerTotal": 0.08,
"powerFactorA": 1,
"powerFactorB": 1,
"powerFactorC": 1,
"powerFactorTotal": -1,
"activeEnergy": 10.4,
"reactiveEnergy": 0.8,
"apparentEnergy": 31.2,
"leakageCurrent": 0,
"tempSensor1": 31.3,
"tempSensor2": 32,
"tempSensor3": 0,
"tempSensor4": 0,
"tempAvg": 15.8,
"envTemperature": 33,
"envHumidity": 41.9,
"electricalAlarm": false,
"alarmOvercurrentA": false,
"alarmOvercurrentB": false,
"alarmOvercurrentC": false,
"alarmOvercurrentAEvent": false,
"alarmOvercurrentBEvent": false,
"alarmOvercurrentCEvent": false,
"alarmOvervoltageA": false,
"alarmOvervoltageB": false,
"alarmOvervoltageC": false,
"alarmOvervoltageAEvent": false,
"alarmOvervoltageBEvent": false,
"alarmOvervoltageCEvent": false,
"alarmUndervoltageA": false,
"alarmUndervoltageB": false,
"alarmUndervoltageC": false,
"alarmUndervoltageAEvent": false,
"alarmUndervoltageBEvent": false,
"alarmUndervoltageCEvent": false,
"alarmShortCircuit": false,
"alarmShortCircuitEvent": false,
"alarmTempSensor1": false,
"alarmTempSensor2": false,
"alarmTempSensor3": false,
"alarmTempSensor4": false,
"alarmTempSensor1Event": false,
"alarmTempSensor2Event": false,
"alarmTempSensor3Event": false,
"alarmTempSensor4Event": false,
"alarmLeakage": false,
"alarmLeakageEvent": false,
"model": "EF5600-DN1"
}
}
2.3 IoT Hub Modbus TCP — Python Script
Script download: modbus_tcp_read.py
Use modbus_tcp_read.py to poll all registers at once:
python3 modbus_tcp_read.py --ip 192.168.31.205 --port 502 \
--slaveId 7 --sensorType EF5600-DN1
Target: 192.168.31.205:502 | Slave ID: 7 | Sensor: EF5600-DN1
================================================================================================================================================================
Attribute | Addr | FC | Format | Order | Cnt | Scale | Raw(Hex) | Value | Unit
----------------------------------------------------------------------------------------------------------------------------------------------------------------
online | 6 | 03 | Bit/Bool | Big(ABCD) | 1 | x1 | 0001 | true | none
lastOnlineTime | 7 | 03 | UnixTime | Big(ABCD) | 2 | x1 | 69CC CD76 | 1775029622 | second
ef5600CommandCode | 9 | 03 | Int16 | Big(ABCD) | 1 | x1 | 0000 | 0.0 | none
ef5600SettingAddress | 10 | 03 | Int16 | Big(ABCD) | 1 | x1 | 0000 | 0.0 | none
ef5600SettingValueHigh | 11 | 03 | Int16 | Big(ABCD) | 1 | x1 | 0000 | 0.0 | none
ef5600SettingValueLow | 12 | 03 | Int16 | Big(ABCD) | 1 | x1 | 0000 | 0.0 | none
switch | 13 | 03 | Bit/Bool | Big(ABCD) | 1 | x1 | 0001 | true | none
voltageA | 14 | 03 | Int16(S) | Big(ABCD) | 1 | /10 | 093F | 236.7 | volt
voltageB | 15 | 03 | Int16(S) | Big(ABCD) | 1 | /10 | 0936 | 235.8 | volt
voltageC | 16 | 03 | Int16(S) | Big(ABCD) | 1 | /10 | 0942 | 237.0 | volt
voltageAvg | 17 | 03 | Int16(S) | Big(ABCD) | 1 | /10 | 093D | 236.5 | volt
currentA | 18 | 03 | Int16(S) | Big(ABCD) | 1 | /10 | 0000 | 0.0 | ampere
... (77 fields total)
2.4 IoT Hub Modbus TCP — Modbus Poll
Tool download: Modbus Poll 9.5.0.1507.zip
- Open Modbus Poll, connect to
192.168.31.205:502, Slave ID7 - Menu Setup → Read/Write Definition, set Function Code = FC03, Start Address =
6, Length =132 - Click OK — values update in real-time
2.5 IoT Hub BACnet BIP — Python Script
Script download: bacnet_read.py
Use bacnet_read.py to read all BACnet objects:
python3 bacnet_read.py --ip 192.168.31.205 --port 47808 --id 106
Target: 192.168.31.205:47808 | BACnet ID: 106 | Scan: 10600-10699
------------------------------------------------------------
Type | Instance | Offset | Value | Object Name
------------------------------------------------------------
BI | 10602 | 2 | active | ffffff100004e99f.online
AI | 10603 | 3 | 1775029888.00 | ffffff100004e99f.lastOnlineTime
AV | 10604 | 4 | 0.00 | ffffff100004e99f.ef5600CommandCode
AV | 10605 | 5 | 0.00 | ffffff100004e99f.ef5600SettingAddress
AV | 10606 | 6 | 0.00 | ffffff100004e99f.ef5600SettingValueHigh
AV | 10607 | 7 | 0.00 | ffffff100004e99f.ef5600SettingValueLow
BV | 10608 | 8 | active | ffffff100004e99f.switch
AI | 10609 | 9 | 236.70 | ffffff100004e99f.voltageA
AI | 10610 | 10 | 235.80 | ffffff100004e99f.voltageB
AI | 10611 | 11 | 236.90 | ffffff100004e99f.voltageC
AI | 10612 | 12 | 236.50 | ffffff100004e99f.voltageAvg
AI | 10613 | 13 | 0.00 | ffffff100004e99f.currentA
... (80 objects total)
2.6 IoT Hub BACnet BIP — YABE
Tool download: SetupYabe_v2.1.0.exe
- Open YABE, connect to
192.168.31.205:47808 - Expand Device 106 in the device tree
- Browse AI/BI/AV/BV/CV objects to view real-time values
3 Sending Control Commands
The EF5600-DN1 supports breaker open and breaker close commands via Fport 2.
⚠️ The IP addresses (192.168.31.205/192.168.31.193), ChirpStack API token, Slave ID, BACnet Device ID, and devEui in the examples below are for demonstration only. Replace them with your actual gateway IP, ChirpStack API token, and device parameters.
Script downloads: modbus_tcp_write.py · bacnet_write.py
Example 1: Breaker Open (Relay OFF — cut power)
Modbus TCP:
python3 modbus_tcp_write.py --ip 192.168.31.205 --port 502 --slaveId 7 --sensorType EF5600-DN1 breakerOpen
Target: 192.168.31.205:502 | Slave ID: 7 | Sensor: EF5600-DN1
Expected values:
ef5600CommandCode: 4
ef5600SettingAddress: 0
ef5600SettingValueHigh: 0
ef5600SettingValueLow: 0
Expected confirmed state:
switch: 0
Attempt 1/1: writing control values (default)...
Modbus Poll write guide:
Batch 1: FC16 Write Multiple Registers | Start register: 9 (4x40010) | Count: 4
ef5600CommandCode -> register 9 (4x40010) raw=4 signed=4
ef5600SettingAddress -> register 10 (4x40011) raw=0 signed=0
ef5600SettingValueHigh -> register 11 (4x40012) raw=0 signed=0
ef5600SettingValueLow -> register 12 (4x40013) raw=0 signed=0
Observed values:
switch: 0
Link confirmation time: 4.154s
Control completed in: 4.166s
The script automatically writes registers and reads them back for verification. The Modbus Poll write guide section in the output can be used directly as a reference for manual writes in Modbus Poll.
Modbus Poll:
- Connect to the gateway (IP
192.168.31.205, Port502, Slave ID7) - Menu Functions → 16 Write Multiple Registers
- Refer to the Modbus Poll write guide in the script output above for the Register Address and value to enter
- Click Send to send the write command
BACnet BIP:
python3 bacnet_write.py --ip 192.168.31.205 --port 47808 --id 106 --sensorType EF5600-DN1 breakerOpen
Target: 192.168.31.205:47808 | BACnet ID: 106 | Sensor: EF5600-DN1
Expected values:
ef5600CommandCode: 4
ef5600SettingAddress: 0
ef5600SettingValueHigh: 0
ef5600SettingValueLow: 0
Expected confirmed state:
switch: 0
Attempt 1/1: writing control values (default)...
YABE write guide:
ef5600CommandCode -> object analog-value,10604 | property present-value | type=analog-value | write=4
ef5600SettingAddress -> object analog-value,10605 | property present-value | type=analog-value | write=0
ef5600SettingValueHigh -> object analog-value,10606 | property present-value | type=analog-value | write=0
ef5600SettingValueLow -> object analog-value,10607 | property present-value | type=analog-value | write=0
Observed values:
switch: 0
Link confirmation time: 7.754s
Control completed in: 7.809s
The script automatically writes and reads back for verification. The YABE write guide section in the output can be used directly as a YABE manual-write reference.
YABE:
- Connect to the gateway (IP
192.168.31.205, Port47808), expand Device 106 - Refer to the YABE write guide in the script output above to locate the corresponding object
- Right-click the object → Write Property, set the property to
present-value, enter the target value, then click Write
IoT Hub HTTP:
Endpoint: POST http://192.168.31.205:8070/api/sendCommand
curl -s -X POST "http://192.168.31.205:8070/api/sendCommand" \
-H "Content-Type: application/json" \
-d '{"devEui":"ffffff100004e99f","params":{"ef5600CommandCode":4,"ef5600SettingAddress":0,"ef5600SettingValueHigh":0,"ef5600SettingValueLow":0}}'
{
"success": true,
"result": {
"devEui": "ffffff100004e99f",
"status": "buffered"
}
}
ChirpStack REST API:
Endpoint: POST http://192.168.31.205:8090/api/devices/ffffff100004e99f/queue
curl -s -X POST 'http://192.168.31.205:8090/api/devices/ffffff100004e99f/queue' \
-H 'accept: application/json' \
-H 'Grpc-Metadata-Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{"flushQueue":true,"queueItem":{"confirmed":false,"isPending":false,"object":{"model":"EF5600-DN1","command":"breakerOpen"}}}'
{
"id": "4e8b2c17-5f93-4a01-b8d0-2c91ef345678"
}
Formatted JSON payload:
{
"flushQueue": true,
"queueItem": {
"confirmed": false,
"isPending": false,
"object": {
"model": "EF5600-DN1",
"command": "breakerOpen"
}
}
}
ChirpStack MQTT:
mosquitto_pub -h 192.168.31.205 -p 1883 -u gateway -P mqtt88888888 \
-t "application/3ef9e6b9-ec54-4eda-86b8-a5fb46899f39/device/ffffff100004e99f/command/down" \
-m '{"flushQueue":true,"devEui":"ffffff100004e99f","confirmed":false,"object":{"model":"EF5600-DN1","command":"breakerOpen"}}'
Formatted JSON payload:
{
"flushQueue": true,
"devEui": "ffffff100004e99f",
"confirmed": false,
"object": {
"model": "EF5600-DN1",
"command": "breakerOpen"
}
}
Example 2: Breaker Close (Relay ON — restore power)
Modbus TCP:
python3 modbus_tcp_write.py --ip 192.168.31.205 --port 502 --slaveId 7 --sensorType EF5600-DN1 breakerClose
Target: 192.168.31.205:502 | Slave ID: 7 | Sensor: EF5600-DN1
Expected values:
ef5600CommandCode: 5
ef5600SettingAddress: 0
ef5600SettingValueHigh: 0
ef5600SettingValueLow: 0
Expected confirmed state:
switch: 1
Attempt 1/1: writing control values (default)...
Modbus Poll write guide:
Batch 1: FC16 Write Multiple Registers | Start register: 9 (4x40010) | Count: 4
ef5600CommandCode -> register 9 (4x40010) raw=5 signed=5
ef5600SettingAddress -> register 10 (4x40011) raw=0 signed=0
ef5600SettingValueHigh -> register 11 (4x40012) raw=0 signed=0
ef5600SettingValueLow -> register 12 (4x40013) raw=0 signed=0
Observed values:
switch: 1
Link confirmation time: 4.154s
Control completed in: 4.166s
The script automatically writes registers and reads them back for verification. The Modbus Poll write guide section in the output can be used directly as a reference for manual writes in Modbus Poll.
Modbus Poll:
- Connect to the gateway (IP
192.168.31.205, Port502, Slave ID7) - Menu Functions → 16 Write Multiple Registers
- Refer to the Modbus Poll write guide in the script output above for the Register Address and value to enter
- Click Send to send the write command
BACnet BIP:
python3 bacnet_write.py --ip 192.168.31.205 --port 47808 --id 106 --sensorType EF5600-DN1 breakerClose
Target: 192.168.31.205:47808 | BACnet ID: 106 | Sensor: EF5600-DN1
Expected values:
ef5600CommandCode: 5
ef5600SettingAddress: 0
ef5600SettingValueHigh: 0
ef5600SettingValueLow: 0
Expected confirmed state:
switch: 1
Attempt 1/1: writing control values (default)...
YABE write guide:
ef5600CommandCode -> object analog-value,10604 | property present-value | type=analog-value | write=5
ef5600SettingAddress -> object analog-value,10605 | property present-value | type=analog-value | write=0
ef5600SettingValueHigh -> object analog-value,10606 | property present-value | type=analog-value | write=0
ef5600SettingValueLow -> object analog-value,10607 | property present-value | type=analog-value | write=0
Observed values:
switch: 1
Link confirmation time: 7.754s
Control completed in: 7.809s
The script automatically writes and reads back for verification. The YABE write guide section in the output can be used directly as a YABE manual-write reference.
YABE:
- Connect to the gateway (IP
192.168.31.205, Port47808), expand Device 106 - Refer to the YABE write guide in the script output above to locate the corresponding object
- Right-click the object → Write Property, set the property to
present-value, enter the target value, then click Write
IoT Hub HTTP:
Endpoint: POST http://192.168.31.205:8070/api/sendCommand
curl -s -X POST "http://192.168.31.205:8070/api/sendCommand" \
-H "Content-Type: application/json" \
-d '{"devEui":"ffffff100004e99f","params":{"ef5600CommandCode":5,"ef5600SettingAddress":0,"ef5600SettingValueHigh":0,"ef5600SettingValueLow":0}}'
{
"success": true,
"result": {
"devEui": "ffffff100004e99f",
"status": "buffered"
}
}
ChirpStack REST API:
Endpoint: POST http://192.168.31.205:8090/api/devices/ffffff100004e99f/queue
curl -s -X POST 'http://192.168.31.205:8090/api/devices/ffffff100004e99f/queue' \
-H 'accept: application/json' \
-H 'Grpc-Metadata-Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{"flushQueue":true,"queueItem":{"confirmed":false,"isPending":false,"object":{"model":"EF5600-DN1","command":"breakerClose"}}}'
{
"id": "4e8b2c17-5f93-4a01-b8d0-2c91ef345678"
}
Formatted JSON payload:
{
"flushQueue": true,
"queueItem": {
"confirmed": false,
"isPending": false,
"object": {
"model": "EF5600-DN1",
"command": "breakerClose"
}
}
}
ChirpStack MQTT:
mosquitto_pub -h 192.168.31.205 -p 1883 -u gateway -P mqtt88888888 \
-t "application/3ef9e6b9-ec54-4eda-86b8-a5fb46899f39/device/ffffff100004e99f/command/down" \
-m '{"flushQueue":true,"devEui":"ffffff100004e99f","confirmed":false,"object":{"model":"EF5600-DN1","command":"breakerClose"}}'
Formatted JSON payload:
{
"flushQueue": true,
"devEui": "ffffff100004e99f",
"confirmed": false,
"object": {
"model": "EF5600-DN1",
"command": "breakerClose"
}
}