Files
battery-charging-optimizer/PROJECT_SUMMARY_v3.5.0.md
Felix Zösch 43f1f3c93c Update: Battery Optimizer v3.5.0 - Volle Ladung bis 100% SOC
## Hauptänderungen

### Removed
- Sicherheitspuffer (20%) entfernt - führte zu unvollständiger Ladung
- Reservekapazität (2 kWh) entfernt - Hardware hat eigene Puffer
- Problem: Mehr Ladestunden geplant als nötig, aber tatsächliche Ladung begrenzt
- Folge: Batterie erreichte nie 100% SOC

### Changed
- Standardwert max_charge_power: 5000W → 8000W (+60%)
- Standardwert price_threshold: 28ct → 25ct/kWh
- Ladelogik vereinfacht: Direkte Berechnung ohne Puffer

### Fixed
- Batterie lädt jetzt vollständig bis 100% SOC
- Genauere Ladestunden-Berechnung
- Bessere Kapazitätsnutzung: Volle Leistung in allen Stunden

## Projekt-Aufräumarbeiten

### Archiviert
- Bugfix-Dokumentationen → archive/
  - BUGFIX_TIMEZONE_v3.2.md
  - DIAGNOSE_LADE_PROBLEM.md
  - FIX_API_TIMING.md
  - FIX_CHARGING_CAPACITY.md
  - FIX_SOC_SPIKE_PROBLEM.md
  - FIX_SOC_SPIKE_REMOTE_MODE.md
  - SOC_CALIBRATION_GUIDE.md

### Entfernt
- docs/ (Duplikate)
- debug_log.txt, debug_schedule.py

### Neu
- UPGRADE_TO_v3.5.0.md - Detaillierter Upgrade-Guide
- PROJECT_SUMMARY_v3.5.0.md - Technische Zusammenfassung
- pyscripts/ aktualisiert auf v3.5.0

## Migration

1. Backup erstellen
2. Neue Skripte nach /config/pyscript/ kopieren
3. PyScript neu laden
4. Input Helper anpassen (8000W, 25ct)
5. Test durchführen

Details: siehe UPGRADE_TO_v3.5.0.md

---

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-28 16:49:58 +01:00

6.8 KiB

Projekt-Zusammenfassung: Battery Optimizer v3.5.0

Aufräumarbeiten durchgeführt

Entfernte/Archivierte Dateien

  • Bugfix-Dokumentationenarchive/:

    • BUGFIX_TIMEZONE_v3.2.md
    • DIAGNOSE_LADE_PROBLEM.md
    • FIX_API_TIMING.md
    • FIX_CHARGING_CAPACITY.md
    • FIX_SOC_SPIKE_PROBLEM.md
    • FIX_SOC_SPIKE_REMOTE_MODE.md
    • SOC_CALIBRATION_GUIDE.md
  • Debug-Dateien (gelöscht):

    • debug_log.txt
    • debug_schedule.py
  • Duplikate (gelöscht):

    • docs/ (Duplikate von Root-Dokumentationen)
    • pyscripts/ (veraltete v3.3.1 Kopien, jetzt neu erstellt mit v3.5.0)
  • Legacy-Versionenlegacy/:

    • v1/, v2/, v3/ (340KB historische Daten)

Aktuelle Projektstruktur

openems/
├── archive/                    # Alte Bugfix-Dokumentationen
├── automations/                # Home Assistant Automationen
├── config/                     # Konfigurationsdateien
├── dashboards/                 # Dashboard-Varianten
├── legacy/                     # Alte Versionen (v1-v3)
├── pyscripts/                  # 🎯 PRODUKTIONS-SKRIPTE (v3.5.0)
│   ├── battery_charging_optimizer.py
│   ├── hastrom_flex_extended.py
│   └── ess_set_power.py
├── battery_charging_optimizer.py    # Root-Version (Master)
├── hastrom_flex_extended.py
├── ess_set_power.py
├── CHANGELOG.md                # ✅ Aktualisiert mit v3.5.0
├── CLAUDE.md                   # Projekt-Anweisungen für AI
├── EMS_OpenEMS_HomeAssistant_Dokumentation.md
├── INSTALLATION.md
├── LICENSE
├── README.md
├── UPGRADE_TO_v3.5.0.md       # 🆕 Neuer Upgrade-Guide
├── project_memory.md
├── battery_optimizer_config.yaml
├── battery_optimizer_input_helper_safety_buffer.yaml  # Veraltet
├── battery_calibration_automation.yaml
├── battery_calibration_input_helper.yaml
└── rest_requests.yaml

Hauptänderungen v3.5.0

🔧 Code-Änderungen

1. Sicherheitspuffer entfernt

Vorher (v3.4.0):

'safety_buffer': float(state.get('input_number.battery_optimizer_safety_buffer') or 20) / 100,  # 20%
'reserve_capacity': float(state.get('input_number.battery_optimizer_reserve_capacity') or 2) * 1000,  # 2 kWh

available_capacity_wh -= config['reserve_capacity']  # -2000 Wh
available_capacity_wh_with_buffer = available_capacity_wh * (1 + safety_buffer)  # +20%
needed_hours = int((available_capacity_wh_with_buffer + ...) / max_charge_per_hour)

Nachher (v3.5.0):

