Register Map
Read-only input registers 30000–35017, transcribed from the
FuturaPulse hybrid inverter Modbus protocol v0.0.3.
183 values across 34 coalesced read ranges, in twelve sections matching the chapters of the source document.
This project never writes
The writable holding registers (40001–49999, FC 0x03/0x06/0x10)
are deliberately absent from this map. Only function codes 0x04 and
0x03 reads are implemented.
Addressing
Document register numbers are used verbatim as the Modbus PDU address — no
30000 offset is subtracted.
That is confirmed twice over: by the source document's own example frames
(01 04 75 94 … reads register 30100) and by live traffic from a Si-Dongle-L.
# reads register 31002 directly, no offset arithmetic
sitsolar-dongle <host> --sn ... --read 31002:2
Word order
32-bit values are big-endian pairs: the low address holds the high word.
31002~31003 -> (0, 50010) -> 0x0000C352 -> 50.010 Hz
high low
This is an easy way to silently read zero
Because the high word sits at the low address, reading a single 16-bit
register out of a 32-bit pair returns only the high word. For lifetime
counters that word is frequently 0, so the value reads as zero while the
real figure sits one register over.
This is exactly the bug that was fixed: every lifetime total was reported as
zero. As a cross-check, the decoded totals now match the vendor cloud
exactly — all_charge 600.2, all_discharge 570.1,
all_pv_to_battery_level 437.6, all_battery_to_grid_capacity 317.7,
totalOngridPower 446.5, totalBuyGridPower 51.8 kWh.
Data types
The scale column converts the raw integer into the unit. For example
31000 phase_r_voltage has scale 0.1 and unit V, so a raw 2301 decodes
as 230.1 V.
Enums and bit fields are decoded into human-readable names: enumerations become
label, and bit fields become the active_bits list. Run
sitsolar-dongle --list to see every register with its scale, unit, and notes.
Sections
Use --section to poll one of these in isolation, e.g.
--section "AC_side".
Full map
The tables below are generated directly from
registers.py,
so they cannot drift from the implementation.
device_info
30000–30099 — 14 value(s)
operation_data
30100–30199 — 8 value(s)
error_info
30200–30299 — 12 value(s)
temperatures
30300–30399 — 5 value(s)
ARM_data
30400–30499 — 8 value(s)
DC_side
30500–30999 — 9 value(s)
AC_side
31000–31999 — 18 value(s)
EPS_parameters
32000–32039 — 15 value(s)
battery_parameters
32040–32999 — 33 value(s)
meter_parameters
33000–33999 — 17 value(s)
generation_info
34000–34999 — 27 value(s)
Italy_self-test
35000–35999 — 17 value(s)
Totals: 183 values across 34 read ranges.
Coalesced read ranges:
30000–30034, 30041–30050, 30061–30062, 30070–30082, 30100–30101, 30103–30106, 30108–30109, 30200–30211, 30301–30301, 30303–30303, 30305–30305, 30307–30307, 30316–30316, 30400–30417, 30419–30421, 30500–30508, 31000–31007, 31010–31013, 31016–31022, 31035–31040, 32001–32002, 32005–32008, 32011–32014, 32017–32026, 32040–32040, 32051–32051, 32055–32058, 32063–32065, 32069–32093, 33001–33020, 33040–33043, 34001–34016, 34019–34043, 35001–35017
Where the document disagrees with the hardware
Every entry below was checked against a live 3K-HS and against the vendor's
own cloud API — which is what the official app displays. Each one is also
recorded in the notes field of the corresponding register and printed by
sitsolar-dongle --list.
For a VA sensor, compute it yourself
31039~31040 is not usable as apparent power. Use √(P²+Q²) from
31018~31019 (inverter_p) and 31020~31021 (inverter_q), which agrees
with V·I.
The warning codes
30207–30210 are four ordinary bit-field words (Charts 8–10). Chart 11
addresses their combined space with:
code = 201 + 16·word_index + bit_index
That formula reproduces every row of the chart — 201/204/213 from word 0,
219/225/230 from word 1, 241/247 from word 2 — which is what shows
30211 carries a code rather than a mask.
200 means no warning
The first possible code is 201, so the value 200 means no warning at
all — which is what a healthy unit reports.
30210 has no chart in the document, so its bits are unknown; codes 249 and
up would belong to that word.
The 25 known labels are carried in the register's enum map and surface as the
label field of a decoded reading.
Other quirks worth knowing
Next
- Caveats & Troubleshooting — firmware differences and connection limits.
- CLI Reference —
--list,--section, and--key.