This guide organizes the raw interface documentation into a "run it first, then extend" sequence: discover devices, read state, and finally perform control and pass-through. Endpoint: TCP:8080. Protocol: JSON / Modbus. Recommended sequence: mDNS → JSON → Control → Pass-through.
Meters & readers
Power / Electricity
PV / AC / Battery
Active Power
Connector 1 / 2
Power / Temp
This guide organizes the raw interface documentation into a "run it first, then extend" sequence: discover the device first, then read state, and finally perform control and pass-through. It is best suited for first-time integration: anyone who wants to quickly ingest EMS data into their own application, dashboard, gateway, or platform.
| Stage | Suggestion |
|---|---|
| Step 1 | Discover the device IP and port via mDNS |
| Step 2 | Use HA JSON to read device parameters and confirm connectivity |
| Step 3 | Read energy control parameters, then perform writes |
| Step 4 | If you already have industrial protocols, see RTU / TCP pass-through |
If you don't know which interface to start with, follow the sequence below — it saves time.
| Scenario | Priority Interface | Reason |
|---|---|---|
| Confirm device reachability | mDNS + HA JSON read |
Read-only interface is low risk and easiest to verify network and device state |
| Monitoring only | HA JSON data interface |
Get device state, power, SOC and similar data |
| Change strategies or limits | Energy control parameters interface | Supports reading and setting control parameters |
| Already have RTU frames | Modbus RTU pass-through |
Forward existing frames directly to EMS |
| Native Modbus system | Modbus TCP interface |
Suited for PLC, gateways, and industrial hosts |
s_ip and s_port.
Response, SerialNumber, Target.
The most important fields in a JSON request are: Get / Set / Response / SerialNumber / CommandSource / Target.
Get
Read method name, e.g. EnergyParameter
Set
Write method name, e.g. EnergycontrolparametersList, DataTransmission
Response
Response method name, used to confirm the return type
SerialNumber
Request sequence, recommended to auto-increment by 1 each time
CommandSource
Command source, commonly Web
Target
Response target, commonly Web or HA
Example request:
{
"Get": "EnergyParameter",
"SerialNumber": 1,
"CommandSource": "Web"
}
mDNS answers two questions: where the device is, and what this device is.
7.1 mDNS Fields
| Field | Description | Type |
|---|---|---|
_http._tcp |
Service type identifier | String |
SXD-mDNS.local |
Domain name | String |
s_sn |
Device serial number | String |
s_ip |
Device IP address | String |
s_port |
Service port | String |
s_type |
Device type | String |
7.2 mDNS Data Example
{
"_http._tcp": "SXD-mDNS-IF-NKYWLTS011",
"SXD-mDNS.local": "8080",
"s_sn": "NKYWLTS011",
"s_ip": "192.168.3.206",
"s_port": "8080",
"s_type": "131"
}
This interface is best suited for monitoring, dashboards, and first-time connectivity tests. Get "device parameters" working first, then expand fields gradually.
It is recommended to look at top-level summary fields first, then expand device lists. This makes debugging easier — is it network, message, or field parsing?
Response / SerialNumber / Target first, then list fields8.1 Minimum Request for Device Parameters
{
"Get": "EnergyParameter",
"SerialNumber": 1,
"CommandSource": "Web"
}
8.2 Response: Top-Level Summary + Multiple Device Lists
{
"Response": "EnergyParameter",
"SerialNumber": 1,
"Target": "Web",
"Storage_list": [{
"DevAddr": 1,
"StorageSN": "ZL-2502250374-00039",
"StorageStatus": 1,
"PvChargingPower": 0,
"AcChargingPower": 0,
"BatterySoc": 100,
"BatteryDischargingPower": 50,
"AcInActivePower": -350,
"OffGridLoadPower": 0,
"BatteryChargingPower": 0,
"PvStringCount": 0,
"Pv1Power": 0,
"Pv2Power": 0,
"Pv3Power": 0,
"Pv4Power": 0
}],
"SSumInfoList": {
"ControlEnableStatus": 1,
"MeterTotalActivePower": 0,
"TotalPVPower": 4,
"TotalPVChargePower": 0,
"TotalACChargePower": 0,
"TotalSmartLoadElectricalPower": 0,
"AverageBatteryAverageSOC": 60,
"TotalBatteryOutputPower": 9,
"TotalGridOutputPower": -35,
"TotalBackUpPower": 0,
"TotalChargePower": 0
},
"ChargerInfoList": [{
"DevAddr": 55,
"lsThirdParty": 0,
"FansDevType": 0,
"lsInterconnect": 1,
"ChargerSN": "SXDI78C594",
"ChargerStatus": 1,
"Connector1Status": 0,
"Connector1Power": 0,
"Connector2Status": 0,
"Connector2Power": 0,
"ConnectorElectricity": 0
}],
"PlugInfoList": [{
"DevAddr": 110,
"lsThirdParty": 0,
"FansDevType": 6,
"lsInterconnect": 1,
"PlugSN": "NKPG1DDC40",
"PlugStatus": 0,
"PlugActvePower": 0,
"PlugVol": 2359,
"PlugCurrent": 0,
"PlugRatePower": 2000,
"PlugElectricity": 0
}],
"HotInfoList": [{
"DevAddr": 150,
"lsThirdParty": 0,
"FansDevType": 6,
"lsInterconnect": 1,
"HotSN": "SXDI7A47B8",
"HotStatus": 1,
"HotActvePower": 0,
"HotActvePowerMAX": 1200,
"HotTEMP": 258,
"HotTEMPMAX": 470
}]
}
8.3 Top-Level Key Fields
| Key Field | Description |
|---|---|
Response |
Response method name, usually EnergyParameter |
SerialNumber |
Request sequence, used to map responses to requests |
Target |
Response target, commonly Web or HA |
SSumInfoList |
Top-level power summary object |
PlugInfoList |
Smart plug device list |
ChargerInfoList |
Charger list |
Storage_list |
Energy storage list |
HotInfoList |
Hot water / heat pump device list |
8.4 Common List Fields
Group by list first, then look at business fields in detail — easiest to stay oriented.
| List Field | Common Fields | Purpose |
|---|---|---|
SSumInfoList |
ControlEnableStatus / MeterTotalActivePower / TotalPVPower / TotalChargePower |
Overall running state |
Storage_list |
StorageSN / StorageStatus / BatterySoc / BatteryChargingPower |
Energy storage state |
PlugInfoList |
PlugSN / PlugStatus / PlugActvePower / PlugVol / PlugCurrent |
Plug load |
ChargerInfoList |
ChargerSN / ChargerStatus / Connector1Status / Connector2Status |
Charger state |
HotInfoList |
HotSN / HotStatus / HotActvePower / HotTEMP |
Hot water device state |
InterverInfoList |
InterverSN / InterverStatus / InterverActivePower |
Inverter state |
8.5 SSumInfoList Field Details
| Field | Description | Type |
|---|---|---|
ControlEnableStatus |
Green-power plan switch, 0=Off / 1=On | int |
MeterTotalActivePower |
Meter total active power, unit W | double |
TotalPVPower |
PV power, unit W | double |
TotalPVChargePower |
PV total charge power, unit W | double |
TotalACChargePower |
AC total charge power, unit W | double |
TotalSmartLoadElectricalPower |
Smart load total electrical power, unit W | double |
AverageBatteryAverageSOC |
Battery average SOC, unit % | int |
TotalBatteryOutputPower |
Battery total output power, unit W | double |
TotalGridOutputPower |
Device total grid-tied power, unit W | double |
TotalBackUpPower |
Device total off-grid power, unit W | double |
TotalChargePower |
Battery total charge power, unit W | double |
8.6 Storage_list Field Details
| Field | Description | Type |
|---|---|---|
DevAddr |
Registration ID | int |
StorageSN |
Energy storage serial number | string |
StorageStatus |
Energy storage status, 0=Off / 1=On | int |
PvChargingPower |
Energy storage PV charge power, unit W | double |
AcChargingPower |
Energy storage AC charge power, unit W | double |
BatterySoc |
Energy storage battery SOC, unit % | int |
BatteryDischargingPower |
Battery discharge power, unit W | double |
AcInActivePower |
AC grid-tied active power, unit W | double |
OffGridLoadPower |
Off-grid load power, unit W | double |
BatteryChargingPower |
Battery charge power, unit W | double |
PvStringCount |
Number of PV input strings | int |
Pv1Power / Pv2Power / Pv3Power / Pv4Power |
Each PV input power, unit W | double |
8.7 PlugInfoList Field Details
| Field | Description | Type |
|---|---|---|
DevAddr |
Registration ID | int |
lsThirdParty |
Third-party device flag | int |
FansDevType |
Third-party device model | int |
PlugSN |
Plug serial number | string |
PlugStatus |
Plug status, 0=Off / 1=On | int |
PlugActvePower |
Plug active power, unit W | double |
PlugVol |
Plug voltage, unit V | double |
PlugCurrent |
Plug current, unit A | double |
PlugRatePower |
Plug rated power, unit W | double |
PlugElectricity |
Plug electricity, unit kWh | double |
8.8 ChargerInfoList Field Details
| Field | Description | Type |
|---|---|---|
DevAddr |
Registration ID | int |
lsThirdParty |
Third-party device flag | int |
FansDevType |
Third-party device model | int |
ChargerSN |
Charger serial number | string |
ChargerStatus |
Charger status | int |
Connector1Status |
Connector 1 status, 0=Off / 1=Ready / 2=Charging / 3=Charging end | int |
Connector1Power |
Connector 1 power, unit W | double |
Connector2Status |
Connector 2 status, 0=Off / 1=Ready / 2=Charging / 3=Charging end | int |
Connector2Power |
Connector 2 power, unit W | double |
ConnectorElectricity |
Connector electricity, unit kWh | double |
8.9 HotInfoList Field Details
| Field | Description | Type |
|---|---|---|
DevAddr |
Registration ID | int |
lsThirdParty |
Third-party device flag | int |
FansDevType |
Third-party device model | int |
HotSN |
Hot water device serial number | string |
HotStatus |
Hot water device status, 0=Off / 1=On | int |
HotActvePower |
Hot water device current power, unit W | double |
HotActvePowerMAX |
Hot water device max power, unit W | double |
HotTEMP |
Current temperature, raw value in tenths of a degree Celsius | int |
HotTEMPMAX |
Max temperature, raw value in tenths of a degree Celsius | int |
This interface is the entry point for reading and setting control strategies: power limits, time-period strategies, SOC control, and linkage control.
Before writing parameters, read the original values back and save them — especially for power periods, SOC thresholds, and peak/valley strategies.
| Field | Field Name | Type | Description |
|---|---|---|---|
Get |
Read method | string | "EnergycontrolparametersList": read energy control parameters |
Set |
Write method | string | "EnergycontrolparametersList": set energy control parameters |
Response |
Reply | string | "EnergycontrolparametersList": read/write reply |
SerialNumber |
Request sequence | int | Auto-incremented by 1 per request |
CommandSource |
Command source | string | "Web": web page |
Target |
Command source | string | "HA": Home Assistant |
RegControlField |
Read parameter fields | array | Array of secondary field names to read |
ControlInfoField |
Read result | object | Field names and normalized current values |
SetControlInfoField |
Set parameters | object | Field names and values to set |
SetParametersField |
Set success result | object | Successful fields and the actual values read back after setting |
SetFailedField |
Set failed result | object | Optional. Key is failed field name, value is the failure reason |
9.1 Read Request & Response
Request:
{
"Get": "EnergycontrolparametersList",
"SerialNumber": 1,
"CommandSource": "Web",
"RegControlField": [
"PhaseRecognitionTrigger",
"MeterSelector",
"SystemMaxPowerLimit",
"PowerRegulationOperatingPoint"
]
}
Response:
{
"Response": "EnergycontrolparametersList",
"SerialNumber": 1,
"Target": "Web",
"ControlInfoField": {
"EnergyManagement": "0",
"ScheduledModeEnabled": "1",
"PhaseRecognitionTrigger": "0",
"MeterSelector": "1",
"SystemMaxPowerLimit": "10800,3600,3600,3600",
"PhaseRecognitionPowerMultiplier": "50",
"PowerRegulationOperatingPoint": "10",
"DeviceGridInputPowerLimit": "800",
"PeakShavingConfig": "0:0",
"BaseDischargePower": "0",
"PeriodValidTimestamp": "2024-09-20 00:00:00",
"InstantControlPeriod": "255,20261231,0,00:00,23:59,800,0,6,100,10",
"ValleyChargePowerStrategy": "0",
"SystemAcChargePowerLimits": "4200,1400,1400,1400",
"VppDispatchPeriod": "255,20261231,0,00:00,23:59,800,100,10,7000"
}
}
9.2 Write Request & Response
Request:
{
"Set": "EnergycontrolparametersList",
"SerialNumber": 2,
"CommandSource": "Web",
"SetControlInfoField": {
"PhaseRecognitionTrigger": "0",
"MeterSelector": "1",
"SystemMaxPowerLimit": "10800,3600,3600,3600",
"PhaseRecognitionPowerMultiplier": "50",
"PowerRegulationOperatingPoint": "10",
"DeviceGridInputPowerLimit": "800"
}
}
Response:
{
"Response": "EnergycontrolparametersList",
"SerialNumber": 2,
"Target": "Web",
"SetParametersField": {
"PhaseRecognitionTrigger": "0",
"MeterSelector": "1",
"SystemMaxPowerLimit": "10800,3600,3600,3600"
}
}
SetFailedField; when all fields succeed, this field may be omitted.
9.3 Common Field Reference
| Field | Parameter Description | Type | Unit | R/W | Explanation |
|---|---|---|---|---|---|
EnergyManagement |
Energy management linkage enable | String | / | R/W | 0: Off / 1: On |
ScheduledModeEnabled |
Scheduled mode enable | String | / | R/W | 0: Off / 1: On but no power compensation / 2: On with power compensation |
PhaseRecognitionTrigger |
Phase recognition trigger | String | / | R/W | 0: Clear / idle / 1: Trigger one phase recognition |
MeterSelector |
Meter selection | String | / | R/W | Meter ID participating in energy management control, non-negative integer |
SystemMaxPowerLimit |
System max power limit | String | W | R/W | Format: totalLimitW,phaseALimitW,phaseBLimitW,phaseCLimitW |
PhaseRecognitionPowerMultiplier |
Phase recognition power multiplier | String | / | R/W | Non-negative integer |
PowerRegulationOperatingPoint |
Power regulation operating point | String | W | R/W | Signed integer |
DeviceGridInputPowerLimit |
Device grid input power limit | String | W | R/W | Upper limit of grid input power, non-negative integer |
PeakShavingConfig |
Peak-shaving configuration | String | / | R/W | Format: enable:socThreshold; example: 1:50; normalized to 0:0 when off |
BaseDischargePower |
Base discharge power | String | W | R/W | Base discharge power field |
PeriodValidTimestamp |
Period valid timestamp | String | / | R/W | Format: "yyyy-mm-dd hh:mm:ss"; example: "2024-09-20 00:00:00" |
9.4 Time Period Fields
| Field | Description |
|---|---|
PowerControlPeriod1 ~ PowerControlPeriod16 |
Power control period 1 to 16. Same format. Suitable for site time-period configuration. |
[时间段使能],[起始时间],[结束时间],[强制取/馈电功率限制],[允许取电功率限制],[功率控制模式],[充电最大 SOC],[放电最小 SOC]
Example:
"1,09:00,23:59,1000,500,0,100,10"
Means: this period is enabled, time 09:00 to 23:59, forced take/feed power limit 1000W, allowed take power limit 500W.
9.5 Other Combined Fields
| Field | Description |
|---|---|
InstantControlPeriod |
Instant control period. Common format includes date, time period, power limit and SOC threshold. |
ValleyChargePowerStrategy |
Valley charge power strategy. |
SystemAcChargePowerLimits |
System AC charge power limits, usually total + per-phase. |
VppDispatchPeriod |
Virtual power plant dispatch period. |
If you already have standard Modbus RTU frames, there is no need to rewrite business logic — just pass them through.
This interface is suitable for forwarding existing RTU frames directly to EMS. Note that TransmittedData must be a complete RTU frame with CRC, and bytes are separated by spaces.
10.1 Pass-through Field Reference
| Field | Field Name | Type | Description |
|---|---|---|---|
Set |
Write method | string | "DataTransmission": data pass-through |
Response |
Reply | string | Returns pass-through result |
SerialNumber |
Request sequence | int | Auto-incremented by 1 per request |
CommandSource |
Command source | string | "Web": web page |
Target |
Command source | string | "HA": Home Assistant |
SetCommand |
Pass-through parameters | string | Pass-through parameter configuration |
FunctionCode |
Function code | string | Supports 0x03 / 0x04 / 0x06 / 0x10 |
TransmittedData |
Pass-through data | string | Pass-through data for set / return |
CommandResponse |
Pass-through response | string | Response data |
ControlState |
Pass-through state | string | Success: "succeed" / Failure: "fail" |
10.2 Send Example
{
"Set": "DataTransmission",
"SerialNumber": 1,
"CommandSource": "Web",
"SetCommand": {
"FunctionCode": 3,
"TransmittedData": "01 03 FE 06 00 03 56 67"
}
}
10.3 Response Example
{
"Response": "DataTransmission",
"SerialNumber": 1,
"Target": "Web",
"CommandResponse": {
"FunctionCode": 3,
"ControlState": "succeed",
"TransmittedData": "01 03 06 00 01 02 03 04 05 2F CE"
}
}
TransmittedData is a complete RTU frame string, including CRC, with bytes separated by spaces. Before sending, verify the raw frame with a serial tool, then convert to string.
Modbus TCP is used to directly read EMS-accessed devices' registers, suitable for PLCs, gateways, and industrial hosts.
11.1 Standard Message Examples
Request (0x03):
00 01 00 00 00 06 01 03 FE 06 00 03
Response:
00 01 00 00 00 09 01 03 06 00 01 00 02 00 03
| Stage | What to Check | Pass Criteria |
|---|---|---|
| Discovery | Device IP, port, model | Get s_ip and tell what the device is |
| Connect | TCP 8080 reachable | Client connects and receives response |
| Read | JSON fields complete | Get / Response / SerialNumber mapped correctly |
| Set | Failed fields and reasons | Locate the specific field, not just "failed" |
| Pass-through | RTU / TCP frame format | RTU includes CRC, TCP excludes CRC |
| Regression | Restore original value after changes | Can read back after changes, restore when needed |
s_ip and s_port in the mDNS response; if not available, check the router admin or the local network configuration.
Web; if integrating with Home Assistant, fill the corresponding source according to the target system's requirements.
TransmittedData is transmitted as a string, with bytes separated by spaces.