# 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