Files
battery-charging-optimizer/openems/FIX_API_TIMING.md
felix.zoesch 0fa03a566a feat: Major update - Battery Optimizer v3.4.0 with comprehensive fixes
## 🎯 Hauptänderungen

### Version 3.4.0 - SOC-Drift & Charging Capacity
-  Sicherheitspuffer (20-50% konfigurierbar) für untertägige SOC-Schwankungen
-  Monatliche automatische Batterie-Kalibrierung
- 🐛 SOC-Plausibilitäts-Check (filtert 65535% Spikes beim Modus-Wechsel)
- 🐛 Zeitabhängige API-Abfrage (vor/nach 14:00 Uhr)

### Neue Features
- 🔋 **Safety Buffer**: Kompensiert SOC-Drift und Eigenverbrauch
- 🔋 **Auto-Calibration**: Monatlicher Vollzyklus für SOC-Genauigkeit
- 🔋 **Spike Protection**: 4-fach Schutz gegen ungültige SOC-Werte
- 🔋 **Smart API**: Verhindert HTTP 500 Errors bei fehlenden Tomorrow-Preisen

### Dokumentation
- 📚 SOC_CALIBRATION_GUIDE.md - Umfassender Kalibrierungs-Guide
- 📚 FIX_CHARGING_CAPACITY.md - Sicherheitspuffer-Dokumentation
- 📚 FIX_SOC_SPIKE_PROBLEM.md - Spike-Protection-Lösung
- 📚 FIX_API_TIMING.md - Zeitabhängige API-Abfrage
- 📚 DIAGNOSE_LADE_PROBLEM.md - Debug-Guide

### Neue Dateien
- battery_calibration_automation.yaml - 4 Automations für Kalibrierung
- battery_calibration_input_helper.yaml - Input Helper Config
- battery_optimizer_input_helper_safety_buffer.yaml - Puffer Config
- debug_schedule.py - Umfassendes Debug-Script

### Scripts
- battery_charging_optimizer.py v3.4.0
- hastrom_flex_extended.py v1.1.0
- debug_schedule.py v1.0.0

### Fixes
- 🐛 SOC springt auf 65535% beim ESS-Modus-Wechsel → Debounce + Plausibilitäts-Check
- 🐛 API-HTTP-500 vor 14:00 → Zeitabhängige Abfrage
- 🐛 Batterie nicht bis 100% geladen → Sicherheitspuffer
- 🐛 SOC driftet ohne Vollzyklen → Automatische Kalibrierung

## 🚀 Installation

1. Input Helper erstellen (siehe battery_optimizer_input_helper_safety_buffer.yaml)
2. Automations installieren (siehe battery_calibration_automation.yaml)
3. Scripts aktualisieren (battery_charging_optimizer.py v3.4.0)
4. PyScript neu laden

## 📊 Verbesserungen

- Präzisere Ladeplanung durch Sicherheitspuffer
- Robustheit gegen SOC-Drift
- Keine API-Fehler mehr vor 14:00
- Hardware-Stopp bei 100% wird respektiert
- Bessere Batterie-Gesundheit durch regelmäßige Kalibrierung

🤖 Generated with Claude Code (claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-12 08:04:07 +01:00

278 lines
7.1 KiB
Markdown

# Fix: haStrom API zeitabhängige Abfrage
## Problem
Die haStrom FLEX PRO API wurde immer mit `start_date=heute&end_date=morgen` abgefragt, auch vor 14:00 Uhr.
**Folge**: HTTP 500 Error, da die API die Preise für morgen erst ab 14:00 Uhr bereitstellt.
**URL vorher**:
```
http://eex.stwhas.de/api/spotprices/flexpro?start_date=20251125&end_date=20251126
```
## Lösung
### Zeitabhängige API-Abfrage
**VOR 14:00 Uhr** (00:00 - 13:59:59):
- Nur heute abfragen: `end_date=heute`
- Tomorrow-Daten sind noch nicht verfügbar
**AB 14:00 Uhr** (14:00 - 23:59:59):
- Heute + morgen abfragen: `end_date=morgen`
- Tomorrow-Daten sind jetzt verfügbar
### Code-Änderungen in `hastrom_flex_extended.py`
**Zeile 29-46** (vorher):
```python
today = now.strftime("%Y%m%d")
tomorrow = tomorrow_date.strftime("%Y%m%d")
url = f"http://eex.stwhas.de/api/spotprices/flexpro?start_date={today}&end_date={tomorrow}"
```
**Zeile 29-46** (nachher):
```python
today = now.strftime("%Y%m%d")
tomorrow = tomorrow_date.strftime("%Y%m%d")
hr = int(now.strftime("%H"))
# Zeitabhängige API-Abfrage
if hr < 14:
end_date = today
log.info(f"Lade Preise nur für {today} (vor 14:00 - Tomorrow nicht verfügbar)")
else:
end_date = tomorrow
log.info(f"Lade Preise für {today} bis {tomorrow} (ab 14:00 - Tomorrow verfügbar)")
url = f"http://eex.stwhas.de/api/spotprices/flexpro?start_date={today}&end_date={end_date}"
```
### Verbessertes Logging
**Zeile 162-189**: Logging zeigt jetzt klar:
- Ob Tomorrow-Daten ERWARTET werden (nach 14:00)
- Ob Tomorrow-Daten tatsächlich VERFÜGBAR sind
- Warnung wenn sie verfügbar sein sollten, aber fehlen
**Beispiel-Output VOR 14:00**:
```
📊 haStrom FLEX PRO Extended - Preise aktualisiert:
├─ Heute: 24 Stunden
└─ Morgen: 0 Stunden (noch nicht erwartet vor 14:00)
📈 Heute: Min=24.49, Max=47.50, Avg=35.67 ct/kWh
```
**Beispiel-Output NACH 14:00**:
```
📊 haStrom FLEX PRO Extended - Preise aktualisiert:
├─ Heute: 24 Stunden
└─ Morgen: 24 Stunden ✓ verfügbar (nach 14:00)
📈 Heute: Min=24.49, Max=47.50, Avg=35.67 ct/kWh
📈 Morgen: Min=28.29, Max=60.57, Avg=44.23 ct/kWh
```
## Installation
### Schritt 1: Script aktualisieren
```bash
# Kopiere das aktualisierte Script nach Home Assistant
cp openems/hastrom_flex_extended.py /config/pyscript/
```
### Schritt 2: PyScript neu laden
In **Home Assistant → Developer Tools → Services**:
```yaml
service: pyscript.reload
data: {}
```
### Schritt 3: Manueller Test
Teste die Preis-Abfrage manuell:
```yaml
service: pyscript.getprices_extended
data: {}
```
Prüfe dann die Logs auf:
- Korrekte Zeitlogik ("Lade Preise nur für..." oder "Lade Preise für...bis...")
- Keine HTTP 500 Errors mehr
- Tomorrow-Daten verfügbar nach 14:00
## Auswirkungen auf Battery Optimizer
### Vor 14:00 Uhr
- Battery Optimizer wird um 14:05 getriggert
- Zu diesem Zeitpunkt sind Tomorrow-Daten bereits verfügbar
- **Keine Auswirkung** auf normale Operation
### Bei stündlichen Updates (jede volle Stunde)
- **VOR 14:00**: Sensor hat nur Heute-Daten
- **NACH 14:00**: Sensor hat Heute + Morgen-Daten
- Battery Optimizer kann damit umgehen (checkt `tomorrow_available` Flag)
### Bei manuellen Trigger vor 14:00
Wenn du den Battery Optimizer manuell vor 14:00 triggerst:
```yaml
service: pyscript.calculate_charging_schedule
data: {}
```
Dann:
1. Er lädt nur Heute-Daten
2. Optimiert nur für die verbleibenden Stunden des heutigen Tages
3. `has_tomorrow_data = false` im Schedule
4. Um 14:05 läuft automatische Neu-Berechnung mit Tomorrow-Daten
## Automatische Updates
Das Script hat drei automatische Trigger:
### 1. Stündlich (jede volle Stunde)
```python
@time_trigger("cron(0 * * * *)")
```
- Hält Preise aktuell
- Nutzt zeitabhängige Logik
### 2. Um 14:05 Uhr (wenn Tomorrow verfügbar wird)
```python
@time_trigger("cron(5 14 * * *)")
```
- Extra Update für Tomorrow-Preise
- Triggert Battery Optimizer Neuberechnung
### 3. Um Mitternacht
```python
@time_trigger("cron(5 0 * * *)")
```
- Update für neuen Tag
- "Morgen" wird zu "Heute"
## Testing-Szenarien
### Test 1: Vor 14:00 Uhr
```bash
# Setze System-Zeit auf 10:00 (nur für Test)
# Oder warte bis vor 14:00
```
**Erwartetes Verhalten**:
- API-Call mit `end_date=heute`
- Log: "Lade Preise nur für {heute}"
- `tomorrow_available = false`
- Kein HTTP 500 Error
### Test 2: Nach 14:00 Uhr
```bash
# Setze System-Zeit auf 15:00 (nur für Test)
# Oder warte bis nach 14:00
```
**Erwartetes Verhalten**:
- API-Call mit `end_date=morgen`
- Log: "Lade Preise für {heute} bis {morgen}"
- `tomorrow_available = true`
- 24 + 24 = 48 Stunden Preise
### Test 3: Grenzfall 13:59 → 14:00
```bash
# Um 13:59 ausführen, dann um 14:00
```
**Erwartetes Verhalten**:
- 13:59: Nur heute
- 14:00: Heute + morgen (stündlicher Trigger)
- 14:05: Extra-Update für Battery Optimizer
## Monitoring
### Prüfe Sensor-Attributes
In **Home Assistant → Developer Tools → States**:
```
sensor.hastrom_flex_pro_ext
```
**Attributes zu prüfen**:
- `tomorrow_available`: true/false
- `tomorrow_count`: 0 oder 24
- `prices_tomorrow`: Array (leer oder 24 Einträge)
- `last_update`: Timestamp
### Prüfe Logs
Suche in Home Assistant Logs nach:
```
haStrom FLEX PRO Extended - Preise aktualisiert
```
**Vor 14:00**:
```
Lade Preise nur für 20251125 (vor 14:00 - Tomorrow nicht verfügbar)
└─ Morgen: 0 Stunden (noch nicht erwartet vor 14:00)
```
**Nach 14:00**:
```
Lade Preise für 20251125 bis 20251126 (ab 14:00 - Tomorrow verfügbar)
└─ Morgen: 24 Stunden ✓ verfügbar (nach 14:00)
```
## Fehlerbehandlung
### Wenn Tomorrow-Daten fehlen NACH 14:00
**Symptom**: Log zeigt:
```
⚠ Morgen: 0 Stunden ⚠ NICHT verfügbar (sollte verfügbar sein nach 14:00!)
```
**Mögliche Ursachen**:
1. API ist down oder verzögert
2. Preise wurden noch nicht publiziert
3. API-Endpoint hat sich geändert
**Lösung**:
1. Prüfe API manuell: `http://eex.stwhas.de/api/spotprices/flexpro?start_date=YYYYMMDD&end_date=YYYYMMDD`
2. Warte 30 Minuten und prüfe erneut (stündlicher Update)
3. Trigger manuell: `pyscript.getprices_extended`
### Wenn HTTP 500 Error VOR 14:00
**Wenn der Fehler jetzt trotzdem noch auftritt**:
**Prüfe**:
1. Ist die Zeitzone korrekt? (CET/CEST)
2. Ist die System-Zeit korrekt?
3. Log-Output: Welche URL wird aufgerufen?
**Debug**:
```python
# In den Logs sollte stehen:
"Lade Preise nur für 20251125 (vor 14:00 - Tomorrow nicht verfügbar)"
# URL sollte sein:
"...?start_date=20251125&end_date=20251125"
```
## Zusammenfassung
### Was wurde gefixt
✅ Zeitabhängige API-Abfrage (VOR 14:00 vs. NACH 14:00)
✅ Verhindert HTTP 500 Error bei fehlenden Tomorrow-Daten
✅ Besseres Logging für Debugging
✅ Klarere Kommunikation über erwartete vs. verfügbare Daten
### Was bleibt gleich
- Automatische Updates (stündlich, 14:05, Mitternacht)
- Sensor-Namen und Attributes
- Integration mit Battery Optimizer
- API-Endpoint und Feldnamen
### Nächste Schritte
1. ✅ Script aktualisieren und neu laden
2. ✅ Logs prüfen für korrekte Zeitlogik
3. ✅ Um 14:05 beobachten ob Tomorrow-Update funktioniert
4. ✅ Heute Nacht prüfen ob Laden funktioniert
## Version
- **hastrom_flex_extended.py**: v1.1.0
- **Datum**: 2025-11-25
- **Fix**: Zeitabhängige API-Abfrage