## đŻ HauptĂ€nderungen ### Version 3.4.0 - SOC-Drift & Charging Capacity - âš Sicherheitspuffer (20-50% konfigurierbar) fĂŒr untertĂ€gige SOC-Schwankungen - âš Monatliche automatische Batterie-Kalibrierung - đ SOC-PlausibilitĂ€ts-Check (filtert 65535% Spikes beim Modus-Wechsel) - đ ZeitabhĂ€ngige API-Abfrage (vor/nach 14:00 Uhr) ### Neue Features - đ **Safety Buffer**: Kompensiert SOC-Drift und Eigenverbrauch - đ **Auto-Calibration**: Monatlicher Vollzyklus fĂŒr SOC-Genauigkeit - đ **Spike Protection**: 4-fach Schutz gegen ungĂŒltige SOC-Werte - đ **Smart API**: Verhindert HTTP 500 Errors bei fehlenden Tomorrow-Preisen ### Dokumentation - đ SOC_CALIBRATION_GUIDE.md - Umfassender Kalibrierungs-Guide - đ FIX_CHARGING_CAPACITY.md - Sicherheitspuffer-Dokumentation - đ FIX_SOC_SPIKE_PROBLEM.md - Spike-Protection-Lösung - đ FIX_API_TIMING.md - ZeitabhĂ€ngige API-Abfrage - đ DIAGNOSE_LADE_PROBLEM.md - Debug-Guide ### Neue Dateien - battery_calibration_automation.yaml - 4 Automations fĂŒr Kalibrierung - battery_calibration_input_helper.yaml - Input Helper Config - battery_optimizer_input_helper_safety_buffer.yaml - Puffer Config - debug_schedule.py - Umfassendes Debug-Script ### Scripts - battery_charging_optimizer.py v3.4.0 - hastrom_flex_extended.py v1.1.0 - debug_schedule.py v1.0.0 ### Fixes - đ SOC springt auf 65535% beim ESS-Modus-Wechsel â Debounce + PlausibilitĂ€ts-Check - đ API-HTTP-500 vor 14:00 â ZeitabhĂ€ngige Abfrage - đ Batterie nicht bis 100% geladen â Sicherheitspuffer - đ SOC driftet ohne Vollzyklen â Automatische Kalibrierung ## đ Installation 1. Input Helper erstellen (siehe battery_optimizer_input_helper_safety_buffer.yaml) 2. Automations installieren (siehe battery_calibration_automation.yaml) 3. Scripts aktualisieren (battery_charging_optimizer.py v3.4.0) 4. PyScript neu laden ## đ Verbesserungen - PrĂ€zisere Ladeplanung durch Sicherheitspuffer - Robustheit gegen SOC-Drift - Keine API-Fehler mehr vor 14:00 - Hardware-Stopp bei 100% wird respektiert - Bessere Batterie-Gesundheit durch regelmĂ€Ăige Kalibrierung đ€ Generated with Claude Code (claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
12 KiB
SOC-Kalibrierung & Drift-Management
Problem: SOC ist berechnet, nicht gemessen
Wie SOC funktioniert
Der State of Charge (SOC) wird vom Battery Management System (BMS) berechnet, nicht direkt gemessen:
Berechnungsmethoden:
-
Coulomb Counting (Hauptmethode)
- Integriert Strom ĂŒber Zeit: â« I(t) dt
- Geladen mit 5A fĂŒr 1h = +5Ah
- Entladen mit 3A fĂŒr 1h = -3Ah
- Netto: +2Ah â SOC steigt um ~2%
-
Spannungsbasiert (Open Circuit Voltage)
- Zellspannung korreliert mit SOC
- 4.2V/Zelle â 100% SOC
- 3.2V/Zelle â 0% SOC (Minimum)
-
Kalman-Filter / State Estimation
- Kombiniert beide Methoden
- BerĂŒcksichtigt Temperatur, Alterung, Laderate
Warum SOC abweicht (Drift)
Hauptursachen:
| Ursache | Effekt | Beispiel |
|---|---|---|
| Keine vollen Zyklen | BMS verliert Referenzpunkte | Immer 30-92%, nie 20-100% |
| Coulomb Counting Fehler | Akkumuliert ĂŒber Zeit | 0.1% Fehler/Tag = 3% nach 1 Monat |
| Temperatur | KapazitÀt Àndert sich | 10kWh bei 20°C, 9.5kWh bei 5°C |
| Alterung | TatsÀchliche KapazitÀt sinkt | 10kWh neu, 9.2kWh nach 3 Jahren |
| Strommessung | Sensorfehler (±1-2%) | 5.0A gemessen, 5.1A real |
| Selbstentladung | Nicht im SOC berĂŒcksichtigt | 1-2%/Monat |
Beispiel SOC-Drift:
Tag 1: BMS kalibriert, SOC = 100% (korrekt)
Tag 5: SOC = 95% (BMS sagt), real = 96% (+1% Drift)
Tag 10: SOC = 88% (BMS sagt), real = 91% (+3% Drift)
Tag 30: SOC = 65% (BMS sagt), real = 72% (+7% Drift)
â Nach Vollladung: Kalibriert sich neu
GoodWe-spezifische Einstellungen
Hardware-seitiges 20% Minimum
Du hast im GoodWe eingestellt:
- Minimum SOC: 20%
- Entladung stoppt bei 20%
- Freigabe nur bei Netzausfall
Bedeutung:
âââââââââââââââââââââââââââââââââââââââ
â 100% â Hardware-Maximum â
â â â
â 80% â Nutzbare KapazitĂ€t â
â â â
â 20% â Hardware-Minimum â â GoodWe stoppt hier!
â â â
â 0% â Nur bei Netzausfall â
âââââââââââââââââââââââââââââââââââââââ
Effektive KapazitÀt:
- Physisch: 10 kWh (100%)
- Nutzbar: 8 kWh (80% von 20-100%)
- Reserve fĂŒr Netzausfall: 2 kWh (20%)
Integration mit unserem Optimizer
Unser Optimizer:
min_soc: 20%(redundant, aber konsistent)max_soc: 100%reserve_capacity: 2 kWh(entspricht 20%)
Das passt perfekt zusammen! â
Auswirkungen auf die Optimierung
Problem 1: Ungenaue Planung
Szenario:
14:05 Uhr (Planung):
BMS zeigt: SOC 30%
Real: SOC 35% (5% Drift)
Optimizer plant: (100 - 30) Ă 10kWh - 2kWh = 6.8 kWh
TatsÀchlich braucht: (100 - 35) à 10kWh - 2kWh = 6.3 kWh
â Plant 500Wh zu viel
â Nutzt eventuell 1 Stunde mehr als nötig
â Könnte teurere Stunde nutzen
Problem 2: Keine Kalibrierung durch Teilzyklen
Typischer Tagesablauf (OHNE Kalibrierung):
07:00 â SOC 92% (nicht 100% erreicht)
â PV-Produktion ĂŒberschuss lĂ€dt minimal
09:00 â SOC 95% (immer noch nicht 100%)
â PV reicht fĂŒr Eigenverbrauch
12:00 â SOC 93% (leicht entladen)
â Eigenverbrauch ĂŒbersteigt PV
18:00 â SOC 65% (Eigenverbrauch ohne PV)
â Weiterer Eigenverbrauch
22:00 â SOC 45% (vor Laden)
â GĂŒnstige Stunden: Laden
23:00 â SOC 60% (teilweise geladen)
00:00 â SOC 75% (weiter geladen)
â Auto-Modus
07:00 â SOC 92% (nicht 100%)
â Kein voller Zyklus!
â BMS hat keine Referenzpunkte
â SOC driftet weiter
Lösungen
Lösung 1: Höherer Sicherheitspuffer (Sofort umsetzbar)
Empfehlung: 25-30% statt 20%
input_number:
battery_optimizer_safety_buffer:
initial: 30 # Statt 20
BegrĂŒndung:
- SOC kann um 5-10% abweichen
- Puffer kompensiert Drift
- Hardware stoppt sowieso bei 100%
- Lieber eine Stunde mehr laden als 8% zu wenig
Berechnung:
Ohne Drift:
6.8 kWh Ă 1.20 = 8.16 kWh (20% Puffer)
Mit 5% Drift:
6.8 kWh Ă 1.30 = 8.84 kWh (30% Puffer)
â Kompensiert Drift + normale Schwankungen
Lösung 2: Monatliche Kalibrierung (Empfohlen)
Automatischer Kalibrierungs-Zyklus:
Phase 1: Entladung (natĂŒrlich durch Eigenverbrauch)
- Ziel: SOC auf ~20% bringen
- Dauer: Normalerweise 1-2 Tage
- Optimizer pausiert (Manual Override)
Phase 2: Vollladung (erzwungen, unabhÀngig von Preisen)
- Ziel: SOC auf 100% laden
- Dauer: 2-5 Stunden (je nach Start-SOC)
- Volle Ladeleistung (5kW)
Phase 3: Kalibrierung (automatisch durch BMS)
- BMS erkennt: Zellen bei 4.2V = 100% SOC
- Vergleicht mit berechnetem SOC
- Korrigiert Coulomb Counter
- Passt KapazitÀts-SchÀtzung an
Ergebnis:
- â SOC wieder prĂ€zise
- â BMS hat Referenzpunkte
- â TatsĂ€chliche KapazitĂ€t bekannt
- â Drift zurĂŒckgesetzt
HĂ€ufigkeit:
- Minimum: Alle 3 Monate
- Empfohlen: Jeden Monat
- Bei Bedarf: Wenn SOC merklich abweicht
Installation: Siehe battery_calibration_automation.yaml
Lösung 3: SOC-Monitoring (Automatisch)
Erkenne SOC-Drift automatisch:
# Automation: SOC-Drift-Detektor
alias: "Batterie: SOC-Drift Warnung"
description: "Warnt wenn SOC wahrscheinlich driftet"
trigger:
# Wenn Batterie "voll" ist aber nicht 100%
- platform: state
entity_id: input_boolean.goodwe_manual_control
from: "on"
to: "off"
for:
minutes: 30
condition:
# SOC ist unter 98%
- condition: numeric_state
entity_id: sensor.esssoc
below: 98
# Aber Laden lief mehr als 2 Stunden
- condition: template
value_template: >
{% set duration = as_timestamp(now()) - as_timestamp(trigger.from_state.last_changed) %}
{{ duration > 7200 }}
action:
- service: notify.persistent_notification
data:
title: "SOC-Drift erkannt?"
message: >
Laden lief {{ ((as_timestamp(now()) - as_timestamp(trigger.from_state.last_changed)) / 3600) | round(1) }}h,
aber SOC ist nur {{ states('sensor.esssoc') }}%.
Eventuell SOC-Drift? Kalibrierung empfohlen.
Installation der Kalibrierung
Schritt 1: Input Helper erstellen
# In configuration.yaml
input_boolean:
battery_calibration_active:
name: "Batterie Kalibrierung aktiv"
icon: mdi:battery-sync
initial: off
Via UI:
- Einstellungen â GerĂ€te & Dienste â Helfer
- "Helfer hinzufĂŒgen" â "Toggle/Schalter"
- Name:
Batterie Kalibrierung aktiv - Entity ID:
input_boolean.battery_calibration_active - Icon:
mdi:battery-sync
Schritt 2: Automations installieren
Kopiere die 4 Automations aus battery_calibration_automation.yaml:
- Kalibrierung starten (jeden 1. des Monats)
- Kalibrierungs-Laden (stĂŒndlich wĂ€hrend aktiv)
- Kalibrierung beenden (nach 24h oder bei 100%)
- Notfall-Abbruch (bei kritisch niedrigem SOC)
Via UI oder YAML:
- UI: Einstellungen â Automationen & Szenen â Neue Automation â YAML-Modus
- YAML: In
automations.yamleinfĂŒgen
Schritt 3: Testen
Manuelle Kalibrierung triggern:
# Developer Tools â Services
service: input_boolean.turn_on
target:
entity_id: input_boolean.battery_calibration_active
Beobachte:
- Manual Override wird aktiviert
- Batterie lÀdt auf 100%
- Nach 24h oder bei 100%: Automatische Deaktivierung
Best Practices
Wann Kalibrierung durchfĂŒhren?
Automatisch:
- â Jeden Monat (1. des Monats)
- â Nach Software-Updates
- â Nach lĂ€ngeren AusfĂ€llen
Manuell:
- â ïž Wenn SOC merklich abweicht
- â ïž Wenn Batterie nie 100% erreicht
- â ïž Wenn KapazitĂ€t sich verĂ€ndert anfĂŒhlt
Nicht nötig:
- â Wöchentlich (zu hĂ€ufig)
- â Wenn SOC prĂ€zise ist
- â Bei normalen Teilzyklen
Optimale Kalibrierungs-Bedingungen
| Faktor | Optimal | Warum |
|---|---|---|
| Temperatur | 15-25°C | Beste Messgenauigkeit |
| Laderate | 0.5C (5kW bei 10kWh) | Minimiert Fehler |
| Entladerate | NatĂŒrlich (Eigenverbrauch) | Realistisch |
| Dauer | Mindestens 6h | BMS braucht Zeit |
Was nach Kalibrierung zu erwarten ist
Sofort:
- â SOC springt eventuell (z.B. 92% â 97%)
- â BMS hat neue Referenzpunkte
- â KapazitĂ€ts-SchĂ€tzung aktualisiert
In den nÀchsten Tagen:
- â PrĂ€ziserer SOC
- â Bessere Ladeplanung
- â Weniger "ĂŒberraschende" SOC-Werte
Langfristig:
- â Verlangsamter Drift
- â LĂ€ngere Batterielebensdauer
- â Genauere KapazitĂ€ts-Prognosen
Erweiterte Lösungen
Adaptive Pufferberechnung
Konzept: Puffer basierend auf historischer Drift anpassen
# Pseudo-Code fĂŒr zukĂŒnftige Version
historical_drift = learn_from_last_30_days()
# Beispiel: SOC war durchschnittlich 5% höher als geplant
adaptive_buffer = base_buffer + historical_drift
# 20% + 5% = 25%
# Plane mit adaptivem Puffer
capacity_with_buffer = capacity Ă (1 + adaptive_buffer)
SOC-Validierung ĂŒber Spannung
Konzept: Vergleiche BMS-SOC mit Zellspannung
# Sensor fĂŒr SOC-Validierung
sensor:
- platform: template
sensors:
battery_soc_validated:
friendly_name: "SOC (validiert)"
unit_of_measurement: "%"
value_template: >
{% set soc = states('sensor.esssoc') | float %}
{% set voltage = states('sensor.battery_voltage') | float %}
{# Validiere SOC gegen Spannung #}
{% if voltage > 54.0 and soc < 95 %}
{{ 'SOC zu niedrig (Voltage hoch)' }}
{% elif voltage < 50.0 and soc > 30 %}
{{ 'SOC zu hoch (Voltage niedrig)' }}
{% else %}
{{ soc }}
{% endif %}
Batterie-Gesundheits-Tracking
Konzept: Ăberwache tatsĂ€chliche KapazitĂ€t ĂŒber Zeit
# Berechne echte KapazitÀt aus Vollzyklus
sensor:
- platform: template
sensors:
battery_true_capacity:
friendly_name: "Wahre Batterie-KapazitÀt"
unit_of_measurement: "kWh"
value_template: >
{% if is_state('input_boolean.battery_calibration_active', 'on') %}
{# Nach Vollzyklus: Berechne Energie geladen #}
{% set energy = states('sensor.battery_charged_energy') | float %}
{% set soc_diff = 80 %} {# 20% â 100% #}
{{ (energy / (soc_diff / 100)) | round(2) }}
{% else %}
{{ states('input_number.battery_capacity_kwh') }}
{% endif %}
Zusammenfassung
Empfohlene MaĂnahmen
| PrioritĂ€t | MaĂnahme | Aufwand | Nutzen |
|---|---|---|---|
| đŽ HOCH | Puffer auf 30% erhöhen | 1 min | Sofort bessere Ergebnisse |
| đĄ MITTEL | Monatliche Kalibrierung | 30 min | Langfristig prĂ€ziser SOC |
| đą NIEDRIG | SOC-Monitoring | 15 min | FrĂŒhwarnung bei Drift |
Checklist
- Sicherheitspuffer auf 30% erhöhen
- Input Helper fĂŒr Kalibrierung erstellen
- 4 Kalibrierungs-Automations installieren
- Erste manuelle Kalibrierung durchfĂŒhren
- SOC-Monitoring Automation installieren
- Nach 1 Monat: ĂberprĂŒfen ob Batterie regelmĂ€Ăig 100% erreicht
Technische Details
GoodWe BMS-Spezifikationen
SOC-Berechnung:
- Methode: Coulomb Counting + Voltage Estimation
- Update-Rate: 1 Hz (jede Sekunde)
- Genauigkeit: ±3% (typisch), ±5% (maximum)
- Kalibrierungs-Intervall: Empfohlen alle 30 Tage
Referenzpunkte:
- 100% SOC: 54.4V (LiFePO4, 16S Ă 3.4V)
- 20% SOC: 51.2V (LiFePO4, 16S Ă 3.2V)
- Floating Voltage: 54.0V
KapazitÀts-Learning:
- Algorithmus: Adaptive Weighted Integration
- Lernrate: 0.1-0.5 (abhÀngig von Confidence)
- Konvergenz: 3-5 Vollzyklen
Home Assistant Integration
Wichtige Entities:
sensor.esssoc: BMS-berechneter SOCsensor.battery_voltage: Gesamt-Spannungsensor.battery_current: Lade-/Entladestromsensor.battery_power: Leistung (W)sensor.battery_temperature: Temperatur
Berechnete Sensoren:
- SOC-Validierung
- Wahre KapazitÀt
- Drift-Erkennung
- Health-Score
Referenzen
WeiterfĂŒhrende Informationen
- GoodWe BMS Manual: SOC-Algorithmus Details
- Battery University: SOC Estimation Techniques
- OpenEMS Documentation: Battery Management
- Home Assistant: Template Sensors & Automations
Support & Community
- Home Assistant Community Forum
- GoodWe Support
- OpenEMS Community
- Battery Management System Best Practices
Version: 1.0 Datum: 2025-11-25 Autor: Felix + Claude Status: Produktions-bereit