Skip to content

Commit 2b28b04

Browse files
0xAHAclaude
andcommitted
docs: shorten release notes and drop the fault narration
Entries had grown into multi-paragraph post-mortems. The reasoning, measurements and history belong in the commit and the code comments, where a maintainer will look for them; a release note needs what changed and who it affects. Rewrites v1.5.2 to v1.5.4 as short bullets and records the convention in CLAUDE.md, including what still belongs in a note - affected models, entities appearing or disappearing, actions required, reporter credit, and whether a mapping is confirmed on hardware or taken from the protocol. Published release bodies updated to match. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 9e1a695 commit 2b28b04

2 files changed

Lines changed: 51 additions & 134 deletions

File tree

CLAUDE.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,23 @@ When preparing a release:
874874
- Document all fixes and new features
875875
- Include upgrade notes if needed
876876

877+
**Keep entries to short bullets.** One or two sentences each: what changed, and what a
878+
user has to do or expect. A bullet that runs to four paragraphs is a commit message in
879+
the wrong file — the reasoning, the measurements and the history belong in the commit
880+
and the code comments, where the next maintainer will look for them.
881+
882+
**Do not narrate whose fault it was.** No "introduced by us in vX.Y.Z", no "the same
883+
bug that release was fixing", no post-mortem of how it got shipped. State the fix and
884+
who it affects. Users need to know whether it touches them; they do not need the
885+
confession, and it crowds out the part they came for.
886+
887+
Still include, because these are user-facing facts rather than blame:
888+
- which models or profiles a change applies to
889+
- entities that will appear or disappear on upgrade
890+
- anything the user must do (re-select an option, re-run a scan)
891+
- credit to the reporter — that is thanks, not fault
892+
- whether a mapping is confirmed on hardware or taken from the protocol
893+
877894
3. **Commit with proper message:**
878895
```
879896
Bump version to vX.Y.Z

RELEASENOTES.md

Lines changed: 34 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -8,155 +8,55 @@
88

99
Issues: #360, #362
1010

11-
- **Fix: sensors removed in v1.5.3 went `unavailable` instead of disappearing.**
12-
If v1.5.3 left you with a DC-DC Temperature entity showing *unavailable* rather than
13-
removing it, this is the follow-up. Upgrade and it will go.
14-
15-
Dropping a sensor from a profile stops it being created, but Home Assistant keeps what
16-
earlier versions already registered — so it lingers as a dead entity. Arguably worse
17-
than the 0.0 °C it replaced, because an unavailable sensor looks like something broken
18-
rather than something that was never meant to exist.
19-
20-
The cleanup that handles this existed, but was a list of specific sensor names, so each
21-
new removal needed its own entry and this one never got one. It is now driven by the
22-
profile itself: any sensor the profile does not list is removed, because nothing can
23-
recreate it. Future removals clean up after themselves.
24-
25-
This is the second time this cleanup has failed. In v1.4.0 it was gated on the inverter
26-
being reachable, which never holds during setup, so it did not run at all. Both failure
27-
modes are now covered by tests.
11+
- **Removed sensors now disappear instead of showing `unavailable`.** If v1.5.3 left you
12+
with a DC-DC Temperature entity stuck as unavailable, upgrading clears it.
13+
- Stale entities are now cleared based on the active profile, so sensors dropped in future
14+
releases tidy up after themselves.
2815

2916
---
3017

3118
## v1.5.3
3219

3320
Issues: #360, #362
3421

35-
**Coming from v1.5.1?** v1.5.2 was a pre-release, so you are getting its changes too —
36-
the register scanner keeping your tuned settings when the integration is disabled, the
37-
new SPA-TL3 profile, and the `Charge Stopped SOC` relabel. They are listed under v1.5.2
38-
below and are worth reading, particularly if you run an SPA or set charge limits.
39-
40-
- **Fix: a "DC-DC Temperature" sensor reporting 0.0 °C on models that have no such
41-
sensor.** Introduced by us in v1.4.0, and it is the same bug that release was fixing.
42-
43-
v1.4.0 identified register 3176 on MOD/MID as the DC-DC stage rather than battery
44-
temperature, and added `dcdc_temp` to the shared temperature sensor group — a group
45-
almost every profile includes. Only MOD/MID, SPF and SPE define that register, so every
46-
other model gained an entity that could never have a value and published freezing point
47-
instead.
48-
49-
A sensor is created because it is in a profile's set; the register only decides whether
50-
it has a value. The note added at the time said the opposite. It now belongs to the
51-
profiles that can populate it, and a test fails if a temperature sensor is ever declared
52-
without a register behind it.
53-
54-
**If you saw a DC-DC Temperature entity stuck at 0.0 °C, it will disappear on upgrade.**
55-
MOD, MID, SPF and SPE keep theirs — those are real readings.
56-
57-
- **SPH-TL3 and SPA-TL3 gain real IPM and Boost temperatures.** Both sensors were declared
58-
but had no registers, so both reported 0.0 °C. A full scan of the #360 device answered
59-
registers 94 and 95 with 20.0 °C and 33.3 °C alongside the inverter temperature at
60-
37.8 °C, so these are now mapped rather than removed.
22+
**Coming from v1.5.1?** v1.5.2 was a pre-release, so you get its changes too — see below.
6123

62-
- **SPA-TL3 regains Energy Today and Energy Total.** v1.5.2 excluded them, assuming they
63-
counted solar generation an AC-coupled inverter does not have. The same scan shows
64-
2.0 kWh today and 2313.9 kWh total, with the SPA extended block agreeing at a second
65-
address. They measure what the inverter puts out, and a discharging battery produces
66-
output like anything else.
24+
- **DC-DC Temperature no longer appears on models that don't have the sensor.** It was
25+
reporting 0.0 °C on MIN, SPH, SPH-TL3, WIT and TL-XH. MOD, MID, SPF and SPE keep theirs —
26+
those are real readings.
27+
- **SPH-TL3 and SPA-TL3 gain IPM and Boost temperature** (registers 94/95). Both were
28+
present but unmapped, so both read 0.0 °C.
29+
- **SPA-TL3 regains Energy Today and Energy Total** — confirmed on hardware, not the solar
30+
generation figures they were mistaken for.
6731

6832
---
6933

7034
## v1.5.2
7135

7236
Issues: #360, #362
7337

74-
- **"Charge Stopped SOC (Battery First)" renamed to "Charge Stopped SOC".**
75-
Register 3048 is documented as a Battery First setting, and the name said so — but it
76-
governs charging under Load Priority too. Measured on a MID 25KTL3-XH with all nine TOU
77-
periods disabled and every priority on Load Priority: charging stopped at exactly the
78-
configured value with 10.8 kW of PV available and room in the battery, and resumed when
79-
it was raised.
80-
81-
This is the same correction register 3067 received in v1.4.1, and it fails more quietly
82-
than that one did. A discharge floor firing unexpectedly looks like the battery refusing
83-
to supply the house. A charge ceiling firing just sends surplus to the grid — everything
84-
reads plausibly and nothing looks wrong unless you ask why SOC stopped climbing.
85-
86-
Entity IDs are unchanged, so automations and dashboards keep working.
87-
88-
Reported and measured by @as-wallpen.
89-
90-
- **The "settings are being reverted" notice no longer blames the dongle by itself.**
91-
It named a connected ShineWiFi or ShineLink dongle as the most likely cause. A user
92-
running one alongside this integration, still uploading to Growatt's cloud, has local
93-
writes persisting overnight — so the dongle alone is not sufficient. The notice now
94-
points at the cloud pushing settings *down* (remote control or a schedule set in the
95-
ShinePhone app), which is the part that actually overwrites local changes.
96-
97-
- **SPA gains AC current, output power, inverter status, AC energy today/total, and
98-
inverter/IPM/boost temperature.** From the SPA extended range (2000-2124). The model
99-
matrix recorded AC current and power as unconfirmed; the temperatures were absent
100-
entirely, so an SPA reported no temperature of any kind — which looks like hardware
101-
that doesn't measure it rather than registers nobody asked for.
102-
103-
**These come from the protocol and have not yet been read on a device.** If you own a
104-
single-phase SPA, a scan of 2000-2124 would confirm or correct all of them in one pass.
105-
106-
Verified values already in the profile were left alone: AC voltage and frequency keep
107-
their measured 1000-range registers rather than adopting the documented 2000-range ones.
108-
109-
Three-phase SPA-TL3 does not serve this range and is unaffected.
110-
111-
- **A protocol coverage audit, and what it found.** These registers had been sitting in
112-
our own extracted protocol reference the whole time, unmapped, because nothing fails
113-
when a register is never requested — "we never asked for it" and "the hardware doesn't
114-
report it" look identical from outside.
115-
116-
`tools/protocol_coverage.py` now reports registers the protocol documents that no
117-
profile maps, so that gap is findable rather than waiting for someone to notice. It
118-
compares addresses, not meanings, and a range a model doesn't serve shows as a gap that
119-
isn't a defect — it's a place to look, not a defect list.
120-
121-
Also corrects the range summary, which called 2000-2124 "SPH extended". Every register
122-
in it is SPA, and that mislabel pointed anyone checking at the wrong family.
123-
124-
- **Fix: scanning a disabled integration fell back to default connection settings.**
125-
The documented procedure asks you to disable the integration before scanning, so the
126-
poller stops competing with the scanner for the adapter. Disabling unloads the entry —
127-
and the scan service looked for its connection details on the loaded entry, so selecting
128-
your inverter no longer worked and the only way to scan was to retype the host and port.
129-
130-
That manual path started from defaults: slave ID 1, 250 ms pacing, 125-register blocks.
131-
On a gateway tuned to smaller, slower reads, those requests fail — so every range reported
132-
"no response" from hardware that had been polling perfectly a minute earlier. Following
133-
the instructions was what triggered it, and v1.5.1's pacing fix could not help, because
134-
the value it reads lives on the entry that disabling had just unloaded.
135-
136-
The scan now reads the connection, slave ID, **Modbus delay** and **block size** from the
137-
stored entry whether or not it is loaded. Select your inverter under **Config entry**
138-
rather than typing the host by hand — that is what carries your tuned settings into the
139-
scan. An explicitly chosen block size still overrides the inherited one.
140-
141-
Reported by @Xybertecnic, whose scan came back empty on a disabled entry and full of data
142-
the moment it was re-enabled.
143-
144-
- **New profile: SPA-TL3 (AC Storage, 3-Phase) 4-10kW.**
145-
Three-phase SPA inverters use the SPH-TL3 register layout, not the single-phase SPA one,
146-
which reads a range this hardware does not serve — picking the only option with "SPA" in
147-
its name left every entity unavailable.
148-
149-
SPA is AC-coupled and has no solar inputs, so running it on the SPH-TL3 profile instead
150-
produced a full set of PV entities permanently reading zero. The new profile shares the
151-
verified SPH-TL3 register map with those sensors removed, and **DTC 3725 now selects it
152-
automatically**.
153-
154-
If your SPA-TL3 was auto-detected onto SPH-TL3, its PV sensors will disappear on upgrade.
155-
They only ever reported zero.
156-
157-
Both dropdown entries now state their phase count — **SPA (AC Storage, 1-Phase) 3-6kW**
158-
and **SPA-TL3 (AC Storage, 3-Phase) 4-10kW** — so the choice no longer depends on knowing
159-
which register range your model serves.
38+
- **Scanning a disabled integration now keeps your tuned settings.** Select your inverter
39+
under **Config entry** rather than typing the host and port, and the scan inherits your
40+
slave ID, Modbus delay and block size. Typing the connection by hand still starts from
41+
defaults, which a sensitive gateway may not tolerate. Reported by @Xybertecnic.
42+
- **New profile: SPA-TL3 (AC Storage, 3-Phase) 4-10kW**, selected automatically by
43+
DTC 3725. Both SPA options now state their phase count, so the choice no longer depends
44+
on knowing which register range your model serves.
45+
- If your SPA-TL3 was auto-detected onto SPH-TL3, its PV entities disappear on
46+
upgrade. They only ever reported zero.
47+
- **`Charge Stopped SOC (Battery First)` renamed to `Charge Stopped SOC`.** Register 3048
48+
also governs charging under Load Priority, so the old name suggested it could be ignored
49+
outside Battery First. Entity IDs are unchanged. Measured and reported by @as-wallpen.
50+
- **SPA gains AC current, output power, inverter status, AC energy and temperatures** from
51+
the 2000-2124 range. These come from the protocol and have not yet been read on a device —
52+
a scan from a single-phase SPA would confirm them. AC voltage and frequency keep their
53+
existing measured registers. Three-phase SPA-TL3 is unaffected.
54+
- **The "settings are being reverted" notice** now points at Growatt's cloud pushing
55+
settings down — remote control or a schedule set in the ShinePhone app — rather than a
56+
connected dongle on its own.
57+
- **New: `tools/protocol_coverage.py`**, which reports registers the protocol documents
58+
that no profile maps. Also corrects the range summary, which listed 2000-2124 as SPH
59+
rather than SPA.
16060

16161
---
16262

0 commit comments

Comments
 (0)