Update: Battery Optimizer v3.4.0 mit allen Fixes und Features
This commit is contained in:
350
FIX_CHARGING_CAPACITY.md
Normal file
350
FIX_CHARGING_CAPACITY.md
Normal file
@@ -0,0 +1,350 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user