Skip to content

Commit

Permalink
Merge pull request #750 from canton7/bugfix/ac1-g2
Browse files Browse the repository at this point in the history
Fix detection of AC1-G2
  • Loading branch information
canton7 authored Jan 31, 2025
2 parents e9d0178 + eee5615 commit e8f5e6a
Show file tree
Hide file tree
Showing 2 changed files with 172 additions and 171 deletions.
1 change: 1 addition & 0 deletions custom_components/foxess_modbus/common/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class InverterModel(StrEnum):
H1_G2 = "H1_G2"

AC1 = "AC1"
AC1_G2 = "AC1_G2"
AIO_H1 = "AIO-H1"
AIO_AC1 = "AIO-AC1"

Expand Down
342 changes: 171 additions & 171 deletions custom_components/foxess_modbus/inverter_profiles.py
Original file line number Diff line number Diff line change
Expand Up @@ -237,178 +237,178 @@ def inverter_capacity(self, inverter_model: str) -> int:
return capacity


INVERTER_PROFILES = {
x.model: x
for x in [
# E.g. H1-5.0-E-G2. Has to appear before H1_G1.
InverterModelProfile(
InverterModel.H1_G2, r"^H1-([\d\.]+)-E-G2", capacity_parser=CapacityParser.H1
).add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={Version(1, 44): Inv.H1_G2_PRE144, None: Inv.H1_G2_144},
special_registers=H1_G2_REGISTERS,
),
# Can be both e.g. H1-5.0 and H1-5.0-E, but not H1-5.0-E-G2
InverterModelProfile(InverterModel.H1_G1, r"^H1-([\d\.]+)", capacity_parser=CapacityParser.H1)
.add_connection_type(
ConnectionType.AUX,
RegisterType.INPUT,
versions={None: Inv.H1_G1},
special_registers=H1_AC1_REGISTERS,
)
.add_connection_type(
ConnectionType.LAN,
RegisterType.HOLDING,
versions={None: Inv.H1_LAN},
),
# AC1-5.0-E-G2. Has to appear before AC1 G1 see https://github.com/nathanmarlor/foxess_modbus/discussions/715
InverterModelProfile(
InverterModel.AC1, r"^AC1-([\d\.]+)-E-G2", capacity_parser=CapacityParser.H1
).add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={Version(1, 44): Inv.H1_G2_PRE144, None: Inv.H1_G2_144},
special_registers=H1_G2_REGISTERS,
),
InverterModelProfile(InverterModel.AC1, r"^AC1-([\d\.]+)", capacity_parser=CapacityParser.H1)
.add_connection_type(
ConnectionType.AUX,
RegisterType.INPUT,
versions={None: Inv.H1_G1},
special_registers=H1_AC1_REGISTERS,
)
.add_connection_type(
ConnectionType.LAN,
RegisterType.HOLDING,
versions={None: Inv.H1_LAN},
),
InverterModelProfile(InverterModel.AIO_H1, r"^AIO-H1-([\d\.]+)", capacity_parser=CapacityParser.H1)
.add_connection_type(
ConnectionType.AUX,
RegisterType.INPUT,
versions={None: Inv.H1_G1},
special_registers=H1_AC1_REGISTERS,
)
.add_connection_type(
ConnectionType.LAN,
RegisterType.HOLDING,
versions={None: Inv.H1_LAN},
),
InverterModelProfile(
InverterModel.AIO_AC1, r"^AIO-AC1-([\d\.]+)", capacity_parser=CapacityParser.H1
).add_connection_type(
ConnectionType.AUX,
RegisterType.INPUT,
versions={None: Inv.H1_G1},
special_registers=H1_AC1_REGISTERS,
),
# The KH doesn't have a LAN port. It supports both input and holding over RS485
# Some models start with KH-, but some are just e.g. KH10.5
InverterModelProfile(InverterModel.KH, r"^KH([\d\.]+)").add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={Version(1, 19): Inv.KH_PRE119, Version(1, 33): Inv.KH_PRE133, None: Inv.KH_133},
special_registers=KH_REGISTERS,
),
# The H3 seems to use holding registers for everything
InverterModelProfile(InverterModel.H3, r"^H3-([\d\.]+)")
.add_connection_type(
ConnectionType.LAN,
RegisterType.HOLDING,
versions={None: Inv.H3},
special_registers=H3_REGISTERS,
)
.add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.H3},
special_registers=H3_REGISTERS,
),
InverterModelProfile(InverterModel.AC3, r"^AC3-([\d\.]+)")
.add_connection_type(
ConnectionType.LAN,
RegisterType.HOLDING,
versions={None: Inv.H3},
special_registers=H3_REGISTERS,
)
.add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.H3},
special_registers=H3_REGISTERS,
),
InverterModelProfile(InverterModel.AIO_H3, r"^AIO-H3-([\d\.]+)")
.add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.AIO_H3},
special_registers=H3_REGISTERS,
)
.add_connection_type(
ConnectionType.LAN,
RegisterType.HOLDING,
versions={None: Inv.AIO_H3},
special_registers=H3_REGISTERS,
),
# Kuara 6.0-3-H: H3-6.0-E
# Kuara 8.0-3-H: H3-8.0-E
# Kuara 10.0-3-H: H3-10.0-E
# Kuara 12.0-3-H: H3-12.0-E
# I haven't seen any indication that these support a direct LAN connection
InverterModelProfile(InverterModel.KUARA_H3, r"^Kuara ([\d\.]+)-3-H$").add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.KUARA_H3},
special_registers=H3_REGISTERS,
),
# Sonnenkraft:
# SK-HWR-8: H3-8.0-E
# (presumably there are other sizes also)
InverterModelProfile(InverterModel.SK_HWR, r"^SK-HWR-([\d\.]+)").add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.H3},
special_registers=H3_REGISTERS,
),
# STAR
# STAR-H3-12.0-E: H3-12.0-E
# (presumably there are other sizes also)
InverterModelProfile(InverterModel.STAR_H3, r"^STAR-H3-([\d\.]+)").add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.H3},
special_registers=H3_REGISTERS,
),
# Solavita SP
# These have the form 'SP R8KH3', 'R10KH3', 'R12KH3', but the number doesn't map to a power
# https://www.svcenergy.com/product/three-phase-solar-power-hybrid-inverter-sih
InverterModelProfile(
InverterModel.SOLAVITA_SP,
r"^SP R(\d+)KH3",
capacity_parser=CapacityParser(
capacity_map={
"8": 10400,
"10": 13000,
"12": 15600,
},
fallback_to_kw=False,
),
).add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.H3},
special_registers=H3_REGISTERS,
),
# E.g. H3-Pro-20.0
InverterModelProfile(InverterModel.H3_PRO, r"^H3-Pro-([\d\.]+)").add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.H3_PRO},
special_registers=H3_REGISTERS,
_INVERTER_PROFILES_LIST = [
# E.g. H1-5.0-E-G2. Has to appear before H1_G1.
InverterModelProfile(
InverterModel.H1_G2, r"^H1-([\d\.]+)-E-G2", capacity_parser=CapacityParser.H1
).add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={Version(1, 44): Inv.H1_G2_PRE144, None: Inv.H1_G2_144},
special_registers=H1_G2_REGISTERS,
),
# Can be both e.g. H1-5.0 and H1-5.0-E, but not H1-5.0-E-G2
InverterModelProfile(InverterModel.H1_G1, r"^H1-([\d\.]+)", capacity_parser=CapacityParser.H1)
.add_connection_type(
ConnectionType.AUX,
RegisterType.INPUT,
versions={None: Inv.H1_G1},
special_registers=H1_AC1_REGISTERS,
)
.add_connection_type(
ConnectionType.LAN,
RegisterType.HOLDING,
versions={None: Inv.H1_LAN},
),
# AC1-5.0-E-G2. Has to appear before AC1 G1 see https://github.com/nathanmarlor/foxess_modbus/discussions/715
InverterModelProfile(
InverterModel.AC1_G2, r"^AC1-([\d\.]+)-E-G2", capacity_parser=CapacityParser.H1
).add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={Version(1, 44): Inv.H1_G2_PRE144, None: Inv.H1_G2_144},
special_registers=H1_G2_REGISTERS,
),
InverterModelProfile(InverterModel.AC1, r"^AC1-([\d\.]+)", capacity_parser=CapacityParser.H1)
.add_connection_type(
ConnectionType.AUX,
RegisterType.INPUT,
versions={None: Inv.H1_G1},
special_registers=H1_AC1_REGISTERS,
)
.add_connection_type(
ConnectionType.LAN,
RegisterType.HOLDING,
versions={None: Inv.H1_LAN},
),
InverterModelProfile(InverterModel.AIO_H1, r"^AIO-H1-([\d\.]+)", capacity_parser=CapacityParser.H1)
.add_connection_type(
ConnectionType.AUX,
RegisterType.INPUT,
versions={None: Inv.H1_G1},
special_registers=H1_AC1_REGISTERS,
)
.add_connection_type(
ConnectionType.LAN,
RegisterType.HOLDING,
versions={None: Inv.H1_LAN},
),
InverterModelProfile(
InverterModel.AIO_AC1, r"^AIO-AC1-([\d\.]+)", capacity_parser=CapacityParser.H1
).add_connection_type(
ConnectionType.AUX,
RegisterType.INPUT,
versions={None: Inv.H1_G1},
special_registers=H1_AC1_REGISTERS,
),
# The KH doesn't have a LAN port. It supports both input and holding over RS485
# Some models start with KH-, but some are just e.g. KH10.5
InverterModelProfile(InverterModel.KH, r"^KH([\d\.]+)").add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={Version(1, 19): Inv.KH_PRE119, Version(1, 33): Inv.KH_PRE133, None: Inv.KH_133},
special_registers=KH_REGISTERS,
),
# The H3 seems to use holding registers for everything
InverterModelProfile(InverterModel.H3, r"^H3-([\d\.]+)")
.add_connection_type(
ConnectionType.LAN,
RegisterType.HOLDING,
versions={None: Inv.H3},
special_registers=H3_REGISTERS,
)
.add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.H3},
special_registers=H3_REGISTERS,
),
InverterModelProfile(InverterModel.AC3, r"^AC3-([\d\.]+)")
.add_connection_type(
ConnectionType.LAN,
RegisterType.HOLDING,
versions={None: Inv.H3},
special_registers=H3_REGISTERS,
)
.add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.H3},
special_registers=H3_REGISTERS,
),
InverterModelProfile(InverterModel.AIO_H3, r"^AIO-H3-([\d\.]+)")
.add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.AIO_H3},
special_registers=H3_REGISTERS,
)
.add_connection_type(
ConnectionType.LAN,
RegisterType.HOLDING,
versions={None: Inv.AIO_H3},
special_registers=H3_REGISTERS,
),
# Kuara 6.0-3-H: H3-6.0-E
# Kuara 8.0-3-H: H3-8.0-E
# Kuara 10.0-3-H: H3-10.0-E
# Kuara 12.0-3-H: H3-12.0-E
# I haven't seen any indication that these support a direct LAN connection
InverterModelProfile(InverterModel.KUARA_H3, r"^Kuara ([\d\.]+)-3-H$").add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.KUARA_H3},
special_registers=H3_REGISTERS,
),
# Sonnenkraft:
# SK-HWR-8: H3-8.0-E
# (presumably there are other sizes also)
InverterModelProfile(InverterModel.SK_HWR, r"^SK-HWR-([\d\.]+)").add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.H3},
special_registers=H3_REGISTERS,
),
# STAR
# STAR-H3-12.0-E: H3-12.0-E
# (presumably there are other sizes also)
InverterModelProfile(InverterModel.STAR_H3, r"^STAR-H3-([\d\.]+)").add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.H3},
special_registers=H3_REGISTERS,
),
# Solavita SP
# These have the form 'SP R8KH3', 'R10KH3', 'R12KH3', but the number doesn't map to a power
# https://www.svcenergy.com/product/three-phase-solar-power-hybrid-inverter-sih
InverterModelProfile(
InverterModel.SOLAVITA_SP,
r"^SP R(\d+)KH3",
capacity_parser=CapacityParser(
capacity_map={
"8": 10400,
"10": 13000,
"12": 15600,
},
fallback_to_kw=False,
),
]
}
).add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.H3},
special_registers=H3_REGISTERS,
),
# E.g. H3-Pro-20.0
InverterModelProfile(InverterModel.H3_PRO, r"^H3-Pro-([\d\.]+)").add_connection_type(
ConnectionType.AUX,
RegisterType.HOLDING,
versions={None: Inv.H3_PRO},
special_registers=H3_REGISTERS,
),
]

INVERTER_PROFILES = {x.model: x for x in _INVERTER_PROFILES_LIST}
assert len(INVERTER_PROFILES) == len(_INVERTER_PROFILES_LIST)


def create_entities(entity_type: type[Entity], controller: EntityController) -> list[Entity]:
Expand Down

0 comments on commit e8f5e6a

Please sign in to comment.