Skip to content

Commit 3a8b093

Browse files
committed
feat(inverter): add LuxPower LXP family + rebrand drivers
- lxp_6k: LuxPower LXP 6K (SNA-US 6000 platform, 2-MPPT single-phase) - lxp_12k / lxp_18k: LuxPower LXP 12K/18K (18KPV platform, 3-MPPT split-phase) - fortress_envy_12k: Fortress Envy True 12K (rebadged LXP 12K) - bigbattery_sna_6k: BigBattery SNA-US 6K (rebadged SNA-US 6000) All are aliases of the two existing validated families (luxpower_sna and eg4_18kpv) — the LuxPower/EG4 protocol is model-agnostic with runtime model detection via hold registers 7-8 + register 16 (DTC). No new register map needed; PV string count is handled at runtime via hold register 20. Source: docs/reference/luxpower-ha-register-map.md
1 parent c05394b commit 3a8b093

7 files changed

Lines changed: 147 additions & 0 deletions

File tree

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
"""BigBattery SNA-US 6K inverter driver.
2+
3+
The BigBattery SNA-US 6K is a rebadged LuxPower SNA-US 6000 (2-MPPT,
4+
single-phase off-grid), sold as-is under the BigBattery brand. It shares the
5+
exact same register map as the EG4 6000XP. This driver is an alias of the
6+
canonical `luxpower_sna` driver.
7+
"""
8+
from __future__ import annotations
9+
10+
from . import ModelDriver
11+
from .luxpower_sna import create_driver as _sna
12+
13+
14+
def create_driver() -> ModelDriver:
15+
drv = _sna()
16+
drv.name = "bigbattery_sna_6k"
17+
drv.label = "BigBattery SNA-US 6K"
18+
return drv
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
"""Fortress Power Envy True 12K inverter driver.
2+
3+
The Fortress Power Envy True 12K (formerly "Envy 12kW") is a rebadged
4+
LuxPower LXP 12K — 3-MPPT, split-phase 120/240V hybrid. It shares the exact
5+
same register map as the EG4 18KPV / 12kPV. This driver is an alias of the
6+
`eg4_18kpv` driver (document-derived, not yet capture-validated).
7+
"""
8+
from __future__ import annotations
9+
10+
from . import ModelDriver
11+
from .eg4_18kpv import create_driver as _18kpv
12+
13+
14+
def create_driver() -> ModelDriver:
15+
drv = _18kpv()
16+
drv.name = "fortress_envy_12k"
17+
drv.label = "Fortress Envy True 12K"
18+
return drv

‎collector/drivers/lxp_12k.py‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
"""LuxPower LXP 12K inverter driver.
2+
3+
The LuxPower LXP 12K is the OEM's own branding of the 12 kW hybrid platform
4+
(3-MPPT, split-phase 120/240V, AFCI, generator input). It shares the exact
5+
same register map as the EG4 18KPV / 12kPV. This driver is an alias of the
6+
`eg4_18kpv` driver (document-derived, not yet capture-validated).
7+
"""
8+
from __future__ import annotations
9+
10+
from . import ModelDriver
11+
from .eg4_18kpv import create_driver as _18kpv
12+
13+
14+
def create_driver() -> ModelDriver:
15+
drv = _18kpv()
16+
drv.name = "lxp_12k"
17+
drv.label = "LuxPower LXP 12K"
18+
return drv

‎collector/drivers/lxp_18k.py‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
"""LuxPower LXP 18K inverter driver.
2+
3+
The LuxPower LXP 18K is the OEM's own branding of the 18 kW hybrid platform
4+
(3-MPPT, split-phase 120/240V, AFCI, generator input). It shares the exact
5+
same register map as the EG4 18KPV. This driver is an alias of the
6+
`eg4_18kpv` driver (document-derived, not yet capture-validated).
7+
"""
8+
from __future__ import annotations
9+
10+
from . import ModelDriver
11+
from .eg4_18kpv import create_driver as _18kpv
12+
13+
14+
def create_driver() -> ModelDriver:
15+
drv = _18kpv()
16+
drv.name = "lxp_18k"
17+
drv.label = "LuxPower LXP 18K"
18+
return drv

