API Changelog
Chronologische Änderungen an der öffentlichen SpotpriceAPI (neueste zuerst). Vertrag = /docs-Spec + OpenAPI. KI-Übersicht: /docs/llms.txt.
Diese Seite dokumentiert Änderungen an der öffentlichen SpotpriceAPI in chronologischer Reihenfolge (neueste zuerst). Breaking Changes werden mindestens 30 Tage vor Abschaltung mit einem Deprecation-Hinweis angekündigt.
2026-10-22
- Speichergröße: In der Jahresrechnung bleibt eine dunkle Vorspanne vor der ersten Sonne vor einer späteren teureren Stunde desselben Tages. Nur eine spätere billigere oder gleich teure Stunde zieht vor. Ein größerer Speicher kauft dadurch nicht den teuren Morgen, solange die Nacht billiger ist. Der EMS-Plan folgt dieser Reihenfolge nicht.
decision_enginebleibthours_demand_v1.38. Alle Anlagen/Keys. PicoC unverändert. - Hours Einspeise-Platz: Netzladung, die spätere PV bei 110 % der Prognose aus dem Speicher drängen würde oder in derselben Stunde nach 110 % der PV nicht mehr hineinpasst, wird nur um diese kWh gekürzt. Der Mindeststand gilt auf der rohen Prognose.
decision_enginebleibthours_demand_v1.38. KillHOURS_PV_EXPORT_HEADROOM=0. Alle Anlagen/Keys. PicoC unverändert.
2026-10-21
- Hours Interim-Prefix: Bei imminent Interim bleibt der Interim-Slot die EMS-Kette. Die Decide-Stunde mit endlichen Netz-kWh bleibt im Prefix, inklusive Geschwisterzeilen derselben Stunde. Der Prefix schneidet an der ersten Lücke, Demand ist diese Zahl. Die Stunde 23 bleibt vor 23:00 draußen. JSON-
true, NaN und unendlich zählen nicht. Alle Anlagen/Keys. PicoC unverändert.
2026-10-20
- PV Mitternachts-SoC:
loxone.d0_soc_eodstartet beim Live-SoC. PV und geplante Netz-kWh der laufenden Stunde zählen nur die Restminuten. Die Last dieser Stunde und alle späteren Stunden bleiben ganz. Netz-kWh nur aus frischemday_planmitenergy_kwh > 0. RollbackLOXONE_EOD_OPEN_HOUR_FRACTION=0. Alle Anlagen/Keys. PicoC unverändert.
2026-10-18
- Hours Kauf-Sperre: Die laufende Stunde wird nur einmal gekürzt. Hat die Cover-Glättung sie schon auf den Rest gebracht, rechnen Kauf-Sperre und Krümel-Schnitt mit diesem Rest. Sonst kürzen sie die volle Stunde mit dem verbleibenden Bruch.
decision_enginebleibthours_demand_v1.38. Alle Anlagen/Keys. PicoC unverändert. - Hours Last: Drei gleiche Zählerstunden heben oder senken dieselben Uhrzeiten der nächsten 24 Stunden. Der Deckel gilt nur nach oben (das Doppelte der Typical-Stunde). Eine einzelne Spitze oder Senkung zählt nicht. Ein fallender Speicher ist keine ruhige Stunde. Die laufende Stunde zählt nur anteilig, wenn die Cover-Glättung sie schon gekürzt hat. Die Tageszahl und
d1_load_kwhbleiben Typical.decision_enginebleibthours_demand_v1.38. KillHOURS_LOAD_HOUR_BRIDGE=0. Alle Anlagen/Keys. PicoC unverändert.
2026-10-17
- Hours Krümel: Eine Netzladung unter der Krümelgrenze (
max(0,5 kWh, 2 % der Kapazität)), deren Anschluss größer ist, fällt nur weg, wenn die Floor-Stunden über alle Fenster bis zur achten Sonne mit und ohne sie dieselben sind. Eine Verschiebung des Floors lässt sie stehen. Fehlender oder nicht endlicher Speicherstand: kein Schnitt. Ein kleinerer Anschluss,mustundreserve_breachbleiben. Nicht anheben. Decide, DA-Replan und Jahresrechnung.decision_enginebleibthours_demand_v1.38. KillHOURS_CHARGE_CRUMB_DROP=0. Alle Anlagen/Keys. PicoC unverändert. - Wochenblick: Eine Ladestunde ohne kWh zählt nicht als „1 h geplant“.
hours_neededundhours_needed_dayszählen nur Stunden mit Netzenergie. Dieselbe Zeile setztcharge_nownicht und ist nicht die nächste Ladung. Ein älterer Snapshot wird in der Anzeige genauso gezählt, auch im Wochenblick und in den Tageschips der Anlagenseite. Die sieben Tage starten am Wiener Ausgabetag. Explain-Uhren und die volle Stundenzahl lassen dieselbe leere Zeile aus; eine Uhr ohne Energie-Feld bleibt eine Ladestunde. Alle Anlagen/Keys. PicoC unverändert. - Docs:
llms.txtund OpenAPI nennen den live gemeldeten Hours-Tag (Defaulthours_demand_v1.38). PV-PicoC in llms ist DebugPvForecast v1.6 und ExtractPvDaily v2.7. Sieben Loxone-Detailseiten sindnoindex, weil anonym nur das Login-Gate sichtbar ist. - Hours Netzladung: In den teuersten Stunden eines vollständig bepreisten Tages wird nicht aus dem Netz in den Speicher geladen. Fehlt eine Stunde oder liegt die Spanne unter 5 €/MWh, gibt es keine Sperre. Zeigt 110 % der PV-Prognose in den nächsten 24 Stunden eine Einspeisung und hält der Mindeststand auf der rohen Prognose ohne die Netzladung davor, entfällt sie. Decide und Jahresrechnung. Die Ladung ab dieser Stunde bleibt. Sonst höchstens eine Nachladung: die billigste Stunde, die den Fehlbetrag ganz deckt. Was vorher nicht mehr in den Speicher passt, wird nicht gekauft. Deckt keine Stunde ihn ganz, gilt der größte ankommende Anteil. Entladung in teuren Stunden bleibt.
decision_enginebleibthours_demand_v1.38. KillHOURS_PRICE_PEAK_CHARGE_BAN=0. Alle Anlagen/Keys. PicoC unverändert.
2026-10-14
- Portal/Sparvo — Anlage: Stundenplan-Uhren aus Lookback/Survive gehen als ISO-String in Wochenblick, Snapshot und Anlagen-JSON. Ein
datetimehat den Refresh mit HTTP 500 abgebrochen, die Seite blieb stehen; die Tageszeile hätte sonst 0 kWh gezeigt. Alle Anlagen/Keys. PicoC unverändert.
2026-10-13
- Hours Entladung: Unter der Kurven-Oberkante (bei Mindeststand 20 % ab 32 %) sinkt die Entladeleistung mit dem Speicherstand und steigt mit ihm, auch wenn später oder gerade geladen wird. An oder unter dem Mindeststand ist sie 0. Im genommenen Hold über dem Mindeststand bleibt die Slot-Cap.
decision_enginebleibthours_demand_v1.38. Alle Anlagen/Keys. PicoC unverändert.
- Hours Cover: Eine dunkle Vorspanne vor der ersten Sonne verdrängt die späteren billigen Stunden desselben Tages nicht. Netzladung bleibt nur, wenn sie nach Wirkungsgrad die Preise schlägt, die sie bis zur nächsten Sonne oder im Rest des Kalendertags vermeidet (ε 3 €/MWh). Sonst importiert das Haus direkt. Ein größerer Speicher kauft dadurch nicht mehr teuren Nachtstrom.
decision_enginebleibthours_demand_v1.38. Alle Anlagen/Keys. PicoC unverändert.
- Portal/Sparvo — Speichergröße: Die Jahres-€ und die Import-Ø folgen dem Niveau der letzten 90 Spot-Tage (70–150 % des 12-Monats-Mittels). Die Chips Spot Ø 12 Monate und Regime Ø 90 Tage bleiben die rohen Fenster. Kill
STORAGE_HORIZON_PRICE_REGIME_SCALE=0. Hours Decide: Jahresfelder weiter null. Alle Anlagen/Keys.
- Hours Schwach-PV: Ein Speicherkauf auf einer Sonnenstunde fällt weg, wenn er den späteren Hausbezug im selben Sonne-Fenster nicht senkt. Die Prüfung benutzt das ausgespielte Hold-Cap, nicht die volle Entnahme. Der End-SOC einer Überschuss-Ladestunde zählt die PV mit. Ein Kauf, der einen späteren Import noch trägt, bleibt. Preis unter 0 bleibt.
decision_enginebleibthours_demand_v1.38. KillHOURS_WEAK_PV_REDUNDANT_PEEL=0undHOURS_WEAK_PV_FORWARD_RENT=0. Alle Anlagen/Keys. PicoC unverändert.
2026-10-12
- Hours Netzladung: Gebuchte Cover-, Vorrat-, Survival- und Lookback-kWh bleiben nur, wenn ihr Wegfall den Hausbezug über den restlichen Horizont erhöht. Nach jedem Streich zählt der verbleibende Plan. Ein nötiger Rest unter der Mindestmenge wird auf diese Menge gesetzt, nicht auf die volle Ladung. Eine Lookback-Stunde vor einem Fülltag entfällt, wenn die volle Port-Menge dort nichts senkt. Der eine Nachlauf beginnt bei der aktuellen Stunde und legt neue kWh als eigene Zeile. Speicher-kWh auf einer Floor-Stunde wandern auf frühere billigere Stunden, die den Mindeststand erreichen; die Kostenprüfung zählt Hausbezug plus Speicher-Netzladung und sucht die kleinste Menge mit der niedrigsten Rechnung. Der Kilowattstunden-Clip lässt diese Ladung dafür stehen.
decision_enginebleibthours_demand_v1.38. KillHOURS_CHARGE_SURVIVES_USE=0undHOURS_LOOKBACK_FILL_DAY_BLOCK=0. Alle Anlagen/Keys. PicoC unverändert.
- Hours PV-Tag: Ein kurzer Rest, den der PV-Tag-Schnitt abwirft, bleibt ein eigener Block. Ladung vor einem vollen Speicher deckt einen späteren Trog nicht. Ein fehlender Reihenpreis wird nicht zu 0 ct; die Zeile behält ihren Preis.
decision_enginebleibthours_demand_v1.38. KillHOURS_CHEAP_REACH_DEFER=0. Alle Anlagen/Keys. PicoC unverändert.
- Hours PV-Tag: Die Pack-Tiefe des ersten Trogs eines PV-Tags, geteilt durch den Wirkungsgrad, liegt auf der billigsten erreichbaren Stunde dieses Tags. Ein früherer PV-Tag öffnet sich nur, wenn der eigene den Mindeststand nicht trägt. Ein voller Port ohne Fehlmenge fällt weg.
decision_enginebleibthours_demand_v1.38. KillHOURS_CHEAP_REACH_DEFER=0. Alle Anlagen/Keys. PicoC unverändert.
- Hours Nachtladung: Nötige Netzladung liegt auf den billigsten erreichbaren Stunden von heute und morgen. Lücken bleiben leer. Ab D+2 nur, wenn diese beiden Tage den Mindeststand nicht tragen. Slot-Caps bleiben, solange sie die Netzrechnung nicht erhöhen. Entnahme über Mitternacht reicht bis zum Ende des Folgetags.
decision_enginebleibthours_demand_v1.38. KillHOURS_CHEAP_REACH_DEFER=0. Alle Anlagen/Keys. PicoC unverändert.
2026-10-09
- Portal/Sparvo — Fixtarif: Der tägliche Abruf holt höchstens eine Stufe pro Stunde. Die Stunde ist fest aus Postleitzahl und 100-kWh-Stufe, nicht pro Anlage. Das erste Einschalten im Anlagenprofil bleibt sofort. Kill
ECONTROL_TK_STAGGER=0. Alle Anlagen/Keys.
- Portal/Sparvo — Fixtarif: Die erste Seite nach dem Einschalten bleibt nicht auf „wird abgefragt“, sobald die Zeile im Cache liegt. Der Anlagenprognose-Cache (120 s) liest die Tarifzeile beim nächsten Aufruf neu. Die Seite lädt höchstens 16 Mal alle 15 s nach. Alle Anlagen/Keys.
- Portal/Sparvo — Fixtarif: Hat eine Postleitzahl nur einen Netzbetreiber, ist das Feld schon gesetzt und gesperrt. Es wird nicht noch einmal gewählt. Sonst bleibt die Abfrage ohne Tarifzeile auf „wird abgefragt“. Alle Anlagen/Keys.
- Portal/Sparvo — Fixtarif: Fehlt für die PLZ eine vollständige Zeile (Energie, Gesamt, Anbieter), wird sofort abgefragt, auch innerhalb von 23 h. Die Kachel zeigt solange „wird abgefragt“, nicht den 11,4-ct-Fallback. Während der Abfrage wird dieselbe PLZ nicht ein zweites Mal angestoßen. Ein Heavy-ML-Skip zählt nicht als Versuch. Ein Versuch ohne Zeile wartet 10 Minuten. Alle Anlagen/Keys.
- Portal/Sparvo — Fixtarif: Gesamt bleibt die Jahreszahl der 100-kWh-Stufe. Die Cent-Liste zeigt zusätzlich den Netz-Grundpreis. Der Energie-Grundpreis bleibt die Zeile in €/Monat. Energie plus Cent-Liste plus dieser Monatsbetrag mal 12 durch die Stufe ist der Gesamtpreis.
bis einschließlich N Jahreab 18 undN- bis M-Jährigesind eine Altersgrenze, auch neben einer Preisgarantie. Alle Anlagen/Keys.
- Sparvo — Anlageninfo: Speichern mit Fixtarif-Vergleich an oder aus bleibt eine Antwort. Der aktive Anlagen-Schlüssel wird vor dem Schreiben gelesen. Alle Anlagen/Keys.
- Portal/Sparvo — Fixtarif: Der Richtwert bleibt das Formular. Preisgarantie für 12 Monate bleibt. Ausgeschlossen werden, nur im Produktfenster, eine Altersgrenze, eine Verbrauchskappe unter 100.000 kWh/Jahr und ein Tarif nur für Neukunden. Die Firmenstartseite zählt nicht. Die Staffel 0–100.000 kWh und ein Neukundenbonus bleiben. Ein fertiger Lauf ohne zulässigen Festpreis entfernt die Zeile dieser Stufe, danach 11,4 ct ohne Anbieter-Hinweis. Ein Fehler oder ein unfertiger Lauf lässt die alte Zeile stehen. Kill
ECONTROL_TK_HOUSEHOLD_ONLY=0. Alle Anlagen/Keys.
- Portal/Sparvo — Speichergröße: Die Jahres-Ø ist Netzladung plus übriger Netzbezug aus demselben Lauf. Die Netzladung liegt ab Tagesanfang auf der billigsten Stunde im Sonne-Fenster, nicht auf der billigsten Uhr des Kalendertags. Die Summe bleibt der Jahres-Netzbezug. Alle Anlagen/Keys. Hours Decide ohne Jahres-€.
- Portal/Sparvo — Fixtarif: Der Richtwert kommt aus dem Formular auf e-control.at/tarifkalkulator (PLZ und Netzbezug in 100-kWh-Stufen). Die Partner-API und
rc-public-restwerden nicht aufgerufen. Die Kachel liest den Cache. Ein Stand bleibt bis zu 7 Tage sichtbar. Der Energiepreis wird nur gespeichert, wenn er unter dem Gesamtpreis der Cent-Spalte liegt. Eine Euro-Jahreszahl wird nicht als ct/kWh übernommen. Ein teurerer Detailpreis ersetzt den Listenpreis nicht. Unter dem Produktnamen steht, dass Alter, Neukunde und Aktion beim Anbieter zu prüfen sind. Das gilt für jede Anlage mit E-Control-Branding. Die drei Aussagen Fix vs. Dynamik bleiben. Alle Anlagen/Keys.
- Hours Sonne-Fenster: Weak-Rest und Lookback-Delta ziehen im selben Sonne-Fenster (Morgensonne bis Morgensonne) auf eine mindestens 5 €/MWh billigere Stunde, die noch nicht vorbei ist. In der Wochenrechnung wandert nur das Lookback-Delta, auf der vollen Ladekarte. JSON
trueist keine Stunde. Die Anzeige bleibt der Kalendertag. Survival ohne Lookback, MUST, Prefill, Spill, Interim, Prep und Opp bleiben. Kill bleibtHOURS_COVER_EARLY_PLACE. Alle Anlagen/Keys. PicoC unverändert.
2026-10-08
- Sparvo Planen: Liegen Kapazität und Ladezustand vor, zählt für die Uhrzeit nur der zusätzliche Netzbezug nach PV und Speicher. Nacheinander darf überlappen, wenn dieser Zuwachs in der gemeinsamen Stunde bei 0 liegt. Bei praktisch gleichem Zuwachs gewinnt mehr PV, danach eine Stunde zwischen 7 und 22 Uhr. Ein festgelegter Tag bleibt bis zur Neuplanung. Ein fehlender Ladezustand wird nicht durch 30 % ersetzt und nicht an den Folgetag weitergegeben. Die Ersparniskarte vergleicht ab der aktuellen Stunde nur mit Stunden, die noch wählbar sind. Der SNAP-Abzug macht einen noch positiven Börsenpreis nicht zur Einnahme. Laufen Geräte nur wegen eines Preises unter null zusammen, nennt die Begründung den Preis. JSON
true/falsezählt nicht als Preis, kWh, Ladezustand, Grundlast, Anschluss, PV-Tagessumme oder Geräte-Leistung; ein ungültiger Wert fällt auf das Preset zurück. Eine blockierte Stunde, eine Pflichtstunde oder ein Wochentagtrueist nicht Stunde 1 und nicht Dienstag. KillSPARVO_PLAN_BATTERY_COVER=0. Alle Anlagen/Keys.
- Flex Windows: JSON
true/falsezählt nicht als bereits gelaufene Stunden und nicht als kWh im Rezept. Ein Wochentag oder ein Fenstertrueist nicht Dienstag und nicht 01:00. Ungültige Zahlen zählen als 0. Alle Anlagen/Keys. PicoC unverändert.
- Anzeige: JSON
true/falseund ungültige Zahlen sind kein Spot-Betrag. Als Aufschlag oder kWh zählen sie 0. Alle Anlagen/Keys.
- Entladung, Woche, Speichergröße: JSON
true/falseist keine Entladeleistung (es bleibt der Standard 9 kW), kein Ladestand und kein Wochenpreis von 1 €/MWh. In der Speicherempfehlung ist es keine 1-kWh-Kapazität und kein 1 kWp. Alle Anlagen/Keys. - Hours Explain und Vorrat: JSON
true/falseist keine Nacht- oder Horizontstunde, kein Vorratspreis und keine 1-€-Decke, kein Dual-Contract-Tag und kein EMS-Clear-Zähler. Ein Preserve- oder Hold-Indextrueist nicht Stunde 1. Ein Session-Zählertrueist keine kWh und keine Stunde. Die Nacht-SoC-Rechnung zählt es nicht als Speicher oder Last. Die Explain-Ansicht zählt es nicht als Stunde, kWh, Fenster oder Puffer. Ein Profilfeldtrueist kein Ladezustand, kein Anschluss, kein Jahresverbrauch, kein Zählerstand, kein kWp und kein Wirkungsgrad von 100 %. In der Lookback-Zusammenführung und auf der Wochenkarte ist es keine 1 kWh. Alle Anlagen/Keys. PicoC unverändert.
- Hours Restladung: Ein Nachzug vor dem Floor bleibt nur, wenn die Stunde mindestens 5 €/MWh billiger ist als die Floor-Stunde. Sonst kauft das Haus in der Floor-Stunde. Fehlender Preis der Floor-Stunde lässt den Nachzug aus. Das Sonne-Fenster bleibt danach für den nächsten Floor offen. Alle Anlagen/Keys. PicoC unverändert.
- Hours Lookback: Eine vom Soft-Cap blockierte Tagstunde wird genommen, wenn sie mindestens 5 €/MWh unter der billigsten Nachtstunde liegt und keine PV verdrängt. Der Morgen über min+10 pp allein hält sie nicht zu. Eine weitere Stunde, die zusammen mit der schon gelegten Menge PV verdrängt, fällt aus. Die Probe setzt nur den freien Anschluss an, entlädt eine Schonstunde nur bis zu ihrem Cap und stoppt am Ziel-SoC. JSON
true/falseist kein Preis, keine kWh und kein PV-Block (gemeinsame Preislesung inklusive P20, Hold, Weak, Verschieben und P33, Wirkungsgrad, PV-Erholung und Sonnenfenster). Einspeisung, Rest-Carry, Interim, Prep-Reserve, der Entnahme-Ping-Pong und die billigste-Stunden-Sortierung zählen es nicht als 1 kWh. In der Decide-Preisreihe, im Weak-Fill und im Tagespreis füllttruenicht als 1 €/MWh vor. Neighborhood- und Thin-Cover-Carry sowie Lookback-Thin zählen es nicht als Last oder Ladeleistung. Cover-Defizit, Autark-Gate, Frühzug und der Entnahme-Ping-Pong zählen es nicht als Kapazität oder Ladeleistung. Hold-Pack und die ausgerichtete PV-Reihe zählen es nicht als kWh. Cold-Start-PV und der Rest-heute zählen es nicht als kWh. Die Nachtkarte zählt es nicht als Stunden oder kWh. Der Leergrund zählt es nicht als Ladeleistung. Das Cover-Fenster und die Horizont-Last zählen es nicht als kWh. Weak-DP und der Decide-Mix zählen es nicht als Kapazität, Ladeleistung oder Netzanschluss-Limit, und Cap-Skip behandelt den Speicher dann nicht als voll. Pflicht-, Prep- und Lookback-Stundenindizes zählentruenicht als Stunde 1, und die geladene Energiemenge zählt es nicht als 1 kWh. Alle Anlagen/Keys. PicoC unverändert.
2026-10-07
- Sparvo Planen: Der Tagesplan nutzt den Zeitplan des Geräts (Wochentag, Von–Bis, Dauer).
00:00–00:00bleibt der ganze Kalendertag. Ein Fenster über Mitternacht läuft auf den Folgetag; die kWh zählen nur dort, eine angebrochene letzte Stunde bleibt angebrochen. Eine angepinnte Nacht bleibt liegen, wenn der Budget-Zwang neu legt. Die dynamische Neulegung bewertet Stunden nach Mitternacht mit der Kurve des Folgetags und zieht ein Gerät nicht vor das Gerät, nach dem es laufen muss. Ein neuer Lauf beginnt erst nach der eigenen Fortsetzung. Pflichtstunden gehören zu demselben Lauf und werden nicht ein zweites Mal belegt. Aneinanderliegende Stunden desselben Laufs erscheinen als ein Block. Passt eine Pflichtstunde nicht ins Zeitfenster oder in die Dauer, bleibt sie aus und der Plan nennt das. Flex Windows bleibt preis-only. Request und Response von/v1/decision/windowsund/v1/plant/device-schedulessind unverändert. Alle Anlagen/Keys.
- Hours Slot-Platz: Die Restladung vor der PV-Erholung sucht ab der ersten Stunde des PV-Blocks, nicht erst nach der Dämmerung. Anschluss voll oder Speicher auf Cap nimmt die nächste billigere Stunde. Die Restladung wird nach dem Frühzug auf dem Schonungs-Lauf neu gesetzt, damit eine Schonstunde keinen Floor erfindet. Eine Stunde, die schon lädt, bleibt dabei keine Schonstunde. Liegt der Floor schon auf der ersten Suchstunde, bleibt das Sonne-Fenster für den nächsten Floor offen. Plain Cover zieht im selben Sonne-Fenster auf die frühere billigere Stunde (
HOURS_COVER_EARLY_PLACE, Default an), nach Neighborhood und vor der Direktplanung. Eine eingefrorene Zeile auf der Zielstunde bleibt; die kWh liegen daneben. Die Jahresrechnung verschiebt nur Cover, das neben Weak-PV eingefroren ist. Der Chip zur fehlenden früheren Stunde gilt nur für Schwach-PV.decision_enginebleibthours_demand_v1.38. KillHOURS_COVER_EARLY_PLACE=0. Alle Anlagen/Keys. PicoC unverändert.
2026-10-04
- Einspeisung ist die Tagesmenge:
export_feed_kwhfür heute ist bereits eingespeist plus noch prognostiziert, nicht mehr nur der Rest ab der aktuellen Stunde. Der Speicher-Chart bleibt ab jetzt auf dem Live-SoC. Abgeschlossene Stunden kommen aus den SoC-Pings (ohne Ping und mit Speicher wird nichts erfunden; ohne Speicher zählt der Überschuss). D1…D6 bleiben der volle Tag. Anzeige unverändert, 1 Nachkommastelle. Nicht im Hours-JSON, nicht im Loxone-Text. Alle Anlagen/Keys.
2026-10-03
- Einspeisung auf jeder Anlage sichtbar: Dieselbe
export_feed_kwh-Rechnung für alle aktiven Keys. Die Zeile und die Tageschips zeigen die kWh immer, auch 0,0. 0,0 heißt: Last und Speicher nehmen die PV auf (oder es gibt keine PV). Alle Anlagen/Keys.
- Einspeisung im 7-Tage-Horizont:
export_feed_kwhist der PV-Überschuss (AC-kWh), den Last und Speicher an dem Tag nicht aufnehmen. Stand dieses Tages: Rest ab der aktuellen Stunde. Ab 2026-10-04 gilt die Tagesmenge (Eintrag oben). Anzeige Sparvo Anlage und Portal-Anlagenprognose (PV · Last · Einspeisung, Tageschips und Tagesbuttons immer, auch 0,0). 1 Nachkommastelle. Nicht im Hours-JSON, nicht im Loxone-PV-Text. Alle Anlagen/Keys.
- Hours Horizont: Schonung bis zum nächsten Morgen gilt über die ganzen 168 h (ohne neue Netz-kWh). Die Restladung vor der PV-Erholung läuft über jede Nacht der 7-Tage-PV, nicht nur über den ersten Morgen. Der tageübergreifende Kauf bleibt beim Lead-Band bis D+2. Last, PV und Preis sind dieselben Stundenvektoren. Alle Anlagen/Keys.
- Hours Restladung vor Sonnenaufgang: Die Zusatz-kWh liegen als eigene Zeile
prefill_breach(weitersurvival). Eine schon geplante Ladung derselben Stunde bleibt verschiebbar. Die Tages-Umlage streicht diese Zeile nicht und schiebt sie nicht hinter den Engpass; ein Umlage-Zug daneben gilt nur, wenn der Mindeststand vor der PV-Erholung hält. Alle Anlagen/Keys.
- Hours Speicherplan v1.38 (Default an): Ein Hold-Wrapper für Decide, Weak und Familie B. Der Speicher wird für spätere Peaks reserviert, Entnahme wandert auf teurere Stunden ohne Extra-kWh, und eine billige Nacht darf bis zum nächsten Morgen schonen, solange der Tag höchstens D+2 ist. Preis-Peaks ergänzen die Uhr-Peaks nur bei vollständigem Tagespreis. Restladung vor der PV-Erholung bleibt unter dem Morgen-Cap. Lookback darf eine Tagstunde nur nehmen, wenn sie günstiger als die Nacht ist, der Stempel hält und keine PV verdrängt wird. Negativpreis (unter 0, Band 0) hängt nicht am Opp-Schalter der Anlage. Der Tagesfuß zeigt den Netzbezug am Mindeststand extra; die geplante Summe bleibt X+Y+Z.
decision_enginehours_demand_v1.38. KillsHOURS_HOLD_LATER_PEAK_RESERVE,HOURS_HOLD_DISCHARGE_PING_PONG,HOURS_HOLD_PRICE_PEAKS,HOURS_HOLD_MIDNIGHT_CARRY,HOURS_PREFILL_BREACH_TOPUP,HOURS_LOOKBACK_DAY_STAMP_PROBE,HOURS_OPP_NEGATIVE_PRICEjeweils=0(dann bei Lead-Band an wiederv1.37). Alle Anlagen/Keys. PicoC unverändert.
2026-10-02
- Portal/Sparvo — Brutto/Netto: Fixtarif-Energie und Grundpreis folgen dem MwSt-Schalter der Preisseite (gleiche Nutzer-Einstellung, alle Anlagen). E-Control-Arbeitspreis ist netto; brutto ist dieser Wert × 1,20, nicht noch einmal geteilt.
- Portal/Sparvo — Fixtarif-Abfrage: E-Control bekommt den erwarteten Netz-Restbezug (ganze kWh), nicht den Jahresverbrauch der Anlage. Ohne Restbezug kein Abruf. Alle Anlagen/Keys.
- Portal/Sparvo — Speicher-Amortisation: Hardware = 160 €/kWh netto × 1,20 (fertig eingebaut, linear). Keine 16-kWh-Pauschale und keine zweite EMS-Pauschale. Sichtbare Jahre und Euro folgen derselben Balken-Basis (Aufschlag/MwSt). Liegt der Ist-Speicher über dem Sweetspot-Bucket, sagt Kurz-erklärt „über der Faustregel“, nicht „im Bereich“. Alle Anlagen/Keys.
- Hours Weak-PV Forward-Rentabilität (Default an): Eine Schwach-PV-Netzladung bleibt nur, wenn die Hausimporte, die sie wirklich vermeidet, teurer sind als der Kauf nach Wirkungsgrad (ε 3 €/MWh, volle Entnahme bis Floor, kein Aufschlag). Das Abendmittel bleibt das Aufnahme-Gate. Ein flacher Preis-Schwanz nach einem schon gedeckten Abend fällt weg. Note
weak_pv_forward_unrentable. KillHOURS_WEAK_PV_FORWARD_RENT=0. Decide, DA-DP und Familie B. Neighborhood-Move, der den rentablen Rest verkleinert, wird zurückgenommen (neighborhood_forward_rent_revert). Alle Anlagen/Keys. PicoC unverändert.
- Hours Econ-Lead-Band (Default an): absolute Euro nur bis D+2; ab D+3 nur die Tagesform. Note
econ_lead_band,decision_enginehours_demand_v1.37. Punktpreis unverändert, kein Dump-Szenario als Steuerpreis. Typwoche ohne Forecast-startsbleibt preisgeordnet. Die Bridge-Zielstunde ist nur Band 0, wenn Horizont-Tage mitgegeben sind (ein D+6 unter der Dump-Schwelle verlängert den Trog nicht). KillHOURS_ECON_LEAD_BAND=0stellthours_demand_v1.36und die alte Preisordnung wieder her. Spec HOURS §6.8.19 + Wiki Hours. Alle Anlagen/Keys.
2026-10-01
- Hours Weak-PV Redundant-Peel: Netzladung, die im selben PV-Tag (Sonne→Sonne) den Haus-Restimport nicht senkt, fällt weg — typisch der Port-Rest kurz bevor die PV den Speicher allein vollmacht. Nötige günstige Stunden davor bleiben. Kill
HOURS_WEAK_PV_REDUNDANT_PEEL=0. Explain-Zeile Netz bei Netzladung = Lade-kWh plus Haus-Rest (Portal und Sparvo, dieselbe Karte). Holds werden nach dem Peel zum verbleibenden Fill neu geplant. Alle Anlagen/Keys. PicoC unverändert.
2026-09-29
- Portal/Sparvo — Fixtarif E-Control (Try-Mode live): Günstigster Haushalt-Fix (
GUARANTEE) für alle Anlagen mit aktivem API-Key + AT-PLZ, Cache 24 h, Timerspotforecast-fix-tariff-refresh(HA Primary, distinct PLZ×Band — Last-Band plus niedrigere Bänder/bestehende Cache-Keys, weil Outlook Import-Band bevorzugt). Schicht-A-Kachel Energie+Gesamt + Attribution; Expand ohne/inkl. MwSt + Link Zum Anbieter (changeLink.link); Schicht B Admin (Pending nur wenn Fixtarif-Pfad aktiv, nicht Non-AT); Opt-outfix_tariff_display_enabled(Sparvo Power-Toggle AN/AUS, default ON; Save last-of-duplicate hidden-0+checkbox-1; Guest-"0"= Aus; Portal/Sparvo Speichern+Geocode/Reverse inkl. Early-Exitsempty_address/not_enough_input/invalid_coords/invalid_postal/Profilfehler; Sparvo-Geocode ignoriert kaputte Form-Koordinaten). KillECONTROL_TK_ENABLED=0. Fetch fail-closed: nur 4-stellige PLZ, finite Jahres-kWh (kein JSON-bool/inf), HTTP-Body-Cap, keine kaputten Kosten-Objekte; Live-Compare ohne Fake-cost_dyn(fix×Import). Cache-/Compare-ct finite (Gift-Cache → Fallback; Env-Floats crashen Hours-Import nicht). Hours Decide unverändert (basis.storage_horizonohne E-Control-Fetch/Jahres-€). Spec ANLAGENPROFIL (Fixtarif). Alle Anlagen/Keys.
2026-09-20
- Speichergröße Outcome Guard Fail-closed (SSR): Fehlendes/ungültiges Outcome-Dict fürs aktive Szenario → fail_closed; Kill=
0ignoriert Leftover-Dicts (nuroutcome_guard_enabled); JSON-Attrs single-quoted. Spec ANLAGENPROFIL Hybrid. Alle Anlagen/Keys.
- Speichergröße Outcome Guard: Display-Titel/Cap/€/Delta/Balken-3 nur aus
display_outcome_{pv,bridge}(nie teureres Tip-Cap; Tip nur Outcomesinnvoll; Collapse/Passt/Warn/Grid/Fail). KillSTORAGE_HORIZON_OUTCOME_GUARDdefault on (=0→ Legacy Rechenbeispiel). Soft-Link = candidate ∧ Edit; Fixtarif-Bürgercollapse|fix. Hours Decide unverändert (Outcomes null). Spec ANLAGENPROFIL + HOURS §6.6. Alle Anlagen/Keys.
- Speichergröße Hybrid-UI Audit-clean: Incomplete/Empty-Toggle Default = Nur PV; Portal horizon-html Soft-Link-Gate = Plant-Location-Owner (wie Seite); Toggle aktualisiert Balken-Ø + Delta-€ inkl. MwSt; Balken-3-Label = rechter Titel; Amort-Extra nur bei Profil-Szenario. Spec ANLAGENPROFIL Hybrid. Alle Anlagen/Keys.
- Speichergröße Hybrid-UI + Dual-Annual: Toggle Nur-PV / Mit-Netzladen + 2 Spalten + 3 Balken (Portal/Sparvo/Gast); Dual-Jahres-€ PV/Bridge additiv; Kill
STORAGE_HORIZON_DUAL_ANNUALdefault on; „Passt“ bei Szenario-Cap ≈ Ist; Upsizing = Copy-Gate; Soft-Link nur Owner/Edit; Fail-closed „—“ ohne Dual-€. Hours Decide unverändert (Jahresfelder null). Spec ANLAGENPROFIL + HOURS §6.6. Alle Anlagen/Keys.
2026-09-17
- Speichergröße Dual-Szenarien (Portal/Sparvo/Gast): Status Netzladen An|Aus; immer beide Blöcke wenn-aus/wenn-an (inkl. Incomplete + Empty-Hydrate-Stub); „Passt“ nur bei Netzladen an; Upsizing-Gate;
assumptions.annual_load_sourcemeter|profile. Hours Decide unverändert (Jahresfelder null). Spec ANLAGENPROFIL + HOURS §6.6. Alle Anlagen/Keys.
- Speichergröße Dual-kWh / Bridge-Sweetspot live (Phase 3): Payload additiv
sweet_spot_pv_kwh/sweet_spot_bridge_kwh/recommendation_mode(grid_off|pv|bridge). Code-Kill-Default weiter off (STORAGE_BRIDGE_SWEETSPOTunset/=0→ aktive Empfehlung = PV). User-Go 17.09.2026: Hosts HP+Lenovo=1inaccount.env→ bei Netzladen an ist Bridge die aktive Empfehlung (sweet_spot_capacity_kwh). Grid-off: kein Upsizing. Rollback:=0+systemctl restart account-portalbeiderseits. Evidence:storage_bridge_sweetspot_evidence_20260917. Alle Anlagen/Keys.
2026-09-16
- Hours Soft-Cap Weak-resim + Spill-€ JSON-bool scrub: Soft-Cap post-trim
end_socresim, Econ-PP Soft-Cap SoC/stamp maps, Soft-Cap-Spill euro proxy, gate-filter/Econ-redistrib charge maps scrubben JSON-bool/NaN→0 (keinfloat(True)=1). Spec HOURS §6.8.15/§6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Soft-Cap SoC-Pfad JSON-bool scrub: Shared Soft-Cap SoC-Pfad (
roll_soc_hour/forward_soc_path/Stamp/Lookback stress+place/O4-Refresh/plan_roles/NB+Thin residual) zählt JSON-bool/NaNals 0 (keinfloat(True)=1Soft-Cap-Σ). Spec HOURS §6.8.15/§6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Soft-Cap Cover-worsen + Spill scrub: Consolidate Soft-Cap-Gate reject't Cover Soft-Cap-Worsen auch wenn Soft-Cap auf orig schon broken (pre-stamp Cover-Σ↑); In-Horizon Soft-Cap-Trim scrubt JSON-bool auch bei
soft_rel=None; Soft-Cap-Spill/clip/same-dayMaps JSON-bool→0. Spec HOURS §6.7/§6.8.15 + Wiki Hours. Alle Anlagen/Keys.
- Hours Soft-Cap Survival/MUST Peel + Consolidate Cover Gate: Soft-Cap peel exempt lookback/survival/MUST (
softcap_may_peel_row); Consolidate Soft-Cap-Gate läuft immer — Cover-Δ allein Soft-Cap-Break → Reject (Survival-Δ darf Soft-Cap-Breach); Econ-PP Base/Frozen JSON-bool→0. Spec HOURS §6.7/§6.8.15 + Wiki Hours. Alle Anlagen/Keys.
- Hours Soft-Cap Boundary JSON-bool Scrub: Soft-Cap trim early-hold exit scrubt
energy_kwh/cover_merged;softcap_stamp_holds/In-Horizon-Map/LThin-Map+lookback_added/Resolve Soft-Cap-adjacent Charge-Maps zählen JSON-bool/NaNals 0 (keinfloat(True)=1Soft-Cap-Σ). Spec HOURS §6.7/§6.8.15 + Wiki Hours. Alle Anlagen/Keys.
- Hours Consolidate JSON-bool kWh: Day-Consolidate
_energy/ Prep-Σ zählen JSON-bool/NaNals 0 (keinfloat(True)=1Soft-Cap-/Budget-Inflate); Week-Status Charge-Σ ebenso. Spec HOURS §6.8.15/§6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Soft-Cap Relocate JSON-bool Floor:
split_cover_merged_on_relocate+ Neighborhood/Thin-Defer/LThin Σ zählen JSON-boolcover_merged/energy_kwhals 0 (keinfloat(True)=1Floor bei Relocate). Spec HOURS §6.7/§6.8.15/§6.8.18 + Wiki Hours. Alle Anlagen/Keys.
- Hours Soft-Cap JSON-bool kWh (shared): Soft-Cap Identity/
peelable/trim/Lookback-Thin Map zählen JSON-bool/NaNkWh als 0 (keinfloat(True)=1); Merge normalisiert str-Map-Indices. Spec HOURS §6.7/§6.8.15 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback Merge JSON-bool / MUST-kind / non-cover Role: JSON-bool
energy_kwhzählt als 0 (keinfloat(True)=1Soft-Cap-Floor); Coalesce setzt bei MUSTcharge_kind=must(kein darf/weak_pv-Rest); non-coverslot_role(z. B. floor) bleibt freeze; neue Lookback-Slots sanitisieren NaN/Inf Last/PV. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback Merge Non-Finite kWh: Sibling/
mapenergy_kwh/cover_merged/lookback_addeddie NaN/Inf/unparseable sind, zählen als 0 (kein Soft-Cap-Floor-Poison, kein Merge-Crash). Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback Merge Abs-Map Unparseable/Out-of-Window: Unparseable oder außerhalb-
starts-Fenster Non-Spill-Zeilen werden genullt/gedroppt (kein Soft-Cap-Σ-Inflate); Spill bleibt exempt. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback Merge Freeze-Role-Coalesce: Prep/Opp/Bridge∪Weak same-hour Coalesce behält Freeze-
slot_roleauf dem Sink (Neighborhood / Thin-Cover-Defer frieren weiter); leerestart-Zeilen droppen. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback Merge Survival-Coalesce: Cover∪Weak same-hour Coalesce behält
survivalvom Sibling auf dem Sink (Thin-Now / Neighborhood / Defer frieren weiter). Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback Merge Interim-Omit + MUST-Coalesce: Interim ohne Map-Energie behält die Pin-Zeile, Energie=0 (kein Soft-Cap-Σ-Inflate); same-hour Coalesce ORt
mustauf den Sink. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback Merge Abs-Map + Zero-Δ Lookback: Stunden mit Map-Energie 0/omit werden gedroppt (kein Soft-Cap-Σ-Rest);
lookback=Truenur bei Lookback-Δ>ε (Zero-Δ peel’t Weak nicht mehr aus). Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback Merge-Coalesce naive-tz: Naive Slot-
startnimmt Map/start0/Vienna-TZ an (nicht UTC), damit Siblings coalescen und Soft-Cap-Σ nicht inflatiert. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback Merge-Coalesce nach logischer Stunde: Sibling-Match per geparster UTC-Stunde (nicht String-Gleichheit), damit
str(dt)vsisoformat()keine zweite Zeile und Soft-Cap-Σ-Inflate erzeugen; Sink-startauf Map-ISO normalisiert. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback Merge Soft-Cap-Floor bei Coalesce: Same-start Cover∪Weak behält Cover-Energie als
cover_merged_kwh-Floor (kein bare-weak_pv→ Soft-Cap-Natural-Reopen); Spill-Flags wandern zum Sink. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback Merge Sibling-Coalesce + Familie B Soft-Cap-Baseline Carry:
merge_lookback_into_charge_hourscoalesciert same-start Siblings auf Absolute-Map-Σ (kein Soft-Cap-Σ-Inflate); Familie B LThin Natural nur bei Weak-Overlay ∧ ¬Cover-Fill ∧ ¬Lookback-Movable;week_had_*überlebt PP-Forced-Re-Sim. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback-Thin Weak per-index + Familie B Soft-Cap baseline: Weak Soft-Cap identity is per movable hour (Cover siblings no longer inherit
weak_pv); Familie B LThin Natural only when Weak overlay filled and no Cover fill remains (not stamp presence). Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback-Thin Weak Soft-Cap identity + split clamp: Rebuild keeps
weak_pvon peelable movable; prior-Weak frozen remnant keepsweak_pv(Cover-floor remnant still clears it);split_cover_merged_on_relocateclamps floor ≤ source energy; Familie B LThin Soft-Cap Natural when Weak-week stamps present. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Consolidate Soft-Cap plan-level + Lookback-Thin floor/probe: Soft-Cap mode = day pool + fixed
other_slots(Lookback Cover nicht mehr day-scoped Weak-only→Natural); Lookback-Thin trägtcover_mergedbei Drop/Relocate mit und probe’tsoftcap_stamp_holdsCover/Mixed absolut / Weak-only Natural (Thin/NB-Parität). Spec HOURS §6.8.15/§6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Consolidate min_head overshoot + Lookback-Thin cover_merged: Cover-Crumb
< min_headbehältcover_merged_kwh(Mixed absolut, nie bare Weak→Natural); Soft-Cap-Demote clampcover_merged≤energy; Lookback-Thin Frozen/Movable-Split viasplit_cover_merged_on_relocate. Spec HOURS §6.8.15/§6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Consolidate Mixed Weak-budget: Weak budget excludes
cover_merged_kwhfloor (softcap_weak_peelable_kwh) — full Mixed energy as Weak stamped Cover→weak_pvand Soft-Cap Natural reopen after day-consolidate. Spec HOURS §6.8.15 + Wiki Hours. Alle Anlagen/Keys.
- Hours Thin/NB Mixed cover_merged relocate: Relocate splits/trägt
cover_merged_kwh(Weak zuerst, Floor mit Cover-Energie) — volle Mixed-Verschiebung droppte den Marker und öffnete Soft-Cap Natural. Spec HOURS §6.7/§6.8.18 + Wiki Hours. Alle Anlagen/Keys.
- Hours Soft-Cap Mixed post-apply absolute:
trim_weak_pv_charges_to_softcap+ Thin/Neighborhood/Consolidate Soft-Cap-Mode viasoftcap_charge_rows_weak_only— Cover/Mixed (inkl.cover_merged_kwh) absolut / Weak-only Natural; immer-Natural nach Cover∪Weak-Merge ließ Soft-Cap reopen. Thin Trim-Σ-Guard → Revert (Neighborhood-Parität); Why Neighborhood moved > dest-skip. Spec HOURS §6.8.15/§6.7/§6.8.18 + Wiki Hours. Alle Anlagen/Keys.
- Hours Econ-PP Soft-Cap dest-skip note hygiene: Zwischen-Note
weak_econ_ping_pong_softcap_dest_skipentfällt nach erfolgreichem Move (Neighborhood-Parität); Why: moved > dest-skip > no_move. Spec HOURS §6.8.15/§6.8.10 + Wiki Hours. Alle Anlagen/Keys.
- Hours Explain Why-Hydrate + Thin Soft-Cap-Revert: Lookback-Codes
lookback_fill_day_block/lookback_far_softcap_guardim Explain-JS-i18n-Blob (Hydrate droppte SSR-Chips bei leeremwhy_*); Thin Post-Move Soft-Cap-Revert schreibt Notethin_cover_softcap_revertins Snapshot/plan_why_chain(Neighborhood-Parität). Spec HOURS §6.7/§6.8.10 + Wiki Hours. Alle Anlagen/Keys.
- Hours Thin-Cover Soft-Cap dest-skip Why: Probe-Fail ohne Move schreibt Note
thin_cover_softcap_dest_skipins Snapshot/plan_why_chain(Neighborhood-Parität); Explain DE+EN. Spec HOURS §6.7/§6.8.10 + Wiki Hours. Alle Anlagen/Keys.
- Hours Econ-PP Mixed Soft-Cap absolute: Dest Soft-Cap-Probe = Cover∪Weak Stamp (
softcap_stamp_holds); Cover/Mixed absolut / Weak-only Natural; frozen Cover in Port/SoC — Natural Weak-only Map ließ Mixed Soft-Cap reopen. Spec HOURS §6.8.15 + Wiki Hours. Alle Anlagen/Keys.
- Hours Mixed Soft-Cap absolute (Thin/Neighborhood): Dest Soft-Cap-Probe plan-level Weak-only (nicht source-row); Mixed Cover+Weak bleibt absolut; same-flag Sibling-Merge (kein Cover→
weak_pv-Flip). Spec HOURS §6.7/§6.8.18 + Wiki Hours. Alle Anlagen/Keys.
- Hours Cover Soft-Cap absolute on Thin/Neighborhood: Neighborhood + Thin-Cover-Defer Soft-Cap Stamp-Probe = Cover/Mixed absolut / Weak Natural (
softcap_stamp_holds, Consolidate-Parität) + Post-Move Soft-Cap-Check → Revert — Natural-Probe ließ Cover Soft-Cap über morning_cap reopen. Spec HOURS §6.7/§6.8.18 + Wiki Hours. Alle Anlagen/Keys.
- Hours stop display bool-guard (Why + Explain JS + chip merge): Why-Page und Explain-JS lehnen JSON-bool Stopp ab (kein
fmt_num(true)/Number(true)=1); Chip-Mergecoerce_charge_stop_soc_pct; Spec §6.2 EMS-Default Extract v1.23/Fetch v1.17; Client-Session-Poll Regressionstests. Spec HOURS §6.2/§6.7 + Wiki. Alle Anlagen/Keys.
- Hours
charge_nowclient bool-guard + PicoC spec: Portal/Sparvo/Live-Telem Session-Poll nur beicharge_now === 1/"1"(keinNumber(true)=1); Explain-Jinja Stopp nicht|intauf JSON-bool; Spec §14 PicoC Fetch v1.17 / Extract v1.23. Spec HOURS §6.7/§14 + Wiki Hours. Alle Anlagen/Keys.
- Hours Familie-B Soft-Cap stamp rebuild: Jahres-€ Lookback/Lookback-Thin Soft-Cap-Stamps = Weak-week ∪ sun→sun-
plan.hi(merge_softcap_stamps_with_rebuild) — Weak-aus ließ_lb_softcap=Noneund Soft-Cap-Probe no-op. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours
charge_nowbool-guard (UI/live-telem/webhook): Sharedcoerce_charge_now— JSONtrue/falsenieint(True)=1auf Snap-Write, Explain-UI, Live-Telem, Session-Hide, Webhook-Payload/Material-Key, EMS-Prefix und Session-Complete. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback-Thin Soft-Cap stamp probe: Relocate-Dest Soft-Cap-Probe (
softcap_natural_baseline_holds) — peel-exempt Lookback darf Soft-Cap-Tagesstunden nicht nachträglich füllen (Far-Guard-Parität); Decide + Familie B. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours stop-reader bool-guard (session-complete + UI): Session-complete Replan und Session-complete Overlay/
charge_stop_soc_pctUI lesen Stopp nur übercoerce_charge_stop_soc_pct(JSONtrue/falsenie Stopp=1);charge_nowbool → idle. FetchPlantHours-Kommentar + Wiki O12 Engine v1.36. Spec HOURS §6.7 + Wiki Hours/Loxone. Alle Anlagen/Keys.
- Hours Thin Soft-Cap stamp probe (Cover): Thin-Cover-Defer Soft-Cap-probes Dest vor Commit (
softcap_natural_baseline_holds, Neighborhood-Parität) — Cover Soft-Cap auch Weak-aus nicht reopen; Weak-Trim bleibt Safety-Net. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Soft-Cap stamps Thin/Neighborhood (Weak-off): Decide reicht Soft-Cap-Stamps = Weak-defer ∪ Near∪Dawn∪jedes sun→sun-
plan.hi(merge_softcap_stamps_with_rebuild) an Lookback und Thin-Cover-Defer / Neighborhood — bei Weak-aus sonst Cover Soft-Cap ohne Stamp-Probe. Spec HOURS §6.8.18/§6.2b + Wiki Hours. Alle Anlagen/Keys.
- Hours sticky stop writer bool-guard: Prior-Snap-/Publish-Stopp (
coerce_charge_stop_soc_pct) an Latch-Sticky-Republish, Snapshot-Write, Webhook-Payload, Material-Key und Timeline-Stamp — JSONtrue/falsenie mehr Stopp=1. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Lookback Far Soft-Cap Stamp-Rebuild: Soft-Cap-Stamps für Far-Guard = Weak-defer ∪ Near∪Dawn∪jedes sun→sun-
plan.hi(rebuild_lookback_softcap_stamps) — dawn-only ließ Soft-Cap-Tagesstunden im Far-JIT peel-exempt (Slack↑). Spec HOURS §6.2b + Wiki Hours. Alle Anlagen/Keys.
- Hours Dual warm-up Geo
cache_only:estimate_pv_series_kwh(cache_only=True)/ Dual-Stitch nie Open-Meteo-Refresh — fehlender Cache →sun_sun_ready=false. Spec HOURS §14.5b + Wiki Hours. Alle Anlagen/Keys.
- Hours numeric input bool-guard (series + constraints): Client-
load.hours/pv.hours/energy_next_24h_kwh, Constraints-max_hours*/min_hours, Snap-Stopp und PV-Array-kwpfail-closed wie Battery/Horizon/Latch — JSONtrue/false→invalid_inputbzw. Feld omit (niefloat(True)=1/int(True)=1). Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours numeric input bool-guard: Request-Zahlen (
battery.*/ Meter / PV-Scalars / Opp /horizon_hours) und Latch Live/Stopp akzeptieren nur int/float/str/Decimal — JSONtrue/false→invalid_inputbzw. Latchincomplete_hold(niefloat(True)=1/int(True)=1/float(False)=0). Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
- Hours Familie-B Lookback Soft-Cap-Stamps: Jahres-€-Pfad reicht Soft-Cap-Stamps an Lookback (Decide-Parität / Far-Guard braucht weiter
dawn_cap→ no-op ohne Dawn; Fill-Day-Block läuft unabhängig von Soft-Cap). Spec §6.2b. Alle Anlagen/Keys.
- Hours Lookback Dawn-Scope + Fill-Day + Soft-Cap-Far + Dual-Warm-up (
hours_demand_v1.36): Bewusster Engine-Sprung vonv1.32. O2 erster Stress-Cluster + O5b Far-JIT 36 h (HOURS_LOOKBACK_DAWN_SCOPE); Fill-Day-Block Survival (HOURS_LOOKBACK_FILL_DAY_BLOCK); Far Soft-Cap-Kohorte + Natural-Probe (HOURS_LOOKBACK_FAR_SOFTCAP_GUARD); Warm-up Dual-Cycle Kalender ≥18/24 ∧ sun→sun (HOURS_COLD_START_DUAL_CYCLE, Default on; Ops zuerst Dual=0). Spec HOURS §6.2b/§14.5b + Wiki Hours. Alle Anlagen/Keys.
- Hours Latch Survival-Below-Floor Rearm: Sticky Stopp−H hält nicht mehr unter Reserve-Floor (Live < min_soc−0,5 pp) — Decide öffnet mit
rearm_below_floor(Prefix-charge_now); oberhalb unverändert Hold bis Stopp−H. Extract v1.23 folgt Server-SoT (charge_now=1cleart lokal). Spec HOURS §6.7 + Wiki Hours/Loxone. KillHOURS_CHARGE_HYSTERESIS=0unverändert. Alle Anlagen/Keys.
- Hours Grid-off Speicherschonen Evidence: Display-Strip verlangt echte Hold-Evidence (
hold_hours/hold_hours_local/status=hold) — stalehold_hours_nallein erfindet keine Speicherschonen-Uhren. Portal Explain: Live-Telemcharge_now=0auch bei Cold-Start-Pause. Sticky?api_key_id=synct Session nur bei ACL+aktivem Key. Spec HOURS §14.5b + ANLAGENPROFIL. Alle Anlagen/Keys.
2026-09-15
- Hours Cold-Start / Warm-up Pause: Bis
load_profile_ready(Meter-Typical ≥1 voller Tag, Client-Last oderallow_flat_default) publisht Decide OK mit leeren Charges/Holds,charge_now=0, Latch false,charge_stop_soc_pct: null(Snap+Webhook explizit), O12 Max/at_min(+ EV-Flex), synthetischemweek_statuswhy_code=cold_start. Pause bei Meter-Warming (Profil-Stempel/PlantLoadSample) oder Annual-only <72 h (fehlende Aktivierungs-Stempel / ApiKey lookup fail → fail-closed Pause; Meter-Count-DB-Fehler inventiert kein Warming). Warm-up-Exit löscht sticky Snap-pause_reason(Explainempty_cold_startnur bei aktiver Pause).load_covered_by_soc_pv=false+ Outlook/empty_reason=cold_start— Wochenblick D0 Warm-up, nie Gedeckt; Explain Chip/Headlinechip_cold_start/headline_cold_start(nichtchip_none). Pause ∩ Grid-off → Pause gewinnt nur solangehours_control_paused(Top-Level/Basis; stickynotesallein reichen nicht): Display-Strip setztcharge_kind=none, leert Holds und schreibtweek_statuswhy/empty_hint/groups aufcold_start(niegrid_off/Hold/Gedeckt). Pause mit Netzladung noch an: gleiche Display-Mute ohnegrid_off(UI-Format + Outlook Snapshot-First/Live-Hydrate setzenhours_needed*/energy_charge_kwh/next_charge_*auf 0; Live-Telemcharge_now=0). Nur Grid-off: half-healedstatus=chargemit Hold-Evidence → Speicherschonen (hold), nicht Autark. Tombstone-Webhook setzthours_control_paused=false. KillHOURS_COLD_START_PAUSE=0(Default on). Webhook-Feldhours_control_paused. Portal/Sparvo Warm-up-Banner + Explainempty_cold_start. Spec HOURS §14.5b. Alle Anlagen/Keys.
- Hours Max. Netzladung Cap (
hours_demand_v1.32): Profil-Feldmax_grid_charge_kw(Default 8,NULL→8 ohne Backfill) als harter Deckel:available_kw = min(WR, Anschluss×0,80−Grundlast, Cap). O11/MUST = available; Darf und Weak-PVP_econ≤ Cap (Cap 0 → 0, kein inventiertes C×Kapazität). Cap/Headroom 0 bei ungedeckter Nacht → UIcharge_empty_reason=no_charge_power/ Wochenblick „Keine Ladeleistung“ (nie falsches „Gedeckt“). Portal/Sparvo/Guest-Slider + Anlagenprognose Rules-Bar; Material-Key inkl.charge_power_kw. Vollform blank→NULL (Engine 8); Teilformulare ohne Cap-Feld lassen DB-Wert unverändert. Spec ANLAGENPROFIL/HOURS + Wiki Hours/Loxone/Webhooks. Alle Anlagen/Keys.
- Netzladung-Aus deep-audit: Decide-OK ohne persistierten Hours-Snap flasht
error_stale(nie still ok). Outlook-Hydrate publisht bei Grid-off + uncleared Snap (prefix_*/Today-Slots/plan_hour_rolescharge/energy_charge_kwh/nestedday_planmitgeprüft;resolved_clearausresult.hours_needed) statt silent Persist. Snapshot-first bauthours_engine.week_statusaus dem Display-Strip (_strip_stale_grid_charge_narration) — Parität zu Explain. Snapshot-first + DA-Replan erzwingen Clear bei Profil-aus + noch geladenem Snap (grid_off_uncleared_snap/ fail-closedgrid_off_clear_check_failed). Nicht-ok DA unter Grid-off + charged Snap → neuer Tombstone + ein Webhook. Live-Telem/hours_decision_ui_payloadundui_payload_from_resolvederzwingencharge_now=0/ leere Demand-Narration (inkl. charge roles/week_status/hours_needed_days/next_charge_*/projected_soc_pct_*_with_grid) bei Profil-aus; Display-Strip heilt auch half-healed Tage (status=charge/charge_hold/charge_kwhtrotzwhy=grid_off; Hold-Evidence →status=hold) aufstatus=autark/charge_kwh=0, bautgroupsneu und verwirft staleteaser/lines(kein Laden-Teaser nach localize); Clear-Gate prüft week_status-Charge-Residue; Outlook reinjectiert Mit-Netz SoC nicht unter Grid-off/Warm-up;empty_reasonpriorisiertgrid_off(Warm-up davor).
- Netzladung-Aus → EMS Demand/LoadNow: Server nullt Plan/
charge_nowsofort; Portal/Sparvo flashen wennplant.plan_updatedfehlt (webhook_not_configured/webhook_failed). Telemetry-Partialgrid_charge_allowed=0echoedcharge_now/prefix_hours_needed_today/hours_needed*= 0. EMS ohne Webhook: nächster Hours-Decide. Alle Anlagen/Keys.
- Portal Community-only (vorübergehend): Bezahlte Self-Service-Preise/Checkout ausgeblendet (
PORTAL_HIDE_PAID_PLANS). Community bleibt sichtbar; Professional/OEM in Auth/_index als auf Anfrage (ohne €)./preise→ Kontakt. Partner-Upsell Titel/Lead Soft-Copy ohne Self-Service-€. API-Vertrag unverändert.
2026-09-14
- Hours Explain Why-Details deep-audit #5 clean: Unbekannte Timeline-Kinds nicht mehr zu Charge gezwungen (Later/Body omit); toter Key
softcap_boundweg; CSShx30. Spec §6.8.10. Alle Anlagen/Keys. PicoC unverändert.
- Hours Explain Why-Details deep-audit #4 clean:
floor_prefillnutzt Start-SoC; Soft-Cap-Hint ohne Doppel-Later; Softcap-Move vor Hint; Specno_legal_later. Spec §6.8.10. Alle Anlagen/Keys. PicoC unverändert.
- Hours Explain Why-Details Phase-2 Lite (audit polish): Why-Hints ohne Soft-Cap-Jargon (
details_hint_*); FAQ-Typo; CSS-Tokens auf.hours-why; Pinhx29. Spec §6.8.10. Alle Anlagen/Keys. PicoC unverändert.
- Hours Explain Why-Details Phase-2 Lite: UI Hero/Rollenfarben/FAQ; Segment-
later_code(Precedence + Dedupe); Always-on-Later weg; Speicherschonen/η-Copy; CSShx28. Spec §6.8.10. Alle Anlagen/Keys. PicoC unverändert.
2026-09-13
- Hours Explain Why-Details deep-audit #3 clean: Hold-Cap≈
HOLD_KW→cheap_hold(weak_legacy-Parität Snapshot/O12; kein falsches Last-Anteil-Label); Spec §6.8.10. Alle Anlagen/Keys. PicoC unverändert.
- Hours Explain Why-Details deep-audit #2 clean: Details-Link nach Shell-Hydrate (
data-why-detailsarm=Kill+Href, Sichtbarkeit=available); Stopp-SoC nur Prefix-Stamp (kein Global-Fallback); Hold-Nuance aushold_kw→hold_reason_for_cap; Clienthx54. Spec §6.8.10. Alle Anlagen/Keys. PicoC unverändert.
- Hours Explain Why-Details deep-audit clean: Hint-Parität Explain (adaptive-off + EV O12); Kill fail-closed im Partial; Portal Runtime-Tests Guest/Kill/Mitbenutzer/Owner; Spec §6.8.12
HOURS_WHY_DETAILS. Alle Anlagen/Keys. PicoC unverändert.
- Hours Explain Why-Details (Phase 1) audit-complete: Sparvo Login-
next=/plant/hours-whyWhitelist + SSO-Pfad; Route-Tests Guest/Mitbenutzer/Owner/Kill + snapshot-only (keinresolve_hours_demand); i18n DE=EN Parität. Spec §6.8.10. Alle Anlagen/Keys. PicoC unverändert.
- Hours Explain Why-Details (Phase 1): Shared Auth-Seite Sparvo
/plant/hours-why· Portal/plant-outlook/hours-whynarrativ aus Snapshot (use_live_resolve=False); Sibling-Link „Details“ neben Week-Teaser; Mitbenutzer wie Explain; KillHOURS_WHY_DETAILS(Default on); Clienthx53/hx27. Spec §6.8.10. Alle Anlagen/Keys. PicoC unverändert.
- Hours Explain deep-audit #4 clean: Jinja fail-closed
discharge_power_kwvia.get; SSRuntil_pv_energy_label; Wiki Pack→Speicher (+ PV-Tagespack SoT); Client-Pinhx52. Spec §6.8.10. Alle Anlagen/Keys. PicoC unverändert.
- Hours Explain deep-audit #3 clean: Wiki EN Rollen
PV + storage(statt PV+pack); DE Pack-Laden→Speicherladen; SSR↔JSshow_restBars-Fallback; i18n-Blob Dedupe; Spec §6.8.10 Hydrate-Note. Portal-Pinhx51; SWhz6/v28. Alle Anlagen/Keys. PicoC unverändert. - Hours Explain deep-audit #2 clean: SSR↔JS Hydrate-Parität (Ops vor Stopp-SOC;
until_pv_energy_kwh+today_autarkfür until-none); EN Battery conserve in week_status-Engine + Chart-JS-Fallbacks + Tip; Wiki Pack-Reserve→Speicherreserve; Sparvo Base-Pinhx50, SW-Pinshz6/v28. Spec §6.8.10. Alle Anlagen/Keys. PicoC unverändert. - Hours Explain deep-audit clean: SSR
_today_cover/_rest_daysgesetzt (Folgetage-/Chip-SSR); EN Hold-Copy Pack conserve→Battery conserve; Fold-Titel/Tip an „Bis morgen früh · Folgetage“; Wiki EN week_status; Tests Fold-Edges. Spec §6.8.10. Alle Anlagen/Keys. PicoC unverändert. - Hours Explain UI: zwei Folds: Netzladung und „Bis morgen früh · Folgetage“ getrennt aufklappbar (Shared Partial Portal+Sparvo; beide default zu). Spec §6.8.10 + Wiki. Alle Anlagen/Keys. PicoC unverändert.
- Hours Explain/API heal (audit-clean): Decide top-level Thin-Echo (
lookback_placed_kwh/lookback_thin_*/lookback_placed_effective_kwh= Σlookback=True);plan_why_chain—econ_darf_closednur ¬Autark∧¬Weak,dual_contractnur D0=0∧später>0, NB Soft-Cap Probe →neighborhood_softcap_dest_skip; UI Pack→Speicher / Speicherreserve (DE) · battery reserve (EN); Sparvo pins späterhx49/hx26. Spec §6.8.10/§14.6 + Wiki. Alle Anlagen/Keys. PicoC unverändert. - Hours Neighborhood Rebalance default ON (User-Go Dual-Gate):
HOURS_NEIGHBORHOOD_REBALANCEDefault on (Kill=0). Decide-only Vorwärts-Move Radius 18 h (Clamp 4…24); Soft-Cap Stamp-Probe + Peel→Revert; orthogonal zu Econ-PP/Thin-Defer. Spec §6.8.18/§14.6 + Wiki. Alle Anlagen/Keys. PicoC unverändert. Familie-B follow-up. - Hours Explain Engine Pack (WP1+WP3): UI
plan_why_chain(Autark/¬Darf/Cap-Skip/PP/Thin/Dual-Contract Chips DE+EN); Econ-PP Soft-Cap Stamp-Probe vor Dest-Commit (softcap_dest_skip, Decide+Familie B); Neighborhood Modul später Default ON (siehe Eintrag oben); Lookback Early-Exit PARK. Soft-Cap unverändert. Spec §6.8.10/§6.8.15/§6.8.18 + Wiki. Alle Anlagen/Keys. PicoC unverändert. - Hours Portal Overlay Fuß X+Y+Z: Session-Hide setzt
grid_draw_kwh= Hold+Charge+Direct (kein proportionaler Charge-Scale); Spot-€ skaliert nur Charge-Anteil;week_grid_draw_kwhsync. Spec §6.7 + Tests. Alle Anlagen/Keys. - Hours Portal Overlay date-aware chip strip: Session-Hide strippt ≤Now nur date-aware (ISO/
DD.MM.); Folgetag-Chips mit gleicher Uhrzeit bleiben; future ISO-Start gewinnt gegen bareclock. Fußgrid_draw_kwhskaliert mit Truncate. Spec §6.7 + Tests. Alle Anlagen/Keys. - ExtractHoursDemand v1.23 (O9 stop-headroom) + Overlay Hide ohne Cap: O9-Headroom bis Session-Stopp/O4 (nicht target_soc); Latch → rest=0. Portal Session-Hide auch bei capacity=0; Fuß
charge_kwhnach Timeline-Truncate sync; Chips ≤Now drop. Spec §6.7 + Wiki/Samples. Alle Anlagen/Keys. - Hours Portal Overlay merged-timeline truncate: Session-Hide truncates gemergte
plan_timeline-Charge-Segmente wenn Now ∈ \[start…end_start\] (inkl. Mid-Span), nicht nur Exact-Label — Portal Explain = EMS LoadNow=0. Spec §6.7 + Tests. Alle Anlagen/Keys. - ExtractHoursDemand v1.22 docs/llms sync + dead-var hygiene: llms.txt / docs-llms / overview-Tests / README / Sample-Stub / retired ParsePlantHours auf v1.22; totes
lastInChargeSlotentfernt (kein Verhaltenswechsel). Wiki/Samples DE+EN. Alle Anlagen/Keys. - ExtractHoursDemand v1.22 (remaining-energy baseline) + Portal Overlay Latch-Hide: API
prefix_energy= Rest-SoT — Extract re-baselined SoC bei jedem Lauf während Laden;energy>0clearstchargeDoneTodayvor Baseline (Fix: Doppel-Abzug vs Session-Start → Demand/O3/O9=0 trotzcharge_now=1). Portal Overlay hide beicharge_latchedoder live≥stop−0,5 und strippt Now-Charge inplan_timeline. Wiki/Samples DE+EN. Alle Anlagen/Keys. - ExtractHoursDemand v1.21 (charge_now SoT): Parst
charge_latched; bei APIcharge_now=1lokales Session-Latch clearen (Demand/O3/LoadNow folgen offenem Decide). Sonst beicharge_latched=truelokal latchen. Fix: weites H-Band ließ Demand/LoadNow=0 während Portal/APIcharge_now=1zeigten. Wiki/Samples DE+EN. Alle Anlagen/Keys. - ExtractHoursDemand v1.20 (O4 Sync):
sessionStopSocfolgt bei jedem Extract dem API-charge_stop_soc_pct; Anhebung mitten in der Session aktualisiert O4 und rüstet den Latch neu, solange Live-SoC unter dem neuen Stopp liegt (Fix Drift Loxone-Ziel 74 % vs Portal-Stopp 77 %). Kein live+energy-Invent. Wiki/Samples DE+EN. Alle Anlagen/Keys. - Hours Soft-Cap Cover-Merge-Floor (deep-audit #3): Post-apply Soft-Cap peelt nur Weak-Rest;
cover_merged_kwh= Floor (kein Strip von gemergtem Darf-Cover). Econ-PP Exception rollt Notes mit zurück. Spec §6.8.15/§14.6 + Wiki. Alle Anlagen/Keys. - Hours Econ-Ping-Pong deep-audit #2 (Default ON): Familie-B Forced-PP honoriert intended per-hour Cap (
weak_hour_cap) auch bei role-aware Soft-Cap (kein chronologisches Day-Budget-Dump in ersten Port). Spec Status-LIVE + §6.8.15. Alle Anlagen/Keys. - Hours Econ-Ping-Pong deep-audit (Default ON): Familie B — prior Near \(H_{gate}\) → Occupied ban (Dest∉); Forced-PP Soft-Cap nur Weak/PP-Stunden (Cover/Prep role-aware; kein false Σ-Revert); Flag Whitespace/empty → ON. Spec §6.8.15/§14.6 + Wiki. Alle Anlagen/Keys.
- Hours Econ-Ping-Pong Default ON (User-Go):
HOURS_WEAK_EARLY_PLACEDefault on (Kill=0). Decide + Familie B live. Spec §6.8.15/§14.6 + Wiki. Alle Anlagen/Keys. - Hours Econ-Ping-Pong Familie-B Soft-Cap-Peel live (shipped Flag-OFF; superseded Default ON): Forced-PP-Apply mit Soft-Cap-Ceiling (nie Cap);
week_charge= actual applied; Peel=gained-dest∨Σ → Revert; Survival-Cover Occupied-Ban. Spec §6.8.15. Alle Anlagen/Keys. - Hours Econ-Ping-Pong Audit-Clean (shipped Flag-OFF; superseded Default ON): Decide Exception→pre-PP Restore; Post-PP Cap0+Hold-Strip; kein Cap-Fallback; Familie-B Soft-Cap-Σ-Revert + per-Source-Gate + Weak-Ziel-Ceiling; Wiki Hours DE+EN Econ-Absatz. Spec §14.6. Alle Anlagen/Keys.
- Hours Econ-Ping-Pong Audit-Fix (shipped Flag-OFF; superseded Default ON): Familie-B Lookback nach PP-forced Re-Sim; Near sticky via Occupied-Ban (nicht global
gate_hi); Prep-Occupied-Ban + Hold-aware SoC; Decide Soft-Cap-Ceiling (nie Cap); Soft-Cap-Peel → Revert; Exception-Logging. Spec §6.8.15/§14.6. Alle Anlagen/Keys. - Hours SoT Stopp-SOC Display + Econ-Ping-Pong (shipped Flag-OFF; superseded Default ON): Prefix-Charge-Timeline-Ende (
soc_pct) = publiziertercharge_stop_soc_pct/ O4 (ein Zielwert; Hold/pv_pack half_up unverändert). Sharedapply_weak_econ_ping_pong(HOURS_WEAK_EARLY_PLACE): nötige Weak-kWh früher legen (move≠add, η/Soft-Cap/Gate/Cap-Skip); Cover-Apply Merge statt Strip; Decide+Familie B. Spec §6.7/§6.8.15/§14.6 + Wiki. Alle Anlagen/Keys. - Hours Session-Stopp SoT / O4-Parität (
hours_demand_v1.31, Extract v1.19): Decide schreibt eine Stopp-Zahl — Snapshot + Material-Webhook (charge_stop_soc_pct) + Portal/Sparvo Timeline-Stamp + Loxone O4. Resolve refreshedsoc_projected_*nach Picker-Mutationen; kein live+energy-Invent (fail-closedNone/ Latch sticky); O4 =floor(prefix-end);plan_rolesCharge =roll_soc_hour; Explainhx46. Spec §6.7/§8 + Wiki DE+EN. Alle Anlagen/Keys. - Hours+Quota consolidate load-first path + clip target + orphan finalize: Consolidate SOC-Trough/Emit load-first (Cover-Parität); Clip
upper=min(cap,target); Lookback-Thin Stress/s0 mittarget_soc; Middleware finalisiert reserved Exception alsaccess_denied; Finalize hältduplicategegen Softcap-Overwrite. Spec §6.5 + MONITORING + Changelog. Alle Anlagen/Keys.
2026-09-12
- Hours+Quota load-first shared headroom + softcap 4xx demote: Shared
grid_headroom_after_natural_hour_kwh(Lookback/Thin/Defer/Spill/Interim); Interime_gapohne Decide-SoC-Clip; Lookback Delivery-Capmin(cap,target); Weak R2; Consolidate Shortfall = Caps; reserved 4xx demotet auch Softcap; Basic ohne IP → 429. Spec/Wiki/MONITORING. Alle Anlagen/Keys. - Hours consolidate load-first + PV-fill grid-gate + Weak inject finite: P1-v2 Consolidate Headroom load-first (
soc_nat, Plan-target, R2 auf vollem Port); PV-Fill Skip nurroom_grid ≤ min_head; Weak-Inject ohne NaN/±inf-Preis. Spec §6.5/R2/§6.8.15 + Wiki. Alle Anlagen/Keys. - Hours+Quota PV-fill η + burns Remaining heal: Cover PV-Fill-Lookahead liefert Grid-kWh (
pack/η); Darf Preis_Tag skippt non-finite;check_rate_limitspeichertburns; reserved demote (4xx und 200access_denied) stelltX-RateLimit-Remainingwieder her; Auth deferred-Pfadrstrip("/"). Spec/Wiki/MONITORING. Alle Anlagen/Keys. - Hours+Quota Thin ±inf + Cover η + duplicate-IP heal: Lookback-Thin/Thin-Cover-Defer Dest
math.isfinite(−inf nicht „günstig“); Cover-Headroom Grid(upper−soc)/η(Lookback/Spill-Parität); Slot-Emitter ohne Fake-0€/MWh; anonymous Duplicate-Coalesce nurapi_key_id IS NULL; reserved-4xx stelltX-RateLimit-Remainingwieder her. Spec/Wiki/MONITORING. Alle Anlagen/Keys. - Hours+Quota interim pack + IP anonymous heal: Interim-Picker Pack-Headroom inkl. geplanter Cover (
already·η, R2 auf vollem Port); finite Preise in Interim/Rebalance/Consolidate/Weak; Basic-IP-Zähler nurapi_key_id IS NULL; Responsequota_classfolgt Coalesce/Demote. Spec §6.8.5 + MONITORING + Wiki Spill-R2. Alle Anlagen/Keys. - Hours+Quota spill R2 + reserved-4xx/3xx heal: Soft-Cap-Spill Partial-Port auf vollen Inverter-Port (Cover/Lookback-Parität); Prep
_hour_price/prices_prepfinite; Middleware skippt unreserved 3xx und demotet reserved billable 4xx →access_denied. Spec §6.2b + MONITORING. Alle Anlagen/Keys. - Hours+Quota finite-price + duplicate finalize heal: Soft-Cap-Spill/Lookback/Thin/
_rank_indices/Resolve skippen NaN/±inf (0€/MWh gültig); Finalize behältduplicate(kein Re-Bill nach Coalesce);check_rate_limitsynctrequest.state.quota_class; Telemetrie semanticinvalid/incompletedemotet Softcap; Spec Force + DE Auth. Alle Anlagen/Keys. - Hours+Quota fail-closed deep-audit: Incomplete Hours echo
grid_charge_allowed=falsewenn Profil/Feld unbekannt; Survival/Force-Near/_try_takeskippen non-finite Preise (NaN/±inf) und behandeln0,0€/MWh als gültig; Windows POST parse vor Reserve; Telemetrie parse vor Softcap-Reserve; PV/Weather Key vor Reserve; Middleware Deferred-Pfad mit Trailing-Slash; Finalize kannquota_classdemoten; Softcap-X-RateLimit-Remainingzählt Reserve. Spec/Wiki Auth EN + MONITORING. Alle Anlagen/Keys. - Portal Auto-Geocode deep-audit parity: Locality-Keep behält
nominatim_reverse/nominatimwenn Form≈DB (Portal postet immer Lat/Lon); Guest Forward-Fail cleart Coords + speichert Adresse (Owner-Parität). Spec ANLAGENPROFIL. API-JSON unverändert. Alle Anlagen/Keys. - Hours Soft-Cap-Abandon-Spill pack-headroom (
hours_demand_v1.31): Spill-Take Pack-Roomupper−soc_i−already·η(Lookback/Defer-Parität; kein Cover-Plan-Decken-Overshoot beim Stacken). Spec §6.2b + Wiki. Alle Anlagen/Keys. - Portal Auto-Geocode on address save: Speichern (Portal + Sparvo Owner/Guest) prüft/setzt Lat/Lon aus der Adresse (Nominatim); Drift >2 km mit Locality-Gate; Kill-Switch
PLANT_AUTO_GEOCODE_ON_SAVE=0. Wiki Weather/PV Standort-Hinweis. API-JSON unverändert. Alle Anlagen/Keys. - Quota deferred unreserved 4xx + Hours invalid grid_off echo: Middleware skippt deferred Paths (Hours/Windows/PV/Weather/…) ohne Reserve und ohne
quota_classbei HTTP ≥400 (kein Default-decision-Bill); Windows POST gate vor Body-Parse;invalid_input/EMS-Prefix fail-closedgrid_charge_allowed=falsewenn unbekannt; incomplete echo bleibt. Wiki Telemetry/Auth/Rate-Limits + MONITORING. Alle Anlagen/Keys. - Quota Windows defer + duplicate-at-ceiling + Force-Near price guard:
/v1/decision/windowsdeferred (Access/access_deniedvor Reserve, Hours-Parität); Loxone-Twin-GET bei Fair-Use-Ceiling → freiesduplicatestatt 429; Force-Near Cover-Rank fail-closed beiNone/OOB-Preis; incomplete Hours-Basis echogrid_charge_allowed. Spec/Wiki Auth DE + MONITORING. Alle Anlagen/Keys. - Hours Lookback Place pack-headroom + η clamp (
hours_demand_v1.31): Place ziehtalready·ηvom Pack-Headroom ab (kein Overfill beim Stacken auf bestehende Dest-kWh; LThin/Defer-Parität); Lookback Place/Stress/size_e_bridge+ Decide-roundtrip_efficiency+ SOC-Slots nutzen sharedclamp_charge_eta. Spec §6.2b + Wiki. Alle Anlagen/Keys. - Hours Carry residual-aware + η-parity (
hours_demand_v1.31): Thin-Cover-Defer / Thin-Now Carry nutztresidual_carry_step(Netto-Last > Room über Floor → refuse; incomplete Horizon fail-closed) statt vacuous Floor-Clamp; sharedclamp_charge_etafür Lookback-Thin / Defer-Headroom /roll_soc_hour. Spec §6.7 + Wiki. Alle Anlagen/Keys. - Unified Billable-Pool + Community 200: Produktive Calls (Forecast, Hours, Decision, Windows/Flex, PV, Weather) teilen einen Kontingent-Pool je Stufe — Community 200/Tag (Vienna), Professional 600/h Account, OEM 3000/h. Telemetrie + Duplicate bleiben ausgenommen (Telemetrie-Softcap 2000/10000). Softcaps PV/Weather 48/288 nur noch per Kill-Switch
QUOTA_UNIFIED_BILLABLE=0. Portal Dashboard Breakdown (Telemetrie = Vienna-Tag)./v1/statusund HTTP 429 ohne Reserve zählen nicht. Backlog (nicht in diesem Ship): Device-Schedules kann parallel zu Windows billable zählen. Docs/Wiki/llms DE+EN. - Hours Lookback-Thin + Thin-Cover-Defer (
hours_demand_v1.31): Lookback-Thin — nach Lookback Drop-first/Relocate nur lookback-eligible kWh (auch unterreserve_breach; Sibling frozen/movable getrennt; Merge-lookback_added_kwhfriert absorbierte Cover-kWh und behältsurvivalgegen Defer-Undo; Pack-Headroom+Port) bei Stress-Delta-Konjunktion (sum≤∧earliest≥); eigenes Commit; Residual Note undlookback_reason_codesnur bei \(S≠∅\); Felderlookback_thin_*; KillHOURS_LOOKBACK_THIN=0. Thin-Cover-Defer — danach Relocate-only für non-spill Cover/Weak auf günstigere Stunde in derselben Near- bzw. Weak-[lo,hi]-Kohorte (residual-aware Carry + Port + Pack-Headroommin(cap[,target])/η+ Partial-Port inkl. R2/_partial_port_take_ok); Dest meidet Spill ∪ Cap-Skip; Freeze Spill/Lookback/Survival/MUST/reserve_breach/Latch; ein Commit mit Thin-Now; Soft-Cap nicht reopen; KillHOURS_THIN_COVER_DEFER=0. Spec §6.7 / §6.2b. Alle Anlagen/Keys.
2026-09-11
- sparvo.at Hybrid Marketing (IA CLEAN): Öffentliche Marketing-Site Hybrid
/·/ems·/services(+ Legal). Claim-Ampel Live / Mit Anbindung / Ausblick. App-Tour-Keys shared (hoursstatt Spar-Check). SEO Sitemap/hreflang/llms; Umami Website-ID16c2ee7f-…(consent-gated). Portal-Landing Hours-first unverändert — siehe Historie 2026-08-27. - Hours Lookback Spec 5b + slider bool-guard: Spec-Tabelle 5b Placeable
\\ Cap-Skip; Speicherregeln-Jinjasameasauch für min/target/cover (kein|float(True)=1). Engine weiterhours_demand_v1.29. Alle Anlagen/Keys. - Hours Latch H Jinja/form_num type-guard: Speicherregeln-Slider (
sameas true/false→ Default) + Sparvo-Standort-_form_num/build Prefill viacoerce_hysteresis_pp. Engine weiterhours_demand_v1.29. Alle Anlagen/Keys. - Hours Latch H form-prefill type-guard: Portal/Sparvo Speicherregeln-Prefill (
charge_hysteresis_pp_for_form, Guest-Form/_pct) nutztcoerce_hysteresis_pp— bool/Mock → Default, kein"1"zum Persistieren. Engine weiterhours_demand_v1.29. Alle Anlagen/Keys. - Hours Latch H webhook/guest type-guard:
plant.plan_updatedPayload + Material-Key und Sparvo-Guest-Profil nutzencoerce_hysteresis_pp(bool/Mock → omit/Default). Engine weiterhours_demand_v1.29. Alle Anlagen/Keys. - Hours Latch H surface type-guard: Tombstone-UI, Live-Telem, Snap-Write, EMS-Prefix und Decide-Request (
battery.charge_hysteresis_pp) nutzencoerce_hysteresis_pp/ bool-Reject — keinfloat(True)=1. Familie-B Cap-Skipblocked_indicessofort nach Mix. Engine weiterhours_demand_v1.29. Alle Anlagen/Keys. - Hours Latch H snap type-guard: Snap-Fallback/
tombstonefürcharge_stop_hysteresis_ppnutzt denselben Fail-closed Coerce wie Profil (int/float/str/Decimal; bool/Mock → Default/omit). Engine weiterhours_demand_v1.29. Alle Anlagen/Keys. - Hours OpenAPI/Samples/Version-notes sync (
hours_demand_v1.29): OpenAPI-Stub, Code-Sample-Guides DE+EN, Changelog-Versionshinweise, Docs-Konzept-Badge →v1.29. Alle Anlagen/Keys. - Hours PicoC/wiki engine-tag sync (
hours_demand_v1.29): Fetch/Extract.pico+ Code-Samples + Wiki-Extract-Header →v1.29. Alle Anlagen/Keys. - Hours live engine-tag sync (
hours_demand_v1.29): API-Tests/Docstring, llms.txt, Loxone PicoC/Wiki O12, Webhooks „live“-Tag →v1.29(Changelog-Historie unverändert). Alle Anlagen/Keys. - Hours Cap-Skip deep-audit CLEAN (
hours_demand_v1.29): Lookbackblocked_indices+ Latch-H Type-Guard (Decimalok, Mock/bool reject); Worklist/Wiki Feldtabelle. Alle Anlagen/Keys. - Hours Weak Cap-Skip Lookback block (
hours_demand_v1.29): Cap-Skip-Fenster in Lookbackblocked_indices(Decide + Familie B) — kein Soft-Cap-exempt Refill bei Folgetag-Stress; Spec §6.8.15 + Tests. Alle Anlagen/Keys. - Hours Latch H type-guard:
profile_charge_hysteresis_ppakzeptiert nur int/float/str/Decimal (nicht bool/Mock) — Tombstone bewahrt Snap-H. Alle Anlagen/Keys. - Hours Weak Cap-Skip wiki kill-switch wording: Surplus-Cap Kill (
HOURS_HOLD_CONTINUOUS_CAP) ≠ Cap-Skip Kill (HOURS_WEAK_PV_NEED_FULL_PV_CAP_SKIP); Cap-Skip ab v1.27 / Audit v1.28. Alle Anlagen/Keys. - Hours Weak Cap-Skip audit heal (
hours_demand_v1.28): DA-DP nach Cap-Skip no-op (Holds bleiben);eve_start=n_wfail-closed kein Skip; Spec §6.8.15 + Tests. Alle Anlagen/Keys. - Hours Weak-PV need_full Cap-Skip (
hours_demand_v1.27): Wenn PV-only (ohne Hold) bis Cap vor Abend reicht und kein Residual-Import →need_full=0, keine Weak-Netzladung; Hold bleibt; Noteweak_pv_need_full_pv_cap_skip(Decidebasis.notes+ Snapshotnotes). KillHOURS_WEAK_PV_NEED_FULL_PV_CAP_SKIP=0. Spec §6.8.15. Alle Anlagen/Keys. - PV meter day-cap UI heal: Wenn Ist bereits > 1,2× Modell-Tagesprognose (
day_cap_kwp_forecast/ abs), kein Scale — aber Sparvo/Portal/pv_kindbehalten Chart-Ist +meter_blend(wie Kill-Switch). Nur Mittel-Leistung > 1,2×kWp leert Chart. Spec §14.2.1. Alle Anlagen/Keys. - Hours Soft-Cap heal live default on (
hours_demand_v1.26):HOURS_DARF_SOFTCAP_S1,HOURS_LOOKBACK_LATE_BIAS,HOURS_SOFTCAP_ABANDON_SPILLdefault on (Standardpfad); Kill jeweils=0. Zielt auf unnötige frühe Netzladung / Soft-Cap-Near vor günstigerem S1. Alle Anlagen/Keys. - Hours Soft-Cap Darf-S1 + Lookback late-bias (
hours_demand_v1.25): FlagHOURS_DARF_SOFTCAP_S1(damals default off) — Darf Near-Budget=0 → S1 Soft-Cap-Cohort (shared Spill-Helper, Gate OR ohne Spill-Flag, kein S0-Fallback); FlagHOURS_LOOKBACK_LATE_BIAS(+…_EURDefault 5) — Pre-Stress late-bias im Preisband; Thin-Now dropptsoftcap_spill-Now nicht; Spec §6.2b/§6.8.3–4/§14.6. Alle Anlagen/Keys. (superseded: Defaults on ab v1.26) - Hours Soft-Cap v1.25 full-audit heal: Decide top-level Echo
softcap_abandon_spill_*/darf_softcap_s1*; Interim ¬breach Darf-S1 →darf_softcap_s1_skip_near; Spec §6.8.5 + Samples. Alle Anlagen/Keys. Flags weiter default off. - Hours Soft-Cap spill skip + Darf echo heal:
clippedvseuro_capgetrennt; Darf-S1 Echo auch aufno_grid/autark; DE Wiki Skip-Enum + §6.8.14. Alle Anlagen/Keys. - Hours Soft-Cap spill R2-continue heal: nach €-Shrink
best>0aber R2-Fail → weiter im Cohort (kein falscheseuro_cap-Stop); Spec §1 Placement-Order + DE Lookback peel-exempt; Gate-OR/late-bias/Snapshot-Tests. Alle Anlagen/Keys. - Hours Soft-Cap docs Flag/Darf-S1 parity: Spec Placement-Strings + Wiki DE/EN Teaser/Cover-Narrative
(Flag/Darf-S1)/ Gate OR. Kein Code-Change. Alle Anlagen/Keys. - PV Forecast Serve deep-audit #5 (clean): Soft-Gaps geschlossen — Sync-Short-Est-Test; Wiki
timezone= Pack/Serve-Taggrenzen. Keine weiteren Code-Bugs auf Estimate→Pack→Serve-Pfaden. Spec §6.7. Alle Anlagen/Keys. - PV Forecast Serve deep-audit #4: Decide/
build_pv_decide_packre-estimates volle Woche wennpv_estD0…D6 nicht deckt (kein Zero-Fill); Sync gleich; GET-Envelopetimezone= Serve/Pack-TZ (nicht Query-Override über Taggrenzen). Spec §6.7. Alle Anlagen/Keys. - PV Forecast Serve deep-audit #3: Live-Estimate immer 7×24 h vor Pack-Sync; Query
daystruncates nur Response-days/hours/totals(loxoneWoche bleibt). Verhindert Zero-Fill D3…D6 bei?days<7. Spec §6.7. Alle Anlagen/Keys. - PV Forecast Serve deep-audit #2: Age-ok nach Mitternacht: Horizon auf 7 pad, Stunden vor heute strippen, fehlendes Heute → synthetisches D0; SoC-Refresh baut
loxoneaus Align-View (Pack-daysbleiben FC). Spec §6.7. Alle Anlagen/Keys. - PV Forecast Serve deep-audit clean: Pack nicht fresh bei leeren
hours/ Kalender-Roll (days[0]≠ heute); Serve alignt D0 per Kalenderdatum (nicht Index[0]);loxone.d0_kwh= heutige Zeile. Spec §6.7. Alle Anlagen/Keys. - PV Forecast Serve D0 = Ist+Prognose (all keys): Pack in DB bleibt Modell-FC (
pv_hashFC).GET /v1/plant/pv-forecast/loxone.d0_kwhund Portal/Sparvo wenden denselben Calendar-Meter-Blend an (pv_kind/pv_meter_today_kwhadditiv). Meter-Tick feuert keinplant.plan_updated. KillHOURS_PV_METER_REFINE=0. Spec §6.7 / §14.2.1. Alle Anlagen/Keys. - Plant Outlook PV chart seam audit-clean: Wiki Kill-Switch-Wording = Spec (UI Ist + Decide unskaliert); Portal
now_hourNaN-Guard; Outlook-Kommentar Seam Δ > 0. Alle Anlagen/Keys. - Plant Outlook / Sparvo PV chart seam (all keys): Laufende Stunde zeigt Prognose bis Meter‑Δ > 0;
pv_kind=meter_blendauch bei nur laufender Stunde; Balken Grün = PV (Basis), Softgrün = Prognose mit Meter; Legende nicht mehr „Balken = PV“. Spec §14.2.1 / Wiki Telemetry. Alle Anlagen/Keys. - Hours/Telemetry audit-clean #4 (P2 polish): Webhook-Sample
charge_stop_hysteresis_ppDefault 2.0; Sparvostorage_rules_linkDE+EN nennt Ladehysterese. Alle Anlagen/Keys. - Hours/Telemetry audit-clean #3: Loxone-Hours Wiki Latch-H = Profil-
charge_hysteresis_pp(nicht Netz-Puffer); joint Partialinvalid_inputträgtupdated.*für gelandete Sibling-Writes; Latch-Modul ohne Cover-Default-Reexport. Alle Anlagen/Keys. - Plant Telemetry joint Partial heal: Import-Meter-Fehler blockiert Sibling-
pv_production_kwh_totalnicht mehr (beide unabhängig ingestiert; invalid_input trägt beide Results). Guest plant-settings Payload trägtcharge_hysteresis_pp. Wiki Ceiling-Liste + historischer Latch-Changelog superseded-Hinweis. Alle Anlagen/Keys. - Hours Phase-1 Split + Ziel-Decke: Profil-
charge_hysteresis_pp(Default 2, Clamp 1…20) getrennt voncover_buffer_pct; Latch/EMScharge_stop_hysteresis_ppaus Profil-H; Material-Key inkl. H; Cover/Bridge/Survival/Lookahead/Lookback/Consolidate/Interim/Spill/Rebalance → Plan-Ceilingmin(cap,target); Weak/chrono Cap bleiben. KillHOURS_CHARGE_HYSTERESIS=0= Latch only. Alle Anlagen/Keys. - Plant Telemetry PV-Ertragszähler (Phase-2): Partial-POST
meter.pv_production_kwh_total→plant_pv_samples+ Profilmeter_pv_*; Response siblingpv_meter/updated.pv_meter(Quota T); D0-Refine Ist-Stunden + Rest × Scale 0,5…1,5 gegen Kalendertag-Prognose (HOURS_PV_METER_REFINE, ε≥1 kWh, N≥2); kein Decide auf PV-Δ; Portalpv-meter-reset; Loxone VO 1dFetchPlantTelemetryPvMeter(1c bleibt GridAllow). Spec §14.2.1. Alle Anlagen/Keys.
2026-09-10
- Hours Latch Docs deep-audit #5 (
hours_demand_v1.24): Anlagenprofil Tombstone H7 Latch-Carry + Material-Key Latch; Loxone-Hours Wiki O12-Zelle DE+EN anactive_charge/v1.24. Alle Anlagen/Keys. - Hours Anlagenprofil O12-Prosa Sync (
hours_demand_v1.24): Adaptive-Entladung-Absatz an §6.8.7/active_charge(kein „Während des Ladens volle Cap“ mehr). Alle Anlagen/Keys. - Hours Latch/active_charge Docs Sync (
hours_demand_v1.24): Wiki Webhooks DE+EN, Anlagenprofil, FORECAST-WEBHOOK, Portal-i18n Adaptive-Hint an §6.8.7/active_chargeangeglichen. Alle Anlagen/Keys. - Hours Spec §6.8.7 Latch/active_charge Sync (
hours_demand_v1.24): Kanonische Hold-Leistung + PicoC-Absatz an §6.7/active_chargeangeglichen (volle Cap nur bei aktiver Netzladung; Latch → Hold-Cap). Alle Anlagen/Keys. - Hours O12 Hold-Cap deep-audit #4 (
hours_demand_v1.24): Hold-Gate nutztactive_charge(Latch/Grid-aus → Hold-Cap trotz stalecharge_now=1); Tombstone-Wiki H7 Latch-Carry; O12-Wiki-Caveat. Alle Anlagen/Keys. - Hours Latch/O12/Tombstone deep-audit #3 (
hours_demand_v1.24): O12 Latch-Guard fail-closed (charge_nowumgeht nicht mehrblock_recharge_vollcap); Tombstone-Webhook + UI tragen sticky Latch/Stopp (H7-Parity); Decide-Disclaimer + Spec §6.7 Materialität. Alle Anlagen/Keys. - Hours Latch/Thin-Now deep-audit #2 (
hours_demand_v1.24): Thin-Now Hold-Rebuild fail-closed (Locals + prior Hold restore); MUST/reserve_breachCover nie droppen; sticky Stopp aus prior Snap publish; §14.8/Wiki-Auslöser inkl. Latch. Alle Anlagen/Keys. - Hours Latch/Thin-Now deep-audit heal (
hours_demand_v1.24): Sticky Latch fail-closedincomplete_hold(prior latched + fehlender Stopp/SoC); Latch-Stopp aus prior Snap; Thin-Now nurslot_role=cover+ Hold-Rebuild-Fail abort; Material-Key inkl.charge_latched; Wiki/Spec §6.7/§14.8/Webhooks. Alle Anlagen/Keys. - Hours Latch Docs/Samples-Heal (
hours_demand_v1.24): Wiki plant-telemetry DE+EN stickycharge_latched/ Stopp−H (Decide-SoT); Code-Samples aller Sprachen Latch-Felder; AGENTS PicoC Extract v1.18 / Fetch v1.17. Alle Anlagen/Keys.
- Loxone FetchPlantHours v1.17 (Community-120-Cadence): Decide-Trigger = stündlich :00 (+ :05) · SOC-5%-Stufen beide Richtungen · Latch/Stop Extract O5→I5+I6 · Manual I5/I6. Smart-15-Decide entfernt (I7 :15/:30/:45 nur Telemetry; :00 weiter Telem+Decide). Softcap-Spec Klasse T an Code angeglichen (Community 2000/Tag · Pro 10000/Tag). Extract bleibt v1.18. Alle Anlagen/Keys. Miniserver: Fetch v1.17 neu einfügen.
- Hours Latch/Thin-Now Audit-clean (
hours_demand_v1.24): Live-UI/ui_payload_from_resolved+ Live-telem tragen Latch-Felder; Thin-Now commit nur nach Sync/Recount (+ Hold-Rebuild); Webhook-Payload additivcharge_latched/charge_stop_hysteresis_pp; O12 Latch unterdrückt nurrecharge_planned-Vollcap (Haus-Adaptive bleibt); Wiki PicoC-Stand Extract v1.18. Alle Anlagen/Keys. - Hours SOC-Stopp-Latch / Thin-Now / Extract v1.18 (
hours_demand_v1.24): Sticky Latch in Decide-Publish (Overlay display-only); Hysterese Stopp−H damals auscover_buffer_pct(1–20 pp, leer→2) — superseded durch Phase-1 Split → Profil-charge_hysteresis_pp; Thin-Now vorplan_roles; O12 Short-Circuit bei Latch; Material-Key +charge_now/charge_stop_soc_pct; Snap additivcharge_latched/charge_stop_hysteresis_pp. Extract v1.18 O5 PulseSessionStop → Fetch I5+I6 (kein Mid-Poll-Fetch); Fetch damals v1.16, Cadence später v1.17. KillHOURS_CHARGE_HYSTERESIS/HOURS_THIN_NOWDefault on. Alle Anlagen/Keys. - Hours Soft-Cap-Abandon-Spill deep-audit #2 (
hours_demand_v1.23, Flag default off): Placement-Freeze (kein Prep/Opp/Far-Top-up auf Spill); Need-Cap Pre-Spill-Baseline; Peak-Hold display-tz;no_gridpf↔basis Skip-Parity; Tests. Alle Anlagen/Keys. - Hours Soft-Cap-Abandon-Spill deep-audit (
hours_demand_v1.23, Flag default off): Spill-Indices rebalance-/consolidate-/lookback-fix; Weak-Apply behält Spill/Lookback; Post-Clip Need-Cap-Sync; Resolve-Echo fail-closed; Wiki Sync; Tests. Alle Anlagen/Keys. - Hours Soft-Cap-Abandon-Spill (B5b, Flag default off,
hours_demand_v1.23): Nach Near Soft-Cap-Abandon (Recovery\|Darf) optional Rest ≤ abandoned in S1-Cohort (Preis zuerst, Soft-Cap@S1, Dawn-Cap, €-Cap Peak-Hold-Proxy ε=0). KillHOURS_SOFTCAP_ABANDON_SPILL=0→ Felder absent / exakt v1.23. Additivesoftcap_abandon_spill_*+charge_hours[].softcap_spill. Kein Soft-Cap-Slack↑ / Far→100 %. Spec §6.2b Freeze-Ausnahme. Alle Anlagen/Keys.
2026-09-09
- Hours Explain SOC Klarheit Audit-clean (UX, Sparvo
hx45): SSR nutzt Sharedformat_plan_soc_token; JS End-only ohne DE-Hardcode-Fallback; Prefix DE/EN; Parity-Tests. Alle Anlagen/Keys. - Hours Explain SOC Klarheit (UX, Sparvo
hx44): Timeline-{soc_pct}zeigt Start→Periodenende (~a %→~b %) bzw. nur Ende /—; additiv Segment-soc_start_pct(soc_pctbleibt Ende). Live-Gauge ≠ Timeline-SOC; Overlay schreibt Segmente nicht um. Non-breaking. Alle Anlagen/Keys. - Hours Lookback-Rebalance port/role fix (
hours_demand_v1.23): Place respektiertport−already(Cover-Parität); Merge erzwingtslot_role=coverbei Lookback; Decide skippt bei Ladeleistung 0 wieapply_*; Wiki-Duplikat entfernt +HOURS_LOOKBACK_PASSESim Feldtext. Alle Anlagen/Keys. - Hours Lookback-Rebalance deep-audit (
hours_demand_v1.23): Exception-Echo-Parität; Residual-Note = finales Stress-Set; Soft-Cap-Trim-Test fürlookback=True; Samples Python/JS/TS/Loxone; Familie-B Dawn/Hold-Approx dokumentiert; Env-Tabelle + Slot-Feld Wiki. Alle Anlagen/Keys. - Hours Lookback-Rebalance Audit-clean (
hours_demand_v1.23): Decide Residual nach letztem Place/Hold-Rebuild (nicht Pre-Place); Flag-on-Skip echolookback_applied=false+lookback_skip; Familie-B Exceptions geloggt; toter Place-Roll entfernt. Wiki/Spec Sync. Alle Anlagen/Keys. - Hours Lookback-Rebalance (
hours_demand_v1.23): Nach Hold Survival-Ping-Pong — Stress (Floor ∧ Residuum) → günstigste Pre-Stress-Slots (Cover-Ranker + R2) → Full-Hold-Rebuild; Soft-Cap peeltlookback=Truenicht; Passes Default 4 (HOURS_LOOKBACK_PASSES); Kill-SwitchHOURS_LOOKBACK_REBALANCE=0. Additive Felderlookback_applied/lookback_passes/lookback_stress_remaining_kwh+reason_codes. Familie B shared helpers. Spec §6.2b/§14.6. Alle Anlagen/Keys. - Hours Interim Wide-Pick + Deferred Contract (
hours_demand_v1.22, Sparvohx43): Interim-Slot-Picker sucht jetzt bismin(breach, next_cheap-1)statt fixer 5h-Pick-Kappe; Legacy-Fenster viaHOURS_INTERIM_PICK_CAP_H=5. Deferred Interim (interim_decision=charge) bleibt gültig auch mitinterim_period_active=false; EMS-Period-Shrink/Today-Pin nur bei imminent (h < 5). Deferred-Skip bei bereits geplanter Survival-Energie setzt fail-closedinterim_decision=none,interim_reason=covered_by_scheduled_survivalund scrubbtinterim_slot_start/interim_cost_*. Snapshot/Explain-Hinweise (reason_codes,show_interim_charge_hint,hidePlan) folgeninterim_decision=charge. Beipassbleiben beide Econ-Kosten (interim_cost_charge_eur+interim_cost_pass_eur) erhalten — nurnone/r2_rejected/covered-scrub löscht sie. Alle Anlagen/Keys. - Hours Folgetage fail-soft hydrate (
hx42): Folgetage-SSR wird erst ersetzt, wenn ≥1 Tag erfolgreich gemalt wurde; Total-Paint-Fail stellt SSR wieder her bzw. blendet leere Schale aus (kein Hint-only-Card). Sparvohx42. Alle Anlagen/Keys. - Hours Folgetage empty after hydrate (
hx41):statusChipsHtmlhing unteruseSummary— Folgetage-Supply-Cost-Paint warfReferenceError, der Per-Day-Catch leerte alle Tage (Titel/Hint blieben). Helper nebendisplayPrefsgehoisted; Sparvo-Cachehx41. Alle Anlagen/Keys. - Hours Interim week_status Label (
hours_demand_v1.21): Interim-Slots trageninterim=True;week_status/Folgetagecharge_kind=interim(„Übergang“) statt fälschlich MUST/Reserve. Samples/API-Tests Engine-Tagv1.21. Spec §6.8.5. Alle Anlagen/Keys. - Hours Interim Explain reason gate (
hours_demand_v1.21): Snapshot-reason_codessetztinterim_chargenur beiinterim_period_active(parity mit Explain-Fuß/hidePlan). Regressionstests für empty_min-today-only + JS-Interim-Gate. Alle Anlagen/Keys. - Hours Interim R2 Weak-Consolidate Pin (
hours_demand_v1.21): Weakstage=future-Day-Consolidate erhältinterim_slot_start(Mitternacht-Übergriff nicht relocaten);basis.interim_*synced mit Decide Top-Level nach pass/r2-scrub. Spec §6.8.5 + Tests. Alle Anlagen/Keys. - Hours Interim R2 Audit-clean (
hours_demand_v1.21, Sparvohx40): Post-Consolidate EMS-Pin hältcharge_hours_todayauf einem Interim-Slot;r2_rejectedlöscht Phantom-interim_cost_*und setztinterim_decision=none; Explainempty_min-Hinweis nur bei heutigemempty_min(nicht Horizont); Zwischenladen-Fuß/hidePlannur beiinterim_period_active. Decide+DA shared. Alle Anlagen/Keys. - Hours Interim R2 + empty_min Explain (
hours_demand_v1.21): Interim-Insert fail-closed über_partial_port_take_ok(kein Sub-min_headroom-Take ohne Partial-Port);charge_kwhaligned; Decide+DA shared. Explain: Soft-Cap-Abandon- undempty_min-after-Peak-Hinweise; Zwischenladen-Fuß nur bei aktivem Interim heute. Soft-Cap+Hold→empty_min = akzeptierter Tradeoff (kein Far→100 %/Slack↑). Docs/AGENTS Engine-Tag v1.21; Sparvo Explain-JShx40. Alle Anlagen/Keys. - Snapshot refresh + Folgetage-Chips + Today-Basis (Audit-clean hx38):
load_raw_snapshotmachtdb.refreshgegen Identity-Map-Stale (Hydrate/DA sehen Concurrent-Tombstone/Heal); Folgetage-Supply-Cost behält Prefs-Chips nach JS-Paint; Sparvo-Today Savings-Note hydratisiert Basis-Prosa (data-sv-savings-basis). Alle Anlagen/Keys. - Wiki Tombstone O12: Webhooks DE+EN + Anlagenprofil: Profil-Save-Clear liefert
discharge_power_kw=0/charge_now=0; UI—nur bei fehlendem/nullFeld, numerisch0→0,0 kW/is-off. Alle Anlagen/Keys. - Tombstone O12 + Hydrate issued_at (Audit-clean hx37/hz5): Profil-Save-Tombstone-Webhook setzt
discharge_power_kw=0+charge_now=0(PicoC-Fallback 9 vermeiden); Snapshot trägt dieselben Nullen; Outlook-Hydrate skippt silent Persist wennissued_atwährend Resolve fortschreitet; Portalhorizon-htmllieferttariff_markup_ct_kwh; Lead/Explain-€ ohne Chip-Wipe; Sparvo SW-Shellplant-hydrate-hz5/nav-center-1/sparvo-shell-v27. Alle Anlagen/Keys. - Speichergröße Prefs-Hydrate (Audit-clean): Lead-Basis ohne Chip-Wipe; Explain/Delta-€ (
savings_vs_no/ sensible) folgen Prefs-Toggle; Horizon-HTML liefert Profil-tariff_markup; Tombstone-Webhook setztcharge_now/discharge_power_kw=0; Hydrate clobbert neueren Snapshot nicht; Spec/Wiki DA-Redispatch bei jedem nicht-ok Decide. Cachehx37/plant-hydrate-hz5. Alle Anlagen/Keys. - Hours Explain Folgetage + O12 + Horizon Prefs (Audit-clean hx36): Folgetage-Kosten-Paint nutzt Decision
d(nicht undefiniertesdata) — sonst leere Folgetage beicost_net_eurohne Day-Markup; O12 immerpaintPlantNowDischarge(Clear auch beiavailable+ null kW); Speichergröße hydratisiert Lead/Basis-Note/Transparenz/Explain{basis}/{tax}bei Prefs-Toggle. Cachehx36. Alle Anlagen/Keys. - Sparvo/Portal Akt. Entladung + Horizont (Client): Explain-JS vor Sparvo; O12-Chip vor Explain-Render (try/catch); Horizon-Fetch entkoppelt + Parallel-Kick bei Skeleton; Inline-Fallback wenn Explain-Shell fehlt. Alle Anlagen/Keys.
- Hours Explain Folgetage (Bugfix):
displayPrefswieder top-level — sonst ReferenceError in strict mode nach Cost-Paint und leere Folgetage-Liste. Alle Anlagen/Keys. - Speichergröße-Kacheln Prefs-Chips: Ist/Passt zeigen Börse + mit/ohne Aufschlag + mit/ohne MwSt (Hydrate bei Toggle). Alle Anlagen/Keys.
- Speichergröße-Kachel Labels netto/brutto: Headline + Balken-Ø folgen MwSt-Toggle (
{tax}→ netto/brutto); Aufschlag allein bleibt netto. Client-Hydrate bei Prefs-Wechsel. Alle Anlagen/Keys. - Sparvo/Portal Anlagenprognose Hydrate (Audit-clean hz4): Snapshot-first akzeptiert leeres
day_plan(Autark/Covered); Tombstone/fehlendesdischarge_power_kwlöscht O12-Chip (—/is-off); Cachehx34/plant-hydrate-hz4. Alle Anlagen/Keys. - Horizon-HTML Prefs + Hydrate: Portal
/plant-outlook/horizon-htmlinjiziert Account-Display-Prefs (SSR); nach AJAX-Inject ruft Portal/SparvoSpotDisplayCost.hydrateDomauf (MwSt/Aufschlag/Chips/{tax}). DA redispatched Tombstone-Clear bei jedem non-ok Decide. Alle Anlagen/Keys. - Profil-Save Tombstone Audit (Hydrate/Fingerprint/DA): Hydrate lädt Snapshot nach Resolve neu vor Persist/Publish (Concurrent-Tombstone → Publish; fortgeschrittenes
issued_at→ kein silent Persist); Material-Fingerprint nur bei Push-OK (nicht beinot_configured/HTTP-Fail); DA beiincomplete_input+ Tombstone redispatched leeren Clear; Flash-Copy nennt EMS-Retry. Alle Anlagen/Keys. - Profil-Speichern → Hours Decide (Audit): Tombstone + leerer Webhook; Material-Fingerprint nur bei erfolgreichem Push (HTTP-Fail → Retry beim nächsten Decide/DA); Outlook/Sparvo-Hydrate über Tombstone →
publish_hours_and_pv_after_decide(kein silent Persist); DA prüft Tombstone vor incomplete-Cache; Flasherror_stalewenn Clear scheitert. Alle Anlagen/Keys. - Profil-Speichern → Hours Decide: Nach Standort/Speicherregeln/Dump/
grid_charge_allowedsofort Shared Decide; bei incomplete/Fehler Tombstone (profile_refresh, leere Charges,hours_unavailable) +plant.plan_updatedinkl.grid_charge_allowed; Snapshot best-effort, Webhook best-effort; wenn Snapshot-Schreiben scheitert → Flashplan=error_stale; Sparvo-Geräte-Freezes invalidiert; DA-Replan erzwingt Recompute. Gast: Session-only ohne Decide. API-JSON Decide unverändert. Alle Anlagen/Keys. - Sparvo/Portal Anlagenprognose Hydrate (Audit-clean):
/…/dataohne Speicher-Horizont (include_horizon=False); Horizont nur…/horizon-html; shared TTL + Snapshot-Persist nach Preview-Resolve (kein Webhook, außer Hydrate über Profil-Save-Tombstone → Publish inkl. Webhook); Soft-Busy inkl.fetch_timeout/pending ohne Decide; Loader weg bei nutzbarem Decide. Behebt hängendes „Ladeplan/Horizont wird berechnet“. Alle Anlagen/Keys. - Sparvo/Portal Anlagenprognose Hydrate (Resume/Horizon): Visibility-Abort resumed sofort bei sichtbarem Loader/Skeleton; Horizon-Retry leert den Mount nicht mehr (soft-retry). Alle Anlagen/Keys.
- Sparvo/Portal Anlagenprognose Hydrate: Soft-Busy
status=computingpollt weiter (kein hängendes „Ladeplan wird berechnet… Erneut laden“); Horizon-Loading-Skeleton bleibt (Kostenprognose-Lücke behoben); Loader wird bei fertigem Decide entfernt;Akt. Entladungausdischarge_power_kwauch wenn Explain hidden. Portal+Sparvo. Alle Anlagen/Keys. - Day-Ahead Accept Hardening: Fresh-Overlay Attribution ohne Blind-
awattar_api; integrity_reopen zählt Wien-D+1-Stunden; Inferenz-Gate Doc = expected (nicht ≥20). Alle Anlagen/Keys. - Day-Ahead Accept Audit-Fix: D+1 aus Parquet
awattar_apinachreceived_for(Bridge/ohne Live-Overlay);fresh_api_tsmintet kein Stale; Wiki Forecast/Hours: Label erst nachreceived_for. Alle Anlagen/Keys. - Day-Ahead Accept (Pass 9): Live-Tick vs Parquet-Bridge (Bridge nur bei aWATTar
failed|stale); D+1-Label erst mitreceived_for/ Predicate; Hours-Sofort-Replan nurreceived+received_for=morgen. Öffentliche Forecast-Felder (price_source) unverändert. Alle Anlagen/Keys. - Globale Kostenanzeige — Hours Explain + Horizon no-batt hydrate: Hours Explain speichert die letzte Decision und re-applied bei
sf-display-prefs-changed(Boot-Hydrate aus#hours-explain-decision); Horizon Ohne-Speicher-Bar-ct mitdata-horizon-bar-calc; Plant-Outlook + Sparvo-Chart hören Cross-Widget-Prefs. Alle Anlagen/Keys. - Globale Kostenanzeige — Landing/Charts + Audit-clean: PDN/Bands/Forecast-Chart/
/beste-stunden//live-strompreisefolgen denselben Prefs (Cross-Widgetsf-display-prefs-changed); Stundentabelle + Horizon Markt/Bar-ct hydratisiert; Sparvo ohne Doppel-Apply;estimated_ctinkl. Markup; Dead Helpers entfernt; Partner-Embeds Börse-only; Wiki Forecast/Windows: Prefs UI-only. Alle Anlagen/Keys. - Globale Kostenanzeige — Audit-Follow-up: Sparvo-Today Markup-kWh =
device_energy(arb) bzw.from_grid+grid_charge(plan); Wochen-Summary + Horizon/Today Client-Hydrate für Guest/Admin-localStorage; Admin-FCsource=admin; Fix-vs-Dyn net≠gross; PDN-Disclaimer aus i18n-data-*. Public-API weiter ohne Prefs-Flags. Alle Anlagen/Keys. - Globale Kostenanzeige (Portal/Sparvo): Account-Prefs
display_markup_on/display_vat_on(Default beide aus) steuern Aufschlag·MwSt in Hours-Fuß, Supply-Pie, Speichergröße, Charts, Charge-Chips, Sparvo-Today und FC-Verification. Profil-grid_surcharge_ct_kwh= Betrag (netto, ohne MwSt). Payload bleibt Spot (spot_cost_eur); Engine/Gates/Public-API/PicoC unverändert. Timeline-Ops alle Rollen:(PV, Speicher, Netz, SOC). Alle Anlagen/Keys. - Speichergröße-Kachel Spec/UI-Nachzug: Anlagenprofil-Jahres-Spot + Horizon-Explain (Portal/Sparvo) dokumentieren Surplus-Cap Hold
min(net,Cap,s−floor)und Profil-max_discharge_kwwie Decide; SEO-Meta Peak-Pack→Surplus-Cap; Testsimulate_week_gridforwardsmax_discharge_kw. Code-Pfad war seit Audit-Fix live. Alle Anlagen/Keys. - Hours Docs-Nachzug Surplus-Cap: Spec §6.8 Intro/6.8.6–9/Familie B + Wiki Webhooks/Hours (Cap-Vektor-Materialität, Hold-Load, planned_direct seit v1.19) + PicoC-Kommentare/Sample-Prints an Live
hours_demand_v1.20angeglichen. Alle Anlagen/Keys. - Hours Audit-Fix Cap-Labels + P_max-Parity:
_hold_maps_subsetlabelt Cap>0,2 ohne Reason alshold_share(nichtcheap_hold); Cap≈HOLD_KW→cheap_hold(O12/Resolve/Snapshot); Cap0-Refresh behält nur Weak/Legacy; Weak + Familie B Peak-Pack + Outlookcompute_storage_horizonbekommen Profil-max_discharge_kw; Hold-Load Slot-Cap lieststart\|target_start\|time; Speicherschonung-SOC ohneSOC: — %. Spec §6.4.2 / §6.8.16 / §6.8.17. Alle Anlagen/Keys. - Hours Explain Speicherschonung kW+SOC: Hold-Segmente in
plan_timelinezeigenSpeicherschonung (Speicher: ~x kW, Netz: ~y kW, SOC: ~z %)— Mittelwert geplante Pack-Entnahme/min(net,Cap,s−floor)+ Haus-Residuum (1 dp) + SoC am Periodenende; Cap weiter inhold_kw/discharge_cap_kw. PicoC unverändert. Spec §6.8.17. Alle Anlagen/Keys. - Hours Hold-Load Cap-aware + Weak Peak-Cap-Copy: Telemetry Hold-Load vergleicht Live-Import vs
max(0, plan_rate−Cap)(kein False-Decide unterhold_share); Weak SoC-Roll clippt Peak-Share-Caps nicht mehr; Cap-raise-Guard-SchwellePACK_RESERVE_KW_MAX(0,2); Decide Peak-Pack nutzt Profil-max_discharge_kw. Spec §6.4.2 / §6.8.16. Alle Anlagen/Keys. - Hours Speicherschonung Surplus-Cap + Hold-Last-Replan (
hours_demand_v1.20): Kontinuierliches lastgewichtetetes Surplus-Cap ersetzt Cap0/Liberate für Off-Peak-Defizit vor Peaks; Reasonshold_share/pack_reserve/cheap_hold; O12=Slot-Cap, Floor→reserve_emptyvor Cap; Familie Bmin(net,Cap); Webhook-Material inkl. Cap-Vektor; Telemetry Hold-Load Decide (Session→Near-Min→Hold-Load). Kill-SwitchesHOURS_HOLD_CONTINUOUS_CAP,HOURS_HOLD_LOAD_REPLAN. PicoC unverändert (nur O12). Spec §6.8.16. Alle Anlagen/Keys.
2026-09-08
- Hours v1.19 Wiki-Feinschliff: Öffentliches Hours-Wiki dokumentiert optionales
battery.grid_surcharge_ct_kwh; Research Peak-Pack-Note als SUPERSEDED (Live-Enginev1.19). Kein API-/PicoC-Bruch. Alle Anlagen/Keys. - Hours v1.19 Hygiene: Sekundär-Docs/PicoC-Header auf Engine-Tag
hours_demand_v1.19; Week-Glance Dead-Code entfernt. Kein API-/PicoC-Vertragsbruch. Alle Anlagen/Keys. - Hours v1.19 Audit-Fix: Fuß-€ nur X/Y/Z (kein
empty_min-Catch-all); Markup0ct bleibt0(is not None); Request-battery.grid_surcharge_ct_kwhfail-closedinvalid_input; Why-{energy}= Decide-Horizont X+Y+Z (nicht Folgetage-1A-Filter); Sparvohours_enginespiegeltweek_grid_draw_kwh/tariff_markup_ct_kwh. PicoC unverändert. Spec §6.8.17. Alle Anlagen/Keys. - Hours Netzladung Volltag + geplanten Netzbezug Haus (
hours_demand_v1.19): Nach finalem Cap0/Hold/\(H_{gate}\) taggt Decide Residuen alsplanned_direct(Tag-P33 +spot ≤ p_ersetztohne η/Markup; nie auf Charge/Hold). Explain-Volltag-Rollen + Fuß X/Y/Z (stundenweise Kosten); Wochenblick-Why = EMS-Heute‑h + Summe X+Y+Z (168 h). Anbieteraufschlaggrid_surcharge_ct_kwh(Requestbattery.grid_surcharge_ct_kwh→ Profil → 1,5 ct/kWh) nur Display. Kill-SwitchHOURS_PLANNED_DIRECT=0. PicoC/day_planunverändert. Spec §6.8.17. Alle Anlagen/Keys. - Day-Ahead Fetch / Sofort-Decide: aWATTar Market-Day-
start/end(kein mittags-15/24 mehr); Live-Overlay ab 13:00 Wien inkl. smartENERGY-Lückenfüllung (aWATTar priorisiert); smartENERGY early-accept nur live (kein Stale→received); Hours-Sofort-Replan nur bei Pollstatus=received(Catch-up 15–23 Wien). Feldvertragprice_sourceunverändert. Alle Anlagen/Keys. *(Superseded 09.09.: Pass 9 Live-Tick/Bridge + Sofort nurreceived∧received_for=morgen.)* - Hours Weak price-first + Cover Partial-Port: Rentable Day-Fill weist Band∩η∩R2-Port in \(W\) (sun→sun) preisoptimal zu (SoC-Roll + greedy Chrono-Deliver, Grid-Budget (target−soc)/η, nicht chrono-first); Rebalance öffnet keine pv_will_fill-Skips;
net≤0blockiert Grid nicht bei Port>ε; Cover Skippv_fillsnur bei Port≈0 (Partial Port erlaubt); Timeline until-none respektiertcharge_by_date, kein Phantom-kWh. PicoC unverändert. Spec §6.3 / §6.8.15 / §8. Alle Anlagen/Keys. - Hours Explain Plan-Timeline + Versorgungs-Torte: „Diese Woche“-Prosa in die Plan-Kachel gemerged (
plan_timeline: Charge + contiguous Speicherschonen; Unique-Start-Merge Sibling-Slots; Autark/no_hold_gapstill; until-none nur bei Heute-autark); Cover-Label günstige Lade-Stunde / EN *low-price charge hour*; Torte 4. Segment Netzladung (Flow-Nenner, pct-Summe 100);basis.week_statusAPI unverändert;plan_timelineUI-only. PicoC unverändert. Alle Anlagen/Keys. - Hours Soft-Cap sibling EMS prefix (10): Weak+Cover Split gleiche
startbricht EMS contiguous Prefix nicht mehr;hours_needed/day_plan/Today-Cap = unique Starts; Compact-EMS merget Sibling-Energie; SoC-Kette nach Split. PicoC unverändert. Spec §6.8.15. Alle Anlagen/Keys. - Hours Soft-Cap Mixed budget split (9): Mixed Relocate splittet die letzte Stunde am Weak-Budget — Cover-Rest ohne
weak_pv; Soft-Cap-Gate Mixed bleibt absolut. PicoC unverändert. Spec §6.8.15. Alle Anlagen/Keys. - Hours Soft-Cap relocate Natural/Mixed (8): Weak-only Relocate Soft-Cap = Natural-Baseline; Mixed behält
weak_pv-Budget (kein Blanket auf Cover); Cap0 Hold-Map immer Dict ({}=0). PicoC unverändert. Spec §6.8.15. Alle Anlagen/Keys. - Hours Soft-Cap relocate mixed-day (7): Consolidate Relocate behält
weak_pvauch bei Mixed Cover/Weak; Soft-Cap-Check inkl.plan.hi. PicoC unverändert. Spec §6.8.15. Alle Anlagen/Keys. - Hours Soft-Cap post-apply plan.hi + Cap0 notes (6): Post-apply Soft-Cap Stempel = Near/Dawn ∪ Weak-
plan.hi; Cap0-Notescharge_fill/nofillmutually exclusive. PicoC unverändert. Spec §6.8.15. Alle Anlagen/Keys. - Hours Familie B Soft-Cap calendar-scope (5): Soft-Cap
end_socresim nach Deferred-Merge; Cover/Prep-Wipe nur bei Kalender-Weak (nicht deferred-only); Soft-Cap-Note nur bei Peel. PicoC unverändert. Spec §6.8.15. Alle Anlagen/Keys. - Hours Familie B Soft-Cap calendar-scope (4): Soft-Cap peelt nur Kalender-
h < hi(Post-Mitternacht deferred); Weak-except revived Cover nicht nach Soft-Cap-Versuch; Spec-Heuristik Cap0 Empty-Fill. PicoC unverändert. Spec §6.8.15. Alle Anlagen/Keys. - Hours Cap0 after gate/DP (3): Cap0+end_soc immer nach finalem Fill (DP / \(H_{gate}\) / Soft-Cap inkl. Empty-Fill); Familie B Cap0-Refresh nach Soft-Cap; Decide Hold-Map ohne
{} or None-Fallback. PicoC unverändert. Spec §6.8.15. Alle Anlagen/Keys. - Hours Cap0/Soft-Cap audit (2): Cap0 energy-map fail-closed (fehlender Key=0); Weak Cap0-Resim nach Fill/Soft-Cap-Peel; Familie B Soft-Cap Natural ohne Dawn-Kill-Gate + Cover/Prep energy map. PicoC unverändert. Spec §6.8.15/§6.8.16. Alle Anlagen/Keys.
- Hours Peak-Pack Cap0 charge-fill audit: Cap0/
fill_beforenutzt geplantecharge_kwh_by_index(nicht nur flaches kW); Weak Mix re-plant Cap0 nach Rentable Fill (kein Empty-Fill Cap0, das Liberate wieder schließt); Soft-Cap an jedemplan.hiauch ohne Dawn-Stamp. PicoC unverändert. Spec §6.8.15/§6.8.16. Alle Anlagen/Keys. - Hours Weak Soft-Cap Natural-Baseline: Weak-Trim (
trim_weak_pv_charges_to_softcap/ In-Horizon) peelt nur Ladung übermax(min+10 pp, natural[stamp])— hoher Ist-SoC wipe’t Rentable Day-Fill nicht mehr; Cover-/Consolidate-Soft-Cap bleibt absolut. PicoC unverändert. Spec §6.8.15. Alle Anlagen/Keys.
2026-09-07
- Hours Soft-Cap path/parity audit: Soft-Cap rolls from
plan.lo(no hour-0 fail-open); stamp== n= SoC after last hour; Decide horizon keeps Soft-Cap at eachplan.hi; Familie B Soft-Cap Dawn-Kill + wipe clears Cover/Prep (no revive). PicoC unverändert. Spec §6.8.15. Alle Anlagen/Keys. - Hours Familie-B Soft-Cap-Parität: Weak nach Gate-Filter auch in
simulate_week_gridSoft-Cap-Trim am sun→sun-Ende (plan_hi) — Decide §6.8.15. Near-autark:cover_dawn_cap_hoursnur wenn Stempel> H_{gate}. PicoC unverändert. Alle Anlagen/Keys. - Hours Weak×Near-Autark Soft-Cap-Audit: Unter Near-
autark_okbleibt Dawn-Soft-Cap aktiv (Anchormax(pv_cover_end, H_{gate})→hi(next_pv), Stempel> H_{gate}); Near-Stempel ≤ \(H_{gate}\) weiter ausgeblendet.cover_dawn_cap_hourswieder in Basis. PicoC unverändert. Spec §6.8.15. Alle Anlagen/Keys. - Hours Weak×Near-Autark:
autark_okskippt Weak-PV nicht mehr für den ganzen 168 h-Horizont (Decide + Familie B; B: Wochen-Gate für Cover/Prep, sticky Near-\(H_{gate}\)+Resim+Soft-Cap für Weak/Hold — kein Mitternachts-Reset). Near = 0 bis \(H_{gate}\); Folgetage: volles sun→sun → Filter → Soft-Cap; energy_* aus finalencharge_hours. Dual-Contract dokumentiert. PicoC unverändert. Spec §6.0 / §6.8.15. Alle Anlagen/Keys. - Hours Familie-B Weak hold-only + Sparvo 1A: Hold-only Weak wipept Cover/Prep-Ladung nicht mehr und erzwingt kein Cap-Headroom (
weak_overlaynur bei Rentable; Cap0-Hold-Merge getrennt; Decide-Parität); Sparvo PV-Navalways_include= Wanduhr-Heute (nicht Issued/as_of). Wochenblick-Docs: keine „Nächste …“-Chip, nur Why. PicoC-Kommentare Engine v1.18. Alle Anlagen/Keys. - Hours Peak-Pack Familie-B Charge-Fill + Snapshot-1A: Jahres-Sim re-plant Peak-Pack Hold nach geplanter Ladung (
charge_abs_indices); Snapshotweek_status1Aalways_include= Wanduhr-Heute (nicht nur Issued-Tag); Wochenblick ohne doppeltesmetric_next/why_later(wg14). PicoC unverändert. Alle Anlagen/Keys. - Portal/Sparvo Wochenblick Empty-Dedup: Why und Strip-Empty sind mutually exclusive (
wg13) — kein doppeltes „Keine Netzladung im 7-Tage-Plan“. API/PicoC unverändert. Alle Anlagen/Keys. - Hours Peak-Pack v1.18 Audit-Fix (2): Weak-Union erhält Peak Cap0 (
preserve_indices);hours_engine.week_statusteilt 1A-Filter mit Folgetage; Fill-Preview injectet Charge; Orphan-Cap →pack_reserve(kein Cap1-Invent). PicoC unverändert. Alle Anlagen/Keys. - Hours Peak-Pack v1.18 Audit-Fix: Charge-Stunden im Peak-Pack-SoC-Roll drainen den Pack nicht mehr (c∧d=0 Inject); Cap0-Drain vom
drain_budgetabziehen; Liberate-Cap1-Guard shared (Decide + Familie B); Sichtbarkeit 1A = Folgetage-date∪[hour_lo,hour_hi)∪ lokales Heute (D0 bleibt). PicoC unverändert. Alle Anlagen/Keys. - Hours Peak-Pack v1.18 + Sichtbarkeit 1A + Folgetage D+6: Engine
hours_demand_v1.18— sequentielle Peak-Blöcke; Fill nur vor Block; Hold-Set = nur Cap0/pack_reserve; Liberate = leeres Hold (Adaptive). Weak darf Liberate nicht mit Cap1 schließen. UI: Folgetage-Daten gatekeepen PV-Nav/Wochenblick/week_status (überall oder nirgends); Hold→Folgetage per[hour_lo, hour_hi); Copy Restimport≠Laden + Balken-vs-Kuchen-ⓘ;REST_DAY_UI_MAX=7(Incomplete-Trim bleibt). Markup weiter display-only. PicoC unverändert (Live-O12). Spec §6.8.16. Alle Anlagen/Keys. - Portal/Sparvo Wochenblick Copy: Titel „Aktueller Wochenblick“ (ohne „Hours“); Layers-Zeile Cover/Suchhorizont/EMS entfernt; Why bei Gedeckt+Hold nur noch „Speicherschonen in Hold-Stunden ist kein Laden.“ (ohne Hold → leerer Plan-Text). Lead + EMS-Hinweis bleiben (
wg14). API/PicoC unverändert. Alle Anlagen/Keys. - Portal/Sparvo Wochenblick: Redundante Summen-Chips „Woche N h“ / „Heute (EMS) N h“ entfernt (Tagesleiste + EMS-Hinweis reichen; Woche-Summe war bei Hold-only irreführend). Später auch Chip „Nächste …“ entfernt — nächste Ladung nur in Why (
why_later;wg8→wg14). API/PicoC unverändert. Alle Anlagen/Keys. - Hours Peak-Pack Audit (
hour_is_cheap+ Night-UI):hour_is_cheap= nur günstigste N (Preis-Signal), nicht Hold-Mitgliedschaft; O12 weiter überhold_hours/Slot-Cap. Snapshot stellt keine Raw-Night-Scalars (night_direct/night_floor) mehr wieder her. Spec: Dünne-Preise-Gate nur für Cheap-Clock, nicht Peak-Pack-Hold-Set. Wiki/SEO. PicoC unverändert. Alle Anlagen/Keys. - Hours Peak-Pack O12 Hold-Set: Live-O12 = Slot-Cap sobald Now ∈
hold_hours— ohne zweitencover_needed-Gate (Weak-PV-Hold vs. chrono Cover-to-sun). Legacy-Cheap-Clock ohne Hold-Mitgliedschaft braucht weiter Cover-Lücke. Snapshot stellt stalenight_hold_hoursnicht mehr aus Raw wieder her. Explain-Copy Hold = Hold-/Off-Peak-Stunden (nicht „günstigste“). Spec §6.8.7. PicoC unverändert. Alle Anlagen/Keys.
2026-09-06
- Loxone ExtractPvDaily v2.7 + DebugPvForecast v1.6: Extract re-reads ~alle 20 s; Txt1 immer
v2.7 soc=…; SoC-Sidecarspotprice_pv_soc.txtvom Debug nach frischem Fetch. Anzeige = Extract O11. Beide PicoCs neu einfügen, dann Fetch tippen. Alle Anlagen/Keys. - Loxone ExtractPvDaily v2.6: PicoC-Audit —
setoutput(10)=O11(0-basiert), kein%.1f/ kein schwerertxt_d0-Stack; Key-Suche ohne Escapes; Force-Re-Read ~10 s; Idle-Deltad0_kwh+d0_soc_eod; Txt1OK soc=…wenn SoC geparst. Anzeige = Extract O11. PicoC neu einfügen. Alle Anlagen/Keys. - Loxone ExtractPvDaily v2.5: Bei Debug O1=10/12 erzwungenes Re-Read ~alle 10 s; Idle-Delta auch auf
txt_d0. Txt1/setlogtextzeigtOK soc=…. Anzeige = Extract O11 (kein alter Merker). PicoC Extract neu einfügen. Alle Anlagen/Keys. - Plant-Wetter Morning-Slot: Freshness 05:00–11:59 verlangt Fetch heute ab ~05:00 — Mitternachts-On-Demand blockiert den Timer 05:20 nicht mehr. Deploy startet den Refresh nur noch bei stale/Schema-Lücke (fail-open bei Check-Fehler; kein Journal-Spam). Wiki Weather/PV DE/EN. Alle Anlagen/Keys.
- Hours Peak-Pack UI night-scope: Nacht-Chip/Headline nur aus
night_hold_hours+ Live-O12 (Folgetag-pack_reserveüberschreibt Cap1-Nacht nicht). Wiki Slot-Cap-Wording. Alle Anlagen/Keys. - Hours Peak-Pack UI/Samples: Explain Chip/Headline/Empty Cap-aware (
pack_reserve+{kw});pack_reserve_anyviahold_reason_for_cap; Portal PicoC-Samples O12=Slot-Cap. Alle Anlagen/Keys. - Hours Peak-Pack Audit: Cap-Union fail-closed (Weak lockert Peak-Pack nicht); Cap0/
pack_reserveLabel auch beiHOURS_HOLD_KW≤0,2; Weak-Mix/DP ohne Peak-Hold; week_status/API Prefer engster Cap. Spec/PicoC-Doc. Alle Anlagen/Keys. - Hours Peak-Pack Hold (
hours_demand_v1.17): Bei Cover-Lücke + knapper Drain-Bilanz (Off-Peak@HOURS_HOLD_KWwürde Pack vor Peak leeren) gilt Entnahme-Cap 0–0,2 kW (HOURS_PACK_RESERVE_KW, Default 0) statt pauschal 1 kW — Peaks (18–21 / 06–08) ohne Hold.hold_hours[].discharge_cap_kw+reason∈ {cheap_hold,pack_reserve}; Weak-PV-Union Caps fail-closedmin(peak, weak)(inkl. DA-DP-Feinschliff); Folgetage-Explain nutzt Slot-Caps. O12 = Live-Cap (PicoC unverändert). Research:docs/research/peak_pack_allocation_v117_20260906.md. Alle Anlagen/Keys. - PV
d0_soc_eodLive-SoC: Frisches Decide-Pack lieferte bisher eingefrorenes Mitternachts-SoC bis zum nächsten Decide (bis 6 h).GET /v1/plant/pv-forecastund Telemetrie-SOC rechnenloxone.d0_soc_eod/txt_d0jetzt aus dem aktuellen Live-SoC neu (PV-Tage/pv_hashunverändert; Persist nach Meter-Ingest; kein Clobber neuerer Decide-Packs). Loxone ExtractPvDaily v2.4: File-Delta auch beid0_soc_eod(v2.3 nurd0_kwh→ O11 blieb alt). PicoC Extract neu einfügen. Alle Anlagen/Keys. - Hours Rentable Day-Fill (
hours_demand_v1.16): Schwach-PV-Mix ersetzt Abend-Peak durchneed_full+ Spot-η-Gatep/η < p_ersetzt − ε(ε=0,3 ct; Markup nur Kostenanzeige). Soft-Cap nach Weak-Inject (fail-closed Trim); Flat ohne Blind-Charge (Hold bleibt); grid_off: Hold ohne Charge; Tail-PV-Fenster behalten; Familie B gleiche sun→sun-Predicate; Explain Tortesupply_*/cost_*+ Prosa. API-Shape/PicoC unverändert. Alle Anlagen/Keys. - Hours week_status list filter + date: „Diese Woche“ listet nur Plan-Tage (Hold/Charge/Charge+Hold) — Autark/Idle/
no_hold_gap/opp_*entfallen auslines(bleiben indays[]). HeadingDo 10.09.:(Wochentag +dd.mm.). PicoC unverändert. Alle Anlagen/Keys. - Hours Copy B Audit-Fix 4: Residual schlägt nur Near-Hints (
no_charge_covered/interim_pass), nicht horizon-globalesopp_off/opp_not_triggered.charge_holdohne Hold-Evidenz nach 1‑dp‑Heal → Charge-only (kein erfundenes „Dazu Speicherschonen“). PicoC unverändert. Alle Anlagen/Keys. - Hours Copy B Audit-Fix 3: Idle-Restlast schlägt
empty_hint=no_charge_covered→no_hold_gap(kein falsches „gedeckt“).localizeheiltdirect_*vor Hold-Uhren-Backfill; Charge-Status schlägt stalehold_*why. Chart-Tip: bare Clocks auch incharge_starts_plan/night/restnur heute (dated Labels weiter per Datum). PicoC unverändert. Alle Anlagen/Keys. - Hours Copy B Audit-Fix 2:
localize_week_statusheiltdays[](why_code/direct_*) auf 1‑dp wie die Zeilen;_line_for_week_dayprüftcharge_holdvor Hold. Chart-Tip: barecharge_starts(14:00) nur am heutigen Tag (kein Folgetag-Falsch-Netzladung). Explaintip_p33+ Rest-Day-Hold-Strings + Wiki-Chip → Speicherschonen. PicoC unverändert. Alle Anlagen/Keys. - Hours Copy B / Chart Tip Audit-Fix:
why_code=hold_directunddirect_hoursfolgen der 1‑dp‑Anzeige (Mikro‑kWh < 0,05 →hold, nicht Import-Header). Portal/Sparvo Planwort Charge > Hold matched Display-Strings (charge_starts*) und Tages-Chips vor Hold; Tip/aria escaped. Explain-Hold-Chips = Speicherschonen.localize_week_statusohne Fake-min_soc=20. PicoC unverändert. Alle Anlagen/Keys. - Hours week_status Copy B + Anlagen-Tageschart PV/Last: Hold-Zeile = eine Uhrliste (
HH:00 X,X kWhoderohne Bezug· Summe = 1‑dp Anzeige); Wortwahl Speicherschonen / kein Speichern aus dem Netz (EN: Pack conserve / no battery charge from grid). Portal und Sparvo Tageschart: PV+Last mit Schaltern (Default beide an; beide aus verboten), TipPV · Last · Planwort(Charge>Hold aushours_decision), Sparvo-Payloadhourly_load_*+now_hour. Outlook-SOC-Roll η = Profil-roundtrip_efficiency(Default 0,90 wie Hours Decide). PicoC/Engine unverändert. Alle Anlagen/Keys. - Hours week_status Copy 1A+2C:
basis.week_status= eine Plain-Language-Zeile pro Kalendertag mitwhy_code,direct_hours(kWh/h),hold_hours_local,charge_*,teaser. Kein Gruppen-„Netzbezug:“. Hold-Zeile listet alle Hold-Uhren; Restimport nur Anzeige‑kWh>0 (Restimport ⊆ Hold / Felddirect_hours). Legacy ohnehold_hours_local: Uhren ausdirect_hours. Idle mit Restlast ohne Hold →no_hold_gap(nicht falsches Autark). Cover/autark_okschlägtinterim_pass-Hint (wie Explain). Hold-kW-Copy ausHOURS_HOLD_KW. Speicherschonen-/Restimport-Prosa nur in „Diese Woche“; „günstiges Drittel“ nur beidarf(§6.8.10). Hold ohne Import ≠ Autark. Jeder Decide rolliert[now, now+H≤168). Leere Tage: ehrliche Hints (grid_off/interim_pass/no_charge_covered/opp_off/opp_not_triggered/no_hold_gap). Netzladung-Explain + Week-Glance-Echo default zugeklappt. Optionalhold_hours[].direct_grid_kwh. PicoC unverändert. Alle Anlagen/Keys. - Hours Weak-PV Mix v1.15 (
hours_demand_v1.15): Schwach-PV-Tage (Morgensonne→Morgensonne, 168 h Tag-für-Tag): Pre-Peak-Nachladen, Vormittag schonen, Hold-Bänder, c∧d=0.charge_kind=weak_pv;basis.week_status(Plain-Language Wochenzeile Portal/Sparvo, Snapshot+Outlook). Hold-only-Fenster strippen keine Darf-Cover; EMS-Hold ohne parallele Charge-Stunden. Explain/empty_reason=holdnur bei Nacht-Restimport kWh>0. DP-Feinschliff nur im bestehenden DA-Replan (allow_weak_pv_dp, KillHOURS_WEAK_PV_DP); kein Extra-Poll. Deduplizierung Weak vs. MUST-Survival; Restimport-UI nur bei kWh>0. API weiter Kalendertag 00:00–23:59. PicoC unverändert (nur Live-O12 /charge_now). Alle Anlagen/Keys. - Loxone PV after Decide — Extract stale: Server Decide-Pack was already SoT (
GET /v1/plant/pv-forecast= Portal/Sparvo). Wiki wrongly said Hours O7 → VO FetchPvForecast; VO alone updates the file while Extract keeps old kWh. Fix: wire O7 → DebugPvForecast I1; ExtractPvDaily v2.3 also re-reads JSON ~15 s whend0_kwhchanges. PicoC Extract neu einfügen; O7-Verdrahtung prüfen. Alle Anlagen/Keys.
2026-09-05
- Hours Hold / Familie B Abgrenzung: Explain-UI-Gate (Hold nur bei ungedeckter Nacht) ändert Jahres-€ der Kachel Speichergröße & Spot-Kosten nicht; Familie B gated Hold schon im Shared Builder. Ohne Speicher kein Hold; mit Speicher Hold-Import in Lücken-Stunden (v1.14). Docstring-Korrektur O12≠Jahres-Sim-Hold. PicoC unverändert. Alle Anlagen/Keys.
- Hours Hold-Explain Audit-Fix:
charge_empty_reasonnutzt neu berechnetenight_hold_ui(nicht stale Raw); Week-Glance/Explain downgraden Hold→covered bei gedeckter Nacht. PicoC unverändert. Alle Anlagen/Keys. - Hours Hold-Explain UI: Status-Chip/Headline sitzt in der Kachel Bis morgen früh; Hold-Copy nur bei ungedeckter Nachtlast (
Verbrauch > Speicher + PV), nicht bei Folgetag-Holds allein. Headline ohne „günstiges Drittel“ (nur Darf). PicoC unverändert. Alle Anlagen/Keys. - Hours Darf Near-only auch bei ¬Recovery: Soft-Cap Far-Skip/Abandon für Darf unabhängig von
cover_recovery_ok; Consolidatenear_cover_hours/cover_softcapohne Dawn-Stamp für Darf; Interim/Relocate sync’t Cover-kWh. PicoC unverändert. Alle Anlagen/Keys. - Hours Darf Near-only (v1.14 Audit): Recovery Soft-Cap wieder an für Darf (Far-Skip + Leftover-Abandon); nur Dawn Soft-Cap-Stamp bleibt aus. Hold-
n_takeüber volle Ladeleistung (nicht P_econ). Relocate sync’tenergy_deficit_cover_kwh. Wiki PicoC Hold-Header DE/EN. PicoC Logik unverändert. Alle Anlagen/Keys. - Hours Darf Cover — Live-Picker-Fix (v1.14 Audit): Darf sized N×P_econ (nicht Survival-Bulk); Near-Budget ohne Chrono-/Dawn-Nullclip; Dawn Soft-Cap-Stamp nur für MUST/Stretch;
basis.charge_power_kw=P_econbei Darf; Soft-Cap-Abandon sync’t Cover-kWh. Resolve-E2E unter Recovery. PicoC unverändert. Alle Anlagen/Keys. - PV Pack-Sync Audit-Fix: Live-Fail nach Weather-Invalidate → age-ok Pack (Fingerprint + ≤6 h) statt
weather_missing. Outlook-Tages-pv_kwhbei Pack-SoT aus Pack-days(nicht Stunden-Summe). Decide published mit demselben Estimate (pv_est/ today-past +display_tz). Freshness-Weather-Exception fail-closed. Loxone DebugPvForecast v1.5:pendingFetchfür Hours-O7 während busy/coolDown. Darf v1.14: Cover-Energie = N×P_econ (Fill-Cap); Recovery-Soft-Cap zerlegt Darf-Placement nicht mehr. Alle Anlagen/Keys. PicoC DebugPv neu einfügen. - PV Pack-Sync UI↔API: Cover-Kurzfrist-Refine ändert die angezeigte Tages-
pv_kwhnicht mehr (kein Hydrate-Sprung). Bei Weather-Cache stale/midday oder neuerem Wetter: live Estimate → Pack wird persistiert — Portal/Sparvo undGET /v1/plant/pv-forecastbleiben gleich. Alle Anlagen/Keys. - Hours Horizon-Hold / MUST·Darf v1.14 (
hours_demand_v1.14): Autark → kein Hold und kein MUST/Darf. MUST =reserve_breach; Darf = ¬Breach ∧(Preis_Tag/η)≤P33(η Default 0,90; C-Rate Sweet 0,25 nur Darf). Hold-Set = günstigste N − Charge; Live-O12 = 1 kW nur in Hold-Stunden; Speicherschonen (O12=1 kW) = Normalfall; Floor = Notfall. API:hold_hours,day_plan[].hold_hours,direct_grid_hold_kwh,basis.reserve_breach/econ_charge_ok/charge_kind. Webhook-Materialität inkl. Hold-Starts. UI „günstiges Drittel“ nur beicharge_kind=darf(nie „P33“). PicoC unverändert (Live-O12). Familie B: Decide O12=1 kW vs Jahres-Sim Import-ohne-Entnahme. Alle Anlagen/Keys. Kein PicoC-Repaste. - Loxone PicoC O4-Konvention: Debug*-Blöcke setzen den VO-Trigger (meist O4) nur während Fetch/Poll auf 1, danach wieder 0 (VO OR-sicher). DebugPvForecast v1.4, DebugSpotpriceFile v5.7, DebugPlantWeather v1.3; Hours FetchPlantHours v1.16 O7→FetchPvForecast OR-sicher. Wiki DE+EN PicoC-Blöcke neu einfügen; Samples synced.
- Loxone DebugPvForecast v1.4: Nach Poll setzt O4 wieder 0 (vorher blieb O4=1 und maskierte Hours O7→FetchPvForecast am gleichen VO). Wiki DE+EN + Code-Sample. PicoC Debug neu einfügen; Extract v2.2 unverändert.
- Hours/PV Decide-SoT — Audit-Fix 2: Session-Complete-Overlay strippt echte Portal/Sparvo-Payloads (
charge_days_*/ datierte Chips), nicht nur Test-charge_hours_today. Alle Anlagen/Keys. - Hours/PV Decide-SoT — Audit-Fix: Outlook-Pack-Stunden (ISO-
start) werden zudatetimegeparst (kein Crash auf/plant-outlook); Overlaycharge_startsmatched nicht mehr TZ-Offset+02:00bei Stunde 02; Session-Complete nurcharge_now==1+ Debounce 120 s in Wiki. Alle Anlagen/Keys. - Hours/PV Decide-SoT: Nach Decide-OK persistiert der Server Hours-Snapshot und PV-Pack (
last_pv_forecast_*); Webhookplant.plan_updatedenthältpv_forecast_url/pv_hash. GET PV + Outlook preferieren frisches Pack (≤6 h). Fill-Day mit Cap-Need ist kein Prep-Gap (fill_day_not_gap). Session-Complete-Replan + UI-Overlay wenn SoC ≥ Session-Stopp. Loxone FetchPlantHours v1.16 pulst O7→FetchPvForecast nach Decide. Alle Anlagen/Keys. PicoC Hours neu einfügen wenn O7 verdrahtet werden soll; PV:08bleibt Backup. - Auth — Key-Owner-Tier: Wiki-Hinweis: Kontingent/
accessfolgen dem Account, dem der API-Key gehört. Nach Anlagen-Übernahme an Partner gilt für denselben Key das Partner-/Professional-Kontingent. Keine API-Vertragsänderung.
2026-09-04
- Hours Dawn-Cap — Abschluss-Sync: Portal-Samples (
cover_dawn_cap_hours), Wiki/Konzept-Beispiele, Bridge-Rest-Abandon hinter Dawn, Kill-Switch-Verhaltenstest. Enginehours_demand_v1.13. - Hours Dawn-Cap — Universalität ≤168 h: Cover/Bridge dürfen den Stamp
hi(next_pv)nicht überschreiten (jeder Wochentag, nicht nur WE); Rest = Policy-Abandon. Spec/Wiki + Midweek-Tests. Engine weiterhours_demand_v1.13. - Hours Dawn-Cap v1.13 — Docs-Audit: Decide-Pipeline-Fußnoten (§6.0 / §6.1 Schritt-Nummern) an kanonische Reihenfolge Recovery→Sizing→Autark→Dawn→Picker angeglichen. Kein Code-Change. Alle Anlagen/Keys.
- Hours Dawn-Cap v1.13 — Stamm-Audit: Consolidate-Feasibility sync nach kWh-Drop (Survival-Defer); Soft-Cap-Stempel Near+Dawn an Consolidate; Decide-Pipeline + Wiki-Feldtabellen (
energy_cover_dawn_kwh,energy_abandoned_cover_kwh). Alle Anlagen/Keys. Kein PicoC-Repaste. - Hours Dawn-Cap v1.13 — Deep-Audit:
energy_deficit_cover_kwhfolgt dem Dawn-geclippten Picker-Budget; Day-Consolidate (Flag) prüft Soft-Cap am Near/Dawn-Stamp bevor Relocate akzeptiert; Stretch-Doku kalenderagnostisch; Samples Go/Rust/C# mitcover_dawn_cap_hours. Alle Anlagen/Keys. Kein PicoC-Repaste. - Hours Dawn-Cap v1.13 — Audit Soft-Cap-Schichtung: Cover/Bridge Soft-Cap nimmt alle geltenden Stempel (
minder Rooms): Overnight + Recovery-Tagesstempel + Dawnhi(next_pv)— Dawn ersetzt Near Soft-Cap nicht. Bridge-Rest unter Recovery (auch ohne Dawn-Kill-Switch) = Policy-Abandon. PHP-Sample:cover_dawn_cap_hoursunabhängig von Recovery. Alle Anlagen/Keys. Kein PicoC-Repaste. - Hours Dawn-Cap v1.13 (
hours_demand_v1.13): Cover/Bridge Soft-Cap undpicker_cover-Clip anhi(next_pv)(PV-Tag Morgensonne→Morgensonne) auch bei Stretch/Recovery false — verhindert Far-Vorladen auf ~100 % vor Folgetag. Hold-to-min darf Cap brechen; Opp unverändert. Kill-SwitchHOURS_COVER_DAWN_CAP=0→ v1.12. Basis additiv:cover_dawn_cap_hours,energy_cover_dawn_kwh. Alle Anlagen/Keys. Kein PicoC-Repaste. - Hours Cover-Recovery v1.12 — Audit-Fix Rebalance/Feasibility: Bei
cover_recovery_okdarf Same-Day-Rebalance Cover nicht hinter Near verschieben (Accept-if-better hatte Far-Cover am selben Kalendertag wiederhergestellt); Day-Consolidate (Flag default OFF) ebenfalls Near-Gate. Soft-Cap-Cover-Abandon zählt nicht alsstorage_undersized(plan_feasibility.energy_abandoned_cover_kwh). Decide + Explain, alle Anlagen/Keys. Kein PicoC-Repaste. - Hours DA-Replan — Journal/
by_reason: Batch-Log und State unterscheidenalready_current(Idempotenz nach erstem Decide) vonincomplete_input/incomplete_input_cachedund Gate-Skip (by_reason.gate). Keine API-Vertragsänderung; Wiki Hours DA-Abschnitt + Ops-Konzept §6.4. - Hours Cover-Recovery v1.12 — Audit-Fix Far-Spill: Bei
cover_recovery_okdarf Soft-Cap-/Leftover-Rest nach Near-Cover nicht als Far/D+1-Cover oder Bridge nachgelegt werden (sonst wieder Sa→So-Vorladen); D+1-Force entfällt; Rebalance-Dawn-Soft-Cap nur bei Recovery. Decide + Explain, alle Anlagen/Keys. Kein PicoC-Repaste. - Hours Cover-Recovery v1.12 (
hours_demand_v1.12): Wenn der nächste PV-Tag den Chrono-Trog mit Margin hält (basis.cover_recovery_ok), entfallen Reserve-Stretch und D+1-Union — kein Far-Vorladen auf ~100 % vor starkem Folgetag. Soft-Cap Cover auch tagsüber vor Morgensonne nur bei Recovery; leftover kürzt Cover-Take; Rebalance Cover bidirektional (Accept-if-better; Prep/Opp/Bridge fest). Kill-SwitchHOURS_COVER_RECOVERY=0. Alle Anlagen/Keys. Kein PicoC-Repaste. - Hours Cover — günstigere Stunde nach Pack-voll (Audit): Last/PV-zuerst-Roll + Clip + Same-Day-Rebalance. Rebalance nutzt Load-first-Raum auch ohne frühere Netz-kWh (PV-Voll) und verschiebt von teureren Stunden (auch früher→später bei Accept-if-better); Clip-Pass-2 löscht nicht mehr alle Folgestunden; End-SoC via
roll_soc_hour. Decide + Explain, alle Anlagen/Keys. Kein PicoC-Repaste. - Hours Prep/Vorrat — Start-SoC über Prep-Decke:
prep_take_under_ceil_kwhprüft die SoC-Spitze ab der Kandidatenstunde (nicht mehr über den ganzen Horizont). War der Speicher zu Decide-Zeit über der Vorrat-Decke (z. B. 99 % bei Decke 85 %), wurde bisher jede spätere Prep-Stunde auf 0 kWh gesetzt — Folgetage zeigten nur dünnes Far-Cover (z. B. Do nur 13:00 · 6,2 kWh). Zusätzlich: Near-Cover → Prep → Far-Cover, damit Vorrat günstige Stunden vor Far-Cover bekommt. Decide + Explain. Alle Anlagen/Keys. Kein PicoC-Repaste. - Portal/Sparvo Folgetage — Verfügbarer Speicher: Balken Verfügbarer Speicher zur Morgensonne folgt dem Anlagenprofil Netzladung erlauben (
grid_charge_allowed): an → kWh inkl. geplanter Netzladung bis dahin (wie Mit-Netz-Trajektorie); aus → wie bisher ohne Netzladung. Gilt für alle Anlagen/Keys (Portal + Sparvo). Snapshot-Feldrest_day_balances[].usable_soc_kwh(UI-only, nicht Decide-API). Ohne·Mit-Netz-Vergleich unverändert. - Audit-Fix Hours Placement-Docs + Role-Merge: Docstring/Wiki/API-Text: Placement Near-Cover → Prep → Far-Cover → Bridge → Opp (Sizing weiter Dump-first). Role-Merge-Rang
cover > bridge > opp > prep(Bridge nicht mehr gleich Cover).
2026-09-03
- Hours Cover — Mittelpreis-Stunde behalten: Dominated-Hour-Guard entfernt. Wenn 14:00/15:00 schon voll sind, bleibt die nächstgünstige Stunde (z. B. 13:00) im Plan — Restbedarf rutscht nicht mehr in teurere Stunden (z. B. 16:00). Preis-Rang unverändert. Decide + Explain. Alle Anlagen/Keys. Kein PicoC-Repaste.
- Portal/Sparvo — Übersprungene Stunden Vollliste: „Nächste geplante Ladung“ nur einmal pro Tag als eigener Bullet unten; Stundenzeilen ohne Wiederholung. DE+EN.
- Audit-Fix Skip-Footer: Tages-Footer nutzt
next_timeder letzten Skip-Stunde des Tages (nicht die letzte nicht-leere). Explain-Preview/JS: gleicher Footer inkl. „keine weitere Netzladung“. Poll-Assethx24.
2026-08-31
- Sparvo PWA — Homescreen-Start: Service Worker interceptiert keine Document-Navigations mehr (nur noch
/static/*, Manifest,sw.js). Behebt Anzeige von Roh-HTML/JS-Quelltext beim Kaltstart aus dem App-Icon; SWsparvo-shell-v26, RegistrierungupdateViaCache: none. - Sparvo — Menü „Spar“ ausgeblendet: Bottom-Nav, Start-Kacheln und Favoriten ohne
/savings; direkter Aufruf leitet auf/um. Standard aus — Reaktivierung per EnvSPARVO_SAVINGS_SECTION_ENABLED=1(beide Hosts). Tagesplan-Ersparnis auf Heute unverändert. - Portal/Sparvo — Speichergröße & Spot-Kosten (Rollen-UI): Chip Fix vs. Dynamik, Amortisations-Hinweis und aufklappbarer Block Dynamik vs. Fix nur für Anlagen-Administrator (API-Key-Besitzer). Anlagen-Hauptbenutzer und Mitbenutzer sehen weiter Ist/Sinnvoll, Kostenbalken und „Kurz erklärt“. Payload
fix_tariff_compare/ Amort-Felder instorage_horizonunverändert — nur UI-Sichtbarkeit. Alle Anlagen/Keys (gleiche Rollenlogik wie Hours „Übersprungen“).
2026-08-30
- Portal/Sparvo — Speichergröße & Spot-Kosten (Sweetspot + Fix-Vergleich): UI-Empfehlung über Faustregel (50 % Nachtlast + PV-Kopplung, 10-kWh-Buckets) statt irreführender 60-kWh-Leiter; Passt wenn Ist ≥ Sweetspot. WR-Standby 0,5 kWh/Tag in Jahres-Simulation. Fix vs. Dynamik: Shared
fix_tariff_compare(Fallback 11,4 ct netto bis E-Control Phase 2)./fc-verification:horizon_compare.tariff_context. Copy-Fix (Abend): PV-Faustregel-Chip nur bei deutlich kleiner PV; Sommer-Netz+WR eine Zeile (Cover-Tage-Text entfernt). Alle Anlagen/Keys. - Sparvo/Portal — WhatsApp-Empfehlung: Formulare „Per WhatsApp teilen“ / Referral-WhatsApp nutzen
data-sf-no-page-loading— kein „Wird geladen …“-Overlay vor der Weiterleitung zu WhatsApp (Fix: Overlay blieb nach Abbruch/Zurück in der PWA hängen). Zusätzlich: Lade-Modal schließt beivisibilitychangezurück zur App, wenn die Seite bereits vollständig geladen war. - Sparvo PWA — Resume nach Idle: Gemeinsames
fetch-timeout.js(20 s API-Timeout,TimeoutError→ bestehender Retry-Backoff). Plant/Outlook/Live-Telemetrie refreshen beim Zurückholen aus dem Hintergrund nur wenn fällig oder >5 Min hidden; laufende Fetches werden beim Verstecken abgebrochen. Service Workersparvo-shell-v25, Assetsresume-fetch-1/fetch-timeout.js?v=1. Fix: erstes Öffnen nach langer Pause hing (stale TCP + blindes Refresh); Kill+Neustart war Workaround.
2026-08-28
- Hours v1.11 (
hours_demand_v1.11): Vorrat-Sizing nach geplanten Cover/Bridge/Opp-kWh (SOC-Pfad statt nur natürlichem Trog) —basis.forward_prep.energy_kwhnie größer als v0; optionalnotes:sized_after_cover. Decide + Kachel Speichergröße & Spot-Kosten (simulate_week_grid, gleiche Predicate). Cover-Slots unverändert (Non-Regression). Kill-SwitchHOURS_PREP_AFTER_COVER=0. Audit-Fix:plan_feasibilitynach Prep-Trim — Cover-Lücke bleibtpartial, reines Prep-Trim erzeugt kein falschesstorage_undersized. Alle Anlagen/Keys. Kein PicoC-Repaste. - Hours Cover Slot-Rang (Refactor,
hours_demand_v1.10): Cover-Picker: pro Kalendertag Preis-Rang, global per günstigstem Tageskopf — dieselbe Regel heute, morgen, Folgetag (kein Folgetag-Sonderpfad). Dominated-Hour-Guard gilt überall gleich (frühere teurere Stunde nur wenn spätere günstigere geplant + Lücke dazwischen leer). Near/Far, Survival, Prep, Consolidate unverändert. Decide + Portal/Sparvo Explain. Familie B: Policy-Intent (Autark, Prep-Predicate, Port-Raum) — kein voller Picker/Dominated-Guardinsimulate_week_grid. - Portal/Sparvo — Dump-Preis-Toggle entfernt: Day-Navigator, Sparvo, FC-Verification — nur noch Modell-/Punktpreis; kein Umschalter Ohne Dump-Korrektur | Dump-Preis.
- Wiki Detail-Guides Lead-Blockquotes: Loxone-PicoC-Guides DE+EN mit Lead-
>(Endpoint, PicoC-Version, Community 120/Tag). - Hours Explain Cover-Label: Cover-Slots nur „günstige Cover-Stunde“ (Portal/Sparvo).
- Hours Cover Slot-Rang (Hotfix 2b,
hours_demand_v1.10): Folgetag Dominated-Hour-Guard (Di 12+14 ok; Sa kein 08 nach 09). - Hours Cover Slot-Rang (Hotfix,
hours_demand_v1.10): Preis-Rang auf allen Kalendertagen; entfernt Folgetag-Sperre „erst ab erster Tagesbilligst-Stunde“. Decide + Explain. Familie B: Policy shared, kein voller Picker. Kein PicoC-Repaste. - Hours Autarkie-Gate v1.10 (
hours_demand_v1.10): Wenn PV+Speicher den Horizont ohne Netzladung halten (basis.autark_ok), sind geplante Near-Ladung 0 kWh (Cover, Vorrat, Dump, Bridge) — Decide und Portal-Kachel „Speichergröße & Spot-Kosten“ nutzen dieselbe Policy. Gate-Fenster \(H_{gate}\) = Rest-heute ab Decide + nächster Kalendertag bis Morgensonne (gate_hinautark_notes). Ausnahme Stretch (cover_extended_for_reserve). *Nachzug 2026-09-07:* Weak-PV darf nach \(H_{gate}\) weiter laden (kein Wochen-Skip). Alle Anlagen/Keys. Additiv:basis.autark_ok,basis.autark_notes. Kill-SwitchHOURS_AUTARK_GATE=0. Kein PicoC-Repaste (Extract v1.17 / Fetch v1.15). - Hours Cover-Kurzfrist v1.9 (
hours_demand_v1.9): Speicherprognose „Bis heute früh“ nutzt Zähler-Ist (Teilstunde + Recent-Rate 2–4 h) für Cover-Last/PV und Netzladungs-Engine — konsistent in Portal/Sparvo Hours-Explain und API (basis.load_refine,hourly_load_cover_kwh). Folgetage-Lastprofil unverändert. Kein PicoC-Repaste nötig (Extract v1.17 / Fetch v1.15 unverändert). - Hours v1.9 Audit-Fix: Keine doppelte Teilstunde in Slot-Picker/Consolidate nach Refine;
awaiting_first_deltabehält Meter-Budget-Norm; Plant-Outlook-Chart nutzt dieselbe Cover-Last wie Hours; SOC-Slice-Indizes an echte Stunden geklemmt. Extract v1.17:periodbis 48, kein 40-h-Reset vonlastOkAbs. ExtractPvDaily v2.2: optionale O8–O13 bei fehlenden JSON-Feldern auf 0. - Hours v1.9 Audit-Fix (2): Snapshot-first Outlook patcht Cover-Last wie Live-Resolve; Cross-Midnight-Cover schreibt D+1-Stunden;
load_kwhnach Patch neu summiert. Extract v1.17 Fallback-O2 = Stunden im Fenster (inkl. Endstunde). - Hours Explain SoC-Sync: „Jetzt“ in Netzladung zeigt Live-Telemetrie-SOC (nicht älteren Decide-Snapshot); Prognose-Stempel verschiebt sich um SOC-Drift. Live-Telem-Poll patcht Explain clientseitig.
- Hours SOC-Sync Audit-Fix: Keine kumulative Prognose-Verschiebung bei Telem-Polls; Server-Overlay idempotent (
*_at_decide-Baselines); Outlook-Patch summiertpv_kwhneu. - Loxone Offline-Fallback (Forecast · PV · Flex): PicoC Fetch-Blöcke nutzen
rename()-Backup statt JSON-Truncate; bei API-Ausfall O1=12 (Forecast/PV) und Schalten aus letzter JSON (Flex Boot Phase 30). Versionen: DebugSpotpriceFile v5.6, ParseSpotpriceForecast v18, DebugPvForecast v1.3, ExtractPvDaily v2.2, SpotpriceFlexWindows v0.6.11. Wiki DE+EN + Code-Samples aktualisiert. Keine REST-API-Änderung.
2026-08-27
- Seiten-Lade-Modal:
submit-Armierung erst nach synchronen Handlern (setTimeout 0) — abgebrochene Forms (leeres Admin-Passwort /confirmAbbruch auf Mitbenutzer) blockieren die Seite nicht mehr mit „Wird geladen …“. - Landing + Sparvo Marketing IA (Hours-first): Unterer Funnel Nachweis → Sparvo (Gast
app.sparvo.at/try) → Schritte → Wiki-Band/docs→ FAQ (7) → CTA. Leitprodukte Hours · PV · Windows Flex · 168h; Weather API nicht vermarktet. Portal-SEO-Defaults + Legacy-Refresh beim Portal-Start. Damals: Sparvo.at FAQ/VideoObject, Wiki-Footer, Hero „Specs im Wiki“. Aktuell (2026-09-11): Hybrid/·/ems·/services— siehe Changelog 2026-09-11. - Seiten-Lade-Modal (Sparvo/Portal/Websites): Bei Same-Origin-Navigation und langsamen First-Paints erscheint „Wird geladen …“, bis das HTML bereit ist (
DOMContentLoaded). Schnelle Seiten (<≈280 ms) ohne Overlay. Opt-out:data-sf-no-page-loadingan body/link/form. Embeds unverändert. - Lazy-Load Anlagenprognose (Sparvo/Portal): Erster Paint mit
mode=shell(PV + Telem, ohne Hours Decide); Hours per/api/plant-outlook/databzw./plant-outlook/data(mode=full,include_horizon=Falseseit 2026-09-09 Audit-clean); Speicher-Horizont per…/horizon-html. Hours-Resolve begrenzt durchHOURS_RESOLVE_MAX_PARALLEL(Default 2, non-blocking); belegte Slots → JSONstatus=computing+ HTTP 200 +Retry-After+ Client-Backoff. Soft-Busy:status=computing/ pending ohne nutzbaren Decide /fetch_timeout(siehe 2026-09-09 Audit-clean). Incomplete/Failed Shells setzenpending_hours=false. HTTP 503 (auchoutlook_failed) und 429 lösen denselben Backoff aus. Fetch-/Horizon-Ketten mit Generation+Abort; echte Fragmente bleiben; Horizon-Loading-Skeleton wird bei Soft-Busy/Retry nicht mehr geleert (soft-retry — siehe 2026-09-09 Resume/Horizon);charge_hours_source-Warnung per Hydrate aktualisiert. Horizon-HTML: leeres Partial → Empty-Fragment. TTL-Cache liefert Deep-Copies. Empty Explain/Horizon shell-sicher (fmt_numUndefined-Guard). Docs-Markdown-Renderer mit Prozess-lru_cache. Öffentliche API-JSON-Verträge unverändert. - Hotfix PV-Tag auf /plant: Precomputed-PV aus Outlook (Mitternacht→…) wird für Hours/Cover/Folgetage wieder ab jetzt ausgerichtet — Morgensonne-Stempel nicht mehr 23:00/00:00.
- Audit-Fix Anlagen-Hauptbenutzer / Plant-Weather: Claims-Transfer beim Setzen des Hauptbenutzers in derselben DB-Transaktion wie das Primary-Flag; Portal invalidiert Plan-Freezes wie Sparvo; Remove/Leave/Delete Primary ebenfalls. Secondary zählt
skipped_secondarynicht mehr als Weather-Error (inkl. Geo-Save). Wiki Weather/PV: Refresh 05:20 + 12:20 Wien (HA Primary). - Speichergröße & Spot-Kosten (Outlook/Sparvo): Chips trennen Preisbasis (4 typische Börsenwochen / Fallback) und Last & PV (Zähler-Saisons / Hybrid / Schätzung); Börse-Ø 12 Monate bleibt Meta. Season-Preis-State
data/state/season_price_basis_latest.json(HA Primary Soft-Fail). PV-Wetter-Cache 2×/Wiener Tag (05:20 + 12:20), On-Demand nur Primary. Bürger-Explain zur Hochrechnung./plantShort-TTL + Dedup PV/Forecast/Meter. Hours Decide:basis.storage_horizonJahresfelder weiter null. Sparvo/llms.txt+/ai.txt(Marketing + App). - Anlagen-Hauptbenutzer: Beim Festlegen wechseln Gerätebetreuung und EMS-Anbindung immer zur Person (Confirm-Dialog); „Aufheben“-UI entfernt. Deaktivieren/Löschen eines Hauptbenutzers → Claims zurück an den Anlagen-Administrator.
- Hours Auto-Decide nahe Min-SoC (bidirektional): SOC-Ping bei 10 pp / 5 pp / am Floor unter
min_soc_pctund spiegelbildlich beim Wiederanstieg (Floor → 5 pp → 10 pp → Headroom / volle O12). Intern async Decide (Snapshot +plant.plan_updatedbei Delta). Sparvo/Portal live; Webhook sofort; Loxone-Extract beim nächsten Hours-Decide. Kein Decision-Quota. Kill-SwitchHOURS_SOC_NEAR_MIN_REPLAN=0.
2026-08-26
- Hours Vorrat v1.8 (
hours_demand_v1.8): Cap =min(target, max(min+10 pp, min(target−10 pp, 85 %))). Lookback nurvorrat_wuerdig(P20 ∧ Absolutschutz; Dump an → ≤ Grenzpreis inkl. 0). Fill-Day sperrt Prep inkl. Nacht. Dump vor Vorrat (Sizing + Placement). Sticky Lookback ≤P25. Force D0+Near ∪ D+1. Familie B: Cap+Port+gleiche Predicate. Soft-Stop overnight nur Cover/Prep-kWh. PicoC-Wiring unverändert (O1/O4-Werte folgen Engine). - Hours v1.8 Audit-Fix: Sticky liest
forward_preptop-level (Snapshot-Form); Force umgeht Fill-Day nicht mehr; Dump-Placement nur ≤ Grenzpreis; Dump-Rank ohne Force; Schicht-B nurvorrat_wuerdig; Bridge separat; Familie-B Cap-Clip. Docs:charge_nowstattcharge_active. PicoC-Wiring unverändert. - Hours v1.8 Follow-up: Sticky auch außerhalb P20 (≤P25); Familie-B Cheap nur im Kalendertag; Sticky-Preis aus Live-Serie; Speicher-Kachel kWh mit 1 Nachkommastelle.
- Netzladeleistung O11 vs. Anschluss:
charge_power_kw(Loxone Extract O11) istmin(WR/max_charge, Anschluss × 0,80 − Grundlast)— nicht die Roh-Netzanschlussleistung. Portal/Sparvo Anlagenprofil zeigt die berechnete Leistung unter dem Anschluss-Slider. Thin-Decide ohnebattery.max_charge_kw; nach Profil-Speichern Fetch I6 tippen. Geplante Stunden-kWh können SOC-/Vorrats-begrenzt bleiben (nicht immer volle Cap). - Portal Navigation Anlage: Unter Anlage neu Geräte (SSO → Sparvo
/devices, Geräte vorkonfigurieren) und EMS Anbindung (/settings/ems, PicoC-Slots). EMS Anbindung nicht mehr unter Konto. - Anlagen-Hauptbenutzer (Sparvo + Portal): Einstellungen → Konto zeigt Anlagen-Administrator und Anlagen-Hauptbenutzer mit Badge (wie Admin). Der Anlagen-Administrator kann unter Mitbenutzern einen anderen Mitbenutzer zum Hauptbenutzer machen oder die Rolle aufheben — nur nach Admin-Passwort (Portal:
/settings/members; Sparvo: Konto oder/settings/members). Optional EMS-Claims übertragen. - Sparvo/Portal EMS: UI Zeitplan (API-Feld
recipesunverändert). PicoC-Slots nur im Portal EMS Anbindung (/settings/ems) — Sparvo/Migration erfinden keinewallbox_*/flex_*. Ungebundene Katalog-Geräte: Chip „EMS offen“ + Portal-Link. Rollen: Anlagen-Administrator / Anlagen-Hauptbenutzer / Mitbenutzer. Katalogplant_sparvo_prefsproapi_key_id. Binding ist Serve-Quelle für Slot (Schedules/Flex-Merge). - Flex Sparvo-Merge:
flex_pack=0/ I6=0 liest Zeitpläne aus dem Anlagen-Katalogplant_sparvo_prefs(Fallback Owner-Prefs). PicoC-Slot nur Portal EMS; Claim bleibt bei Re-Bind erhalten. - EMS Bind-Overlay: Serve/Flex nutzen nur gebundene PicoC-Slots (
plant_ems_bindings); Konflikt-Verlierer und unbound Katalog-Einträge haben keinen Slot mehr in Merge/Schedules/Portal-UI. - Folgetage-Kachel: Zeile Geplante Netzladung nur für geplante Stunden am Kalendertag der Kachel — nicht für Stunden, die unter übersprungenen günstigen Stunden stehen, und nicht für Nachtladung des Folgetags im Sonne→Sonne-Fenster. Ohne·Mit Netz am Morgensonne-Stempel bleibt die echte Trajektorie.
- Vorrat/Cover vor Folgetag-Morgensonne: Soft-Cap min+10 pp gilt vor jeder Morgensonne (Cover und Vorrat, nicht nur der ersten Nacht). Vorrat füllt nur bis zum Prep-Floor, nicht bis Ziel-SoC/100 % — teure Nächte wie Mo 03:00/04:00 laden den Speicher nicht voll, wenn PV+günstigere Tagesstunden reichen. Survival (Min-SoC) bleibt getrennt.
- PV-Stunde Netz-Cap (Hotfix): Mehrfach-Zuweisung derselben Stunde darf den Rest
Ladeleistung − PVnicht überschreiten (kein Fallback auf Pack-Headroom → keine 14,9 kWh-Slots bei 1,7 kW Port-Room). Nach dem Picker chronologischer Clip: keine weitere Netzladung, sobald Stopp-SOC 100 % / Pack voll (z. B. kein 0,8 kWh direkt nach 13:00→100 %). - Hours Backward-Prep (
hours_demand_v1.7): Prep sucht je Gap-Tag rückwärts in der Trageweite \(H_{eff}\) (basis.carry_hours) — \(H_{prep}\) ist nur das Datenfenster, nicht an \(t=0+H_{eff}\) abgeschnitten. Quelltag ohne Netz schon voll durch PV (volle PV, kein 70-%-Rabatt) nimmt keine Prep-kWh — auch nicht abends nach dem Fill. Far-Cover nur in[Trog−H_{eff}, Trog]und nicht auf Fill-Tagen (keine Hintertür). Cover-Stretch endet am letzten vollständigen PV-Tag. Slot-Rolleprep→ „Vorratsstunde“. Jeder erfolgreiche Decide (ok) rechnet Prep + Slot-Picker (auch wenn Netzladung aus — dann Energie 0). Kachel Speichergröße & Spot-Kosten (Familie B) nutzt dasselbe Sizing. PV-Stunde: Netz nurLadeleistung − PV(1 h: kWh≡kW); Skippv_fills_charge_powerwenn die PV die Ladeleistung voll belegt. Ist/Sinnvoll-€ dürfen sich ändern. Telemetry plant nicht.
2026-08-25
- Flex PicoC v0.6.10: I1=−1 setzt
lastEin=0; I1 aus→an startet Reparse in derselben Stunde. Hours FetchPlantHours v1.15: 3‑Minuten-Pause nur in derselben Stunde (:00 nach Decide kurz vor Stundenwechsel). ExtractHoursDemand v1.17: Alter in UTC-Stunden — DST/Monatswechsel löst keinen 12‑h-Fallback aus. Sparvo: Dauer0,25h in Liste/Heute; Rezept-Zusammenfassung ohne Loxone-Haken; Planer-kWh in Mehr deaktiviert (Rezept 0 gilt); Live-Telemetrie Tag-kWh eine Nachkommastelle. - Flex PicoC v0.6.9: Fensterende setzt
lastHnur bei I1=−1 — bei I1 an folgt der Stunden-Reparse, Overnight bleibt nicht nach winE an. Sparvo: Rezept 0,25 h bleibt 0,25; kWh-Rezept schreibttarget_kwh; Weekly-Chips nicht parallel zu Rezepten; Ofen u. a. könnenapi_linkednicht setzen. - Flex PicoC v0.6.8: I1=−1 schreibt die Laufzeit-Datei am Fensterende nur einmal; I6=0 löscht Reststunden wenn der Slot ausgeht (nicht nur 00:00/06:00); Boot/I2/I7 setzen
lastAutoHour(kein Doppel-Fetch in derselben Stunde). Hours FetchPlantHours v1.14: I8 :00/:05 nutzt die 3‑Minuten-Pause (kein Decide-Sturm nach FAIL). ExtractHoursDemand v1.16: Monatswechsel löst nicht mehr den 12‑h-Fallback aus. PV/Wetter-Debug v1.2: 0→10 Pause 200 ms. - Sparvo/Portal: Leere Rezept-Tage bleiben nach Speichern/Edit leer. Rezept-Stunden außerhalb der Leiter (z. B. 7 h) bleiben. AC-Preset 1,2 kW. Mix-Chips und Wochenblick-kWh mit Komma; Plant-Outlook-kWh eine Nachkommastelle. EN-Verdrahtung
O3 on/off. - Flex PicoC v0.6.7: I6=0 löscht Laufzeit um 00:00 und 06:00 nur wenn der Slot aus ist — Abend-Rest blockiert das nächste Morgenfenster nicht mehr. Hours FetchPlantHours v1.13:
lastDecHourerst nach Decide-OK (:05 holt fehlgeschlagenes :00 nach); I6 während eines Fetches stellt Decide an. - Sparvo/Portal: Rezeptfenster gleiche Uhrzeit zeigt Hinweis 24h. Wochenblick-Stunden mit Komma (nicht
4.5). - Flex PicoC v0.6.6: I7 (Wallbox-Vc) wird nach dem Fetch wieder scharf, wenn der Eingang auf 0 fällt — Stecker raus/rein während eines Polls holt danach erneut. Hours FetchPlantHours v1.12: O1-Pause vor Extract 200 ms (Extract-Takt 100 ms), damit Decide nicht verschluckt wird.
- Sparvo Geräte: Rezept-Zusammenfassung EN mit Mon–Sun; Fenster
00–00zeigt 24h. Dauer-Dropdown und Rezept 1 (Stunden) bleiben gekoppelt; Speichern übernimmt Rezept-Stunden als Gerätedauer. - Flex PicoC v0.6.5: I2 (Manual) wird nach dem ersten Impuls wieder scharf, wenn der Eingang auf 0 fällt — ein Taster holt erneut. Laufzeit zählt nur wenn kein Fetch läuft. Hours FetchPlantHours v1.11: I5/I6-Kante während eines Fetches geht nicht verloren.
- Sparvo Geräteformular: Preset-Dauer schreibt Rezept 1 (Stunden), solange das Rezept noch dieselbe Zahl hat.
- Sparvo Geräteformular: „Nur tagsüber (08–22)“ entfernt (gegen Overnight-Wallbox/WP). Zeitplan-Tage antippen zum Abwählen; Zeitplan 2–4 entfernbar. Alle Tage aus bleibt aus (Edit erzwingt nicht wieder Mo–So). PicoC-Ausgang O1–O8 damals im Sparvo-Formular (seit 26.08. nur noch Portal EMS Anbindung). Bei EMS blendet „Mehr“ Planer-Felder aus (Werte bleiben). Overlap-400 behält Tage/Fenster. Ohne API-Key bleibt eine bestehende EMS-Anbindung sichtbar.
- Flex PicoC v0.6.4: I6=0 löscht Laufzeit um 06:00 nur wenn dieser Slot aus ist (Morgenfenster 05–08 bleibt). I1=−1 schluckt I2/I7-Kante und Stundenwechsel nicht mehr — nach I1 wieder 0 folgt Reparse bzw. Fetch.
- Flex PicoC v0.6.3: I7/I2-Flanke nach Fetch startet erneut (Kante während Poll nicht mehr verloren). Overnight: Laufzeit nicht um Mitternacht löschen (I6=0 Reset 06:00; I6 Overnight am Fensterende). I1=−1 löscht auch Fehler/Busy.
- Flex PicoC v0.6.2: Zur vollen Stunde geht Ein aus, wenn die neue Stunde nicht in
slots[]steht (staleload_nowbis :04). Laufzeit-Datei schreibt immer ASCII-Punkt (1.25), nicht Locale-Komma. - Flex PicoC v0.6.1: VO wie Hours —
{"slot_id":"3","flex_pack":<v.0>}(slot_idfest tippen). Fünf<v.n>in einem Befehl sind falsch (Loxone = ein Analog). I1=−1 löscht Latch O1–O8. I6=0 sendet Fortschritt/Stecker (Segmente=0), Merge bleibt. I7-Flanke holt neu. Stundenwechsel liest JSON lokal (:04 bleibt der HTTP-Fetch).mode/roleweglassen =cheapest/consume. POST-Body akzeptiert Komma-Dezimal. Hours-Persist nur POST, ≤70 min. - Flex Sparvo/PicoC v0.6.0: Hours = Speicher, Flex = Lasten Ein/Aus. Sparvo-Rezepte 1–4 +
slot_id-Merge (flex_pack=0weglassen). PicoC O1–O8, I6=0 ohne Forced-7, I1=0=an. Hours O12 ×battery_to_ev_pct(ev_charge_block/ev_charge_limit). Wiki Flex neu;loxone.mdBudget 7/8 (Wetter weglassen). - Flex PicoC v0.5.1: Parse-Fail behält LoadNow (
wantLoad); I1=0 löscht auchViGridChargeReq; Windows-Docs sagen Flex v0.5. - Flex PicoC v0.5: LoadNow aus aktueller Slot-Stunde (kein stale
ems.load_nowbeim Stunden-Reparse); I7 live jedes Loop; keincontinue; I1=0 resettet State; Wiki I9+I10 Pflicht fürhours_completed;flex_packüberschreibt Body-segments. - Docs-UX Flex-Guide:
/docs/loxone-windows-flexneu (kurze Schritte, Calloutsstep/example, SVG-Flow, PicoC im Anhang). Guide-Muster Konzept §12. Renderer: Calloutsstep+example. - Flex Deep-Audit v0.4d: ISO-Fenster +
deadline_hourohnewindow_*leitet die Uhrstunden ausstart/endab (18:00→06:00, Deadline 22 blockiert 02:00). NaiveStunde≤Deadlineentfernt. Deadline außerhalb des Fensters leert das Fenster nicht. Wiki Flex-Walkthrough DE+EN (Calloutsstep/example, Zielbildflow.svg), OpenAPI/Konzept §8.6 nachgezogen. - Flex Deep-Audit v0.4c:
deadline_hour(Sparvo spätester Start) filtert Flex-Kandidaten overnight-aware;windows_queryträgtdeadline_hour; Request-Echowindow_source(flex_pack|window_hours|iso);deadline_strict/repeat_dailyals Echo/reserved dokumentiert; PicoC I1=0 löscht auch Demand/Period; Konzept §15.1 E =flex_pack. - Flex Deep-Audit v0.4b:
device-schedulesnutzt dieselbe rollierende Overnight-Logik (Fix nach Mitternacht);windows_querynur nochwindow_*-Stunden (kein ISO); Request-Echo zeigtflex_pack/window_*; Wiki: warum kein Multi-VO wie Hours; Schritt-5 ohne ISO. - Hours/Flex Deep-Audit: PV-Tage ignorieren kurze Mittagsdips; unvollständiger letzter PV-Tag ohne nächste Morgensonne bekommt keine \(L_D\); Vortag-Stunden nur bei endlichem \(P_{ref}(D)\).
energy_deficit_kwh= platzierter Bedarf (ohne leftover Prep). OpenAPI:start/endoptional,flex_pack/window_*dokumentiert. PicoC I12 nur Diagnose;repeat_dailyin v0.4 nicht angewendet. - Flex PicoC v0.4 + rollierendes Fenster:
window_start_hour/window_end_houroder Loxoneflex_pack(I4|I5<<5|I6<<10|done<<16) in einem<v.0>— kein tägliches ISO-start/end. PicoC I4–I6 sind die Quelle der Wahrheit. O5 schreibt immer den Pack, nichthours_completed. LoadNow nur ausems.load_now(nicht auswindow.start).prep_extra_energy_kwh= platzierte Prep-kWh. Flex hinter dem Tier =no_slots, nichtdeadline. - Flex Deep-Audit: Live-Floor (keine Past-Stunden im Flex-Fenster);
next_slot_startchronologisch; Soft-Fallback bevorzugt längsten Block; nachendDemand/Slots=0 + Statusdeadline; leere Flex-Exits behaltenems; PicoC I1=0 löscht LoadNow; OverrideEnable als reserved dokumentiert.
- Flex PicoC v0.3 + API-Härtung: Poll akzeptiert auch
deadline/no_slots; PO Demand = Reststunden (0beisegment_completeoder nachend);deadline_reachedimmer wennnow ≥ end; Live-Slots nur ab der aktuellen Stunde; Overnight-Slots chronologisch; I7 sperrt LoadNow; I1=0 setzt LoadNow=0;window.hours_requested= Restbedarf; DA-Baseline leer wenn Rest = 0;softnimmt den längsten Block (Preis nur als Tie-Break);ems.next_slot_start= nächste Stunde ab jetzt. (Historisch: Auto-slot_idder ersten Wallboxwallbox_1— seit 26.08. nur noch Portal EMS.)
- Flex Docs-Vollständigkeit: Konzept §19.5/§19.6 auf POST+
<v.0>; OpenAPI-Stub GET Flex-Params + POST +device-schedules; PicoC damals v0.2; jetzt v0.4. - Windows Flex Loxone VO = Hours-Muster:
POST /v1/decision/windowsmit JSON-Body; dynamisch nur<v.0>/<v.2>am VO-Input (v0.4:flex_pack). Named<v.Vi…>verworfen. PicoC damals v0.2, Wiki/docs/loxone-windows-flexumgestellt. - Hours Forward-Prep (
hours_demand_v1.6): Nach Cover plant jeder Decide Multi-Gap-Prep (Schicht A \(G_{min}\) + Schicht B in PV-Tagen \(D-2..D\)) innerhalb von \(H_{eff}\) (Nutzband / Last-PV, Sommer-Floor0,25·Last, kein Sprung auf 168). Felderhours_needed_prep,prep_extra_energy_kwh,basis.forward_prep,basis.prep_horizon_hours. Slot-Rolleprep(„vorausschauende Stunde“). Cheap-Hold weiter nur Cover. Near Soft-Cap gilt für Cover und für Prep vor Morgensonne (kein Fill über min+10 pp). Speichergröße-Kachel nutzt dieselbe Policy; Ist/Sinnvoll-€ dürfen sich ändern. - Docs/Wiki Hub: Flex Windows in Überblick DE/EN verlinkt (
/docs/loxone-windows-flex); Loxone-Template- und Integrations-README auf live (Wallbox Schritt 1). - Loxone Flex Windows Wiki: Neue Schritt-für-Schritt-Seite
/docs/loxone-windows-flex(DE/EN) · PicoCSpotpriceFlexWindows. - Plant Device Schedules (Sparvo Flex 1b):
GET /v1/plant/device-schedulesliefertapi_linked-Geräte aus Sparvo (Slot-ID, Segmente, Fenster, Deadline) für Loxone/EMS. Community+; HTTP 200 mitdecision_status. - Loxone FetchPlantHours v1.10: Auto-Decide zur vollen Stunde :00 (I7+I8), :05 nur noch Fallback. Behebt Relais-Lücke: Extract setzt O3/
charge_nowzur Stundengrenze auf 0, bisher erst Decide um :05 → manuelles „Plan holen“ nötig. PicoC neu einfügen unter/docs/loxone-hours. - Hours Stopp-SOC Folge-Slots: Bei mehreren Ladestunden am selben Tag ist der angezeigte Stopp-SOC zeitlich nicht fallend (Folge-Stunde ≥ vorige). Slot-Picker rechnet
soc_projected_*nach der finalen Charge-Map neu (Preis-Reihenfolge ließ sonst veraltete End-SOC stehen). - Hours Near/Far Cover (
hours_demand_v1.5): Survival und Stunden bis zur ersten Morgensonne (cover_window_hours_pv) bekommen nur den Near-Bedarf (chrono bis PV + Cover-Puffer, Soft-Cap Morgen-SOC ≤min_soc+ 10 pp). Reserve-Stretch-kWh (Wochenend-Trog) landen erst nach der Morgensonne — kein Front-Load mehr als volle Ladeleistung heute (Symptom: 8,3 kWh „Mindestladestand“ bei Mit-Netz-Morgen ~45 %). Netz-Puffer wirkt wieder sichtbar auf den Near-Anteil. Basis:energy_cover_near_kwh. - Decision Windows Flex v1.1 (additiv): Optionale Query-Parameter
segments,segment_consecutive(off/soft/required),hours_completed,current_segment_index,repeat_daily,deadline_strict,slot_id. Mit Flex:decision_engine: windows_v1.1, Antwort-Blockemsdirekt nachdecision_status(PO Demand =ems.current_segment_hours, Period =ems.period_hours_todaybis Fenster-Ende). Ohne Flex-Parameter unverändertwindows_v1. Deploy:deploy.sh api-only. - Explain Stopp-SOC / Bilanz-Balken: Survival-O4 pinnt auf
min_soc_pctnur unter dem Floor. Stopp-SOC an jeder Plan-Slot-Zeile. Balken Verfügbarer Speicher · jetzt (Nacht) bzw. · um HH:MM (Folgetag = PV-Tagesbeginn). Stempel nur Uhrzeit: DE um 08:00. Poll-Assetshx22.
2026-08-24
- Hours DA-Replan (Produktiv): Nach Day-Ahead + Inferenz replant der Batch alle aktiven Anlagen (
resolve_hours_demand, Snapshot +plant.plan_updated). Poll-Hook + Timer stündlich 15–23 Wien. Webhook-Materialität enthält jetzt den vollen Plan (nicht nur Today-Slots) — EMS soll danachhours_demand_urlpullen. Optionalplan_hashim Payload. - Explain Cover-Label: „günstige Cover-Stunde“ statt „günstigste Stunde“. Cover-Slots die nicht das Tagesminimum sind, tragen „nicht die günstigste Stunde des Tages“. Die Zeile „Günstiger übersprungen: …“ (
cheaper_skipped) wird in Portal/Sparvo nicht angezeigt (nur Snapshot/Diagnose). Poll-Assetshx18. - P1-v2 Tages-Umlage:
HOURS_CHARGE_DAY_CONSOLIDATE=1(Code-Default OFF) legt Cover inkl. Survival auf günstigere ladebare Stunden desselben Kalendertags um — auch 1 Slot, aktuelle Stunde inkl., abgelaufene Stunden bleiben. 0 €/MWh zählt (kein Missing). Kleines Survival (unter 5 kWh) nur weglassen wenn der SoC-Pfad die Reserve inkl. Slack hält. Slack untermin_socnur bei Preisvorteil. Kein neues API-Feld, keinwait_cheap; O12 unverändert. Shadow-Loghours_consolidate_shadow.jsonl. Ops-Diagnose:diagnose-hours-charge-plan.py. - Fix: übersprungene Stunden Vollliste (Portal/Sparvo): Link „Alle N anzeigen“ auf
/plant/skipped-hoursbzw./plant-outlook/skipped-hourslieferte 500 Internal Server Error (Jinja:group.items= Dict-Methode statt Schlüssel). Vollliste rendert wieder chronologisch nach Tag. - Folgetage Ladungswirkung + ⓘ: Pro PV-Tag in Portal/Sparvo Explain: Zeile Geplante Netzladung … kWh · Effekt zur Morgensonne: +X % (
pv_day_charge_kwh,soc_delta_pctim Snapshotrest_day_balances, UI-only). ⓘ erklärt Reserve-Floor, Direktbezug unter Min-SoC und Stempel zur Morgensonne (nicht direkt nach Ladestunde). Poll-Assetshx17. - Wochenblick Tageslabel:
hours_needed_dayswird am Kalender-Grid (D0…D6) gemappt, nicht an der sparseday_plan-Liste — Di mit Ladung zeigt wieder 1 h geplant statt „Keine Ladung“ bei sichtbarem Balken (wg6). - Hours API Kalendertag vs. App PV-Tag: Decide/EMS (
hours_needed_today,period_hours_today,prefix_*,day_plan) bleiben Kalendertag 00:00–24:00 (Period bis 23:00). Nur Explain-Folgetage im Snapshot (rest_day_balances) = PV-Tage Sonne→Sonne — nicht in der API-Response. - Speicher-Kachel Aufklapper: Regelungskonzept präzisiert (Entnahme-Drossel nur wenn Bedarf nicht autark aus PV+Speicher gedeckt); Zeile „Ohne Speicher … kWh/Tag Netzbezug“ entfernt. Prefix-View-Zeile („Optimierer-Period …“) in Explain ausgeblendet (EMS-Feld unverändert).
- Netzladung Plan-Summary Copy: Statt „Nächster PV-Ertrag …“ (irreführend mittags bei laufender PV) heißt es Aktuelle Periode: noch X Stunden bis … und In dieser Zeit … Netzladestunden (Portal + Sparvo).
- Folgetage als PV-Tage (Sonne→Sonne): Nach Mitternacht bis Morgensonne gehört die Nacht zu Bis morgen früh; der erste Folgetag ist der aktuelle PV-Tag von Morgensonne bis Folgetag-Morgensonne (nicht nochmals die Nacht-Stub). Nach Morgensonne / vor Mitternacht: Folgetage ab der nächsten Morgensonne. Balken und Ohne·Mit Netz teilen dasselbe Fenster (Portal + Sparvo).
- Hours O12 bei vollem Speicher: Cheap-Hold (Entnahme 0) nur wenn bis zur nächsten Morgensonne eine Cover-Lücke bleibt. Nicht bei SoC ≥99 % und nicht bei PV-Überschuss in der Stunde — Stretch-Trog (z. B. Mittwoch) allein darf O12 nicht schließen.
- Hours Cover/Survival nicht in PV-Überschuss: Slot-Picker setzt keine Netzladung, wenn die Stunde mehr PV als Last hat (und SoC über min). Stretch darf die billige Solar-Spitze (z. B. 10:00) nicht als „Mindestladestand“ nehmen.
- Hours Interim 24 h: „Nächste Billigstunde“ nur in den nächsten 24 h (nicht der billigste Slot im 168-h-Horizont). Kein Zwischenladen in einer Stunde mit PV-Überschuss. Reserve-Survival später in der Woche bleibt erhalten.
- Hours Cover Morgengrauen: 3-h-Lookahead allein zählt nicht als „schon in PV“.
cover_window_hours_pvendet an der heutigen ersten guten PV-Stunde (nicht morgen 07:00). Survival-Stopp-SOC (O4) = Reserve-Floor (min_soc_pct) nur unter dem Floor; sonst Trajektorie/Ziel (nie unter Live-SOC). Interim-Zwischenladen nur bei echteme_gap(nicht volle Stunde bei 0). - Anlagenprognose Aufklapper: anlagenspezifische Sätze — Mehr-Netz-kWh + € gegenüber ohne Speicher; größerer Speicher mit kWh + weitere €/Jahr. Regelungskonzept (laden bei Cover-Lücke; Entnahme in günstigsten Stunden nur wenn nicht autark aus PV+Speicher gedeckt). Portal Sie / Sparvo du. Hours-JSON unverändert.
- Anlagenprognose Speicher-Kachel: Sinnvoll nur, wenn Jahres-€ günstiger und Ø ct/kWh nicht höher als Ist — sonst Ist / „passt“. Hours-JSON unverändert.
2026-08-23
- Hours Cheap-Hold (v1.4): Nur wenn PV+Speicher den prognostizierten Bedarf nicht decken (
load_covered_by_soc_pv=false): O12 = 0 in den günstigsten N Stunden des Kalendertags, wenn gerade nicht geladen wird (cheap_hold) — Haus aus dem Netz. Ist der Bedarf gedeckt, bleibt die Entnahme an (kein spekulatives Hold). Währendcharge_nowvolle Cap. N =ceil(Tageslast/Lade-kW). Jahres-Kachel dieselbe Cover-Lücke. Feldercheap_take_hours,hour_is_cheap,cheap_hold. - Anlagenprognose Speicher-Kachel: Text auf N günstigste Stunden + Winter-Ø (nicht Autonomie-Tage). Sinnvoll nur, wenn das Jahr günstiger als Ist ist — sonst Ist / „passt“. 24 h-Tageslast ist Untergrenze nur solange Extra-kWh nicht teurer werden. Hours-JSON unverändert ohne Jahres-€.
- Hours-Cap adaptiv, kein Default 36: ohne Request-Cap gilt
ceil(Nutzband/kW)+12, max 168.max_hours_today(Default 12) wird auf diesen Cap geklemmt.basis.storage_horizonohne Jahres-€/Leiter (nur Autonomie/Defer/Cap). Jahres-Spot und sinnvolle Speichergröße nur Anlagenprognose (4 Saisonwochen + Börsen-Ø 12 Monate). - ExtractHoursDemand v1.15: Fallback nach 12 h ohne API (Sommer 11–15 / Winter 01–03, Ziel 35 %). Txt2/Txt3: „keine Netzladung notwendig“ /
X Std, Y kWh. Wiki/Verdrahtung an v1.15 angeglichen. Relais-Latch nach Stundenwechsel zurückgesetzt; Jahreswechsel zählt als stale. - Anlage Folgetage SoC: Portal/Sparvo zeigen Ohne·Mit Netz pro Folgetag zur nächsten Morgensonne (wie „Bis morgen früh“), nicht mehr um 24:00. Letzter Tag ggf. mit Prognoseende-Stempel.
- PV-Tagesnavigation D0–D6: Portal Anlagenprognose und Sparvo Anlage zeigen im PV-Balkendiagramm wieder alle 7 Tage (heute…D+6) — UI hatte fälschlich auf 6 Tage gekappt; Backend/API lieferten bereits 7.
- Grid-Charge Dispatch vereinheitlicht: Jahres-Speicherrechnung (Familie B) und Hours-EMS nutzen dieselbe
grid_charge_dispatch-Simulation — günstige Stunden immer FORWARD über das adaptive Fenster dieser Speichergröße (kein Default 36 h). Adaptivemax_hours_horizon: ohne Request-Cap aus Speicher+Ladeleistung (need_h+12, max 168). Portal zeigt Planungsmeta + Warnung bei Preis-Heuristik ohne Hours-Engine. fc-verification bleibt generischer Archiv-Vergleich (Slider kWh/kW), nicht Anlagen-SOC-Simulation.
2026-08-30
- Anlagenprofil Jahresverbrauch (Zähler): Statt recency-gewichtetem Typical × 365 jetzt arithmetisches Mittel vollständiger Zählertage seit Zählerstart (ohne Baseline-Tag und ohne heute) × 365, auf 100 kWh aufgerundet — ein Wert für Portal, Sparvo, Hours, Outlook, Sparpotenzial. Tages-/Hours-Last bleibt recency-Typical.
2026-08-22
- Anlagenprofil Jahresverbrauch: Typical-Zählertag × 365 (auf 100 kWh aufgerundet) wird ins Profil geschrieben (Portal/Sparvo öffnen + speichern, Telemetry inkl. SOC-only, Hours, Outlook, Sparpotenzial) — nicht nur angezeigt. Stale Formularwerte (z. B. 6000) überschreiben die Hochrechnung nicht.
- Adaptive Entladung Reserve-Schutz:
discharge_power_kw(O12) drosselt nur nahe am Mindest-SoC und wenn kein wirtschaftliches Nachladen geplant ist (Interim-pass/ keine Charge-Slots). Sonst volle User-Cap. Ladestunden bleiben bei voller Cap (WR zieht ohnehin Netz+PV). 0 kW nur an/unter Min-SoC ohne Nachladen oder bei User-Cap 0. Kein Spot-Hold mehr. Hours +plant.plan_updatedlieferndischarge_reason; ein Cap-Wechsel gilt als material (Webhook). - ExtractHoursDemand v1.11 (Breaking): API-Felder
prefix_*stattloxone_*; neucharge_now,charge_stop_soc_pct,target_soc_pct,capacity_kwh. O3 =charge_now(Relais), O4 = Stopp-SOC %, O9 = Rest-kWh (SOC-Delta), O1 = 0 wenn O9=0. PicoC neu einfügen unter/docs/loxone-hours. Legacyloxone_*in alter JSON bis Re-Decide lesbar. - Hours Interim Econ Default ON:
HOURS_INTERIM_ECONist an (Kill-Switch=0).plant.plan_updatedenthält dieselben EMS-Skalare (prefix_*,charge_now,charge_stop_soc_pct,discharge_power_kw,adaptive_discharge,min_soc_pct,charge_power_kw,grid_charge_allowed). - Speicher-Horizont physikalisch: Jahres-Spot-€ rechnen PV→Speicher / Speicher→Last / Restimport in derselben Stunde. Günstige Stunden füllen nur freien SoC — kein Umlegen der Jahres-kWh auf Billigstunden (sonst wirkte 5 kWh günstiger als 30 kWh).
- UI Dezimaltrenner immer Komma: Portal/Sparvo/Admin-Anzeige und Loxone-
txt_*nutzen,in DE und EN (fmt_num/SpotDecimal).data-*/ JSON / CSS-Variablen bleiben ASCII-Punkt. - Sparvo Balken-Focus: Klick zeigt wieder kWh/ct (Rohzahl in
data-price, Format nur in der Anzeige). - Anlage Explain Notstrom-Reserve: „Ohne Netz“ rollt mit Profil-Mindest-SoC (Notstrom-Reserve), nicht 0 %-Floor. Interim-
passentfernt Survival-Slots nicht mehr — Reserve-Ladung bleibt im Plan. Copy: Zwischenladen vs. Direktbezug +{min} %Reserve — nur wenn Speicher+PV das Cover-Fenster nicht schon decken (sonst „gedeckt“). Folgetage: Ohne·Mit Netz immer sichtbar; Mit ausgegraut wenn gleich (<1 %-Diff). O12-kW-Hinweis unter der Plan-Karte entfernt. - Netzladung-Explain Plan-Summary: Portal/Sparvo ersetzen Chip/Period-Pill durch: nächster PV-Ertrag in X h ab HH:MM · Netzladestunden bis dahin · Liste Folgeladungen (Datum, Tages-kWh, Start·kWh). ⓘ nur bei Cover-Stretch → Mindestladestand. Dump/Bridge/aus/keine Ladung unverändert Chip+Text.
- Ladestunden-Hinweis: Pro geplanter Stunde kurzer Grund (
survival→ Erhaltung Mindestladestand, Cover → günstigste Stunde, Opp → günstiges Netzladen, Bridge → Übergangsladung).
2026-08-21
- Anlage UI V1: Sparvo/Portal Reihenfolge Live → PV (Stats nur Tages-PV-kWh) → Plan/Explain → Rest. Plan-Span-Grafik Last + SoC Mit·Ohne bis Morgensonne; KPI am Morgenende. Live-Zählerstand-Label „seit {Datum}“ (
meter_baseline_at/ Reset-Fallback). - Hours Interim Econ (opt-in): Env
HOURS_INTERIM_ECON(Default aus). Wenn an: droht SoC-Bruch vor der nächsten Billigstunde, Vergleich Zwischenladen-€ vs. Spot-Pass-through; Laden nur wenn strikt günstiger (+0,02 €EPS).period_hours_todaykann kürzer werden (Cap 5 h); EMScharge_hours_todaydann max. ein Interim-Slot (spätere Cover-Slots bleiben inday_plan/charge_hours). Additive Felder:period_hours_today_default,interim_period_active,interim_needed,interim_decision,interim_period_cap_h,interim_cost_*_eur,interim_slot_start,interim_reason. Extract O2 unverändert. Details: Hours Demand. - Explain: nächste geplante Netzladung klar: Chip/Headline bei
laterzeigen Tages-kWh + geplante HH:MM des nächsten Ladetags (nicht EMS-Gesamt-Soll und nicht den Nachtende-Stempel). Folgetage-Stempel als Von–Bis-Range (night_end→ Reserve/letzter Rest-Ladetag). Unter beiden Karten Tagesblöcke (kWh + Zeit-Chips); Survival-Slots optisch markiert (survival) mit Kurz-Tipp. 10‑Min-Pollhx11. - Anlage Explain zwei Horizonte: Portal/Sparvo trennen Bis morgen früh (Balken Last/PV/Speicher nur bis
cover_window_hours_pv) und Folgetage (Cover-Rest bei Stretch). Speicher immer Mit·Ohne Netz. PV-Woche: Dual-EOD D0…D6 + Statszeile Last·PV·Speicher Mit/Ohne. Skip-Copy im Futur; 10‑Min-Poll malt beide Karten neu (hx10). - Hours ↔ Loxone Netzladung bidirektional: Decide-JSON Top-Level
grid_charge_allowed(EMS-Anfang). ExtractHoursDemand v1.17 → O10 = 0/1. Schreiben: PartialPOST /v1/plant/telemetry{"grid_charge_allowed":0|1}(VO wie SOC/Meter). Feld weglassen = Profil unverändert. Last-Write-Wins mit Sparvo/Portal. - Hours Nacht vs. Reserve: Explain trennt Diese Nacht (
cover_window_hours_pv, erste Morgensonne) und Reserve hält (cover_window_hoursnur beicover_extended_for_reserve). SoC ohne/mit Netz an beiden Stempeln. Chip bleibt „Heute N h · insgesamt M h“. Heute 0 / Woche > 0 bleibtcharge_kind=later(Mit-Netz am Reservestempel weiter sichtbar). - Master-Schalter
grid_charge_allowed: Default an. Aus →hours_needed*=0, leere Slots, Kindgrid_off/ Reasongrid_charge_disabled. Dump wirkungslos. Explizites Telemetry-Feld darf das Profil setzen; Decide ohne Feld liest nur. Sparvo + Portal Standort + Anlage-Badge. - Mittags-Skip
pv_will_fill_today: Look-ahead (PV×0,70, Kalendertag der Stunde, frischer SoC) ersetzt die Ein-Stunden-PV-Formel. Restplatz statt Binär-Skip. Survival-Kandidaten vor Fill. SNAP bleibt Geräte-Layer. - PV-Karte Tagesende: D0 zeigt Mit Netz / Ohne Netz (
soc_end_pct_with_grid/soc_end_pct_no_grid; Aliassoc_end_pct= Mit Netz). - Portal/Sparvo Netzladung-Erklärung: Chip/Headline trennen heutige EMS-Stunden und Stunden bis Planende (kein „32 kWh in 1 Stunde“ mehr). Übersprungene günstige Stunden sind chronologisch mit Wochentag+Datum; mehr als 6 Zeilen verlinken auf
/plant/skipped-hoursbzw./plant-outlook/skipped-hours. - Hours Cover bei schwachem Wochenende: Mindest-SoC gilt über D0…D6, nicht nur bis zur ersten Morgensonne. Sitzt der Speicher Samstag/Sonntag auf der Reserve, ohne dass PV ihn trägt, verlängert die Engine das Cover-Fenster (
cover_extended_for_reserve,cover_window_hours_pv= erste PV-Erholung) und plant verpflichtende Netzladung (Tiefe unter der Reserve, nicht die Wochen-Netto-Last). Anheben des Mindest-SoC (z. B. 20→40 %) darf die Tagesende-Stände nicht nur auf den neuen Floor klemmen. Portal/Sparvo Wochenblick und Hours-API teilen denselben Pfad. - Loxone
d0_soc_eodLastform: SoC-Tagesende rollt mit derselben stündlichen Last/PV-Form wie die Anlagenprognose (Zähler/Profil, D0 ab aktueller Stunde). Flat 1/24 nur noch Fallback ohne Meter/Shape. Semantik bleibt „Mitternacht heute“; Zahlen können sich gegenüber dem alten Gleichverteiler unterscheiden. - Portal/Sparvo Timeline-Label: DE „Zu Planende am {Zeit}“ (vorher „Am Planende um …“); EN unverändert „At window end / at {time}“.
- Anlagenprognose D0-SoC ab jetzt: Tagesende-Roll startet mit Live-SoC erst ab der aktuellen lokalen Stunde (kein erneutes Verrechnen Mitternacht→jetzt). Nach Hours-
day_planwird der SOC-Pfad mit denselben Ladechips neu verkettet. Loxone-Display-Pack nutzt dieselbe D0-from-now-Logik. Verhindert unplausibles Tagesende vs. Planende ohne Netzladung.
2026-08-20
- Wiki
access.tier: dokumentierte Werte sindbasic,community,full_trial,full_active(nichtprofessional/oemals JSON-Enum). Die Rate-Limit-Tabelle nutzt dieselben Codes; Professional/OEM bleiben Produktlabels. Telemetry-Softcaps: Community 2000/Tag, bezahlt 10000/Tag. - Webhooks: Registrierung und Versand nur HTTPS zu öffentlichen Hosts (HTTP, Loopback, RFC1918 abgelehnt; keine Redirects).
GET /v1/statusenthält keincache_pathmehr. - Hours Cover-Last bei dünner Zähler-Telemetrie: WD/WE-Stundenform behandelt fehlende Samples (
None) nicht mehr als 0 kWh. Tage mit <12 beobachteten Stunden fließen nicht in die Shape ein (Fallback flat 1/24); nie gesehene Stunden bekommen eine Flat-Prior. Flat-Overlay hält Rest-heute positiv (so_far + typical × Restanteil), damit Abend/Nacht im Cover nicht auf 0 fallen. Verhindert Planende-SoC ~100 %, wenn die Nacht im Cover-Fenster liegt (z. B. EMS sendet nur nachmittags). - Portal/Sparvo Planende-Speicherstand: „Zu Planende“ / Ohne·Mit Netz rechnet den SoC stundenweise über das Cover-Fenster (nicht mehr PV−Last als Fenster-Summe). Bei schon vollem Speicher clippt Nachmittags-Überschuss — die Nacht entlädt den Speicher plausibel. Basis liefert
hourly_load_cover_kwh/hourly_pv_cover_kwh/hourly_grid_charge_cover_kwh. Cover-Fehlbedarf nutzt zusätzlich denselben chronologischen Check (maxmit Bulk), damit „Keine Netzladung“ nicht fälschlich gilt, wenn die Nacht unter den Mindest-SoC fällt. Planende-Uhrzeit = Stundenbeginn + Cover-Länge (Ende der letzten gerollten Stunde). Rest-heute-Last wird über alle Reststunden heute verteilt (nicht nur Stunde 0). Dump/Opp nach dem Cover-Fenster hebt den Planende-SoC nicht. Engine-Cover-Last/PV = Summe der Stunden-Serien (kein paralleles Flat-Cover mehr). Legacy-Snapshots ohneprojected_soc_pct_with_griderfinden kein Mit-Netz mehr per Energy-Lump; Opp-Cap nutzt chronologischen Cover-Bedarf. Bulk-Fallback respektiert ebenfallsallow_untimed_grid_lump.
2026-08-19
- Hours Demand v1.3 — SOC-taugliche Netzladestunden: Engine
hours_demand_v1.3wählt Ladezeiten nur, wenn im Speicher Platz ist und PV die Stunde nicht schon füllt. Günstige aber unmögliche Stunden landen inskipped_slots[](immer mitgeliefert); verschobene Ladung in späteren feasible Slots.plan_feasibilitymeldetpartial/storage_undersized, wenn nicht alle kWh untergebracht werden können. P1-Survival vor Preis; stündliches Lastprofil (WD/WE-Form) im SOC-Roll. Portal/Sparvo-Erklärung: neue Reason-Codesslots_skipped,storage_undersizedplus Zeilen wie „16:00 günstig, Speicher voll → nächste Ladung 03:00“ im Block Netzladung (Live-Resolve). PicoC/Extract unverändert (additiv). Details: Hours Demand. - Plant-weather für neue Standorte: Tägliches
spotforecast-plant-weatherscannt aktive API-Keys mit Lat/Lon inuser_plant_locations(Discovery ohne Extra-Timer) und schreibtdata/plant_weather/{api_key_id}/. Zusätzlich: Geo-Save im Portal und erster PV-/Weather-Request (On-Demand). Verzeichnisrechte*:forecastmode2775. PV-Forecast Loxone-Pack nutzt denselben Request-Pfad-Wetter-Payload für Tmin/Tmax, auch wenn der Disk-Write einmal fehlschlägt. - Live-Leiste Tagesverbrauch nach erstem Zähler-Ping: Portal/Sparvo Tagesverbrauch heute bleibt warte auf Zählerdaten (API
day_import_kwh=0), bis die erste positive Differenz da ist. Der erste kumulierte Stand (oder 0-Platzhalter, dann der echte Stand) ist nur Baseline — nicht der Tagesverbrauch. Bei neuem API-Key kein manuelles Zähler zurücksetzen nötig.
2026-08-18
- Hours EMS-Period bis Mitternacht:
period_hours_todayist Reststunden bis 23:00 (00:00 → 23, 13:00 → 10, 22:00 → 1). Um 23:00 wieder 24. Demand/charge_hours_todaynur Slots in diesem Fenster (Stunde 23 erst ab 23:00). Extract O2 mappt das Feld (fehlend/<1→ 24).
- Portal/Sparvo Netzladung-Blöcke: Cover-Headline und „Günstigste Ladezeiten“ kommen aus demselben Live-Hours-Plan wie der Wochenblick (
hours_decisioninbuild_plant_outlook). Speicherregeln, Dump und Standort speichern den Explain-Snapshot neu. Ein veralteter EMS-Snapshot ändert nur nochcharge_power_kw, nicht die Stundenzahl ohne neue Slots.
- Hours Netzladeleistung:
charge_power_kwistmin(battery.max_charge_kw, Netzanschluss × 0,80 − Grundlast)(20 % Reserve wie Sparvo-Geräte).hours_neededteilt die Soll-kWh auf so viele günstigste Stunden auf, wie diese Leistung hergibt (20 kWh bei 10 kW-Anschluss → 3 h bei ~8 kW Headroom, nicht 1 h × 20 kW).
- Hours/Profil Mindest-SOC-Default 20 %: Wenn Request und Anlagenprofil
battery.min_soc_pctleer lassen, Engine-Default 20 (vorher 15). Gespeicherte Profilwerte bleiben unverändert. UI: Portal/settings/locationund Sparvo Einstellungen → Speicherregeln (/settings#sv-storage-rules) mit Slidern für Mindest-/Ziel-Speicherstand (0–100 %) und Netz-Puffer (0–50 %, Default 10 %). - Hours Validation:
battery.min_soc_pct/target_soc_pctaußerhalb 0…100 →invalid_input(wie Cover-Puffer 0…50). - Portal/Sparvo Anlagen-UI — weniger Doppelungen: Live-Leiste ist die einzige Anzeige für Speicherstand, Tagesverbrauch und Zählerstand (Portal
/plant-outlook, Sparvo/plant). Darunter nur noch Steuerung: manueller Start-Speicherstand (Slider, Fallback ohne Live-Telem) und Zähler zurücksetzen — kein zweites Value-Grid bei aktiver Live-Telemetrie. - Hours-Erklärung: Chip + Headline reichen — der zusätzliche Netto-Kurzsatz unter der Bilanz entfällt (gleicher Fehlbedarf wurde dreimal gezeigt).
- Sparvo
/plant: Reihenfolge Live → Hours-Erklärung → PV-Tageschart; Block Geplante Netzladung zeigt nur Preis/kWh je Stunde (Tag wechseln), Bedarf steht in der Erklärung darüber.
2026-08-17
- Hours/Portal Lastprofil — Same-Day-Overlay: Geschätzter Tagesverbrauch und Rest-heute mischen Typical mit Zähler-Ist über die WD/WE-Stundenform (kein
bisher/h×24). Unvollständiges Heute zählt nie als ganzer Tag, auch nicht für D+1. Gleiche Zahl in Hours, Sparvo-Live-Leiste und Outlook-D0. Engine-Tag bleibthours_demand_v1.2. PicoC unverändert (Felderhours_needed*/d0_load_kwhgleich). - Loxone Docs-Konsolidierung + PicoC-Audit: Kanonisch Loxone Überblick (ein Host-VO, Minutenplan, max. 8 PicoCs). Wetter v1.1 Start+:10 (nicht mehr :05 neben Hours-Decide). Forecast Debug v5.5 Start+:01. Windows v2.2 Auto :03. Hours Extract v1.8 liest JSON beim Start. PicoCs in den Guides ersetzen.
- Loxone PV Forecast Auto-Fetch v1.1 / Extract v2.1: Debug holt beim Start (~3 s) und danach stündlich um :08 (nicht :05, damit Hours-Decide frei bleibt). Extract liest eine vorhandene
spotprice_pv.jsonsofort nach Miniserver-Neustart. Hours-Nutzer: denselben VO-Parent wiederverwenden, nur BefehlFetchPvForecastergänzen. Beide PicoCs neu einfügen:/docs/loxone-pv-forecast. - Loxone PV Forecast Extract v2.0: Ein GET
/v1/plant/pv-forecastliefert nebend0_kwh…d6_kwhfertige Klartextzeilentxt_d0/txt_d1(Wochentag, Datum, PV, optional Last, SoC-Tagesende, Tmin–Tmax) plusweek_kwh,d0_load_kwh,d1_load_kwh,d0_soc_eod,d0_tmax,d0_tmin. Fehlende Teile werden weggelassen (kein Default-SoC 30 %). SoC-Tagesende inkl. Netzladung nur bei frischem Hours-Snapshot; sonst PV gegen Last.loxone{}steht am JSON-Anfang. PicoC Extract v2.0 (O1…O13, Txt1…Txt3), Debug bleibt v1.0. Guide:/docs/loxone-pv-forecast.
- Hours Demand Cover-Puffer: Default 10 % auf positiven Cover-Fehlbedarf (
battery.cover_buffer_pct/ Anlagenprofil; Portal Standort + Sparvo Einstellungen → Cover-Puffer, 0–50 %).energy_charge_kwhund Stunden enthalten den Puffer; 0-Fehlbedarf bleibt 0. Engine-Tag bleibthours_demand_v1.2. - Sparvo Cover-Puffer in Einstellungen: Feld unter Einstellungen → Cover-Puffer (
/settings#sv-cover-buffer) und Günstiges Netzladen (/settings/dump) — nicht nur Anlage → Standort. - Netzladung-Copy: Chip/Headline auf Portal und Sparvo Anlage nennen die Soll-kWh in der geplanten Stunde (laden nur bis die Menge da ist), nicht „für 1 Std.“.
- Loxone FetchPlantHours v1.9 + ExtractHoursDemand v1.7: SOC-10%-Stufen steigend und fallend → Telemetry+Decide; I7 alle 15 min Telemetry, Decide nur smart (heute noch Bedarf und SOC steigt); I8 :05 Fallback; 3 min Cooldown. Extract O1/O9 folgen der API auch nach unten (Netzladung kann enden). PicoC neu einfügen unter
/docs/loxone-hours.
- Hours Demand — Slots ab jetzt: Ladezeiten und Preisranking gelten ab der aktuellen lokalen Stunde (keine vergangenen Mitternachtsslots mehr).
hours_needed_today=0bleibt 0 (kein Fallback auf die Wochenzahl). Portal/Sparvo leeren Charge-Chips an Tagen ohne Engine-day_plan; D0 verwirft Stunden vor *jetzt*. energy_charge_kwh: Soll-Netzbezug auf die nächste ganze kWh aufgerundet (1,4 → 2), nicht max. kW × Stunden. EMS-Felder stehen am JSON-Anfang (Loxone Extract ~2,3 KB fread).- Portal/Sparvo Netzladung-Chip: Bei heute=0 aber Folgetagen >0 nicht mehr „Keine Netzladung nötig“, sondern nächste Netzladung (
next_charge_start/next_charge_hours) — gleiche Semantik wie Extract Txt3. Wochenblick-Chip Nächste …. - Loxone ExtractHoursDemand v1.5: neuer Ausgang O3 =
energy_charge_kwh(optionaler kWh-Limiter) plus Energy-Ratchet. Fetch bleibt v1.8. PicoC Copy-Paste unter/docs/loxone-hoursneu einfügen.
2026-08-16
- Docs Sync: Loxone-Überblick / Hours / Telemetry / Plant-Telemetry auf Fetch v1.8 + Extract v1.4; Hours Demand dokumentiert Cover/Dump/Bridge; Telemetrie-Guide verweist auf Hours für den PicoC-Paste (kein Doppel-Embed).
- Loxone FetchPlantHours v1.8 + ExtractHoursDemand v1.4: Abwärts-SOC-Stufen 90→80→…→0 triggern Telemetry+Decide (neben stündlichem :05); Extract hält Demand am Kalendertag nur nach oben (
N_locked), Mitternacht Reset. Docs DE/EN Hours + Telemetrie + Code-Samples synchron. - Hours Demand Bridge-Fix: Übergangsladung (
hours_needed_bridge) nur noch wenn Dump/Opp an ist. Bei ausgeschaltetem „Günstiges Netzladen“ und gedecktem Cover →hours_needed = 0(kein künstliches 1h-Bridge mehr). Engine-Tag bleibthours_demand_v1.2. - Portal/Sparvo Netzladung-UI: Cover-Fehlbedarf vs. Dump-Auffüllen getrennt (Chip/Headline/Netto); Dump-Status + Grenzpreis in der Section; Sparvo Einstellungen → Günstiges Netzladen (
/settings/dump).
2026-08-12
- PV/Weather Audit-Fix: Request-Pfad Open-Meteo-Timeout 8 s (kein 60 s Worker-Freeze);
cache_needs_refreshohne Daily-Refresh-Loop;wind_speed_unit=kmh; Loxone-Doppel-GET-Coalesce für Klassenpv/weather;not_availablevor Quota-Reserve + Middleware-quota_class(access_denied/pv/weather) damit Basic nicht Decision-Fair-Use frisst. - Plant-Wetter Schema v2 live: Cache enthält Display-Felder (Feuchte, Druck, Wind, Wettercode, Daily Min/Max/Sonne); Timer
spotforecast-plant-weather05:20 Wien; Deploy startet Refresh im Hintergrund bei Schema-Heal. - PV Forecast + Weather APIs (öffentlich):
GET /v1/plant/pv-forecast(7-Tage-Ertrag kWh, Klassepv, Community 48/Tag) undGET /v1/plant/weather(Standortwetter, Klasseweather, 48/Tag). Docs DE/EN:/docs/pv-forecast,/docs/weather; Loxone-Guides/docs/loxone-pv-forecast,/docs/loxone-weathermit PicoC Debug/Extract v1.0 + Flow-SVGs. - Hours Info-ⓘ UX: Tipps in Portal/Sparvo erscheinen am angeklickten ⓘ (fixed) und schließen bei erneutem Tip/Klick, Außenklick, Scroll, Resize oder Escape.
- Wochenblick-Copy: „(Shared Engine)“ aus sichtbaren Portal-/Sparvo-Texten entfernt (Quelle + Charge-Hinweis).
- Live-Leiste UX: Untertitel unter „Geschätzter Tagesverbrauch“ (Zählerhistorie / Lastprofil) auf Portal
/plant-outlookund Sparvo entfernt — Kachel zeigt nur den Wert. - Portal/Sparvo Wochenblick — Audit-Fixes: fehlendes
strip_aria-i18n, Demo-Hinweis statt stiller Hide, Explain-Link nur wenn Wochenblick vorhanden, Balkenhöhe/CSS, Sparvo-Glance-Refresh, Loxone-Hours Prosa O1/O2 → Today-Slice v1.3, DE Hours an EN angeglichen. - Portal/Sparvo Wochenblick Hours: Anlagenprognose und Sparvo Anlage zeigen den 7-Tage-Plan (
day_plan, Default-Horizont 168 h) aus der Shared Engine — getrennt vom Cover-Planfenster / letztem EMS-Decide. Docs DE/EN Hours + Loxone Extract-Tabelle synchronisiert. - Hours Demand v1.2 — Dual-Horizont: Default-Planhorizont 168 (Request überschreibt). Caps
max_hours_today=12/max_hours_horizon=36. Response additiv:hours_needed_today,charge_hours_today,period_hours_today,day_plan. EMS/Loxone Extract v1.3 liest Today-Slice (Optimierer-Period bleibt 24). Portal/Sparvo Anlagenprognose übernimmt Charge-Chips aus Shared Hours Engine (side_effects=False). Webhookplant.plan_updatedcompact (Today + URL). Opp weiter nur unter Grenzpreis; Cover weiter PV-Recovery.
2026-08-10
- Dump-Szenario lead-aware:
dump_scenario_ct_kwh/dump_scenario_eur_mwhblenden bei pct > 0 Richtungprice × pct/100mit Lead-Gewicht D+1=1.0/ D+2=0.45/ D+3+=0.30(nie über dem Modellpreis). Scope bleibt Mittag (midday_11_16) — keine Abend-Dump-Korrektur.price_ct_kwhunverändert. Clients sollendump_scenario_*aus der API nutzen, nicht lokal neu berechnen.
2026-08-06
- Live-Leiste Auto-Refresh: Portal + Sparvo Live-Anlage aktualisiert ca. alle 15 Min bei sichtbarem Tab (
/plant-outlook/live-telem, Sparvo/api/live-telem) inkl. Zeitstempel — ohne vollständigen Seiten-Reload. - Geschätzter Tagesverbrauch früher aus Zähler: Portal (
/plant-outlook), Sparvo Live-Telemetrie und Hours/Lastprofil nutzen Meter-Historie ab ≥1 vollem Zählertag (vorher ≥2); bis dahin weiter Jahres÷365. Docs DE/EN + Code-Samples synchronisiert.
2026-08-05
- Docs / Code-Samples Sync (Hours v1.1):
/docs/hours-demand+/docs/plant-telemetry(DE/EN) und Portal/code-samplesHours erläutern Cover bis PV, Spike-Dämpfung und ≥2 volle Meter-Tage; Samples druckendecision_engine,cover_window_hours,remaining_today_load_kwh. - Portal Live-Telemetrie-Hinweis: geschätzter Tagesverbrauch erkennt
site_meter_history_*korrekt (vorher nur exakter Matchsite_meter_history→ fälschlich Jahres÷365-Hinweis). - Plant Telemetry / Outlook: SOC-Pings speichern Historie (
plant_soc_samples); Anlagenprognose zeigt stündliche Last/PV/SOC-Simulation (soc_model=hourly_v1); Tageschart: Last/SOC per Haken, PV-Balken immer an. - Hours Demand — Last-Lernen Spike-Dämpfung: Typical aus Meter-Tagen mit Soft-Cap (≤2× Median der letzten 4 Tage) + 25 % Robust-Blend — nachhaltiger Lastsprung folgt weiter, einmalige EV-/Spike-Tage übersteuern die Netzstunden-Planung nicht.
- Hours Demand v1.1 — Cover bis PV-Erholung: Engine lädt nur die Energie-Lücke bis zur nächsten guten PV-Phase (Rest-heute + D0/D1-Fenster, Cap ~Rest-heute+36 h), nicht die volle 7‑Tage-Last. Lastprofil: recency-weighted Tagesmittel (Halbwertszeit ~2 d, WD/WE).
charge_hoursbevorzugt Slots im Cover-Fenster. Neue Basis-Felder:cover_window_hours,remaining_today_load_kwh,horizon_load_kwh; Engine-Taghours_demand_v1.1. - Portal plant-outlook Last/PV/SOC: Chart-Last aus Meter-Δ-Tagesbuckets (+ Hours-Schätzung für D0…D6); SOC-D0 = Live; Client-Refresh alle 15 Min. via
/plant-outlook/data; Wochenzeile = Netz-Ladekosten (nicht Haushaltsverbrauch). - Portal plant-outlook Zählerstand: Anzeige von Zählerstand Import + Tagesverbrauch in der Karte „Live-Telemetrie (EMS)“ wiederhergestellt (Regression nach Telemetrie-Strip).
- Loxone Nur Telemetrie Guide: neue Community-Seite
/docs/loxone-telemetry(DE/EN) nach Überblick — Analogspeicher-Verdrahtung, Screenshot, FetchPlantHours v1.7 Copy-Paste; Nav + Pager +/docs-assets/…. - FetchPlantHours v1.7: O4-Puls ~1 s für Analogspeicher-Set; Txt weist auf Memory→VO
<v.2>; toterpulseTel-Pfad entfernt; Zähler-Betrag für VI/Checks (meterAbs). - Portal SOC slider vs Live-Telemetrie: Hours/Telemetry-SOC (
hours_api) überschreibt manuelle Slider-Werte und sperrt den Slider (~36 h Frische) auf/plant-outlookund Standort-Einstellungen; ohne frischen API-SOC bleibt der Slider als Fallback. - Telemetry Rate-Limit: Softcap für
/v1/plant/telemetryauf 2000/Tag (Community) bzw. 10000/Tag (sonst) angehoben — zählt weiterhin nicht gegen Decision-Fair-Use. - Loxone Telemetry
<v.2>+ Partial-POST: API akzeptiert SOC-only / Meter-only Bodies; Docs/VO-Anleitung nutzen offizielle Input-Platzhalter statt<v.ViName>; FetchPlantHours v1.6. - Live-Telemetrie UI (Portal + Sparvo): Strip mit Speicherstand %, Tagesverbrauch heute, geschätztem Tagesverbrauch (Zählerhistorie bzw. Lastprofil) und aktuellem Zählerstand — Startseite Sparvo,
/plant,/plant-outlook. - Loxone FetchPlantHours v1.5 + Telemetry
diag: API erkennt unsubstituierte<v.…>-Tags (hint=loxone_vi_not_substituted) und liefert quote-freiesdiagfür Txt2/Txt3; aggressive Dezimal-Komma-Sanitization; PicoC v1.5 liestdiagzuerst. - Loxone FetchPlantHours v1.3: Telemetry pollt
/user/common/spotprice_telemetry.json(wie Decide) — Txt1/Txt2 + O13 zeigen OK/FAIL/Timeout statt nur „Telemetry done“. - Plant Telemetry API: leerer/ungültiger Body → HTTP 200 mit
telemetry_status+hint(kein FastAPI-422 mehr); akzeptiert auch fehlendesContent-Typeund Dezimal-Kommas in Zahlen. - Portal Anlagenprognose — Live-Telemetrie:
/plant-outlookzeigt SOC-Quelle/Zeit, Zählerstand Import, Tagesverbrauch bis jetzt, Zähler-Zeitstempel; Button Zähler zurücksetzen (nächster EMS-Ping = neuer Startwert). Erster Zählerwert (z. B. 3725 kWh) ist immer Baseline (meter.is_baseline). - Telemetry API Response:
meter.is_baseline,meter.import_kwh_total,meter.observed_atexplizit; Docs DE/EN synchronisiert. - Rate-Limit-Header auf Erfolg: erfolgreiche
/v1/*-Antworten tragen jetztX-RateLimit-Limit,X-RateLimit-Remaining,X-RateLimit-ResetundX-RateLimit-Scope(wie bei 429;Retry-Afterweiter nur bei 429). - Decision Windows fehlende Params: fehlende
start/end/mode/role→ HTTP 400incomplete_request(wie Docs; kein FastAPI-422 mehr). - API usage — Loxone double-GET coalesce: Identical
api_key+ path + method within 3 s logs asquota_class=duplicateand does not increment portal/rate-limit counters (request still answered). Fixes Miniserver Virtual Output analog double-fire. Loxone tip: enable Use as digital output, leave Command OFF empty. DebugSpotpriceFile v5.4 keeps O4 high during fetch. - Loxone Forecast DebugSpotpriceFile v5.4: O4 bleibt während Fetch auf 1 (kein Mid-Pulse
1→0); Trigger nur I1-Rising-Edge + Cooldown. Docs/Samples sync. - Loxone Forecast — doppelte API-Zählung: Ursache war kein Server-Doppelzähler, sondern zwei echte
GET /v1/forecast(~2 s Abstand) vom Miniserver. Typisch: Virtual Output Befehl AUS / Command OFF mit derselben URL wie EIN (PicoC-Puls EIN→AUS = 2 GETs). Fix: Command OFF + Header OFF leer; DebugSpotpriceFile v5.3 triggert manuell nur noch auf I1-Rising-Edge (nicht jedesnEvents). Docs DE/EN +/code-samplessynchronisiert.
2026-08-04
- Landing
#planung-live: Dump-Toggle Ohne Dump-Korrektur \| Dump-Preis entfernt; Ranking/Summen wieder fest auf dem Modellpreis (wie/fc-verification). Day-Navigator, Sparvo und/code-samplesbehalten ihren Dump-Toggle. - Sparvo
/prices+ PDN: negative Preise zeichnen Balken unter der Null-Linie (bidirektionale Skala); PDN-Höhe bei Negativpreisen korrigiert (stärker negativ = länger nach unten). - Loxone Forecast PicoC v5.2 / v17 (live-verified): Debug verlangt echte Forecast-Payload (
"forecast":+price_ct_kwh+ Dateilänge ≥ ~7 KB) — kein False-OK überforecast_status. Parse v17 liest Preis jetzt/+1 h perstart-Needle ohne Pointer-Walk (v11–v16 hingen auf dem Miniserver nach Dump-JSON-Wachstum). Portal/code-samplesLoxone Forecast liefert beide Programme. Docs DE/EN/docs/loxone+/docs/loxone-forecastsynchronisiert. - PDN UI: doppeltes Stunden-/Preis-Label in der Chart-Kopfzeile bei Hover/Touch entfernt (
#pdn-chart-focus); schwebender Tooltip bleibt die einzige Detailanzeige (Landing#strompreise,/forecast,/admin/forecast) - API hygiene —
dump_scenario_*aligned to row price: Nach Copy auf Decision/charge_hours/Windows-Slots werdendump_scenario_ct_kwh/dump_scenario_eur_mwhimmer aus dem Preis dieser Zeile ×dump_risk_pctneu gesetzt (kein Float-Drift durch EUR÷10). Windows-Slots strippen interne_-Keys; öffentliches Ranking bleibt am Modellpreis. - PDN/Sparvo UI declutter: Hinweis „Dump-Risiko“ (Chip, Help-Sheet, Risk-Dot, Sparvo-Hint, Home-Zeile) sowie Tooltip-Text „Möglicher Dump (Illustration)“ entfernt — Toggle Ohne Dump-Korrektur \| Dump-Preis und Mittags-Schraffur bleiben. API-Felder
dump_risk*unverändert. - Sparvo Tap-Fokus: Bei aktivem Dump-Preis zeigt die Fokuszeile den Dump-Preis; bei Ohne Dump-Korrektur die Punktprognose.
- Portal
/fc-verification: Dump-Toggle Ohne Dump-Korrektur \| Dump-Preis entfernt; Spar-Simulation und Chart ranken wieder fest auf dem Modellpreis (Dump-Ranking war für den Mehrwert-Vergleich kontraproduktiv). Dump-Historie bleibt auf/fc-verification/detail+ CSV/PDF. Day-Navigator, Sparvo und/code-samplesbehalten ihren Dump-Toggle; Landing#planung-liveebenfalls ohne Dump-Toggle (Modellpreis). - Forecast API —
dump_scenario_*immer nutzbar:dump_scenario_ct_kwh/dump_scenario_eur_mwhenthalten den Dump-Preis wenndump_risk_pct> 0, sonst den Punktpreis (nienullnur wegen fehlendem Dump). Clients brauchen keinen null-Check mehr; ob Dump aktiv ist, zeigtdump_risk_pct/dump_risk. Öffentliches Windows-Ranking bleibt am Modellpreis. Loxone ParseSpotpriceForecast auf v14 (O6 = immer nutzbarer Scenario-/Punktpreis; Anzeige „Dump-Preis“ nur wenn pct > 0). Docs + Code-Samples synchronisiert. - Forecast API —
dump_risk_pct+dump_scenario_*immer auf Stunden: jedes Stundenobjekt aufGET /v1/forecast(und vererbt aufdecision[]/forecast[]bei Decision, Slots bei Windows,charge_hours[]bei Hours Demand) trägt jetzt immerdump_risk_pct(0…100, nienull) unddump_scenario_ct_kwh/dump_scenario_eur_mwh.dump_risk_pbleibt unverändert 0…1 (Kompatibilität).price_ct_kwh/price_eur_mwhwerden nie überschrieben. - Portal Dump-Preis-Toggle (Decision-Demo,
/code-samples): dieselbe Overlay/Dump-Preis-Ansicht wie Day-Navigator/Sparvo in der Landing-Planungsdemo und den Code-Beispielen — nur Anzeige/Ranking im Portal bzw. im generierten Beispielcode. Die öffentlichen Endpunkte (GET /v1/forecast,GET /v1/decision/windows, …) liefern unverändert den Punktpreis;price_ct_kwhändert sich nicht. - Docs/Samples Sync — Dump-Risk & Feld
start: Forecast-Docs DE/EN korrigierentimestamp→start; Dump-Risk nur auf KI-Stunden (forecast_d*), kein Soft-Dump; Loxone ParseSpotpriceForecast v12 (O4 = Risk-Code, O1/O2 unverändert); Portal/code-samplesdrucken optionaldump_risk/dump_risk_p - UI Dump-Preis Default: Day-Navigator (Landing/User/Admin) + Sparvo starten mit Dump-Preis; Min/Max/Ø folgen den angezeigten Dump-/Punktpreisen
- Sparvo/PDN Fokus: Tap/Touch zeigt den angezeigten Preis im schwebenden Tooltip (PDN); Sparvo behält die Tap-Fokuszeile (Toggle: Dump vs Punkt)
- Forecast API — Dump-Risk (additiv):
GET /v1/forecastliefert optionaldump_risk,dump_risk_p,dump_risk_scope,dump_risk_versionauf Mittags-KI-Stunden (11–16 Wien). Kein Einfluss aufprice_ct_kwh/price_eur_mwh. Live-Experiment (ML_DUMP_RISK=live); Kill-Switch0. Portal: Balken-Toggle Overlay \| Dump-Preis.
2026-08-01
- /docs Loxone Verdrahtungsplan: Übersichts- und Detailpläne (ASCII + Checkliste Ausgang→Eingang) für Hours, Windows und Forecast; Überschriften mit Sprungmarken
- Loxone FetchPlantHours v1.1: nach Decide ~3 s warten, dann O1 0→10 für Parse (Fix: O1 blieb auf 10 → kein stündlicher Re-Parse); Telemetry triggert Parse nicht mehr; Diagramme trennen Telemetry vs. Decide-Datei
- Loxone PicoC Härte v1.2: FetchPlantHours pollt
decision_status(Backup/Truncate/Timeout-Restore); Parse Hours/Windows/Forecast starten nur bei O1 ≥10 (nicht bei Fail=9) - Loxone PicoC Härte v1.3: Parse behält letzten Demand bei fehlender Datei; Windows/Forecast VO-Puls ~200 ms (v2.1/v5.1); Fetch-Poll verlangt Status plus
hours_needed/charge_hours - Loxone PicoC Härte v1.4: Demand/Slots nur bei
decision_status=okbzw. gültigem Windows-JSON committen — leere/ungültige Datei nullt den Optimierer nicht mehr - /docs Loxone Versionstabelle: Überblick listet aktuelle PicoC-Stände (Fetch v1.2, Parse Hours/Windows v1.4, Debug Windows v2.1, Forecast v5.1/v11); Guides mit eingebettetem Code synchronisiert
- /docs Einsteiger-Texte: komplette Überarbeitung in einfacher Sprache mit Alltagsbeispielen; Loxone-Guides Schritt-für-Schritt für Nutzer ohne PicoC-Erfahrung
- /docs Prev/Next: auf jeder Docs-Seite inkl. Hub unten Zurück / Weiter zum Durchblättern (Reihenfolge = Sidebar/
PAGE_SLUGS) - /docs Mobile UX: mobile-first Layout, Burger für das Docs-Inhaltsverzeichnis (wie Portal-Hauptnav) und Copy-to-Clipboard-Button oben rechts in allen Code-Blöcken
- Loxone-Integrationsguides (neu): öffentliches Docs-Menü Loxone mit Unterseiten Überblick, Hours & Telemetrie, Decision Windows, Forecast — Schritt-für-Schritt-Verdrahtung und PicoC Copy-Paste unter
/docs/loxone - Hours Demand —
charge_hours[]:POST /v1/decision/hours-demandliefert im Modusdecidejetzt beidecision_status: okimmer konkrete Start-/End-Zeiten und Preise für jede empfohlene Ladestunde, nicht nur die Anzahl (hours_needed) - Plant Telemetry (neu):
POST /v1/plant/telemetry— Übermittlung von Batterie-SOC% und kumulativem Import-Zählerstand; eigene Kontingent-Klassetelemetry, zählt nicht gegen das Decision-Fair-Use-Limit - Hours Demand —
mode: "telemetry": derselbe Ingest-Pfad wie Plant Telemetry ist jetzt auch direkt überPOST /v1/decision/hours-demandmitmode: "telemetry"erreichbar - Bridge-Anteil in Hours Demand: neue Felder
hours_needed_cover,hours_needed_opp,hours_needed_bridgesowieplant_freshnessin der Decide-Antwort - Webhook
plant.plan_updated(neu): wird bei materieller Änderung vonhours_neededodercharge_hours[]an Ihre hinterlegte Webhook-URL gesendet — dieselbe URL und dasselbe Secret wieforecast.updated - Öffentliche API-Dokumentation (neu): vollständiges Developer-Wiki unter
/docs, DE und EN, crawl-bar und ohne Login — ersetzt den bisherigen reinen Status-Link im Footer
Früher
- Decision Windows API (
GET /v1/decision/windows, Enginewindows_v1) — zusammenhängende Zeitfenster mit vollem Constraint-Set (min_gap_hours,max_consecutive,allowed_hours,weekdays,allocation) - Decision API (
GET /v1/decision, Enginequartile_v1) — Quartil-basierte Stunden-Signalecharge/discharge/hold - Hours Demand Core (
POST /v1/decision/hours-demand, Enginehours_demand_v1) — erste Version mithours_neededaus SOC-/Last-/PV-Bilanz - Forecast-Webhook (
forecast.updated) — Push-Benachrichtigung nach jeder erfolgreichen Prognose-Aktualisierung - Forecast API (
GET /v1/forecast) — stündliche EPEX-AT-Preisreihe, 48 h Basic / 168 h Full-Version
Versionshinweise
- API-Version:
v1(im Response-Feldapi_version) - Engine-Tags pro Endpoint:
quartile_v1(Decision),windows_v1(Windows). Hours Demand meldethours_demand_v1.38, solange ein Storage-Plan-Flag an ist. Sind alle Storage-Flags aus und das Lead-Band an, ist eshours_demand_v1.37. Ist auch das Lead-Band aus (HOURS_ECON_LEAD_BAND=0), ist eshours_demand_v1.36. - Breaking Changes werden hier mit Datum, betroffenem Endpoint und Migrationszeitraum vermerkt
Nächste Schritte
- Downloads — aktuelle OpenAPI-Spezifikation mit allen Feldern
- Forecast API · Decision API · Hours Demand API
Community registrieren oder Code-Beispiele mit Ihrem persönlichen Key.