diff --git a/README.md b/README.md index fc2d1a5..5f4209d 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,8 @@ Konfigurierbar pro Gerät im Web UI: > > Die EMS-Funktion muss zusätzlich in der Kathrein easyOperate-App aktiviert sein. +**Batterie-Schutz beim PV-Überschussladen:** Bei Anlagen mit Hausbatterie (z. B. Goodwe) wird die aktuelle Batterie-Entladeleistung vom berechneten PV-Überschuss abgezogen — ein Netzexport, der eigentlich aus dem Speicher kommt (z. B. bei bewölktem Wetter), wird so nicht fälschlich als PV-Überschuss fürs Auto verwendet. Betrifft nur PV-Überschussladen, Zwangsladen bleibt unverändert netzbasiert. + ## Netzleistung (grid_power) Der Sensor `grid_power` zeigt die Netzleistung intuitiv: diff --git a/ROADMAP.md b/ROADMAP.md index 6eda91c..bad4f31 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -18,7 +18,9 @@ Reihenfolge nach Aufwand/Abhängigkeit, nicht nach Wichtigkeit. 2. **Discord-Alerts** — bei Zwangsladen-Start, Fehlerzuständen (unbekannter Ladezustand), besonders günstigen Spot-Preisfenstern. Nutzt den bestehenden Homelab-Discord-Bot. War zurückgestellt bis zur Klärung des 6,5-Minuten-Zyklus — **ist jetzt geklärt** (siehe "Bekannte Einschränkungen", war kein ShineBridge-Bug), Punkt kann wieder angegangen werden. Braucht trotzdem generelles Debounce (Mindestabstand pro Alert-Typ, Zustand muss erst eine Weile stabil sein, günstige Preise als tägliche Zusammenfassung statt Live-Alert) — normales Alert-Design, keine Sonderbehandlung mehr nötig. 3. **Sessions pro Fahrzeug trennen** — falls mehrere Fahrer/Autos an einer Wallbox laden, aktuell nur eine Gesamt-Statistik. 4. **Lastspitzenkappung (Peak Shaving)** — Ladestrom drosseln, wenn Netzbezug (mehrere Autos + Haushalt gleichzeitig) einen Grenzwert überschreitet. Eigenes Sicherheits-Design nötig (was passiert bei Messfehler/Ausfall — nie ungebremst weiterladen). -5. **Prognosebasiertes Laden** — PV-Wetterprognose (z.B. Open-Meteo/Solcast) + Spot-Preis kombinieren, damit Zwangsladen nicht stur nach Timeout entscheidet, sondern z.B. "morgen wird's sonnig, noch etwas warten" berücksichtigt. Größter Umfang, externe API-Anbindung nötig. +5. **Prognosebasiertes Laden** — in zwei Teilen, hintereinander gebaut: + - ~~**Teil A: Batteriebewusster PV-Überschuss**~~ — erledigt (v1.11.2): Batterie-Entladeleistung wird vom PV-Überschuss abgezogen, damit PV-Überschussladen nie versehentlich den Hausspeicher anzapft (Zwangsladen bleibt unverändert netzbasiert). + - **Teil B: Wetterprognose + Sonnenstand** — PV-Wetterprognose (z.B. Open-Meteo/Solcast) + Spot-Preis kombinieren, damit Zwangsladen nicht stur nach Timeout entscheidet, sondern z.B. "morgen wird's sonnig, noch etwas warten" berücksichtigt. Größter Umfang, externe API-Anbindung nötig. 6. **Chart-Feintuning** — läuft nebenbei mit, keine feste Priorität (z.B. Live-Kosten-Ticker statt nur Rückblick). 7. **Auto-Cleanup verwaister MQTT-Geräte** — wenn ein Gerät aus ShineBridge entfernt wird, dessen MQTT-Discovery-Topics aktiv abmelden statt sie als tote HA-Geräte-Leichen zurückzulassen (siehe Fund unten). diff --git a/haos-addon/config.yaml b/haos-addon/config.yaml index 5a5712e..8132300 100644 --- a/haos-addon/config.yaml +++ b/haos-addon/config.yaml @@ -1,5 +1,5 @@ name: ShineBridge -version: "1.11.1" +version: "1.11.2" slug: shinebridge description: Energiemanagement für Growatt/Goodwe-Wechselrichter — PV-Überschussladen, Wallbox-EMS, Tarifvergleich, Zigbee2MQTT-Überschussgeräte url: https://gitea.bitfire.work/retr0/shinebridge diff --git a/haos-addon/src/main.py b/haos-addon/src/main.py index 15a3d9a..c76811f 100644 --- a/haos-addon/src/main.py +++ b/haos-addon/src/main.py @@ -223,9 +223,16 @@ def _compute_aggregates(allow_stale: bool = False) -> Dict[str, float]: # ── EMS Hilfsfunktionen ─────────────────────────────────────── def _get_pv_surplus() -> float: - """PV-Überschuss in Watt. Nutzt grid_power-Aggregat (negativ = Einspeisung).""" + """PV-Überschuss in Watt für PV-Überschussladen (nicht für Zwangsladen — das + bleibt unverändert netzbasiert). Netzexport (grid_power negativ = Einspeisung) + abzüglich aktueller Batterie-Entladeleistung, damit ein Überschuss, der + tatsächlich aus dem Hausspeicher kommt (z.B. bei bewölktem Wetter), nicht + fälschlich als PV-Überschuss fürs Auto verwendet wird. Anlagen ohne Batterie + (bat_discharge_power fehlt) verhalten sich unverändert wie zuvor.""" agg = _compute_aggregates(allow_stale=True) - return max(0.0, -agg.get("grid_power", 0.0)) + grid_export = max(0.0, -agg.get("grid_power", 0.0)) + bat_discharge = agg.get("bat_discharge_power", 0.0) + return max(0.0, grid_export - bat_discharge) # ── Poll Loop ─────────────────────────────────────────────────