From 3ab74a8c21a21bb77f9f38a9ca58f4211233643a Mon Sep 17 00:00:00 2001 From: retr0 <42kdesigners@gmail.com> Date: Wed, 29 Apr 2026 08:48:02 +0200 Subject: [PATCH] =?UTF-8?q?Fix:=20Eigenverbrauch=20=3D=20PV=5Fgesamt=20?= =?UTF-8?q?=E2=88=92=20Einspeisung=20statt=20nur=20Batterie-Entladung=20(v?= =?UTF-8?q?1.8.3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vollständige Formel: total_energy_total - grid_export_kwh deckt Direktverbrauch (PV→Haus) + Batterie-Umweg (PV→Bat→Haus) ab. Fallback auf bat_discharge_total wenn kein PV-Zähler verfügbar. Co-Authored-By: Claude Sonnet 4.6 --- haos-addon/config.yaml | 2 +- haos-addon/src/main.py | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/haos-addon/config.yaml b/haos-addon/config.yaml index ae477da..98c4289 100644 --- a/haos-addon/config.yaml +++ b/haos-addon/config.yaml @@ -1,5 +1,5 @@ name: ShineBridge -version: "1.8.2" +version: "1.8.3" 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 diff --git a/haos-addon/src/main.py b/haos-addon/src/main.py index 4e870f2..d7218a4 100644 --- a/haos-addon/src/main.py +++ b/haos-addon/src/main.py @@ -408,7 +408,8 @@ def api_period_energy(): pd_start_ts = datetime.datetime.combine(pd, datetime.time.min).timestamp() for agg_id in ("grid_import_kwh", "grid_export_kwh", - "bat_discharge_total", "bat_charge_total"): + "bat_discharge_total", "bat_charge_total", + "total_energy_total"): cur = agg.get(agg_id) if cur is None: continue @@ -432,9 +433,16 @@ def api_period_energy(): if "grid_export_kwh" in entry: entry["export_revenue"] = round(entry["grid_export_kwh"] * price_export, 2) - # Eigenverbrauch-Ersparnis: Batterie-Entladung (→ Haus + Auto) zu Importpreis - bat_dch = entry.get("bat_discharge_total") - if bat_dch is not None: + # Eigenverbrauch-Ersparnis: PV_gesamt − Einspeisung = alles was selbst verbraucht wurde + # (Direktverbrauch + Batterie-Umweg). Fällt PV nicht verfügbar: nur Batterie-Entladung. + pv_total = entry.get("total_energy_total") + grid_exp = entry.get("grid_export_kwh") + bat_dch = entry.get("bat_discharge_total") + if pv_total is not None and grid_exp is not None: + savings = round(max(0.0, pv_total - grid_exp), 2) + entry["savings_kwh"] = savings + entry["savings_eur"] = round(savings * eff_price, 2) + elif bat_dch is not None: entry["savings_kwh"] = bat_dch entry["savings_eur"] = round(bat_dch * eff_price, 2)