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

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