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