Skip to content

Commit c257492

Browse files
0xAHAclaude
andcommitted
docs: add profile column and SVG status icons to the VPP DTC table
Three changes to the published DTC table. Adds a 'Profile to select' column showing the option users actually pick in the config flow, rather than only the internal profile key. That makes the table answer the question someone arrives with: my inverter reports this code, what do I choose? It also makes the SPA problem visible -- every SPA code resolves to an SPH profile, so a note now explains why and what that costs. Replaces the emoji status markers with Material icons rendered as inline SVG via pymdownx.emoji. Emoji glyphs take their appearance from whatever font the reader's OS supplies, so the same page looked different on every platform. SVG inherits currentColor and is themed in CSS, including lighter variants for the dark scheme. Fixes the status column wrapping. The model column holds long semicolon-separated lists and was starving the narrow columns, so 'Confirmed' wrapped under its own icon. Fixed with a fixed table layout in extra.css plus a non-breaking space between icon and word, scoped to a wrapper class so the register tables on the same pages are untouched. Also adds the RS485 gateway guide to the nav -- it was reachable only from the index link, not the site navigation. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 60a6dcc commit c257492

3 files changed

Lines changed: 120 additions & 31 deletions

File tree

docs/developer/protocol-vpp.md

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -37,40 +37,54 @@ device and identifies the model reliably; whether the profile it selects is *cor
3737
that model has, for most entries, never been verified against hardware. See
3838
[DTC Debugging](../troubleshooting/dtc-debugging.md) for what that means in practice.
3939

40-
| DTC Code | Model | Profile mapping |
41-
| --- | --- | --- |
42-
| 3501 | SPH 3000-6000TL BL | ⚠️ Unconfirmed |
43-
| 3502 | SPH 3000-6000TL BL-UP | ✅ Confirmed |
44-
| 3503 | SPH 3000-6000TL HU | ⚠️ Unconfirmed |
45-
| 3504 | SPH 3000-6000TL HUB | ✅ Confirmed |
46-
| 3601 | SPH-TL3 4-10kW | ✅ Confirmed |
47-
| 3701 | SPA 1000-3000TL BL | ⚠️ Unconfirmed |
48-
| 3715 | SPA 3000-6000TL AU | ⚠️ Unconfirmed |
49-
| 3716 | SPA 3000-6000TL AUB | ⚠️ Unconfirmed |
50-
| 3725 | SPA-TL3 4-10kW | ⚠️ Unconfirmed |
51-
| 3735 | SPA 3000TL BL-UP | ⚠️ Unconfirmed |
52-
| 5001 | MID 17-25KTL3-X; MID 20-30KTL3-X2; MID 25-30KTL3-X2 Pro/X2 Pro.E; MID 33-50KTL3-X2/X2 Pro/X2 Pro.E; MID 30-40KTL3-X; MID 33-36KTL3-X(Pro.E); MID 3-33KTL3-X3 | ✅ Confirmed |
53-
| 5002 | MOD 3-15KTL3-X; MOD 3-15KTL3-X2(Pro); MOD 12-20KTL3-X2; MOD 12-20KTL3-X2(E); MOD 3-33KTL3-X3 | ⚠️ Unconfirmed |
54-
| 5003 | MAC 30-70KTL3-X; MAC 15-36KTL3-XL; MAC 50-70KTL3-X2; MAC 30-36KTL3-XL2 | ⚠️ Unconfirmed |
55-
| 5000 | MAX 50-100KTL3 LV/MV | ⚠️ Unconfirmed |
56-
| 5500 | MAX 175-253KTL3-X HV | ⚠️ Unconfirmed |
57-
| 5501 | MAX 80-150KTL3-X LV/MV; MAX 100-150KYL3-X2 LV/MV | ⚠️ Unconfirmed |
58-
| 5502 | MAX 320-350KTL3-X | ⚠️ Unconfirmed |
59-
| 5100 | MIN 2500-6000TL-XH/XH2/XHE/XA | ✅ Confirmed |
60-
| 5200 | MIC 600-3300TL-X/X2/X2(Pro); MIN 2500-6000TL-X/X2/X2(Pro)/X2(Pro.E) | ⚠️ Unconfirmed |
61-
| 5201 | MIN 7-10KTL-X/X2/X2(E) | ✅ Confirmed |
62-
| 5400 | MOD 3-10KTL3-XH/BP; MID 11-30KTL3-XH; MID 8-15KTL3-XHL/JP | ✅ Confirmed |
63-
| 5401 | MOD 3-15KTL3-HU; MID 33-50KTL3-HU | ✅ Confirmed |
64-
| 5600 | WIS 100K-AM; WIT 50-100K-H/HE/HU/A/AE/AU (incl. -US); WIT 28-55K-H/HE/HU/A/AE/AU-US L2 | ⚠️ Unconfirmed |
65-
| 5601 | WIT 29.9-50K-XHU | ✅ Confirmed |
66-
| 5800 | WIS 210K | ⚠️ Unconfirmed |
67-
| 5801 | WIS 215K-AM | ⚠️ Unconfirmed |
40+
<div class="dtc-table" markdown>
41+
42+
| DTC | Model | Profile to select | Mapping |
43+
| --- | --- | --- | --- |
44+
| 3501 | SPH 3000-6000TL BL | SPH (3-6kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
45+
| 3502 | SPH 3000-6000TL BL-UP | SPH (3-6kW) | :material-check-circle:{ .dtc-ok }&nbsp;Confirmed |
46+
| 3503 | SPH 3000-6000TL HU | SPH (3-6kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
47+
| 3504 | SPH 3000-6000TL HUB | SPH (3-6kW) | :material-check-circle:{ .dtc-ok }&nbsp;Confirmed |
48+
| 3601 | SPH-TL3 4-10kW | SPH-TL3 (3-10kW) | :material-check-circle:{ .dtc-ok }&nbsp;Confirmed |
49+
| 3701 | SPA 1000-3000TL BL | SPH (3-6kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
50+
| 3715 | SPA 3000-6000TL AU | SPH (3-6kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
51+
| 3716 | SPA 3000-6000TL AUB | SPH (3-6kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
52+
| 3725 | SPA-TL3 4-10kW | SPH-TL3 (3-10kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
53+
| 3735 | SPA 3000TL BL-UP | SPH (3-6kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
54+
| 5001 | MID 17-25KTL3-X; MID 20-30KTL3-X2; MID 25-30KTL3-X2 Pro/X2 Pro.E; MID 33-50KTL3-X2/X2 Pro/X2 Pro.E; MID 30-40KTL3-X; MID 33-36KTL3-X(Pro.E); MID 3-33KTL3-X3 | MID (15-25kW) | :material-check-circle:{ .dtc-ok }&nbsp;Confirmed |
55+
| 5002 | MOD 3-15KTL3-X; MOD 3-15KTL3-X2(Pro); MOD 12-20KTL3-X2; MOD 12-20KTL3-X2(E); MOD 3-33KTL3-X3 | MID (15-25kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
56+
| 5003 | MAC 30-70KTL3-X; MAC 15-36KTL3-XL; MAC 50-70KTL3-X2; MAC 30-36KTL3-XL2 | MID (15-25kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
57+
| 5000 | MAX 50-100KTL3 LV/MV | MID (15-25kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
58+
| 5500 | MAX 175-253KTL3-X HV | MID (15-25kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
59+
| 5501 | MAX 80-150KTL3-X LV/MV; MAX 100-150KYL3-X2 LV/MV | MID (15-25kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
60+
| 5502 | MAX 320-350KTL3-X | MID (15-25kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
61+
| 5100 | MIN 2500-6000TL-XH/XH2/XHE/XA | TL-XH (3-10kW) | :material-check-circle:{ .dtc-ok }&nbsp;Confirmed |
62+
| 5200 | MIC 600-3300TL-X/X2/X2(Pro); MIN 2500-6000TL-X/X2/X2(Pro)/X2(Pro.E) | MIN (3-6kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
63+
| 5201 | MIN 7-10KTL-X/X2/X2(E) | MIN (7-10kW) | :material-check-circle:{ .dtc-ok }&nbsp;Confirmed |
64+
| 5400 | MOD 3-10KTL3-XH/BP; MID 11-30KTL3-XH; MID 8-15KTL3-XHL/JP | MOD Hybrid (6-15kW) | :material-check-circle:{ .dtc-ok }&nbsp;Confirmed |
65+
| 5401 | MOD 3-15KTL3-HU; MID 33-50KTL3-HU | MOD Hybrid (6-15kW) | :material-check-circle:{ .dtc-ok }&nbsp;Confirmed |
66+
| 5600 | WIS 100K-AM; WIT 50-100K-H/HE/HU/A/AE/AU (incl. -US); WIT 28-55K-H/HE/HU/A/AE/AU-US L2 | WIT (29.9-50kW XHU) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
67+
| 5601 | WIT 29.9-50K-XHU | WIT (29.9-50kW XHU) | :material-check-circle:{ .dtc-ok }&nbsp;Confirmed |
68+
| 5800 | WIS 210K | MID (15-25kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
69+
| 5801 | WIS 215K-AM | MID (15-25kW) | :material-help-circle:{ .dtc-unknown }&nbsp;Unconfirmed |
70+
71+
</div>
72+
73+
!!! note "SPA owners"
74+
Every SPA code above resolves to an **SPH** profile, which is why the profile column
75+
reads that way. SPH profiles include PV string sensors, and SPA hardware has no solar
76+
DC inputs — so those entities will exist and read zero permanently. A dedicated SPA
77+
profile is in progress ([#360](https://github.com/0xAHA/Growatt_ModbusTCP/issues/360)).
6878

6979
### Not in the spec table
7080

71-
| DTC Code | Model | Profile mapping |
72-
| --- | --- | --- |
73-
| 5603 | WIT 4-15kW Hybrid | ✅ Confirmed |
81+
<div class="dtc-table" markdown>
82+
83+
| DTC | Model | Profile to select | Mapping |
84+
| --- | --- | --- | --- |
85+
| 5603 | WIT 4-15kW Hybrid | WIT (4-15kW) | :material-check-circle:{ .dtc-ok }&nbsp;Confirmed |
86+
87+
</div>
7488

7589
> **WIT residential models (4-15KTL3):** The VPP V2.03 spec (dated 2025.9.1) does **not** include the WIT 4-15KTL3 residential series in its DTC table — only commercial WIT (50K-100K) models appear. DTC 5603 was confirmed by a live register read (register 30000 = 5603 on a WIT 15KTL3, Issue #335) with protocol version register 30099 = 203, so the residential range follows V2.03 register structure despite being omitted from the spec's device table.
7690

docs/stylesheets/extra.css

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/* DTC reference tables.
2+
*
3+
* The model column holds long semicolon-separated lists while the status column holds two
4+
* short words, so the browser's automatic layout starves the status column and wraps
5+
* "Confirmed" onto its own line under the icon. Fixed by giving the narrow columns an
6+
* explicit share and letting the model column absorb the rest.
7+
*
8+
* Applied via a wrapper class rather than to all tables, because the register tables on
9+
* the same pages have completely different proportions.
10+
*/
11+
12+
.dtc-table table {
13+
table-layout: fixed;
14+
width: 100%;
15+
}
16+
17+
/* DTC code */
18+
.dtc-table th:nth-child(1),
19+
.dtc-table td:nth-child(1) {
20+
width: 4.5rem;
21+
white-space: nowrap;
22+
}
23+
24+
/* Profile to select */
25+
.dtc-table th:nth-child(3),
26+
.dtc-table td:nth-child(3) {
27+
width: 11rem;
28+
}
29+
30+
/* Mapping status — icon and word must stay on one line */
31+
.dtc-table th:nth-child(4),
32+
.dtc-table td:nth-child(4) {
33+
width: 9.5rem;
34+
white-space: nowrap;
35+
}
36+
37+
/* Model column takes whatever is left and wraps freely */
38+
.dtc-table td:nth-child(2) {
39+
word-break: normal;
40+
overflow-wrap: anywhere;
41+
}
42+
43+
/* Status icons.
44+
*
45+
* Rendered as inline SVG by pymdownx.emoji + material's to_svg generator, so they inherit
46+
* currentColor and can be themed here rather than depending on the reader's emoji font.
47+
*/
48+
.dtc-ok svg {
49+
fill: var(--md-typeset-color);
50+
color: #2e7d32;
51+
fill: currentColor;
52+
}
53+
54+
.dtc-unknown svg {
55+
color: #ef6c00;
56+
fill: currentColor;
57+
}
58+
59+
/* Dark scheme needs lighter variants to stay legible on the slate background. */
60+
[data-md-color-scheme="slate"] .dtc-ok svg {
61+
color: #66bb6a;
62+
}
63+
64+
[data-md-color-scheme="slate"] .dtc-unknown svg {
65+
color: #ffa726;
66+
}

mkdocs.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ theme:
4040
plugins:
4141
- search
4242

43+
extra_css:
44+
- stylesheets/extra.css
45+
4346
nav:
4447
- Home: index.md
4548
- Hardware:
@@ -53,6 +56,7 @@ nav:
5356
- Raising an Issue: troubleshooting/raising-an-issue.md
5457
- Diagnostic Service: troubleshooting/diagnostic-service.md
5558
- DTC Debugging: troubleshooting/dtc-debugging.md
59+
- RS485 Gateways: troubleshooting/rs485-gateways.md
5660
- Developer:
5761
- Adding Sensors: developer/adding-sensors.md
5862
- New Profile Guide: developer/new-profile.md
@@ -74,3 +78,8 @@ markdown_extensions:
7478
- pymdownx.details
7579
- attr_list
7680
- md_in_html
81+
# Renders :material-xxx: as inline SVG rather than an emoji glyph, so status icons
82+
# look the same on every platform instead of inheriting the OS emoji font.
83+
- pymdownx.emoji:
84+
emoji_index: !!python/name:material.extensions.emoji.twemoji
85+
emoji_generator: !!python/name:material.extensions.emoji.to_svg

0 commit comments

Comments
 (0)