‎collector/drivers/lxp_6k.py‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
"""LuxPower LXP 6K inverter driver.
2+
3+
The LuxPower LXP 6K is the OEM's own branding of the SNA-US 6000 platform
4+
(2-MPPT, single-phase off-grid). It shares the exact same register map as the
5+
EG4 6000XP. This driver is an alias of the canonical `luxpower_sna` driver.
6+
"""
7+
from __future__ import annotations
8+
9+
from . import ModelDriver
10+
from .luxpower_sna import create_driver as _sna
11+
12+
13+
def create_driver() -> ModelDriver:
14+
drv = _sna()
15+
drv.name = "lxp_6k"
16+
drv.label = "LuxPower LXP 6K"
17+
return drv

‎collector/drivers/registry.py‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212
from .eg4_6500ex import create_driver as _eg4_6500ex
1313
from .eg4_3000ehv import create_driver as _eg4_3000ehv
1414
from .luxpower_sna import create_driver as _luxpower_sna
15+
from .lxp_6k import create_driver as _lxp_6k
16+
from .lxp_12k import create_driver as _lxp_12k
17+
from .lxp_18k import create_driver as _lxp_18k
18+
from .fortress_envy_12k import create_driver as _fortress_envy_12k
19+
from .bigbattery_sna_6k import create_driver as _bigbattery_sna_6k
1520

1621
logger = logging.getLogger(__name__)
1722

@@ -40,6 +45,18 @@
4045
"eg4_18kpv": _eg4_18kpv,
4146
"eg4_12kpv": _eg4_12kpv,
4247

48+
# ── LuxPower LXP family (OEM's own branding) ──
49+
# LXP 6K = SNA-US 6000 (2-MPPT single-phase); LXP 12K/18K = 18KPV
50+
# platform (3-MPPT split-phase). Same shared register map.
51+
"lxp_6k": _lxp_6k,
52+
"lxp_12k": _lxp_12k,
53+
"lxp_18k": _lxp_18k,
54+
55+
# ── Other LuxPower rebrands ──
56+
# Fortress Envy True 12K = LXP 12K; BigBattery SNA-US 6K = SNA-US 6000.
57+
"fortress_envy_12k": _fortress_envy_12k,
58+
"bigbattery_sna_6k": _bigbattery_sna_6k,
59+
4360
# ── FlexBOSS / GridBOSS ──
4461
# NEW platform (not a Luxpower SNA rebadge). Register map unknown; do NOT
4562
# alias to either family above. Intentionally absent until a dedicated

‎tests/test_drivers.py‎

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,47 @@ def test_registry_has_sna_family():
1515
assert "eg4_3000ehv" in DRIVERS
1616

1717

18+
def test_registry_has_lxp_and_rebrands():
19+
assert "lxp_6k" in DRIVERS
20+
assert "lxp_12k" in DRIVERS
21+
assert "lxp_18k" in DRIVERS
22+
assert "fortress_envy_12k" in DRIVERS
23+
assert "bigbattery_sna_6k" in DRIVERS
24+
25+
26+
def test_lxp_6k_is_sna_family():
27+
base = get_driver("luxpower_sna")
28+
d = get_driver("lxp_6k")
29+
assert d.input_registers is base.input_registers
30+
assert d.batches == base.batches
31+
assert d.label == "LuxPower LXP 6K"
32+
33+
34+
def test_bigbattery_is_sna_family():
35+
base = get_driver("luxpower_sna")
36+
d = get_driver("bigbattery_sna_6k")
37+
assert d.input_registers is base.input_registers
38+
assert d.batches == base.batches
39+
assert d.label == "BigBattery SNA-US 6K"
40+
41+
42+
def test_lxp_12k_18k_are_18kpv_family():
43+
kpv = get_driver("eg4_18kpv")
44+
for model, label in (("lxp_12k", "LuxPower LXP 12K"), ("lxp_18k", "LuxPower LXP 18K")):
45+
d = get_driver(model)
46+
assert d.input_registers is kpv.input_registers
47+
assert d.batches == kpv.batches
48+
assert d.label == label
49+
50+
51+
def test_fortress_envy_is_18kpv_family():
52+
kpv = get_driver("eg4_18kpv")
53+
d = get_driver("fortress_envy_12k")
54+
assert d.input_registers is kpv.input_registers
55+
assert d.batches == kpv.batches
56+
assert d.label == "Fortress Envy True 12K"
57+
58+
1859
def test_sna_aliases_share_register_family():
1960
# 12000XP / 6500EX / 3000EHV are SNA rebadges → same map as 6000XP
2061
base = get_driver("eg4_6000xp")

0 commit comments

Comments
 (0)