Skip to content

SPH 3-6kW / 7-10kW / 8000-10000TL-HU: register 1021 may be grid import, not load power (needs field confirmation) #369

Description

@0xAHA

Summary

Registers 1021 and 1037 look mislabelled on the legacy SPH profiles. If that's right, "Load Power" on those profiles is actually showing grid import, and the real load power is read and thrown away.

I have not changed anything. I need one confirmation from a real device first, and it costs about a minute.

✅ Confirmed — no further checks needed

@OmkoH confirmed this on an SPH 5000 (chart): Power to Load, Power to User and Grid Import Power all read 747 W simultaneously, tracking exactly across a sunny August morning down to a shared 29 W baseline. Genuine house load would have diverged from grid import the moment solar or the battery carried the house.

Register 1021 is grid import. The mapping is corrected on all three profiles:

Register Was Now
1021/1022 power_to_load power_to_user_total — grid import
1037/1038 self_consumption_power (unused, discarded) power_to_load — house load

If you're on one of the affected profiles, Load Power will begin reporting your actual house consumption rather than grid import, so it will stop dropping to zero while you run on solar or battery. Self Consumption is derived from Load Power and becomes correct as a result. Existing history is untouched; only new readings change.

Thanks to @ian-mcarthur-oxford, @alanmk and @De4dCert as well — no need to check anything now, this is settled.

The original check, kept for the record

Chart these two entities, both on the Load device:

Entity Source
Growatt Load Power to Load register 1021 — the one in question
Growatt Load Power to User register 1015

Identical lines mean the mapping is wrong. Both are read directly from the inverter, so neither is derived from the other.

Grid Import Power is not a valid third comparison — it isn't read from the inverter, it's calculated from Power to User, so it matches that entity regardless of what 1021 contains. The original wording of this issue offered it as an alternative, which was a mistake on my part.

Which profiles

Profile Affected
SPH 3-6kW suspected
SPH 7-10kW suspected
SPH/SPM 8000-10000TL-HU suspected
SPH ... (V2.01) variants not affected — already correct
SPH-TL3, SPA not affected — already correct

Check under Settings → Devices & Services → Growatt Modbus → Configure which one you're on.

Why I think this

The storage range follows a regular pattern of four 8-register blocks: R phase, S phase, T phase, then Total. Our own docs/developer/protocol-v139.md, extracted from the Growatt Modbus Protocol II documentation, gives:

1015  Pactouser R H       AC power to user R-phase
1021  PactouserTotal H    AC power to user total        <- grid import
1029  Pactogrid total H   AC power to grid total        <- grid export
1037  PLocalLoad total H  INV power to local load total <- house load

The three legacy SPH profiles instead map 1021 as power_to_load and 1037 as self_consumption_power — and self_consumption_power isn't in any sensor group, so 1037 is read and discarded. Four independent sources say 1021 is grid import:

  1. The protocol documentation above.
  2. The SPA profile, field-verified in SPA 3000TL BL not mapping correctly #249 by energy balance (battery discharge + grid import = load held across every scan).
  3. Our own SPH-TL3 and SPH V2.01 profiles, which already map it correctly.
  4. The Homey Growatt app, an independent implementation: pactousertotal: [1021, 'import from grid to user total'], totalhouseload: [1037, 'Total house Load'].

Why the symptom is subtle

On a single-phase inverter, R phase and Total are the same measurement. So register 1015 (power_to_user, mapped correctly) and register 1021 (power_to_load, suspected wrong) would return identical values — which is exactly the signature above.

Both numbers look plausible on a dashboard. Grid import is a real quantity; it just isn't your house load. The likely visible symptom is Load Power sitting at zero whenever you're not importing — during a sunny afternoon, or overnight on battery — while the house is obviously still consuming.

If you've ever wondered why Load Power drops to nothing while your battery discharges, this would explain it.

What happens next

If it's confirmed, the fix is straightforward: 1021 becomes power_to_user, 1037 becomes power_to_load, matching what the V2.01 profiles already do. It will change what your Load Power sensor reports, so I want evidence before touching profiles this widely used rather than after.

If it's not confirmed on your firmware, that's equally valuable and I'll say so here.


Tagging a few people who've reported on single-phase SPH systems, in case you're willing to look — no obligation, and the check is genuinely a one-minute glance at History:

@OmkoH — your #326 is what added these registers to the 3-6kW and 7-10kW profiles, so you're the closest thing to a primary source here.
@ian-mcarthur-oxford — you looked at SPH grid power flow in #302, so you'll know immediately whether these two track each other.
@alanmk — SPH 3-6kW on DTC 3502 from #337.
@De4dCert — SPH 3600TL BL-UP from #333.

If you're on an SPH-TL3, SPA, or a V2.01 profile, this doesn't affect you.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions