Auto-Detection System¶
The integration automatically detects your inverter model using the Growatt VPP Protocol V2.01 standard.
🎯 How It Works¶
Auto-detection follows a 4-step priority system:
Step 1: DTC Code Detection (Primary - V2.01 Inverters)¶
Reads the Device Type Code from register 30000 (VPP 2.01 Protocol).
✅ Advantages: - Most reliable method - Official Growatt identification - Confirms V2.01 protocol support
❌ Limitations: - Only available on V2.01-capable inverters - Some models share DTC codes (refinement needed)
Step 2: DTC Refinement (When Needed)¶
For models sharing the same DTC code, additional register checks differentiate them:
| Shared DTC | Models | Check Register | Decision Logic |
|---|---|---|---|
| 3502 | SPH 3-6kW SPH 7-10kW |
31018 (V2.01 PV3) 11 (Legacy PV3) |
Has PV3 → 7-10kW No PV3 → 3-6kW |
| 5100 | TL-XH (standard) MIN TL-XH (hybrid) |
3003 (MIN range) 31217 (Battery SOC in VPP range) |
Has 3000+ range + battery → MIN TL-XH No 3000+ range → Standard TL-XH |
| 5200 | MIC MIN 3-6kW |
31010 (V2.01 MIN range) 3003 (Legacy MIN range) |
Readable → MIN Not readable → MIC |
| 5400 | MOD MID |
31217 (V2.01 Battery SOC) 3169 (Legacy Battery voltage) |
Readable → MOD Not readable → MID |
Step 3: Model Name Detection¶
If DTC unavailable, reads model name string from holding registers and pattern-matches against known models.
Step 4: Register Range Probing (Legacy Fallback)¶
If DTC and model name unavailable, probes different register ranges to identify the inverter series:
Detection Patterns: - MIN Series: Tests register 3003 (PV1 voltage in 3000 range) - If readable → MIN detected - Tests register 31217 (Battery SOC in VPP range): Readable = MIN TL-XH hybrid - Tests register 3011 (PV3): Readable = 7-10kW, Not readable = 3-6kW - Hybrid Models: Tests register 3169 (battery voltage) - If readable → Hybrid model (SPH/TL-XH/MOD) - Tests 3-phase registers: Determines MOD/SPH-TL3 vs single-phase hybrid - MID Series: Tests 3-phase grid-tied registers (38, 42) - MIC Series: Tests base range (0-124) without 3000 range
Result: Logs medium/low confidence detection - works for most legacy inverters!
📋 Official DTC Code Table¶
Based on Growatt VPP Protocol V2.01 - Table 3-1:
| Model Series | DTC Code | Protocol | Battery | Legacy Registers | Notes |
|---|---|---|---|---|---|
| SPH 3000-6000TL BL (legacy) | 3501 | Legacy | Yes | 0-124, 1000-1124 | Pre-UP model, reg 30099 = 0 |
| SPH 3000-6000TL BL -UP | 3502 | V2.01 | Yes | 0-124, 1000-1124, 30000+, 31000+ | Upgraded model, reg 30099 = 201 |
| SPF 3000-6000 ES PLUS | 3400-3403 | V2.01 | Yes | 0-124, 31200+ | Off-grid with battery |
| SPA 3000-6000TL BL | 3735 | V2.01 | Yes | 0-124 | SPA variant of SPH |
| SPH 4000-10000TL3 BH-UP | 3601 | V2.01 | Yes | 0-124, 1000-1124 | Three-phase hybrid |
| SPA 4000-10000TL3 BH-UP | 3725 | V2.01 | Yes | 0-124 | SPA variant |
| TL-XH 3000-10000 | 5100 | V2.01 | Yes | 0-124, 31200+ | Standard TL-XH (0-124 range) |
| MIN TL-XH 3000-10000 | 5100 | V2.01 | Yes | 3000-3124, 31200+ | MIN series TL-XH (3000+ range) |
| MIC/MIN 2500-6000TL-X/X2 | 5200 | V2.01 | No | 0-179 (MIC) 3000-3124 (MIN) |
Shared code |
| MIN 7000-10000TL-X/X2 | 5201 | V2.01 | No | 3000-3124 | Grid-tied, 3 PV strings |
| MOD-XH / MID-XH | 5400 | V2.01 | MOD: Yes MID: No |
0-124, 3000+ (MOD) 0-124 (MID) |
Shared code |
| WIT 4000-15000TL3 | 5603 | V2.03 | Yes | 0-124, 8000+, 31000+ | Three-phase hybrid with advanced storage — DTC confirmed via hardware register read (Issue #335) |
| WIT 100KTL3-H | 5601 | V2.01 | No | Uses MID profile | Large commercial |
| WIS 215KTL3 | 5800 | V2.01 | No | Uses MID profile | Large commercial |
🔍 Detection Examples¶
Example 1: MOD Inverter (V2.01)¶
1. Read register 30000 → DTC = 5400
2. DTC 5400 maps to MOD/MID (shared)
3. Check register 31217 (Battery SOC) → Readable
4. Result: MOD 6000-15000TL3-XH (V2.01) ✅
5. Protocol version: "Protocol 2.01" (from register 30099)
Example 2: MIN 7-10kW (V2.01)¶
1. Read register 30000 → DTC = 5201
2. DTC 5201 maps to MIN 7-10kW (unique code)
3. No refinement needed
4. Result: MIN Series 7-10kW (V2.01) ✅
5. Protocol version: "Protocol 2.01"
Example 3: Legacy MIN (Register Probing)¶
1. Read register 30000 → Not readable (No DTC)
2. Try model name detection → Not readable
3. Start register probing:
- Test register 3003 → Readable (MIN series confirmed)
- Test register 3011 → Readable (PV3 present = 7-10kW)
4. Result: MIN Series 7-10kW (Legacy) ✅
5. Protocol version: "Protocol Legacy"
6. Confidence: Medium (register probing)
Example 4: SPH Legacy Model (DTC with Protocol Check)¶
1. Read register 30000 → DTC = 3501
2. DTC 3501 maps to SPH 3000-6000TL BL
3. Check register 30099 (Protocol Version) → Returns 0
4. Protocol version 0 = Legacy protocol only
5. Convert profile: sph_3000_6000_v201 → sph_3000_6000 (legacy)
6. Result: SPH Series 3-6kW (Legacy) ✅
7. Battery controls use legacy registers (0-124 range)
Why Protocol Check Matters: - DTC 3501 = Pre-UP model (legacy firmware) - DTC 3502 = -UP model (V2.01 firmware) - Both use register 30000, but only -UP supports V2.01 protocol - Register 30099 confirms actual protocol support
Example 5: Manual Selection Required (Rare)¶
1. Read register 30000 → Not readable (No DTC)
2. Try model name detection → Not readable
3. Register probing → Inconclusive
4. Manual selection required → User selects from legacy profile list
5. Result: Selected model ✅
6. Protocol version: "Protocol Legacy"
⚙️ Configuration Flow¶
Auto-Detection Success¶
Connect → Read DTC → Identify Model → Show Confirmation
↓
"Detected: MOD 6000-15000TL3-XH (V2.01)"
↓
[✅ Accept] or [🔧 Choose Different]
Auto-Detection Fallback (Legacy)¶
Connect → Read DTC → Failed → Try Model Name → Failed
↓
Register Probing
↓
┌─────────────────┴─────────────────┐
↓ ↓
Success (Medium confidence) Failed (Rare)
↓ ↓
Show Confirmation Screen Show Manual Selection
"Detected: MIN 7-10kW (Legacy)" "Please select your model"
↓ ↓
[✅ Accept] or [🔧 Choose Different] [Select from legacy profiles]
The manual selection list only shows legacy profiles because: - If V2.01 was supported, auto-detection would have succeeded - DTC register (30000) not readable = Legacy protocol only
🛠️ Troubleshooting Auto-Detection¶
"Auto-detection failed"¶
Causes: - Inverter uses legacy protocol (no DTC register) - Communication issues - Incorrect Modbus settings
Solution: 1. Manually select your inverter series from the list 2. Legacy profile will be used automatically 3. Check logs for specific error details
"Wrong model detected"¶
Causes: - Shared DTC code with failed refinement - Non-standard firmware
Solution: 1. In integration options, change inverter series manually 2. Report issue with logs to help improve detection
Protocol Version Shows "Legacy" but Should Be V2.01¶
Cause: - Register 30099 not implemented in firmware - Read error
Note: - Protocol version is informational only - Integration will still work correctly - V2.01 registers are included in profile regardless
📊 Detection Statistics¶
After successful detection, check Device Info in Home Assistant:
| Field | Example | Source |
|---|---|---|
| Model | MOD-15000TL3-XH | Register 125-132 (parsed) |
| Serial Number | AB12345678 | Register 23-27 or 3000-3015 |
| Firmware Version | 2.01 | Register 9-11 |
| Hardware Version | Protocol 2.01 | Register 30099 (VPP version) |
🔬 For Developers¶
Adding New DTC Codes¶
Edit /custom_components/growatt_modbus/auto_detection.py:
Testing Auto-Detection¶
Use the emulator with specific DTC codes:
python3 growatt_emulator.py
# Select model with V2.01 profile
# DTC code will be served from profile default
Check logs:
✓ Auto-detected from DTC code 5400: MOD 6000-15000TL3-XH (V2.01)
Detected V2.01 battery SOC register (31217) - MOD series
Detected protocol version: Protocol 2.01 (register 30099 = 201)
Choosing a profile by hand¶
Pick your family - SPH (3-6kW), MOD Hybrid (6-15kW) and so on. There is one entry per
family; you do not need to know which protocol your inverter speaks.
If sensors that should work report nothing¶
Ten families exist as two register maps: a V1.39 legacy one and a VPP V2.01 one. Which is used is decided by auto-detection at setup, and it is almost always right.
When it is wrong the symptom is specific and easy to misread. Both maps share the base and storage ranges, so most sensors work either way - only the handful that live in the range the inverter cannot read report a permanent zero. That looks like a broken sensor rather than a wrong profile.
Settings > Devices & Services > Growatt Modbus > Configure has a Protocol variant field for this:
| Setting | Meaning |
|---|---|
Auto |
Use what auto-detection concluded. Correct for almost everyone |
Legacy V1.39 |
Force the legacy map. Use if your inverter has no VPP support |
VPP V2.01 |
Force the V2.01 map |
The same page names the register map currently loaded under the form title. That is the value worth quoting in an issue - it says which of the two you are actually running, which the family name alone does not.
An inverter whose DTC was read from holding register 43 has no VPP support and wants the legacy map.