Files
battery-charging-optimizer/FIX_CHARGING_CAPACITY.md

351 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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):
```python
# 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:**
```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
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**:
```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**
```bash
cp openems/battery_charging_optimizer.py /config/pyscript/
```
```yaml
service: pyscript.reload
data: {}
```
**Schritt 3: Neue Berechnung triggern**
```yaml
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):
```python
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**
```yaml
input_number:
battery_optimizer_reserve_capacity:
# Setze auf 0 statt 2 kWh
```
**Option B: Puffer auf 50% setzen**
```yaml
input_number:
battery_optimizer_safety_buffer:
# Setze auf 50%
```
**Beachte**: Das nutzt eventuell mehr teure Stunden als nötig!
## Monitoring
### Dashboard-Karte hinzufügen
```yaml
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:
```yaml
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