Files
battery-charging-optimizer/FIX_CHARGING_CAPACITY.md

8.6 KiB
Raw Blame History

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):

  1. Einstellungen → Geräte & Dienste → Helfer
  2. "Helfer hinzufügen" → "Zahl"
  3. Name: Batterie Optimizer: Sicherheitspuffer
  4. Entity ID: input_number.battery_optimizer_safety_buffer
  5. Minimum: 0
  6. Maximum: 50
  7. Schritt: 5
  8. Einheit: %
  9. Modus: Slider
  10. 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:

  1. Erhöhe den Puffer auf 30%
  2. Warte 1-2 Tage
  3. Prüfe ob Batterie jetzt voller wird

Wenn zu viel geladen wird (teure Stunden genutzt):

  1. Reduziere den Puffer auf 10%
  2. Warte 1-2 Tage
  3. 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

  1. Heute um 14:05: Notiere den SOC
  2. Heute um 22:00: Notiere den SOC beim Ladestart (aus Logs)
  3. 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

  1. Setze Puffer auf 20% (Standard)
  2. Beobachte 2-3 Tage
  3. Passe Puffer an basierend auf Ergebnissen:
    • Nicht voll? → Erhöhe auf 25-30%
    • Immer voll, aber zu viele Ladestunden? → Reduziere auf 15%
  4. 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