Fix: SPH Batterie-Leistung aus Energiebilanz statt Register 1009/1011 (v1.7.5)

Register 1009 (bat_discharge) liefert beim SPH im Lademodus falsche Werte.
Neue Ableitung: bat_net = pv1+pv2 + power_to_user - power_to_grid - ac_power_total
Alle vier Quellen sind direkt gemessene, verlässliche Register.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
retr0
2026-04-29 07:58:51 +02:00
parent 3ccf11771d
commit 9ff0b2e971
2 changed files with 13 additions and 6 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
name: ShineBridge
version: "1.7.4"
version: "1.7.5"
slug: shinebridge
description: Growatt Wechselrichter lokal in Home Assistant — Modbus TCP via ShineLAN-X, MQTT Discovery, Web UI
url: https://gitea.bitfire.work/retr0/shinebridge
+12 -5
View File
@@ -245,13 +245,20 @@ def _poll_loop(inv_cfg: Dict[str, Any], stop: threading.Event):
if values and "grid_power" not in values and "import_kwh" in values and "total_power" in values:
values["grid_power"] = values["total_power"]
# Growatt SPH: beide Batterie-Register können gleichzeitig != 0 sein (Messartefakt).
# Batterie kann physikalisch nur laden ODER entladen — kleineren Wert auf 0 setzen.
if values and "bat_charge_power" in values and "bat_discharge_power" in values:
if values["bat_charge_power"] >= values["bat_discharge_power"]:
# Growatt SPH: Register 1009/1011 für Batterie sind unzuverlässig (Messartefakt).
# Batterie-Nettoleistung wird stattdessen aus der Energiebilanz abgeleitet:
# bat_net = PV + grid_import - grid_export - ac_power_total
# Alle vier Quellen sind direkt gemessene, verlässliche Register.
if values and all(k in values for k in ("pv1_power", "ac_power_total",
"power_to_user", "power_to_grid")):
pv = values.get("pv1_power", 0) + values.get("pv2_power", 0)
bat_net = pv + values["power_to_user"] - values["power_to_grid"] - values["ac_power_total"]
if bat_net >= 0:
values["bat_charge_power"] = round(bat_net, 1)
values["bat_discharge_power"] = 0.0
else:
values["bat_charge_power"] = 0.0
values["bat_discharge_power"] = round(-bat_net, 1)
values["bat_charge_power"] = 0.0
# EMS: PV-Überschuss aus anderen Geräten holen und Ladestrom regeln
if ems is not None and values is not None: