## Problem
Die price_threshold wurde geladen aber NIE verwendet!
- System lud auch bei Preisen ÜBER der Schwelle
- Beispiel: Schwelle 25ct, aber Ladung bei 25.93ct
- User-Erwartung komplett ignoriert
## Root Cause
```python
# Zeile 110: Geladen ✓
'price_threshold': float(state.get(...) or 25)
# Zeile 317-340: Aber nie verwendet! ✗
for p in future_price_data:
charging_candidates.append({...}) # Keine threshold-Prüfung!
```
## Fix (v3.5.1)
### 1. Filter VOR Ranking
- Filtere alle Stunden in affordable_hours (≤ threshold)
- Ignoriere teure Stunden komplett
- Wenn keine bezahlbaren Stunden: Keine Ladung (Auto-Modus)
### 2. Besseres Logging
```
💶 Preisschwelle: 25.0 ct/kWh
- Stunden unter Schwelle: 18
- Stunden über Schwelle: 12 (werden ignoriert)
```
### 3. Warnung bei Teilladung
Wenn nicht genug günstige Stunden für volle Ladung
## Verhalten
**VORHER (v3.5.0):**
- Alle Preise 25-30ct, Schwelle 25ct
- → Lädt bei 25.93ct ✗
**NACHHER (v3.5.1):**
- Alle Preise 25-30ct, Schwelle 25ct
- → Keine Ladung, Auto-Modus ✓
## Impact
Severity: 🔴 CRITICAL
- Ungewollte Ladevorgänge bei zu teuren Preisen
- Kosteneinsparungen nicht realisiert
- SOFORT updaten empfohlen!
## Dateien
- battery_charging_optimizer.py: Filter + Logging
- CHANGELOG.md: v3.5.1 Eintrag
- HOTFIX_PRICE_THRESHOLD_v3.5.1.md: Detaillierte Analyse
Danke an Felix für sofortiges Bug-Melden! 🙏
---
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
279 lines
9.6 KiB
Markdown
279 lines
9.6 KiB
Markdown
# Changelog
|
|
|
|
Alle wichtigen Änderungen an diesem Projekt werden in dieser Datei dokumentiert.
|
|
|
|
Das Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.0.0/),
|
|
und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/).
|
|
|
|
## [3.5.1] - 2025-12-28
|
|
|
|
### Fixed
|
|
- **KRITISCHER BUG**: Preisschwelle wurde nicht angewendet
|
|
- `price_threshold` wurde geladen aber nie verwendet
|
|
- System lud auch bei Preisen über der Schwelle (z.B. 25.93ct bei Schwelle 25ct)
|
|
- Jetzt: Nur Stunden ≤ Preisschwelle werden für Ranking berücksichtigt
|
|
- Wenn alle Preise über Schwelle: Keine Ladung, bleibe im Auto-Modus
|
|
- **Besseres Logging**: Zeigt gefilterte Stunden an
|
|
- "X Stunden unter Schwelle, Y Stunden über Schwelle (werden ignoriert)"
|
|
- Schedule-Reason zeigt "Zu teuer: X.XXct (Schwelle: Yct)"
|
|
- **Warnung bei Teilladung**: Log-Warnung wenn nicht genug günstige Stunden verfügbar
|
|
|
|
### Changed
|
|
- Ranking-Logik: Filtert zuerst nach Preisschwelle, dann Ranking der verbleibenden Stunden
|
|
- Schedule-Reasons verbessert für besseres Debugging
|
|
|
|
## [3.5.0] - 2025-12-28
|
|
|
|
### Removed
|
|
- **Sicherheitspuffer entfernt**: 20% Safety Buffer führte zu unvollständiger Ladung
|
|
- Problem: Mehr Ladestunden geplant als nötig, aber tatsächliche Ladung begrenzt
|
|
- Folge: Batterie erreichte nie 100% SOC
|
|
- Lösung: Hardware (GoodWe) hat eigene Sicherheitspuffer, Software-Puffer unnötig
|
|
- **Reservekapazität entfernt**: 2 kWh Reserve ebenfalls in Hardware integriert
|
|
- `input_number.battery_optimizer_reserve_capacity` wird nicht mehr verwendet
|
|
- `input_number.battery_optimizer_safety_buffer` wird nicht mehr verwendet
|
|
|
|
### Changed
|
|
- **Standardwerte optimiert**:
|
|
- `max_charge_power`: 5000W → **8000W** (nutzt volle Inverter-Leistung)
|
|
- `price_threshold`: 28 ct/kWh → **25 ct/kWh** (realistischere Schwelle)
|
|
- **Ladelogik vereinfacht**: Direkte Berechnung ohne Puffer
|
|
- **Logging verbessert**: Klarere Ausgaben zur Ladekapazität
|
|
|
|
### Fixed
|
|
- **100% Ladung jetzt möglich**: Batterie wird vollständig geladen
|
|
- **Genauere Ladestunden-Berechnung**: Nur tatsächlich benötigte Stunden werden geplant
|
|
- **Bessere Kapazitätsnutzung**: Volle Ladeleistung in allen geplanten Stunden
|
|
|
|
### Migration 3.4.0 → 3.5.0
|
|
1. Update `battery_charging_optimizer.py` zu v3.5.0
|
|
2. **Optional**: Entferne nicht mehr verwendete Input Helper:
|
|
- `input_number.battery_optimizer_reserve_capacity`
|
|
- `input_number.battery_optimizer_safety_buffer`
|
|
3. **Empfohlen**: Aktualisiere `input_number.battery_optimizer_max_charge_power` auf 8000W
|
|
4. **Empfohlen**: Aktualisiere `input_number.battery_optimizer_price_threshold` auf 25 ct/kWh
|
|
5. Teste Ladeverhalten über Nacht
|
|
|
|
## [3.3.2] - 2024-11-30
|
|
|
|
### Fixed
|
|
- **Automation 8 SOC-Spike Protection**: Plausibilitäts-Check verhindert vorzeitigen Stop beim Umschalten auf REMOTE-Modus
|
|
- Template-Condition prüft SOC-Bereich 99-101% statt nur >99%
|
|
- Filtert ungültige Werte wie 65535% beim ESS-Modus-Wechsel
|
|
- **Keep-Alive SOC-Check**: Zusätzliche Schutzmaßnahme gegen ungültige SOC-Werte
|
|
- Template-Condition prüft SOC <= 100% vor Modbus-Befehl
|
|
- Überspringt Zyklen bei Spikes, läuft aber weiter
|
|
|
|
### Changed
|
|
- Erweiterte `battery_optimizer_automations.yaml` (Automation 8)
|
|
- Erweiterte `speicher_manuell_laden.yaml` (Keep-Alive)
|
|
- Backups erstellt: `.yaml.backup` Dateien
|
|
|
|
### Documentation
|
|
- Neue Datei: `FIX_SOC_SPIKE_REMOTE_MODE.md` mit detaillierter Problembeschreibung, Lösung und Test-Anleitung
|
|
|
|
## [3.3.1] - 2024-11-26
|
|
|
|
### Fixed
|
|
- **SOC-Plausibilitäts-Check**: Filtert ungültige SOC-Werte (z.B. 65535% Spikes beim ESS-Modus-Wechsel)
|
|
- **Negative Power Values**: `charge_power_battery` wird nun korrekt als negativer Wert gesetzt (-5000 für Laden)
|
|
- **Automation Integration**: Nutzt bestehende Automations für ESS-Modus und Keep-Alive statt direkter Service-Calls
|
|
|
|
### Changed
|
|
- Removed `@time_trigger` decorators from PyScript - Triggers now via Home Assistant Automations
|
|
- Simplified `execute_charging_schedule` - delegates to existing automation infrastructure
|
|
- Updated documentation for proper automation-based architecture
|
|
|
|
## [3.2.0] - 2025-01-20
|
|
|
|
### Fixed
|
|
- **Timezone Handling**: Durchgehende Verwendung von `ZoneInfo("Europe/Berlin")` in allen Scripts
|
|
- **haStrom API Error Handling**: Bessere Fehlerbehandlung mit HTTP-Status-Codes und Response-Text
|
|
- **DateTime Comparison**: Korrekte timezone-aware datetime Vergleiche in PyScript
|
|
|
|
### Changed
|
|
- `get_local_now()` function für konsistente lokale Zeit
|
|
- Explicit timezone conversion in `get_electricity_prices()`
|
|
- Improved logging für API-Fehler
|
|
|
|
## [3.1.0] - 2024-12-15
|
|
|
|
### Added
|
|
- **Ranking-Based Optimization**: Globale Optimierung über Tagesgrenzen hinweg
|
|
- **Tomorrow Price Support**: Einbeziehung von morgigen Strompreisen (ab 14:00)
|
|
- **hastrom_flex_extended.py**: Erweiterter Price Fetcher mit Tomorrow-Support
|
|
- **Cross-Midnight Planning**: Findet günstigste Stunden unabhängig von Tagesgrenzen
|
|
|
|
### Changed
|
|
- Algorithm von threshold-based zu ranking-based
|
|
- Berücksichtigt jetzt heute + morgen in einem 48h-Fenster
|
|
- Verbesserte Statistiken und Logging
|
|
|
|
### Fixed
|
|
- Mitternachts-Übergang wird korrekt gehandhabt
|
|
- PV-Forecast Integration verbessert
|
|
|
|
## [3.0.0] - 2024-11-28
|
|
|
|
### Added
|
|
- **Sections Dashboards**: Modern
|
|
|
|
e Home Assistant 2024.2+ Dashboards
|
|
- Drei Dashboard-Varianten (Standard, Compact, Minimal)
|
|
- Auto-responsive Layout
|
|
- Improved mobile compatibility
|
|
|
|
### Changed
|
|
- Dashboard-Architektur komplett überarbeitet
|
|
- Maximum 4-Spalten Layout für mobile
|
|
- Mushroom Cards statt veralteter Entities Cards
|
|
- Bubble Card Integration
|
|
|
|
### Deprecated
|
|
- Alte horizontal/vertical stack Dashboards (v1/v2)
|
|
|
|
## [2.0.0] - 2024-10-15
|
|
|
|
### Added
|
|
- InfluxDB2 Integration für historische Daten
|
|
- Erweiterte Error Handling
|
|
- Dashboard Verbesserungen
|
|
|
|
### Fixed
|
|
- Modbus FLOAT32 Encoding (Big-Endian)
|
|
- Controller Priority Issues in OpenEMS
|
|
- State value 255-character limitation
|
|
|
|
## [1.2.1] - 2024-09-20
|
|
|
|
### Fixed
|
|
- **CRITICAL**: Hourly execution automation war nicht aktiv
|
|
- PyScript state storage (Attribute statt Value für komplexe Daten)
|
|
|
|
## [1.2.0] - 2024-09-10
|
|
|
|
### Added
|
|
- Automatische Preis-Update Trigger
|
|
- Manual Override mit Auto-Reset (4h)
|
|
- Low-SOC Warnung
|
|
- Startup calculation nach HA-Neustart
|
|
|
|
### Fixed
|
|
- Input textarea limitierung umgangen via pyscript state
|
|
- Generator expressions in PyScript (nicht unterstützt)
|
|
|
|
## [1.1.0] - 2024-08-25
|
|
|
|
### Added
|
|
- Threshold-based optimization algorithm
|
|
- Basic dashboard
|
|
- Manual control automations
|
|
- PV forecast integration (Forecast.Solar)
|
|
|
|
### Changed
|
|
- Improved configuration structure
|
|
- Better logging
|
|
|
|
## [1.0.0] - 2024-08-01
|
|
|
|
### Added
|
|
- Initial release
|
|
- Basic battery charging optimization
|
|
- haStrom FLEX PRO price integration
|
|
- OpenEMS Modbus control
|
|
- Simple time-based scheduling
|
|
- Basic Home Assistant integration
|
|
|
|
---
|
|
|
|
## Version Matrix
|
|
|
|
| Version | Algorithm | Tomorrow Support | Dashboard | Automations | 100% Ladung |
|
|
|---------|-----------|------------------|-----------|-------------|-------------|
|
|
| 3.5.0 | Ranking | ✅ | Sections | HA-based | ✅ |
|
|
| 3.3.1 | Ranking | ✅ | Sections | HA-based | ❌ |
|
|
| 3.2.0 | Ranking | ✅ | Sections | PyScript | ❌ |
|
|
| 3.1.0 | Ranking | ✅ | Sections | PyScript | ❌ |
|
|
| 3.0.0 | Ranking | ✅ | Sections | PyScript | ❌ |
|
|
| 2.x | Threshold | ❌ | Enhanced | PyScript | ❌ |
|
|
| 1.x | Threshold | ❌ | Basic | PyScript | ❌ |
|
|
|
|
---
|
|
|
|
## Migration Guides
|
|
|
|
### 3.2.0 → 3.3.1
|
|
|
|
1. Update `battery_charging_optimizer.py` (v3.3.1)
|
|
2. Remove PyScript time triggers (now handled by automations)
|
|
3. Import `battery_optimizer_automations.yaml`
|
|
4. Verify existing keep-alive automations work correctly
|
|
|
|
### 3.1.0 → 3.2.0
|
|
|
|
1. Update all `.py` files with timezone fixes
|
|
2. Test haStrom API connectivity
|
|
3. Verify datetime comparisons in logs
|
|
|
|
### 2.x → 3.0.0
|
|
|
|
1. Backup old dashboard
|
|
2. Install new Sections dashboard
|
|
3. Install required HACS cards (Mushroom, Bubble)
|
|
4. Verify mobile responsive behavior
|
|
|
|
### 1.x → 2.0.0
|
|
|
|
1. Update Modbus configuration (FLOAT32 Big-Endian)
|
|
2. Configure InfluxDB2 (optional)
|
|
3. Update dashboard to new format
|
|
4. Verify controller priority in OpenEMS
|
|
|
|
---
|
|
|
|
## Known Issues
|
|
|
|
### v3.3.1
|
|
- Keep-Alive automation muss manuell in HA erstellt werden (nicht automatisch)
|
|
- Dashboard-Import kann HACS-Card Warnings zeigen (installiere alle required cards)
|
|
|
|
### v3.2.0
|
|
- haStrom API manchmal langsam (>5s response time) - wird durch Timeout abgefangen
|
|
|
|
### v3.1.0
|
|
- Tomorrow-Preise erst ab 14:00 verfügbar (normal, nicht ein Bug)
|
|
- Mitternachts-Neuberechnung optional (kann zu doppelter Berechnung führen)
|
|
|
|
---
|
|
|
|
## Planned Features
|
|
|
|
- [ ] Dynamische Ladeleistungs-Anpassung basierend auf PV-Produktion
|
|
- [ ] Multi-Tarif Support (neben haStrom FLEX PRO)
|
|
- [ ] Wettervorhersage Integration (Temperatur-Kompensation)
|
|
- [ ] Machine Learning für Verbrauchsprognose
|
|
- [ ] Mobile App Benachrichtigungen
|
|
- [ ] Grafana Dashboard Templates
|
|
- [ ] Multi-Batterie Support
|
|
|
|
---
|
|
|
|
## Contributing
|
|
|
|
Contributions sind willkommen! Für größere Änderungen:
|
|
|
|
1. Erstelle ein Issue zur Diskussion
|
|
2. Fork das Repository
|
|
3. Erstelle einen Feature Branch (`git checkout -b feature/AmazingFeature`)
|
|
4. Commit deine Changes (`git commit -m 'Add some AmazingFeature'`)
|
|
5. Push zum Branch (`git push origin feature/AmazingFeature`)
|
|
6. Öffne einen Pull Request
|
|
|
|
---
|
|
|
|
## Support
|
|
|
|
- **Documentation**: [README.md](README.md), [INSTALLATION.md](INSTALLATION.md)
|
|
- **Issues**: [Gitea Issues](https://gitea.ges4.net/felix/openems-battery-optimizer/issues)
|
|
- **Discussions**: [Gitea Discussions](https://gitea.ges4.net/felix/openems-battery-optimizer/discussions)
|