Decision Windows — „Gib mir die günstigsten X Stunden“
GET /v1/decision/windows — N günstigste Stunden / Flex-Segmente. Loxone Wallbox: Flex Windows. Offene API; Community 120 Anfragen/Tag.
Was macht diese Funktion?
Sie sagen der API zum Beispiel:
„Ich brauche 4 Stunden Laden irgendwann in den nächsten 2 Tagen. Wann sind die günstigsten?“
Die API antwortet mit konkreten Startzeiten (und Preisen) — nicht nur mit einer Ampel.
Alltagsbeispiel: Geschirrspüler oder Wallbox: „Suche die 3 billigsten Stunden bis morgen Abend.“
Wann nutzen?
- Sie kennen die Anzahl Stunden (oder kWh + Leistung) schon
- Sie wollen keine Speicher-SOC-Rechnung auf unserer Seite
Wenn die API aus SOC, Verbrauch und PV berechnen soll, wie viele Stunden nötig sind → Hours Demand.
Endpoint
GET https://api.spotpriceapi.com/v1/decision/windows
Community-Key oder höher. Header: X-API-Key: sf_live_YOUR_KEY
Die Idee in einem Bild
Sie: count=4, Zeitraum von jetzt bis +48h, mode=cheapest
API: 02:00, 03:00, 13:00, 14:00 (Beispiel-Startstunden)
Wichtige Parameter (einfach)
| Parameter | Bedeutung | Beispiel |
|---|---|---|
count | Wie viele Stunden? | 4 |
start / end | Suchfenster | ISO-Zeitangaben |
mode | cheapest oder expensive | günstigste / teuerste |
role | consume (Netzbezug) oder export | meist consume |
timezone | Zeitzone | Europe/Vienna |
allocation | Verteilung über Tage | global oder day_first |
Es gibt weitere Filter (Pausen, erlaubte Stunden, …) — für den Einstieg reichen die oben.
Minimal-Beispiel
curl "https://api.spotpriceapi.com/v1/decision/windows?count=4&mode=cheapest&role=consume&timezone=Europe/Vienna&allocation=global&start=2026-08-01T00:00:00%2B02:00&end=2026-08-03T00:00:00%2B02:00" \
-H "X-API-Key: sf_live_YOUR_KEY"
Antwort verstehen
| Feld | Einfach |
|---|---|
decision_status | ok = Fenster nutzbar |
slots[] | Die gewählten Stunden (Start, oft Preis — Modellpreis, nie überschrieben; Auswahl/Ranking rechnet immer damit) |
slots[].dump_risk_pct / dump_scenario_ct_kwh | Aus der Forecast-Stunde: pct 0…100; Scenario = Dump wenn pct > 0, sonst derselbe Punktpreis wie price_ct_kwh (immer nutzbar) — rein additiv, ändert die Auswahl nicht |
day_plan | Optional: wie viele Stunden pro Kalendertag |
In Loxone: oft „Demand = heutige Stundenquote“ an den Spot-Preis-Optimierer — Anleitung: Loxone Windows. Die Slots können zusätzlich dump_risk_pct / dump_scenario_ct_kwh tragen; der Standard-Parser liest sie nicht mit — rein additiv, kein Pflichtfeld.
Häufige Fehler
startnachend→ HTTP 400invalid_range- Weder
countnochenergy_kwh/segments→ HTTP 400incomplete_request mode/roleweggelassen → Defaultcheapest/consume(kein 400)- Weder ISO-
start/endnochwindow_start_hour+window_end_hournochflex_packnochslot_id(Sparvo-Merge) → HTTP 400incomplete_request countgrößer als der Tier-Horizont (168 Full / 48 Basic) → HTTP 400- Zu niedriger Tarif: kein HTTP-Fehler, sondern
decision_status: not_availablebei HTTP 200
Häufige Verwechslung
| Windows | Hours Demand |
|---|---|
| Sie legen N fest | API berechnet N aus SOC/Last/PV |
| Legacy GET; Flex/Loxone auch POST | POST mit JSON-Body |
Nächste Schritte
Flex v1.1 (Lasten Ein/Aus) — optional
count wählt N günstige Stunden in einem Fenster — nicht die Wallbox. Die Wallbox (und Relais/Pool) ist ein Flex-Slot: Sparvo-Gerät + Zeitplan (API-Feld recipes), PicoC-Slot im Portal EMS Anbindung, PicoC Ein/Aus. Ohne Flex-Parameter bleibt die Antwort windows_v1.
| Parameter | Bedeutung |
|---|---|
segments | Komma-Liste oder Zahl, z. B. 7 oder 3,5 |
segment_consecutive | off, soft oder required |
hours_completed | Bereits geladene Stunden im aktiven Segment |
current_segment_index | Aktives Segment (0-basiert) |
repeat_daily | Wird zurückgegeben; in v0.4 nicht angewendet (Wallbox = ein Fenster; Phase 2+) |
deadline_strict | Wird zurückgegeben; nach end sind Slots/Demand immer 0 (soft-continue reserved) |
deadline_hour | Sparvo spätester Start 0–23 (inkl.) — nicht Fenster-end. Ohne window_* leitet die API die Stunden aus ISO-start/end ab (18:00→06:00 bleibt Overnight-sicher). Liegt die Deadline außerhalb des Fensters, wird sie ignoriert (Fenster bleibt). |
slot_id | Flex-Slot (1 / slot_3 / wallbox_1) — Merge aus Sparvo wenn flex_pack fehlt. Ein PicoC-Ausgang 1–8 pro Anlage |
window_start_hour / window_end_hour | Rollierendes Fenster (0–23, Overnight ok) — statt ISO-start/end |
flex_pack | Loxone: gepackte I4/I5/I6/hours_completed für ein <v.0> |
Mit Flex-Parametern: decision_engine: windows_v1.1, Block ems direkt nach decision_status. ems.current_segment_hours / hours_needed_today = Restbedarf (0 bei Segment fertig). window.hours_requested ebenfalls Restbedarf. ems.next_slot_start = nächste Stunde ab der aktuellen vollen Stunde. deadline_reached ist true sobald now ≥ end (auch ohne deadline_strict).
GET (curl/Skripte) — Query-Parameter wie bisher. POST (Loxone VO) — wie Hours ein Analog: {"slot_id":"3","flex_pack":<v.0>}. slot_id fest tippen. flex_pack=0 gilt als weggelassen (Sparvo-Merge); Pack nur mit Laufzeit/Stecker (Segmente=0) merged trotzdem. mode/role Default cheapest/consume. Keine Named-Tags <v.Vi…>, keine fünf <v.n> als fünf Drähte.
curl -X POST "https://api.spotpriceapi.com/v1/decision/windows" \
-H "X-API-Key: sf_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d "{\"window_start_hour\":18,\"window_end_hour\":6,\"segments\":7,\"segment_consecutive\":\"soft\",\"mode\":\"cheapest\",\"role\":\"consume\",\"timezone\":\"Europe/Vienna\",\"hours_completed\":2,\"slot_id\":\"wallbox_1\"}"
curl "https://api.spotpriceapi.com/v1/decision/windows?window_start_hour=18&window_end_hour=6&segments=7&segment_consecutive=soft&mode=cheapest&role=consume&timezone=Europe/Vienna&hours_completed=2" \
-H "X-API-Key: sf_live_YOUR_KEY"
Details: Flex Windows Wallbox.
Device Schedules (Sparvo → EMS)
GET https://api.spotpriceapi.com/v1/plant/device-schedules
Liefert EMS-gebundene Geräte (api_linked): Zeitpläne aus Sparvo, PicoC-Slot via Portal EMS Anbindung (/settings/ems). Felder u. a. slot_id, recipes[] (UI: Zeitplan), Treffer-recipe, segments, window_*. Community-Key.
Community registrieren oder Code-Beispiele mit Ihrem persönlichen Key.