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