Files
battery-charging-optimizer/FIX_API_TIMING.md

7.1 KiB

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):

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):

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

# 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:

service: pyscript.reload
data: {}

Schritt 3: Manueller Test

Teste die Preis-Abfrage manuell:

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:

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)

@time_trigger("cron(0 * * * *)")
  • Hält Preise aktuell
  • Nutzt zeitabhängige Logik

2. Um 14:05 Uhr (wenn Tomorrow verfügbar wird)

@time_trigger("cron(5 14 * * *)")
  • Extra Update für Tomorrow-Preise
  • Triggert Battery Optimizer Neuberechnung

3. Um Mitternacht

@time_trigger("cron(5 0 * * *)")
  • Update für neuen Tag
  • "Morgen" wird zu "Heute"

Testing-Szenarien

Test 1: Vor 14:00 Uhr

# 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

# 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

# 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:

# 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