# Keine Puffer mehr!
available_capacity_wh = (config['max_soc'] - current_soc) / 100 * config['battery_capacity']
needed_hours = int((available_capacity_wh + max_charge_per_hour - 1) / max_charge_per_hour)

2. Standardwerte optimiert

# Vorher:
'max_charge_power': float(state.get('...') or 5000),
'price_threshold': float(state.get('...') or 28),

# Nachher:
'max_charge_power': float(state.get('...') or 8000),   # +60%
'price_threshold': float(state.get('...') or 25),      # -10%

3. Version und Logging

# Version Header:
Version: 3.5.0 - REMOVED: Sicherheitspuffer und Reservekapazität
                         Batterie lädt jetzt bis 100% SOC

# Log-Ausgaben:
log.info("=== Batterie-Optimierung gestartet (v3.5.0 - Volle Ladung bis 100%) ===")
log.info(f"Verfügbare Ladekapazität: {available_capacity_wh/1000:.2f} kWh (bis {config['max_soc']}% SOC)")
log.info(f"🎯 Benötigte Ladestunden: {needed_hours} (bei {max_charge_per_hour}W pro Stunde)")

📊 Problem-Analyse: Warum 100% nicht erreicht wurde

Szenario: SOC 50% → Soll auf 100%

Alt (v3.4.0):

1. Verfügbare Kapazität: (100 - 50) * 10kWh = 5000 Wh
2. Reserve-Abzug:        5000 - 2000 = 3000 Wh
3. Sicherheitspuffer:    3000 * 1.20 = 3600 Wh (für Planung)
4. Benötigte Stunden:    3600 / 5000 = 0.72 → 1 Stunde
5. Geplante Energie:     1 Stunde * 5000W = 5000 Wh (theoretisch)
6. ABER remaining_capacity = 3000 Wh (OHNE Puffer!)
7. Tatsächlich geladen:  min(5000, 3000) = 3000 Wh
8. Ergebnis:             50% + 30% = 80% SOC ❌

Neu (v3.5.0):

1. Verfügbare Kapazität: (100 - 50) * 10kWh = 5000 Wh
2. Benötigte Stunden:    5000 / 8000 = 0.625 → 1 Stunde
3. Geplante Energie:     1 Stunde * 8000W = 8000 Wh (theoretisch)
4. remaining_capacity:   5000 Wh (gleich wie verfügbar)
5. Tatsächlich geladen:  min(8000, 5000) = 5000 Wh
6. Ergebnis:             50% + 50% = 100% SOC ✅

🎯 Erwartete Verbesserungen

  1. Volle Ladung: Batterie lädt bis 100% SOC (oder Hardware-Limit ~98%)
  2. Weniger Ladestunden: Bei 8000W statt 5000W werden ~37% weniger Stunden benötigt
  3. Bessere Effizienz: Volle Leistung in allen geplanten Stunden
  4. Niedrigere Kosten: Konzentration auf wirklich günstigste Stunden

📋 Migration-Checkliste

  • Code aktualisiert (v3.5.0)
  • Syntax-Check erfolgreich
  • pyscripts/ neu erstellt
  • CHANGELOG.md aktualisiert
  • Upgrade-Guide erstellt (UPGRADE_TO_v3.5.0.md)
  • In Home Assistant installieren
  • PyScript neu laden
  • Input Helper aktualisieren (8000W, 25ct)
  • Erste Berechnung testen (manuell)
  • Erste Ladung überwachen
  • 100% SOC bestätigen

Nächste Schritte für Deployment

  1. Backup erstellen:

    ssh homeassistant
    cd /config/pyscript
    cp battery_charging_optimizer.py battery_charging_optimizer.py.v3.4.0.backup
    
  2. Neue Version kopieren:

    # Von diesem Repository zu Home Assistant
    scp pyscripts/*.py homeassistant:/config/pyscript/
    
  3. PyScript neu laden:

    • Home Assistant → Developer Tools → Services
    • Service: pyscript.reload
  4. Input Helper anpassen:

    • input_number.battery_optimizer_max_charge_power → 8000
    • input_number.battery_optimizer_price_threshold → 25
  5. Test durchführen:

    • Service: pyscript.calculate_charging_schedule
    • Log prüfen: tail -f /config/home-assistant.log | grep battery
    • Schedule prüfen: State von pyscript.battery_charging_schedule
  6. Über Nacht testen:

    • Erste Ladung abwarten
    • SOC-Verlauf überwachen
    • 100% Erreichen bestätigen

Dateigrößen

  • battery_charging_optimizer.py: 24 KB (v3.5.0)
  • Reduzierung durch Code-Bereinigung: ~1.5 KB (-6%)

Git Status

Bereite Commit vor mit:

git add .
git commit -m "Update: Battery Optimizer v3.5.0 - Volle Ladung bis 100% SOC

- Entfernt: Sicherheitspuffer (20%) und Reservekapazität (2kWh)
- Hardware hat eigene Schutzpuffer, Software-Reserven unnötig
- Geändert: Standardwerte auf 8000W und 25ct/kWh
- Fix: Batterie lädt jetzt vollständig bis 100% SOC
- Projekt aufgeräumt: Archive, Legacy-Versionen strukturiert
- Upgrade-Guide hinzugefügt"

Status: Bereit für Deployment
Version: 3.5.0
Datum: 2025-12-28
Größte Verbesserung: 100% Ladung jetzt möglich