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>
This commit is contained in:
207
PROJECT_SUMMARY_v3.5.0.md
Normal file
207
PROJECT_SUMMARY_v3.5.0.md
Normal file
@@ -0,0 +1,207 @@
|
||||
# Projekt-Zusammenfassung: Battery Optimizer v3.5.0
|
||||
|
||||
## Aufräumarbeiten durchgeführt ✅
|
||||
|
||||
### Entfernte/Archivierte Dateien
|
||||
- **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
|
||||
|
||||
- **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-Versionen** → `legacy/`:
|
||||
- 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)**:
|
||||
```python
|
||||
'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)**:
|
||||
```python
|
||||
# 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
|
||||
```python
|
||||
# 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
|
||||
```python
|
||||
# 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
|
||||
|
||||
- [x] Code aktualisiert (v3.5.0)
|
||||
- [x] Syntax-Check erfolgreich
|
||||
- [x] pyscripts/ neu erstellt
|
||||
- [x] CHANGELOG.md aktualisiert
|
||||
- [x] 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**:
|
||||
```bash
|
||||
ssh homeassistant
|
||||
cd /config/pyscript
|
||||
cp battery_charging_optimizer.py battery_charging_optimizer.py.v3.4.0.backup
|
||||
```
|
||||
|
||||
2. **Neue Version kopieren**:
|
||||
```bash
|
||||
# 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:
|
||||
```bash
|
||||
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
|
||||
Reference in New Issue
Block a user