8.6 KiB
Fix: Batterie wird nicht immer bis 100% geladen
Problem
Die Batterie wird nicht immer bis 100% geladen, obwohl genug Zeit und günstige Stunden verfügbar sind.
Ursache
Die Ladekapazität wird um 14:05 Uhr berechnet, basierend auf dem SOC zu diesem Zeitpunkt:
Beispiel:
14:05 Uhr:
SOC: 14%
Benötigt: (100% - 14%) × 10kWh - 2kWh Reserve = 6.6 kWh
Bei 5000W: 6.6kWh ÷ 5kW = 1.32h → 2 Stunden
Geplant: 22:00 + 23:00
ABER zwischen 14:05 und 22:00:
- ☀️ PV-Nachproduktion (Nachmittag)
- 🏠 Eigenverbrauch aus Batterie
- 🔋 SOC ändert sich (z.B. auf 30%)
Um 22:00 (Ladestart):
SOC: 30% (nicht mehr 14%!)
Benötigt: (100% - 30%) × 10kWh = 7.0 kWh
Geplant: 2h × 5kW = 10kWh - 2kWh Reserve = 8 kWh
→ Zu wenig!
Lösung: Sicherheitspuffer
Implementierung v3.4.0
Neuer konfigurierbarer Sicherheitspuffer von 20% (Standard) wird zur berechneten Ladekapazität hinzugefügt.
Code-Änderungen (Zeile 300-319):
# Verfügbare Ladekapazität berechnen
available_capacity_wh = (config['max_soc'] - current_soc) / 100 * config['battery_capacity']
available_capacity_wh -= config['reserve_capacity']
# SICHERHEITSPUFFER: +20% für untertägige Schwankungen
safety_buffer = config['safety_buffer'] # z.B. 0.20 = 20%
available_capacity_wh_with_buffer = available_capacity_wh * (1 + safety_buffer)
log.info(f"Verfügbare Ladekapazität (berechnet): {available_capacity_wh/1000:.2f} kWh")
log.info(f"Verfügbare Ladekapazität (mit {safety_buffer*100:.0f}% Puffer): {available_capacity_wh_with_buffer/1000:.2f} kWh")
# Berechne benötigte Ladestunden mit Puffer
needed_hours = int((available_capacity_wh_with_buffer + max_charge_per_hour - 1) / max_charge_per_hour)
Neues Beispiel mit Puffer:
14:05 Uhr:
SOC: 14%
Benötigt (ohne Puffer): 6.6 kWh
Benötigt (mit 20% Puffer): 6.6 × 1.2 = 7.92 kWh
Bei 5000W: 7.92kWh ÷ 5kW = 1.58h → 2 Stunden (bleibt gleich)
ODER bei niedrigerem Start-SOC → 3 Stunden
Um 22:00:
SOC: 30%
Geplant: 2-3h × 5kW = 10-15kWh → Reicht jetzt!
Konfiguration
Neuer Input Helper
In configuration.yaml oder via UI erstellen:
input_number:
battery_optimizer_safety_buffer:
name: "Batterie Optimizer: Sicherheitspuffer"
min: 0
max: 50
step: 5
unit_of_measurement: "%"
icon: mdi:shield-plus
mode: slider
initial: 20
Werte-Empfehlungen:
| Puffer | Anwendungsfall |
|---|---|
| 0% | Kein Puffer - exakte Berechnung (nicht empfohlen) |
| 10% | Stabile Bedingungen, wenig Eigenverbrauch |
| 20% | Standard - Normale Bedingungen |
| 30% | Hoher Eigenverbrauch am Abend |
| 40% | Sehr dynamische Bedingungen |
| 50% | Maximum - nahezu garantiert volle Ladung |
Installation
Schritt 1: Input Helper erstellen
Via UI (Empfohlen):
- Einstellungen → Geräte & Dienste → Helfer
- "Helfer hinzufügen" → "Zahl"
- Name:
Batterie Optimizer: Sicherheitspuffer - Entity ID:
input_number.battery_optimizer_safety_buffer - Minimum: 0
- Maximum: 50
- Schritt: 5
- Einheit: %
- Modus: Slider
- Anfangswert: 20
Via YAML:
# In configuration.yaml
input_number:
battery_optimizer_safety_buffer:
name: "Batterie Optimizer: Sicherheitspuffer"
min: 0
max: 50
step: 5
unit_of_measurement: "%"
icon: mdi:shield-plus
mode: slider
Dann: Konfiguration neu laden
Schritt 2: Script aktualisieren
cp openems/battery_charging_optimizer.py /config/pyscript/
service: pyscript.reload
data: {}
Schritt 3: Neue Berechnung triggern
service: pyscript.calculate_charging_schedule
data: {}
Prüfe die Logs:
Verfügbare Ladekapazität (berechnet): 6.60 kWh
Verfügbare Ladekapazität (mit 20% Puffer): 7.92 kWh
🎯 Benötigte Ladestunden: 2 (bei 5000W pro Stunde, inkl. Puffer)
Zusätzliche Verbesserungen
SOC-Logging beim Ladestart
Code-Änderung (Zeile 644-649):
if action == 'charge':
# Prüfe aktuellen SOC beim Ladestart
current_soc_now = float(state.get('sensor.esssoc') or 50)
log.info(f"📊 SOC beim Ladestart: {current_soc_now}%")
In den Logs siehst du jetzt:
📊 SOC beim Ladestart: 30%
🔋 AKTIVIERE LADEN mit 5000W
Das hilft dir zu verstehen ob der Puffer ausreicht.
Feinabstimmung
Puffer anpassen
Wenn Batterie regelmäßig nicht voll wird:
- Erhöhe den Puffer auf 30%
- Warte 1-2 Tage
- Prüfe ob Batterie jetzt voller wird
Wenn zu viel geladen wird (teure Stunden genutzt):
- Reduziere den Puffer auf 10%
- Warte 1-2 Tage
- Prüfe ob immer noch ausreichend geladen wird
Analyse der Logs
Um 14:05 (Planung):
Aktueller SOC: 14%
Verfügbare Ladekapazität (berechnet): 6.60 kWh
Verfügbare Ladekapazität (mit 20% Puffer): 7.92 kWh
🎯 Benötigte Ladestunden: 2
Um 22:05 (Ladestart):
📊 SOC beim Ladestart: 30%
🔋 AKTIVIERE LADEN mit 5000W
Berechne Differenz:
Geplant basierend auf: 14% SOC
Tatsächlich beim Start: 30% SOC
Differenz: +16%
→ 16% × 10kWh = 1.6 kWh zusätzlich benötigt
→ Puffer von 20% × 6.6kWh = 1.32 kWh
→ Puffer reicht knapp! (Eventuell auf 25-30% erhöhen)
Hardware-Stopp bei 100%
Wichtig: Die GoodWe-Hardware stoppt automatisch bei 100% SOC, unabhängig von den Befehlen!
Das bedeutet:
- ✅ Es ist sicher mehr zu laden als benötigt
- ✅ Kein Risiko von Überladung
- ✅ Puffer kann großzügig gewählt werden
Empfehlung: Lieber etwas mehr Puffer (25-30%) als zu wenig!
Alternative: Max-SOC auf 100% setzen
Wenn du immer bis 100% laden willst:
Option A: Reserve entfernen
input_number:
battery_optimizer_reserve_capacity:
# Setze auf 0 statt 2 kWh
Option B: Puffer auf 50% setzen
input_number:
battery_optimizer_safety_buffer:
# Setze auf 50%
Beachte: Das nutzt eventuell mehr teure Stunden als nötig!
Monitoring
Dashboard-Karte hinzufügen
type: entities
title: Batterie Optimizer - Konfiguration
entities:
- entity: input_number.battery_capacity_kwh
- entity: input_number.battery_optimizer_min_soc
- entity: input_number.battery_optimizer_max_soc
- entity: input_number.battery_optimizer_max_charge_power
- entity: input_number.battery_optimizer_reserve_capacity
- entity: input_number.battery_optimizer_safety_buffer # NEU
Notification bei niedrigem SOC am Morgen
Erstelle eine Automation die dich warnt wenn die Batterie morgens nicht voll ist:
alias: "Batterie Optimizer: Morgen-Check"
description: "Warnt wenn Batterie morgens nicht voll ist"
trigger:
- platform: time
at: "07:00:00"
condition:
- condition: numeric_state
entity_id: sensor.esssoc
below: 95 # Schwellwert anpassen
action:
- service: notify.persistent_notification
data:
title: "Batterie nicht voll"
message: >
Batterie SOC ist nur {{ states('sensor.esssoc') }}% um 7 Uhr.
Eventuell Sicherheitspuffer erhöhen?
Aktueller Puffer: {{ states('input_number.battery_optimizer_safety_buffer') }}%
Testing
Test-Szenario
- Heute um 14:05: Notiere den SOC
- Heute um 22:00: Notiere den SOC beim Ladestart (aus Logs)
- Morgen um 07:00: Notiere den finalen SOC
Beispiel-Messung:
Tag 1 (Puffer 20%):
14:05 → SOC 15%
22:05 → SOC 32% (geplant: 15% + Schwankung)
07:00 → SOC 94% (nicht voll!)
→ Puffer zu niedrig
Tag 2 (Puffer 30%):
14:05 → SOC 18%
22:05 → SOC 28%
07:00 → SOC 100% ✓
→ Puffer passt!
Zusammenfassung
Was wurde geändert
| Änderung | Version | Beschreibung |
|---|---|---|
| Sicherheitspuffer | v3.4.0 | +20% zur Ladekapazität |
| Konfigurierbarer Puffer | v3.4.0 | input_number.battery_optimizer_safety_buffer |
| SOC-Logging beim Start | v3.4.0 | Zeigt tatsächlichen SOC beim Ladestart |
Vorher vs. Nachher
Vorher (v3.3.1):
SOC 14% → Plane 6.6 kWh → 2 Stunden
Tatsächlich beim Start: SOC 30% → Braucht 7.0 kWh
Ergebnis: Nur 92% geladen
Nachher (v3.4.0 mit 20% Puffer):
SOC 14% → Plane 6.6 × 1.2 = 7.92 kWh → 2 Stunden
Tatsächlich beim Start: SOC 30% → Braucht 7.0 kWh
Ergebnis: 100% geladen ✓
Empfehlung
- ✅ Setze Puffer auf 20% (Standard)
- ✅ Beobachte 2-3 Tage
- ✅ Passe Puffer an basierend auf Ergebnissen:
- Nicht voll? → Erhöhe auf 25-30%
- Immer voll, aber zu viele Ladestunden? → Reduziere auf 15%
- ✅ Nutze die Morgen-Check Automation für Monitoring
Version
- battery_charging_optimizer.py: v3.4.0
- Datum: 2025-11-25
- Fix: Sicherheitspuffer für untertägige SOC-Schwankungen