Huawei SUN2000 inverter
Register map(s) for this device, with a note of how far each has been checked. Addresses are
0-based, as on the wire. Scale and byte order are confirmed only at the hardware-verified rung.
coherence-checked
Round-trips through a real Modbus stack with no overlapping addresses and a word-order-sensitive codec — the map is internally coherent and wire-decodable. Does NOT prove byte-order or scaling match a real device: the emulator is seeded from the map's own types, so a uniformly wrong byte-order still round-trips. Only hardware-verified confirms byte-order/scale on the wire.
| point | address (0-based) | type | scale | unit |
| model_id | 30070 | U16 | 1 | |
| pv_string_count | 30071 | U16 | 1 | |
| mppt_count | 30072 | U16 | 1 | |
| rated_power | 30073 | U32BE | 0.001 | kW |
| max_active_power | 30075 | U32BE | 0.001 | kW |
| max_apparent_power | 30077 | U32BE | 0.001 | kVA |
| pv1_voltage | 32016 | I16 | 0.1 | |
| pv1_current | 32017 | I16 | 0.01 | |
| pv2_voltage | 32018 | I16 | 0.1 | |
| pv2_current | 32019 | I16 | 0.01 | |
| pv3_voltage | 32020 | I16 | 0.1 | |
| pv3_current | 32021 | I16 | 0.01 | |
| pv4_voltage | 32022 | I16 | 0.1 | |
| pv4_current | 32023 | I16 | 0.01 | |
| input_power | 32064 | U32BE | 0.001 | |
| grid_voltage_ab | 32066 | U16 | 0.1 | |
| grid_voltage_bc | 32067 | U16 | 0.1 | |
| grid_voltage_ca | 32068 | U16 | 0.1 | |
| phase_a_voltage | 32069 | U16 | 0.1 | |
| phase_b_voltage | 32070 | U16 | 0.1 | |
| phase_c_voltage | 32071 | U16 | 0.1 | |
| phase_a_current | 32072 | U32BE | 0.001 | |
| phase_b_current | 32074 | U32BE | 0.001 | |
| phase_c_current | 32076 | U32BE | 0.001 | |
| active_power | 32080 | U32BE | 0.001 | |
| reactive_power | 32082 | U32BE | 0.001 | |
| power_factor | 32084 | I16 | 0.001 | |
| grid_frequency | 32085 | U16 | 0.01 | Hz |
| efficiency | 32086 | U16 | 0.01 | % |
| internal_temperature | 32087 | I16 | 0.1 | °C |
| insulation_resistance | 32088 | U16 | 0.001 | MΩ |
| device_status | 32089 | U16 | 1 | |
| accumulated_energy_yield | 32106 | U32BE | 0.01 | kWh |
| daily_energy_yield | 32114 | U32BE | 0.01 | kWh |
link settings as documented (unverified): RTU/TCP; unit ID 0; FC 03,06,16,43,65; Modbus-TCP uses port 6607 by default. Slave address range is 1-247 for RTU, and 0 is used by default for TCP to access the directly connected slave node.
bench facts as documented (unverified)
| wiring notes | Supports physical media such as MBUS, RS485, WLAN, FE, and 4G. |
| max registers/read | 125 |
| broadcast | supported |
| protocol notes | If the exception code is 0x06, resend the request after 10 seconds. A request can be resent for no more than six times. |
| model register | 30000 |
| serial register | 30015 |
| firmware register | 31025 |
| identification notes | Manufacturer name: HUAWEI, Product code: SUN2000 |
| FC 43 device ID | supported |
| doc revision | Issue 08, Date 2024-11-07 |
| firmware applicability | SUN2000MA V100R001C00SPC166 |
field reports — community-sourced, unverified (checked 2026-06-11)
- Modbus TCP communication via the Smart Dongle (SDongleA-05) is highly unstable if polled too frequently; developers recommend a polling interval of at least 5 seconds and a timeout of at least 2-3 seconds to avoid timeout errors. [source]
- When using the Smart Dongle (SDongleA-05) for Modbus TCP, the default Slave ID is 1, whereas connecting directly to the inverter's built-in Wi-Fi AP uses Slave ID 0 on port 6607. [source]
- Modbus RTU communication over RS-485 can become unstable or fail with CRC errors if the WLAN Smart Dongle is simultaneously communicating with cloud servers; Huawei recommends disconnecting the dongle when using Modbus RTU. [source]
- Modbus TCP connection on port 502 via the Smart Dongle can fail to establish or drop immediately during initial register reads (such as register 30000) if another active Modbus client session is open or if the connection is not properly unrestricted in the FusionSolar settings. [source]
- confirmed: doc_revision: Issue 08, Date 2024-11-07 — confirmed by ioBroker-Forum thread for SUN2000MA V100R001C00SPC166 Modbus Interface Definitions [2.1.1]
- confirmed: firmware_applicability: SUN2000MA V100R001C00SPC166 — confirmed by the document title and ioBroker-Forum thread
- confirmed: comms defaults: Modbus-TCP uses port 6607 by default, slave address range is 1-247 for RTU, and 0 is used by default for TCP to access the directly connected slave node — confirmed by the 'Overview of the Communications Protocol' section in the Modbus Interface Definitions
- confirmed: function_codes: [3, 6, 16, 43, 65] — confirmed by the 'Function Code List' (0x03, 0x06, 0x10) and sections for 'Read Device Identification (0x2B / 43)' and 'Querying a Device List / Uploading Data (0x41 / 65)'
- confirmed: identification registers: model_register 30000, serial_register 30015, firmware_register 31025 — confirmed by the 'Register Definitions' table
- confirmed: physical media: MBUS, RS485, WLAN, FE, and 4G — confirmed by the 'Physical Layer' section of the Modbus Interface Definitions
- confirmed: quirks: broadcast_supported is true, max_read_registers is 125, and exception code 0x06 retry logic (resend after 10 seconds, max 6 times) — confirmed by the 'Overview of the Communications Protocol' and 'Reading Registers (0x03)' sections
- confirmed: register map: model_id @ 30070, pv_string_count @ 30071, mppt_count @ 30072, rated_power @ 30073, max_active_power @ 30075, max_apparent_power @ 30077, pv1_voltage @ 32016, pv1_current @ 32017, pv2_voltage @ 32018, pv2_current @ 32019, pv3_voltage @ 32020, pv3_current @ 32021, pv4_voltage @ 32022, pv4_current @ 32023, input_power @ 32064, grid_voltage_ab @ 32066, grid_voltage_bc @ 32067, grid_voltage_ca @ 32068, phase_a_voltage @ 32069, phase_b_voltage @ 32070, phase_c_voltage @ 32071, phase_a_current @ 32072, phase_b_current @ 32074, phase_c_current @ 32076, active_power @ 32080, reactive_power @ 32082, power_factor @ 32084, grid_frequency @ 32085, efficiency @ 32086, internal_temperature @ 32087, insulation_resistance @ 32088, device_status @ 32089, accumulated_energy_yield @ 32106, daily_energy_yield @ 32114 — confirmed by the 'Register Definitions' table
The trust ladder
Each rung states what it proved and what it did not. Gray until proven; green is earned by hardware only.
- generated — A prompt produced it. Unproven — anyone can regenerate this.
- structure-verified — Decode path is structurally sound (addresses, widths, finite values). Does NOT prove word order or scaling.
- coherence-checked — Round-trips through a real Modbus stack with no overlapping addresses and a word-order-sensitive codec — the map is internally coherent and wire-decodable. Does NOT prove byte-order or scaling match a real device: the emulator is seeded from the map's own types, so a uniformly wrong byte-order still round-trips. Only hardware-verified confirms byte-order/scale on the wire.
- hardware-verified (software-key) x1 — Matched a real device with operator-attested readings as ground truth — the only rung that confirms word order + scaling on the wire.