Skip to content

Commit fb56428

Browse files
Merge pull request #5331 from springfall2008/fix/gateway-per-inverter-args
fix(gateway): bind battery_scaling, battery_rate_max and inverter_time per inverter
2 parents 57ec7bf + 209c163 commit fb56428

2 files changed

Lines changed: 33 additions & 6 deletions

File tree

‎apps/predbat/gateway.py‎

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,6 +1291,9 @@ def automatic_config(self):
12911291
discharge_enable_entities = []
12921292
export_limit_entities = []
12931293
inverter_limit_entities = []
1294+
battery_scaling_entities = []
1295+
battery_rate_max_entities = []
1296+
inverter_time_entities = []
12941297

12951298
for inv in inverters:
12961299
suffix = inv.serial[-6:].lower()
@@ -1323,6 +1326,10 @@ def automatic_config(self):
13231326
self.log(f"Warn: GatewayMQTT: inverter {inv.serial} has no battery capacity, setting to None for automatic discovery")
13241327

13251328
inverter_limit_entities.append(f"sensor.{base}_inverter_rate_max")
1329+
battery_scaling_entities.append(f"sensor.{base}_battery_dod")
1330+
battery_rate_max_entities.append(f"sensor.{base}_battery_rate_max")
1331+
# Clock drift detection — uses GatewayStatus.timestamp
1332+
inverter_time_entities.append(f"sensor.{base}_inverter_time")
13261333

13271334
# Map entity lists to PredBat args
13281335
self.set_arg("soc_percent", soc_entities)
@@ -1355,13 +1362,11 @@ def automatic_config(self):
13551362

13561363
# Battery health (first inverter)
13571364
self.set_arg("battery_temperature_history", f"sensor.{base0}_battery_temperature")
1358-
self.set_arg("battery_scaling", [f"sensor.{base0}_battery_dod"])
13591365

1360-
# Battery rate max
1361-
self.set_arg("battery_rate_max", [f"sensor.{base0}_battery_rate_max"])
1362-
1363-
# Inverter time (clock drift detection — uses GatewayStatus.timestamp)
1364-
self.set_arg("inverter_time", [f"sensor.{base0}_inverter_time"])
1366+
# Per-inverter: inverter.py reads these at index=self.id, so each needs one entry per inverter
1367+
self.set_arg("battery_scaling", battery_scaling_entities)
1368+
self.set_arg("battery_rate_max", battery_rate_max_entities)
1369+
self.set_arg("inverter_time", inverter_time_entities)
13651370

13661371
# EMS aggregate entities (GivEnergy EMS only)
13671372
inv0 = inverters[0]

‎apps/predbat/tests/test_gateway.py‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,6 +1746,28 @@ def test_multi_inverter_produces_multiple_entity_lists(self):
17461746
assert "000aa1" in gw._args["soc_percent"][0]
17471747
assert "000bb2" in gw._args["soc_percent"][1]
17481748

1749+
def test_multi_inverter_battery_args_have_one_entry_per_inverter(self):
1750+
"""battery_scaling, battery_rate_max and inverter_time are per-inverter args, so each gets one entry per primary inverter.
1751+
1752+
A single entry leaves inverter 1 reading index 1 out of range: PredBat falls back to a 2600 W battery_rate_max
1753+
and 1.0 battery_scaling, and never checks that inverter's clock.
1754+
"""
1755+
gw = self._make_gateway()
1756+
status = pb.GatewayStatus()
1757+
status.device_id = "pbgw_multi"
1758+
status.firmware = "1.0.0"
1759+
status.schema_version = 1
1760+
self._make_inverter(status, serial="CE2223G800", primary=True)
1761+
self._make_inverter(status, serial="CE2225G400", primary=True)
1762+
gw._last_status = status
1763+
gw.automatic_config()
1764+
1765+
base0 = f"{gw.prefix}_gateway_23g800"
1766+
base1 = f"{gw.prefix}_gateway_25g400"
1767+
assert gw._args["battery_scaling"] == [f"sensor.{base0}_battery_dod", f"sensor.{base1}_battery_dod"]
1768+
assert gw._args["battery_rate_max"] == [f"sensor.{base0}_battery_rate_max", f"sensor.{base1}_battery_rate_max"]
1769+
assert gw._args["inverter_time"] == [f"sensor.{base0}_inverter_time", f"sensor.{base1}_inverter_time"]
1770+
17491771
# ------------------------------------------------------------------
17501772
# Secondary (cloud) and unsupported feature args
17511773
# ------------------------------------------------------------------

0 commit comments

Comments
 (0)