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_engine bleibt hours_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_engine bleibt hours_demand_v1.38. Kill HOURS_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_eod startet 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 frischem day_plan mit energy_kwh > 0. Rollback LOXONE_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_engine bleibt hours_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_kwh bleiben Typical. decision_engine bleibt hours_demand_v1.38. Kill HOURS_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, must und reserve_breach bleiben. Nicht anheben. Decide, DA-Replan und Jahresrechnung. decision_engine bleibt hours_demand_v1.38. Kill HOURS_CHARGE_CRUMB_DROP=0. Alle Anlagen/Keys. PicoC unverändert.
  • Wochenblick: Eine Ladestunde ohne kWh zählt nicht als „1 h geplant“. hours_needed und hours_needed_days zählen nur Stunden mit Netzenergie. Dieselbe Zeile setzt charge_now nicht 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.txt und OpenAPI nennen den live gemeldeten Hours-Tag (Default hours_demand_v1.38). PV-PicoC in llms ist DebugPvForecast v1.6 und ExtractPvDaily v2.7. Sieben Loxone-Detailseiten sind noindex, 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_engine bleibt hours_demand_v1.38. Kill HOURS_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 datetime hat 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_engine bleibt hours_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_engine bleibt hours_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_engine bleibt hours_demand_v1.38. Kill HOURS_WEAK_PV_REDUNDANT_PEEL=0 und HOURS_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_engine bleibt hours_demand_v1.38. Kill HOURS_CHARGE_SURVIVES_USE=0 und HOURS_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_engine bleibt hours_demand_v1.38. Kill HOURS_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_engine bleibt hours_demand_v1.38. Kill HOURS_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_engine bleibt hours_demand_v1.38. Kill HOURS_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 Jahre ab 18 und N- bis M-Jährige sind 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-rest werden 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 true ist keine Stunde. Die Anzeige bleibt der Kalendertag. Survival ohne Lookback, MUST, Prefill, Spill, Interim, Prep und Opp bleiben. Kill bleibt HOURS_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/false zä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 Wochentag true ist nicht Stunde 1 und nicht Dienstag. Kill SPARVO_PLAN_BATTERY_COVER=0. Alle Anlagen/Keys.
  • Flex Windows: JSON true/false zählt nicht als bereits gelaufene Stunden und nicht als kWh im Rezept. Ein Wochentag oder ein Fenster true ist nicht Dienstag und nicht 01:00. Ungültige Zahlen zählen als 0. Alle Anlagen/Keys. PicoC unverändert.
  • Anzeige: JSON true/false und ungültige Zahlen sind kein Spot-Betrag. Als Aufschlag oder kWh zählen sie 0. Alle Anlagen/Keys.
  • Entladung, Woche, Speichergröße: JSON true/false ist 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/false ist keine Nacht- oder Horizontstunde, kein Vorratspreis und keine 1-€-Decke, kein Dual-Contract-Tag und kein EMS-Clear-Zähler. Ein Preserve- oder Hold-Index true ist nicht Stunde 1. Ein Session-Zähler true ist 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 Profilfeld true ist 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/false ist 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üllt true nicht 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ählen true nicht 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:00 bleibt 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/windows und /v1/plant/device-schedules sind 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_engine bleibt hours_demand_v1.38. Kill HOURS_COVER_EARLY_PLACE=0. Alle Anlagen/Keys. PicoC unverändert.

2026-10-04

  • Einspeisung ist die Tagesmenge: export_feed_kwh fü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_kwh ist 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 (weiter survival). 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_engine hours_demand_v1.38. Kills HOURS_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_PRICE jeweils =0 (dann bei Lead-Band an wieder v1.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. Kill HOURS_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_engine hours_demand_v1.37. Punktpreis unverändert, kein Dump-Szenario als Steuerpreis. Typwoche ohne Forecast-starts bleibt 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). Kill HOURS_ECON_LEAD_BAND=0 stellt hours_demand_v1.36 und 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, Timer spotforecast-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-out fix_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-Exits empty_address/not_enough_input/invalid_coords/invalid_postal/Profilfehler; Sparvo-Geocode ignoriert kaputte Form-Koordinaten). Kill ECONTROL_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_horizon ohne 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=0 ignoriert Leftover-Dicts (nur outcome_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 Outcome sinnvoll; Collapse/Passt/Warn/Grid/Fail). Kill STORAGE_HORIZON_OUTCOME_GUARD default on (=0 → Legacy Rechenbeispiel). Soft-Link = candidate ∧ Edit; Fixtarif-Bürger collapse|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_ANNUAL default 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_source meter|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_SWEETSPOT unset/=0 → aktive Empfehlung = PV). User-Go 17.09.2026: Hosts HP+Lenovo =1 in account.env → bei Netzladen an ist Bridge die aktive Empfehlung (sweet_spot_capacity_kwh). Grid-off: kein Upsizing. Rollback: =0 + systemctl restart account-portal beiderseits. 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_soc resim, Econ-PP Soft-Cap SoC/stamp maps, Soft-Cap-Spill euro proxy, gate-filter/Econ-redistrib charge maps scrubben JSON-bool/NaN→0 (kein float(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/NaN als 0 (kein float(True)=1 Soft-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-day Maps 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/NaN als 0 (kein float(True)=1 Soft-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/NaN als 0 (kein float(True)=1 Soft-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-bool cover_merged/energy_kwh als 0 (kein float(True)=1 Floor 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/NaN kWh als 0 (kein float(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_kwh zählt als 0 (kein float(True)=1 Soft-Cap-Floor); Coalesce setzt bei MUST charge_kind=must (kein darf/weak_pv-Rest); non-cover slot_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/map energy_kwh / cover_merged / lookback_added die 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_role auf dem Sink (Neighborhood / Thin-Cover-Defer frieren weiter); leere start-Zeilen droppen. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
  • Hours Lookback Merge Survival-Coalesce: Cover∪Weak same-hour Coalesce behält survival vom 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 must auf 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=True nur 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-start nimmt 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) vs isoformat() keine zweite Zeile und Soft-Cap-Σ-Inflate erzeugen; Sink-start auf 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_hours coalesciert 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_pv on peelable movable; prior-Weak frozen remnant keeps weak_pv (Cover-floor remnant still clears it); split_cover_merged_on_relocate clamps 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ägt cover_merged bei Drop/Relocate mit und probe’t softcap_stamp_holds Cover/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_head behält cover_merged_kwh (Mixed absolut, nie bare Weak→Natural); Soft-Cap-Demote clamp cover_merged≤energy; Lookback-Thin Frozen/Movable-Split via split_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_kwh floor (softcap_weak_peelable_kwh) — full Mixed energy as Weak stamped Cover→weak_pv and 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 via softcap_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_skip entfä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_guard im Explain-JS-i18n-Blob (Hydrate droppte SSR-Chips bei leerem why_*); Thin Post-Move Soft-Cap-Revert schreibt Note thin_cover_softcap_revert ins 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_skip ins 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-Merge coerce_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_now client bool-guard + PicoC spec: Portal/Sparvo/Live-Telem Session-Poll nur bei charge_now === 1/"1" (kein Number(true)=1); Explain-Jinja Stopp nicht |int auf 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=None und Soft-Cap-Probe no-op. Spec HOURS §6.7 + Wiki Hours. Alle Anlagen/Keys.
  • Hours charge_now bool-guard (UI/live-telem/webhook): Shared coerce_charge_now — JSON true/false nie int(True)=1 auf 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_pct UI lesen Stopp nur über coerce_charge_stop_soc_pct (JSON true/false nie Stopp=1); charge_now bool → 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 — JSON true/false nie 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-kwp fail-closed wie Battery/Horizon/Latch — JSON true/false → invalid_input bzw. Feld omit (nie float(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 — JSON true/false → invalid_input bzw. Latch incomplete_hold (nie float(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 von v1.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 &lt; 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=1 cleart lokal). Spec HOURS §6.7 + Wiki Hours/Loxone. Kill HOURS_CHARGE_HYSTERESIS=0 unverändert. Alle Anlagen/Keys.
  • Hours Grid-off Speicherschonen Evidence: Display-Strip verlangt echte Hold-Evidence (hold_hours/hold_hours_local/status=hold) — stale hold_hours_n allein erfindet keine Speicherschonen-Uhren. Portal Explain: Live-Telem charge_now=0 auch 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 oder allow_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), synthetischem week_status why_code=cold_start. Pause bei Meter-Warming (Profil-Stempel/PlantLoadSample) oder Annual-only &lt;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 (Explain empty_cold_start nur bei aktiver Pause). load_covered_by_soc_pv=false + Outlook/empty_reason=cold_start — Wochenblick D0 Warm-up, nie Gedeckt; Explain Chip/Headline chip_cold_start/headline_cold_start (nicht chip_none). Pause ∩ Grid-off → Pause gewinnt nur solange hours_control_paused (Top-Level/Basis; sticky notes allein reichen nicht): Display-Strip setzt charge_kind=none, leert Holds und schreibt week_status why/empty_hint/groups auf cold_start (nie grid_off/Hold/Gedeckt). Pause mit Netzladung noch an: gleiche Display-Mute ohne grid_off (UI-Format + Outlook Snapshot-First/Live-Hydrate setzen hours_needed*/energy_charge_kwh/next_charge_* auf 0; Live-Telem charge_now=0). Nur Grid-off: half-healed status=charge mit Hold-Evidence → Speicherschonen (hold), nicht Autark. Tombstone-Webhook setzt hours_control_paused=false. Kill HOURS_COLD_START_PAUSE=0 (Default on). Webhook-Feld hours_control_paused. Portal/Sparvo Warm-up-Banner + Explain empty_cold_start. Spec HOURS §14.5b. Alle Anlagen/Keys.
  • Hours Max. Netzladung Cap (hours_demand_v1.32): Profil-Feld max_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-PV P_econ ≤ Cap (Cap 0 → 0, kein inventiertes C×Kapazität). Cap/Headroom 0 bei ungedeckter Nacht → UI charge_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_roles charge/energy_charge_kwh/nested day_plan mitgeprüft; resolved_clear aus result.hours_needed) statt silent Persist. Snapshot-first baut hours_engine.week_status aus 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-closed grid_off_clear_check_failed). Nicht-ok DA unter Grid-off + charged Snap → neuer Tombstone + ein Webhook. Live-Telem/hours_decision_ui_payload und ui_payload_from_resolved erzwingen charge_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_kwh trotz why=grid_off; Hold-Evidence → status=hold) auf status=autark/charge_kwh=0, baut groups neu und verwirft stale teaser/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_reason priorisiert grid_off (Warm-up davor).
  • Netzladung-Aus → EMS Demand/LoadNow: Server nullt Plan/charge_now sofort; Portal/Sparvo flashen wenn plant.plan_updated fehlt (webhook_not_configured / webhook_failed). Telemetry-Partial grid_charge_allowed=0 echoed charge_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_bound weg; CSS hx30. Spec §6.8.10. Alle Anlagen/Keys. PicoC unverändert.
  • Hours Explain Why-Details deep-audit #4 clean: floor_prefill nutzt Start-SoC; Soft-Cap-Hint ohne Doppel-Later; Softcap-Move vor Hint; Spec no_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; Pin hx29. 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; CSS hx28. 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-details arm=Kill+Href, Sichtbarkeit=available); Stopp-SoC nur Prefix-Stamp (kein Global-Fallback); Hold-Nuance aus hold_kw→hold_reason_for_cap; Client hx54. 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-why Whitelist + SSO-Pfad; Route-Tests Guest/Mitbenutzer/Owner/Kill + snapshot-only (kein resolve_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-why narrativ aus Snapshot (use_live_resolve=False); Sibling-Link „Details“ neben Week-Teaser; Mitbenutzer wie Explain; Kill HOURS_WHY_DETAILS (Default on); Client hx53/hx27. Spec §6.8.10. Alle Anlagen/Keys. PicoC unverändert.
  • Hours Explain deep-audit #4 clean: Jinja fail-closed discharge_power_kw via .get; SSR until_pv_energy_label; Wiki Pack→Speicher (+ PV-Tagespack SoT); Client-Pin hx52. 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↔JS show_rest Bars-Fallback; i18n-Blob Dedupe; Spec §6.8.10 Hydrate-Note. Portal-Pin hx51; SW hz6/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_autark für until-none); EN Battery conserve in week_status-Engine + Chart-JS-Fallbacks + Tip; Wiki Pack-Reserve→Speicherreserve; Sparvo Base-Pin hx50, SW-Pins hz6/v28. Spec §6.8.10. Alle Anlagen/Keys. PicoC unverändert.
  • Hours Explain deep-audit clean: SSR _today_cover/_rest_days gesetzt (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_closed nur ¬Autark∧¬Weak, dual_contract nur D0=0∧später>0, NB Soft-Cap Probe → neighborhood_softcap_dest_skip; UI Pack→Speicher / Speicherreserve (DE) · battery reserve (EN); Sparvo pins später hx49/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_REBALANCE Default 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_kwh sync. 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 bare clock. Fuß grid_draw_kwh skaliert 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_kwh nach 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 lastInChargeSlot entfernt (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>0 clearst chargeDoneToday vor Baseline (Fix: Doppel-Abzug vs Session-Start → Demand/O3/O9=0 trotz charge_now=1). Portal Overlay hide bei charge_latched oder live≥stop−0,5 und strippt Now-Charge in plan_timeline. Wiki/Samples DE+EN. Alle Anlagen/Keys.
  • ExtractHoursDemand v1.21 (charge_now SoT): Parst charge_latched; bei API charge_now=1 lokales Session-Latch clearen (Demand/O3/LoadNow folgen offenem Decide). Sonst bei charge_latched=true lokal latchen. Fix: weites H-Band ließ Demand/LoadNow=0 während Portal/API charge_now=1 zeigten. Wiki/Samples DE+EN. Alle Anlagen/Keys.
  • ExtractHoursDemand v1.20 (O4 Sync): sessionStopSoc folgt 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_PLACE Default 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) = publizierter charge_stop_soc_pct / O4 (ein Zielwert; Hold/pv_pack half_up unverändert). Shared apply_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 refreshed soc_projected_* nach Picker-Mutationen; kein live+energy-Invent (fail-closed None / Latch sticky); O4 = floor(prefix-end); plan_roles Charge = roll_soc_hour; Explain hx46. 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 mit target_soc; Middleware finalisiert reserved Exception als access_denied; Finalize hält duplicate gegen 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); Interim e_gap ohne Decide-SoC-Clip; Lookback Delivery-Cap min(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 nur room_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_limit speichert burns; reserved demote (4xx und 200 access_denied) stellt X-RateLimit-Remaining wieder her; Auth deferred-Pfad rstrip("/"). 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 nur api_key_id IS NULL; reserved-4xx stellt X-RateLimit-Remaining wieder 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 nur api_key_id IS NULL; Response quota_class folgt 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_prep finite; 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ält duplicate (kein Re-Bill nach Coalesce); check_rate_limit synct request.state.quota_class; Telemetrie semantic invalid/incomplete demotet Softcap; Spec Force + DE Auth. Alle Anlagen/Keys.
  • Hours+Quota fail-closed deep-audit: Incomplete Hours echo grid_charge_allowed=false wenn Profil/Feld unbekannt; Survival/Force-Near/_try_take skippen non-finite Preise (NaN/±inf) und behandeln 0,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 kann quota_class demoten; Softcap-X-RateLimit-Remaining zählt Reserve. Spec/Wiki Auth EN + MONITORING. Alle Anlagen/Keys.
  • Portal Auto-Geocode deep-audit parity: Locality-Keep behält nominatim_reverse/nominatim wenn 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-Room upper−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_class bei HTTP ≥400 (kein Default-decision-Bill); Windows POST gate vor Body-Parse; invalid_input/EMS-Prefix fail-closed grid_charge_allowed=false wenn 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/windows deferred (Access/access_denied vor Reserve, Hours-Parität); Loxone-Twin-GET bei Fair-Use-Ceiling → freies duplicate statt 429; Force-Near Cover-Rank fail-closed bei None/OOB-Preis; incomplete Hours-Basis echo grid_charge_allowed. Spec/Wiki Auth DE + MONITORING. Alle Anlagen/Keys.
  • Hours Lookback Place pack-headroom + η clamp (hours_demand_v1.31): Place zieht already·η 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 shared clamp_charge_eta. Spec §6.2b + Wiki. Alle Anlagen/Keys.
  • Hours Carry residual-aware + η-parity (hours_demand_v1.31): Thin-Cover-Defer / Thin-Now Carry nutzt residual_carry_step (Netto-Last > Room über Floor → refuse; incomplete Horizon fail-closed) statt vacuous Floor-Clamp; shared clamp_charge_eta fü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/status und 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 unter reserve_breach; Sibling frozen/movable getrennt; Merge-lookback_added_kwh friert absorbierte Cover-kWh und behält survival gegen Defer-Undo; Pack-Headroom+Port) bei Stress-Delta-Konjunktion (sum≤ ∧ earliest≥); eigenes Commit; Residual Note und lookback_reason_codes nur bei \(S≠∅\); Felder lookback_thin_*; Kill HOURS_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-Headroom min(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; Kill HOURS_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 (hours statt Spar-Check). SEO Sitemap/hreflang/llms; Umami Website-ID 16c2ee7f-… (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-Jinja sameas auch für min/target/cover (kein |float(True)=1). Engine weiter hours_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 via coerce_hysteresis_pp. Engine weiter hours_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) nutzt coerce_hysteresis_pp — bool/Mock → Default, kein "1" zum Persistieren. Engine weiter hours_demand_v1.29. Alle Anlagen/Keys.
  • Hours Latch H webhook/guest type-guard: plant.plan_updated Payload + Material-Key und Sparvo-Guest-Profil nutzen coerce_hysteresis_pp (bool/Mock → omit/Default). Engine weiter hours_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) nutzen coerce_hysteresis_pp / bool-Reject — kein float(True)=1. Familie-B Cap-Skip blocked_indices sofort nach Mix. Engine weiter hours_demand_v1.29. Alle Anlagen/Keys.
  • Hours Latch H snap type-guard: Snap-Fallback/tombstone für charge_stop_hysteresis_pp nutzt denselben Fail-closed Coerce wie Profil (int/float/str/Decimal; bool/Mock → Default/omit). Engine weiter hours_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): Lookback blocked_indices + Latch-H Type-Guard (Decimal ok, Mock/bool reject); Worklist/Wiki Feldtabelle. Alle Anlagen/Keys.
  • Hours Weak Cap-Skip Lookback block (hours_demand_v1.29): Cap-Skip-Fenster in Lookback blocked_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_pp akzeptiert 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_w fail-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; Note weak_pv_need_full_pv_cap_skip (Decide basis.notes + Snapshot notes). Kill HOURS_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_kind behalten 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_SPILL default 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): Flag HOURS_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); Flag HOURS_LOOKBACK_LATE_BIAS (+ …_EUR Default 5) — Pre-Stress late-bias im Preisband; Thin-Now droppt softcap_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: clipped vs euro_cap getrennt; Darf-S1 Echo auch auf no_grid/autark; DE Wiki Skip-Enum + §6.8.14. Alle Anlagen/Keys.
  • Hours Soft-Cap spill R2-continue heal: nach €-Shrink best>0 aber R2-Fail → weiter im Cohort (kein falsches euro_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_pack re-estimates volle Woche wenn pv_est D0…D6 nicht deckt (kein Zero-Fill); Sync gleich; GET-Envelope timezone = 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 days truncates nur Response-days/hours/totals (loxone Woche 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 loxone aus Align-View (Pack-days bleiben 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_hash FC). GET /v1/plant/pv-forecast / loxone.d0_kwh und Portal/Sparvo wenden denselben Calendar-Meter-Blend an (pv_kind / pv_meter_today_kwh additiv). Meter-Tick feuert kein plant.plan_updated. Kill HOURS_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_hour NaN-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_blend auch 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_pp Default 2.0; Sparvo storage_rules_link DE+EN nennt Ladehysterese. Alle Anlagen/Keys.
  • Hours/Telemetry audit-clean #3: Loxone-Hours Wiki Latch-H = Profil-charge_hysteresis_pp (nicht Netz-Puffer); joint Partial invalid_input trägt updated.* 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_total nicht mehr (beide unabhängig ingestiert; invalid_input trägt beide Results). Guest plant-settings Payload trägt charge_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 von cover_buffer_pct; Latch/EMS charge_stop_hysteresis_pp aus Profil-H; Material-Key inkl. H; Cover/Bridge/Survival/Lookahead/Lookback/Consolidate/Interim/Spill/Rebalance → Plan-Ceiling min(cap,target); Weak/chrono Cap bleiben. Kill HOURS_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 + Profil meter_pv_*; Response sibling pv_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-Δ; Portal pv-meter-reset; Loxone VO 1d FetchPlantTelemetryPvMeter (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 an active_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_charge angeglichen. 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_charge angeglichen (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 nutzt active_charge (Latch/Grid-aus → Hold-Cap trotz stale charge_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_now umgeht nicht mehr block_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_breach Cover 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-closed incomplete_hold (prior latched + fehlender Stopp/SoC); Latch-Stopp aus prior Snap; Thin-Now nur slot_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 sticky charge_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 additiv charge_latched/charge_stop_hysteresis_pp; O12 Latch unterdrückt nur recharge_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 aus cover_buffer_pct (1–20 pp, leer→2) — superseded durch Phase-1 Split → Profil-charge_hysteresis_pp; Thin-Now vor plan_roles; O12 Short-Circuit bei Latch; Material-Key + charge_now/charge_stop_soc_pct; Snap additiv charge_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. Kill HOURS_CHARGE_HYSTERESIS / HOURS_THIN_NOW Default 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_grid pf↔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). Kill HOURS_SOFTCAP_ABANDON_SPILL=0 → Felder absent / exakt v1.23. Additive softcap_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 Shared format_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_pct bleibt 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 respektiert port−already (Cover-Parität); Merge erzwingt slot_role=cover bei Lookback; Decide skippt bei Ladeleistung 0 wie apply_*; Wiki-Duplikat entfernt + HOURS_LOOKBACK_PASSES im 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ür lookback=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 echo lookback_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 peelt lookback=True nicht; Passes Default 4 (HOURS_LOOKBACK_PASSES); Kill-Switch HOURS_LOOKBACK_REBALANCE=0. Additive Felder lookback_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, Sparvo hx43): Interim-Slot-Picker sucht jetzt bis min(breach, next_cheap-1) statt fixer 5h-Pick-Kappe; Legacy-Fenster via HOURS_INTERIM_PICK_CAP_H=5. Deferred Interim (interim_decision=charge) bleibt gültig auch mit interim_period_active=false; EMS-Period-Shrink/Today-Pin nur bei imminent (h < 5). Deferred-Skip bei bereits geplanter Survival-Energie setzt fail-closed interim_decision=none, interim_reason=covered_by_scheduled_survival und scrubbt interim_slot_start/interim_cost_*. Snapshot/Explain-Hinweise (reason_codes, show_interim_charge_hint, hidePlan) folgen interim_decision=charge. Bei pass bleiben beide Econ-Kosten (interim_cost_charge_eur + interim_cost_pass_eur) erhalten — nur none/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). Sparvo hx42. Alle Anlagen/Keys.
  • Hours Folgetage empty after hydrate (hx41): statusChipsHtml hing unter useSummary — Folgetage-Supply-Cost-Paint warf ReferenceError, der Per-Day-Catch leerte alle Tage (Titel/Hint blieben). Helper neben displayPrefs gehoisted; Sparvo-Cache hx41. Alle Anlagen/Keys.
  • Hours Interim week_status Label (hours_demand_v1.21): Interim-Slots tragen interim=True; week_status/Folgetage charge_kind=interim („Übergang“) statt fälschlich MUST/Reserve. Samples/API-Tests Engine-Tag v1.21. Spec §6.8.5. Alle Anlagen/Keys.
  • Hours Interim Explain reason gate (hours_demand_v1.21): Snapshot-reason_codes setzt interim_charge nur bei interim_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): Weak stage=future-Day-Consolidate erhält interim_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, Sparvo hx40): Post-Consolidate EMS-Pin hält charge_hours_today auf einem Interim-Slot; r2_rejected löscht Phantom-interim_cost_* und setzt interim_decision=none; Explain empty_min-Hinweis nur bei heutigem empty_min (nicht Horizont); Zwischenladen-Fuß/hidePlan nur bei interim_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_kwh aligned; Decide+DA shared. Explain: Soft-Cap-Abandon- und empty_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-JS hx40. Alle Anlagen/Keys.
  • Snapshot refresh + Folgetage-Chips + Today-Basis (Audit-clean hx38): load_raw_snapshot macht db.refresh gegen 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/null Feld, numerisch 0 → 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 wenn issued_at während Resolve fortschreitet; Portal horizon-html liefert tariff_markup_ct_kwh; Lead/Explain-€ ohne Chip-Wipe; Sparvo SW-Shell plant-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 setzt charge_now/discharge_power_kw=0; Hydrate clobbert neueren Snapshot nicht; Spec/Wiki DA-Redispatch bei jedem nicht-ok Decide. Cache hx37 / plant-hydrate-hz5. Alle Anlagen/Keys.
  • Hours Explain Folgetage + O12 + Horizon Prefs (Audit-clean hx36): Folgetage-Kosten-Paint nutzt Decision d (nicht undefiniertes data) — sonst leere Folgetage bei cost_net_eur ohne Day-Markup; O12 immer paintPlantNowDischarge (Clear auch bei available + null kW); Speichergröße hydratisiert Lead/Basis-Note/Transparenz/Explain {basis}/{tax} bei Prefs-Toggle. Cache hx36. 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): displayPrefs wieder 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/fehlendes discharge_power_kw löscht O12-Chip (—/is-off); Cache hx34 / plant-hydrate-hz4. Alle Anlagen/Keys.
  • Horizon-HTML Prefs + Hydrate: Portal /plant-outlook/horizon-html injiziert Account-Display-Prefs (SSR); nach AJAX-Inject ruft Portal/Sparvo SpotDisplayCost.hydrateDom auf (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 bei not_configured/HTTP-Fail); DA bei incomplete_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; Flash error_stale wenn Clear scheitert. Alle Anlagen/Keys.
  • Profil-Speichern → Hours Decide: Nach Standort/Speicherregeln/Dump/grid_charge_allowed sofort Shared Decide; bei incomplete/Fehler Tombstone (profile_refresh, leere Charges, hours_unavailable) + plant.plan_updated inkl. grid_charge_allowed; Snapshot best-effort, Webhook best-effort; wenn Snapshot-Schreiben scheitert → Flash plan=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): /…/data ohne 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=computing pollt weiter (kein hängendes „Ladeplan wird berechnet… Erneut laden“); Horizon-Loading-Skeleton bleibt (Kostenprognose-Lücke behoben); Loader wird bei fertigem Decide entfernt; Akt. Entladung aus discharge_power_kw auch 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_api nach received_for (Bridge/ohne Live-Overlay); fresh_api_ts mintet kein Stale; Wiki Forecast/Hours: Label erst nach received_for. Alle Anlagen/Keys.
  • Day-Ahead Accept (Pass 9): Live-Tick vs Parquet-Bridge (Bridge nur bei aWATTar failed|stale); D+1-Label erst mit received_for / Predicate; Hours-Sofort-Replan nur received+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 mit data-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-strompreise folgen denselben Prefs (Cross-Widget sf-display-prefs-changed); Stundentabelle + Horizon Markt/Bar-ct hydratisiert; Sparvo ohne Doppel-Apply; estimated_ct inkl. 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-FC source=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_kw wie Decide; SEO-Meta Peak-Pack→Surplus-Cap; Test simulate_week_grid forwards max_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.20 angeglichen. Alle Anlagen/Keys.
  • Hours Audit-Fix Cap-Labels + P_max-Parity: _hold_maps_subset labelt Cap>0,2 ohne Reason als hold_share (nicht cheap_hold); Cap≈HOLD_KW → cheap_hold (O12/Resolve/Snapshot); Cap0-Refresh behält nur Weak/Legacy; Weak + Familie B Peak-Pack + Outlook compute_storage_horizon bekommen Profil-max_discharge_kw; Hold-Load Slot-Cap liest start\|target_start\|time; Speicherschonung-SOC ohne SOC: — %. Spec §6.4.2 / §6.8.16 / §6.8.17. Alle Anlagen/Keys.
  • Hours Explain Speicherschonung kW+SOC: Hold-Segmente in plan_timeline zeigen Speicherschonung (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 in hold_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 unter hold_share); Weak SoC-Roll clippt Peak-Share-Caps nicht mehr; Cap-raise-Guard-Schwelle PACK_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; Reasons hold_share/pack_reserve/cheap_hold; O12=Slot-Cap, Floor→reserve_empty vor Cap; Familie B min(net,Cap); Webhook-Material inkl. Cap-Vektor; Telemetry Hold-Load Decide (Session→Near-Min→Hold-Load). Kill-Switches HOURS_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-Engine v1.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); Markup 0 ct bleibt 0 (is not None); Request-battery.grid_surcharge_ct_kwh fail-closed invalid_input; Why-{energy} = Decide-Horizont X+Y+Z (nicht Folgetage-1A-Filter); Sparvo hours_engine spiegelt week_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 als planned_direct (Tag-P33 + spot ≤ p_ersetzt ohne η/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). Anbieteraufschlag grid_surcharge_ct_kwh (Request battery.grid_surcharge_ct_kwh → Profil → 1,5 ct/kWh) nur Display. Kill-Switch HOURS_PLANNED_DIRECT=0. PicoC/day_plan unverä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 Poll status=received (Catch-up 15–23 Wien). Feldvertrag price_source unverändert. Alle Anlagen/Keys. *(Superseded 09.09.: Pass 9 Live-Tick/Bridge + Sofort nur received∧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≤0 blockiert Grid nicht bei Port>ε; Cover Skip pv_fills nur bei Port≈0 (Partial Port erlaubt); Timeline until-none respektiert charge_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_gap still; 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_status API unverändert; plan_timeline UI-only. PicoC unverändert. Alle Anlagen/Keys.
  • Hours Soft-Cap sibling EMS prefix (10): Weak+Cover Split gleiche start bricht 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_pv auch 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-Notes charge_fill/nofill mutually exclusive. PicoC unverändert. Spec §6.8.15. Alle Anlagen/Keys.
  • Hours Familie B Soft-Cap calendar-scope (5): Soft-Cap end_soc resim 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_before nutzt geplante charge_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 jedem plan.hi auch 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 über max(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 each plan.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_grid Soft-Cap-Trim am sun→sun-Ende (plan_hi) — Decide §6.8.15. Near-autark: cover_dawn_cap_hours nur wenn Stempel > H_{gate}. PicoC unverändert. Alle Anlagen/Keys.
  • Hours Weak×Near-Autark Soft-Cap-Audit: Unter Near-autark_ok bleibt Dawn-Soft-Cap aktiv (Anchor max(pv_cover_end, H_{gate}) → hi(next_pv), Stempel > H_{gate}); Near-Stempel ≤ \(H_{gate}\) weiter ausgeblendet. cover_dawn_cap_hours wieder in Basis. PicoC unverändert. Spec §6.8.15. Alle Anlagen/Keys.
  • Hours Weak×Near-Autark: autark_ok skippt 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 finalen charge_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_overlay nur bei Rentable; Cap0-Hold-Merge getrennt; Decide-Parität); Sparvo PV-Nav always_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); Snapshot week_status 1A always_include = Wanduhr-Heute (nicht nur Issued-Tag); Wochenblick ohne doppeltes metric_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_status teilt 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_budget abziehen; 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 über hold_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 zweiten cover_needed-Gate (Weak-PV-Hold vs. chrono Cover-to-sun). Legacy-Cheap-Clock ohne Hold-Mitgliedschaft braucht weiter Cover-Lücke. Snapshot stellt stale night_hold_hours nicht 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-Sidecar spotprice_pv_soc.txt vom 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 schwerer txt_d0-Stack; Key-Suche ohne Escapes; Force-Re-Read ~10 s; Idle-Delta d0_kwh+d0_soc_eod; Txt1 OK 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/setlogtext zeigt OK 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_any via hold_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_reserve Label auch bei HOURS_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_KW wü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-closed min(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_eod Live-SoC: Frisches Decide-Pack lieferte bisher eingefrorenes Mitternachts-SoC bis zum nächsten Decide (bis 6 h). GET /v1/plant/pv-forecast und Telemetrie-SOC rechnen loxone.d0_soc_eod / txt_d0 jetzt aus dem aktuellen Live-SoC neu (PV-Tage/pv_hash unverändert; Persist nach Meter-Ingest; kein Clobber neuerer Decide-Packs). Loxone ExtractPvDaily v2.4: File-Delta auch bei d0_soc_eod (v2.3 nur d0_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 durch need_full + Spot-η-Gate p/η < 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 Torte supply_*/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 aus lines (bleiben in days[]). Heading Do 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-globales opp_off/opp_not_triggered. charge_hold ohne 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“). localize heilt direct_* vor Hold-Uhren-Backfill; Charge-Status schlägt stale hold_* why. Chart-Tip: bare Clocks auch in charge_starts_plan/night/rest nur heute (dated Labels weiter per Datum). PicoC unverändert. Alle Anlagen/Keys.
  • Hours Copy B Audit-Fix 2: localize_week_status heilt days[] (why_code/direct_*) auf 1‑dp wie die Zeilen; _line_for_week_day prüft charge_hold vor Hold. Chart-Tip: bare charge_starts (14:00) nur am heutigen Tag (kein Folgetag-Falsch-Netzladung). Explain tip_p33 + Rest-Day-Hold-Strings + Wiki-Chip → Speicherschonen. PicoC unverändert. Alle Anlagen/Keys.
  • Hours Copy B / Chart Tip Audit-Fix: why_code=hold_direct und direct_hours folgen der 1‑dp‑Anzeige (Mikro‑kWh &lt; 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_status ohne 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 kWh oder ohne 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), Tip PV · Last · Planwort (Charge>Hold aus hours_decision), Sparvo-Payload hourly_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 mit why_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 / Feld direct_hours). Legacy ohne hold_hours_local: Uhren aus direct_hours. Idle mit Restlast ohne Hold → no_hold_gap (nicht falsches Autark). Cover/autark_ok schlägt interim_pass-Hint (wie Explain). Hold-kW-Copy aus HOURS_HOLD_KW. Speicherschonen-/Restimport-Prosa nur in „Diese Woche“; „günstiges Drittel“ nur bei darf (§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. Optional hold_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=hold nur bei Nacht-Restimport kWh>0. DP-Feinschliff nur im bestehenden DA-Replan (allow_weak_pv_dp, Kill HOURS_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 when d0_kwh changes. 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_reason nutzt neu berechnete night_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; Consolidate near_cover_hours/cover_softcap ohne 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’t energy_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_econ bei 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_kwh bei 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: pendingFetch fü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_kwh nicht mehr (kein Hydrate-Sprung). Bei Weather-Cache stale/midday oder neuerem Wetter: live Estimate → Pack wird persistiert — Portal/Sparvo und GET /v1/plant/pv-forecast bleiben 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 bei charge_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 zu datetime geparst (kein Crash auf /plant-outlook); Overlay charge_starts matched nicht mehr TZ-Offset +02:00 bei Stunde 02; Session-Complete nur charge_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_*); Webhook plant.plan_updated enthält pv_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 :08 bleibt Backup.
  • Auth — Key-Owner-Tier: Wiki-Hinweis: Kontingent/access folgen 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. Engine hours_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 weiter hours_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_kwh folgt 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# mit cover_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 (min der Rooms): Overnight + Recovery-Tagesstempel + Dawn hi(next_pv) — Dawn ersetzt Near Soft-Cap nicht. Bridge-Rest unter Recovery (auch ohne Dawn-Kill-Switch) = Policy-Abandon. PHP-Sample: cover_dawn_cap_hours unabhängig von Recovery. Alle Anlagen/Keys. Kein PicoC-Repaste.
  • Hours Dawn-Cap v1.13 (hours_demand_v1.13): Cover/Bridge Soft-Cap und picker_cover-Clip an hi(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-Switch HOURS_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_ok darf 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 als storage_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 unterscheiden already_current (Idempotenz nach erstem Decide) von incomplete_input / incomplete_input_cached und 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_ok darf 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-Switch HOURS_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_kwh prü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-Feld rest_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_time der letzten Skip-Stunde des Tages (nicht die letzte nicht-leere). Explain-Preview/JS: gleicher Footer inkl. „keine weitere Netzladung“. Poll-Asset hx24.

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; SW sparvo-shell-v26, Registrierung updateViaCache: none.
  • Sparvo — Menü „Spar“ ausgeblendet: Bottom-Nav, Start-Kacheln und Favoriten ohne /savings; direkter Aufruf leitet auf / um. Standard aus — Reaktivierung per Env SPARVO_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 in storage_horizon unverä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 bei visibilitychange zurü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 Worker sparvo-shell-v25, Assets resume-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_kwh nie größer als v0; optional notes: sized_after_cover. Decide + Kachel Speichergröße & Spot-Kosten (simulate_week_grid, gleiche Predicate). Cover-Slots unverändert (Non-Regression). Kill-Switch HOURS_PREP_AFTER_COVER=0. Audit-Fix: plan_feasibility nach Prep-Trim — Cover-Lücke bleibt partial, reines Prep-Trim erzeugt kein falsches storage_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-Guard in simulate_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_h in autark_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-Switch HOURS_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_delta behält Meter-Budget-Norm; Plant-Outlook-Chart nutzt dieselbe Cover-Last wie Hours; SOC-Slice-Indizes an echte Stunden geklemmt. Extract v1.17: period bis 48, kein 40-h-Reset von lastOkAbs. 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_kwh nach 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 summiert pv_kwh neu.
  • 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 / confirm Abbruch 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 (&lt;≈280 ms) ohne Overlay. Opt-out: data-sf-no-page-loading an 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/data bzw. /plant-outlook/data (mode=full, include_horizon=False seit 2026-09-09 Audit-clean); Speicher-Horizont per …/horizon-html. Hours-Resolve begrenzt durch HOURS_RESOLVE_MAX_PARALLEL (Default 2, non-blocking); belegte Slots → JSON status=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 setzen pending_hours=false. HTTP 503 (auch outlook_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_num Undefined-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_secondary nicht 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. /plant Short-TTL + Dedup PV/Forecast/Meter. Hours Decide: basis.storage_horizon Jahresfelder 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_pct und spiegelbildlich beim Wiederanstieg (Floor → 5 pp → 10 pp → Headroom / volle O12). Intern async Decide (Snapshot + plant.plan_updated bei Delta). Sparvo/Portal live; Webhook sofort; Loxone-Extract beim nächsten Hours-Decide. Kein Decision-Quota. Kill-Switch HOURS_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 nur vorrat_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_prep top-level (Snapshot-Form); Force umgeht Fill-Day nicht mehr; Dump-Placement nur ≤ Grenzpreis; Dump-Rank ohne Force; Schicht-B nur vorrat_wuerdig; Bridge separat; Familie-B Cap-Clip. Docs: charge_now statt charge_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) ist min(WR/max_charge, Anschluss × 0,80 − Grundlast) — nicht die Roh-Netzanschlussleistung. Portal/Sparvo Anlagenprofil zeigt die berechnete Leistung unter dem Anschluss-Slider. Thin-Decide ohne battery.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 recipes unverändert). PicoC-Slots nur im Portal EMS Anbindung (/settings/ems) — Sparvo/Migration erfinden keine wallbox_*/flex_*. Ungebundene Katalog-Geräte: Chip „EMS offen“ + Portal-Link. Rollen: Anlagen-Administrator / Anlagen-Hauptbenutzer / Mitbenutzer. Katalog plant_sparvo_prefs pro api_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-Katalog plant_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 − PV nicht ü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-Rolle prep → „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 nur Ladeleistung − PV (1 h: kWh≡kW); Skip pv_fills_charge_power wenn 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: Dauer 0,25 h 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 lastH nur 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 schreibt target_kwh; Weekly-Chips nicht parallel zu Rezepten; Ofen u. a. können api_linked nicht 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: lastDecHour erst 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–00 zeigt 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 (stale load_now bis :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_id fest 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/role weglassen = 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=0 weglassen). 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.md Budget 7/8 (Wetter weglassen).
  • Flex PicoC v0.5.1: Parse-Fail behält LoadNow (wantLoad); I1=0 löscht auch ViGridChargeReq; Windows-Docs sagen Flex v0.5.
  • Flex PicoC v0.5: LoadNow aus aktueller Slot-Stunde (kein stale ems.load_now beim Stunden-Reparse); I7 live jedes Loop; kein continue; I1=0 resettet State; Wiki I9+I10 Pflicht für hours_completed; flex_pack überschreibt Body-segments.
  • Docs-UX Flex-Guide: /docs/loxone-windows-flex neu (kurze Schritte, Callouts step/example, SVG-Flow, PicoC im Anhang). Guide-Muster Konzept §12. Renderer: Callouts step + example.
  • Flex Deep-Audit v0.4d: ISO-Fenster + deadline_hour ohne window_* leitet die Uhrstunden aus start/end ab (18:00→06:00, Deadline 22 blockiert 02:00). Naive Stunde≤Deadline entfernt. Deadline außerhalb des Fensters leert das Fenster nicht. Wiki Flex-Walkthrough DE+EN (Callouts step/example, Zielbild flow.svg), OpenAPI/Konzept §8.6 nachgezogen.
  • Flex Deep-Audit v0.4c: deadline_hour (Sparvo spätester Start) filtert Flex-Kandidaten overnight-aware; windows_query trägt deadline_hour; Request-Echo window_source (flex_pack|window_hours|iso); deadline_strict/repeat_daily als Echo/reserved dokumentiert; PicoC I1=0 löscht auch Demand/Period; Konzept §15.1 E = flex_pack.
  • Flex Deep-Audit v0.4b: device-schedules nutzt dieselbe rollierende Overnight-Logik (Fix nach Mitternacht); windows_query nur noch window_*-Stunden (kein ISO); Request-Echo zeigt flex_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/end optional, flex_pack / window_* dokumentiert. PicoC I12 nur Diagnose; repeat_daily in v0.4 nicht angewendet.
  • Flex PicoC v0.4 + rollierendes Fenster: window_start_hour/window_end_hour oder Loxone flex_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, nicht hours_completed. LoadNow nur aus ems.load_now (nicht aus window.start). prep_extra_energy_kwh = platzierte Prep-kWh. Flex hinter dem Tier = no_slots, nicht deadline.
  • Flex Deep-Audit: Live-Floor (keine Past-Stunden im Flex-Fenster); next_slot_start chronologisch; Soft-Fallback bevorzugt längsten Block; nach end Demand/Slots=0 + Status deadline; leere Flex-Exits behalten ems; 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 (0 bei segment_complete oder nach end); deadline_reached immer wenn now ≥ 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; soft nimmt den längsten Block (Preis nur als Tie-Break); ems.next_slot_start = nächste Stunde ab jetzt. (Historisch: Auto-slot_id der ersten Wallbox wallbox_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/windows mit 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-flex umgestellt.
  • 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-Floor 0,25·Last, kein Sprung auf 168). Felder hours_needed_prep, prep_extra_energy_kwh, basis.forward_prep, basis.prep_horizon_hours. Slot-Rolle prep („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) · PicoC SpotpriceFlexWindows.
  • Plant Device Schedules (Sparvo Flex 1b): GET /v1/plant/device-schedules liefert api_linked-Geräte aus Sparvo (Slot-ID, Segmente, Fenster, Deadline) für Loxone/EMS. Community+; HTTP 200 mit decision_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_now zur 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-Block ems direkt nach decision_status (PO Demand = ems.current_segment_hours, Period = ems.period_hours_today bis Fenster-Ende). Ohne Flex-Parameter unverändert windows_v1. Deploy: deploy.sh api-only.
  • Explain Stopp-SOC / Bilanz-Balken: Survival-O4 pinnt auf min_soc_pct nur 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-Assets hx22.

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 danach hours_demand_url pullen. Optional plan_hash im 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-Assets hx18.
  • 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 unter min_soc nur bei Preisvorteil. Kein neues API-Feld, kein wait_cheap; O12 unverändert. Shadow-Log hours_consolidate_shadow.jsonl. Ops-Diagnose: diagnose-hours-charge-plan.py.
  • Fix: übersprungene Stunden Vollliste (Portal/Sparvo): Link „Alle N anzeigen“ auf /plant/skipped-hours bzw. /plant-outlook/skipped-hours lieferte 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_pct im Snapshot rest_day_balances, UI-only). ⓘ erklärt Reserve-Floor, Direktbezug unter Min-SoC und Stempel zur Morgensonne (nicht direkt nach Ladestunde). Poll-Assets hx17.
  • Wochenblick Tageslabel: hours_needed_days wird am Kalender-Grid (D0…D6) gemappt, nicht an der sparse day_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_pv endet 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 echtem e_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ährend charge_now volle Cap. N = ceil(Tageslast/Lade-kW). Jahres-Kachel dieselbe Cover-Lücke. Felder cheap_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_horizon ohne 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). Adaptive max_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_updated liefern discharge_reason; ein Cap-Wechsel gilt als material (Webhook).
  • ExtractHoursDemand v1.11 (Breaking): API-Felder prefix_* statt loxone_*; neu charge_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. Legacy loxone_* in alter JSON bis Re-Decide lesbar.
  • Hours Interim Econ Default ON: HOURS_INTERIM_ECON ist an (Kill-Switch =0). plant.plan_updated enthä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-pass entfernt 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 (&lt;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_today kann kürzer werden (Cap 5 h); EMS charge_hours_today dann max. ein Interim-Slot (spätere Cover-Slots bleiben in day_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 later zeigen 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-Poll hx11.
  • 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: Partial POST /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_hours nur bei cover_extended_for_reserve). SoC ohne/mit Netz an beiden Stempeln. Chip bleibt „Heute N h · insgesamt M h“. Heute 0 / Woche > 0 bleibt charge_kind=later (Mit-Netz am Reservestempel weiter sichtbar).
  • Master-Schalter grid_charge_allowed: Default an. Aus → hours_needed*=0, leere Slots, Kind grid_off / Reason grid_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; Alias soc_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-hours bzw. /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_eod Lastform: 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_plan wird 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 sind basic, community, full_trial, full_active (nicht professional/oem als 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/status enthält kein cache_path mehr.
  • Hours Cover-Last bei dünner Zähler-Telemetrie: WD/WE-Stundenform behandelt fehlende Samples (None) nicht mehr als 0 kWh. Tage mit &lt;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 (max mit 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 ohne projected_soc_pct_with_grid erfinden kein Mit-Netz mehr per Energy-Lump; Opp-Cap nutzt chronologischen Cover-Bedarf. Bulk-Fallback respektiert ebenfalls allow_untimed_grid_lump.

2026-08-19

  • Hours Demand v1.3 — SOC-taugliche Netzladestunden: Engine hours_demand_v1.3 wählt Ladezeiten nur, wenn im Speicher Platz ist und PV die Stunde nicht schon füllt. Günstige aber unmögliche Stunden landen in skipped_slots[] (immer mitgeliefert); verschobene Ladung in späteren feasible Slots. plan_feasibility meldet partial / 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-Codes slots_skipped, storage_undersized plus 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-weather scannt aktive API-Keys mit Lat/Lon in user_plant_locations (Discovery ohne Extra-Timer) und schreibt data/plant_weather/{api_key_id}/. Zusätzlich: Geo-Save im Portal und erster PV-/Weather-Request (On-Demand). Verzeichnisrechte *:forecast mode 2775. 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_today ist Reststunden bis 23:00 (00:00 → 23, 13:00 → 10, 22:00 → 1). Um 23:00 wieder 24. Demand/charge_hours_today nur 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_decision in build_plant_outlook). Speicherregeln, Dump und Standort speichern den Explain-Snapshot neu. Ein veralteter EMS-Snapshot ändert nur noch charge_power_kw, nicht die Stundenzahl ohne neue Slots.
  • Hours Netzladeleistung: charge_power_kw ist min(battery.max_charge_kw, Netzanschluss × 0,80 − Grundlast) (20 % Reserve wie Sparvo-Geräte). hours_needed teilt 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_pct leer lassen, Engine-Default 20 (vorher 15). Gespeicherte Profilwerte bleiben unverändert. UI: Portal /settings/location und 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_pct auß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 bleibt hours_demand_v1.2. PicoC unverändert (Felder hours_needed* / d0_load_kwh gleich).
  • 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.json sofort nach Miniserver-Neustart. Hours-Nutzer: denselben VO-Parent wiederverwenden, nur Befehl FetchPvForecast ergänzen. Beide PicoCs neu einfügen: /docs/loxone-pv-forecast.
  • Loxone PV Forecast Extract v2.0: Ein GET /v1/plant/pv-forecast liefert neben d0_kwh…d6_kwh fertige Klartextzeilen txt_d0/txt_d1 (Wochentag, Datum, PV, optional Last, SoC-Tagesende, Tmin–Tmax) plus week_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_kwh und Stunden enthalten den Puffer; 0-Fehlbedarf bleibt 0. Engine-Tag bleibt hours_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=0 bleibt 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-hours neu 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 bleibt hours_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_refresh ohne Daily-Refresh-Loop; wind_speed_unit=kmh; Loxone-Doppel-GET-Coalesce für Klassen pv/weather; not_available vor 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-weather 05:20 Wien; Deploy startet Refresh im Hintergrund bei Schema-Heal.
  • PV Forecast + Weather APIs (öffentlich): GET /v1/plant/pv-forecast (7-Tage-Ertrag kWh, Klasse pv, Community 48/Tag) und GET /v1/plant/weather (Standortwetter, Klasse weather, 48/Tag). Docs DE/EN: /docs/pv-forecast, /docs/weather; Loxone-Guides /docs/loxone-pv-forecast, /docs/loxone-weather mit 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-outlook und 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). Webhook plant.plan_updated compact (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_mwh blenden bei pct > 0 Richtung price × pct/100 mit 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_kwh unverändert. Clients sollen dump_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-samples Hours erläutern Cover bis PV, Spike-Dämpfung und ≥2 volle Meter-Tage; Samples drucken decision_engine, cover_window_hours, remaining_today_load_kwh.
  • Portal Live-Telemetrie-Hinweis: geschätzter Tagesverbrauch erkennt site_meter_history_* korrekt (vorher nur exakter Match site_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_hours bevorzugt Slots im Cover-Fenster. Neue Basis-Felder: cover_window_hours, remaining_today_load_kwh, horizon_load_kwh; Engine-Tag hours_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>; toter pulseTel-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-outlook und Standort-Einstellungen; ohne frischen API-SOC bleibt der Slider als Fallback.
  • Telemetry Rate-Limit: Softcap für /v1/plant/telemetry auf 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-freies diag für Txt2/Txt3; aggressive Dezimal-Komma-Sanitization; PicoC v1.5 liest diag zuerst.
  • 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 fehlendes Content-Type und Dezimal-Kommas in Zahlen.
  • Portal Anlagenprognose — Live-Telemetrie: /plant-outlook zeigt 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_at explizit; Docs DE/EN synchronisiert.
  • Rate-Limit-Header auf Erfolg: erfolgreiche /v1/*-Antworten tragen jetzt X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset und X-RateLimit-Scope (wie bei 429; Retry-After weiter nur bei 429).
  • Decision Windows fehlende Params: fehlende start/end/mode/role → HTTP 400 incomplete_request (wie Docs; kein FastAPI-422 mehr).
  • API usage — Loxone double-GET coalesce: Identical api_key + path + method within 3 s logs as quota_class=duplicate and 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 jedes nEvents). Docs DE/EN + /code-samples synchronisiert.

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-samples behalten 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 über forecast_status. Parse v17 liest Preis jetzt/+1 h per start-Needle ohne Pointer-Walk (v11–v16 hingen auf dem Miniserver nach Dump-JSON-Wachstum). Portal /code-samples Loxone Forecast liefert beide Programme. Docs DE/EN /docs/loxone + /docs/loxone-forecast synchronisiert.
  • 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 werden dump_scenario_ct_kwh / dump_scenario_eur_mwh immer aus dem Preis dieser Zeile × dump_risk_pct neu 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-samples behalten ihren Dump-Toggle; Landing #planung-live ebenfalls ohne Dump-Toggle (Modellpreis).
  • Forecast API — dump_scenario_* immer nutzbar: dump_scenario_ct_kwh / dump_scenario_eur_mwh enthalten den Dump-Preis wenn dump_risk_pct > 0, sonst den Punktpreis (nie null nur wegen fehlendem Dump). Clients brauchen keinen null-Check mehr; ob Dump aktiv ist, zeigt dump_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 auf GET /v1/forecast (und vererbt auf decision[]/forecast[] bei Decision, Slots bei Windows, charge_hours[] bei Hours Demand) trägt jetzt immer dump_risk_pct (0…100, nie null) und dump_scenario_ct_kwh / dump_scenario_eur_mwh. dump_risk_p bleibt unverändert 0…1 (Kompatibilität). price_ct_kwh / price_eur_mwh werden 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 korrigieren timestamp → start; Dump-Risk nur auf KI-Stunden (forecast_d*), kein Soft-Dump; Loxone ParseSpotpriceForecast v12 (O4 = Risk-Code, O1/O2 unverändert); Portal /code-samples drucken optional dump_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/forecast liefert optional dump_risk, dump_risk_p, dump_risk_scope, dump_risk_version auf Mittags-KI-Stunden (11–16 Wien). Kein Einfluss auf price_ct_kwh / price_eur_mwh. Live-Experiment (ML_DUMP_RISK=live); Kill-Switch 0. 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=ok bzw. 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-demand liefert im Modus decide jetzt bei decision_status: ok immer 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-Klasse telemetry, zählt nicht gegen das Decision-Fair-Use-Limit
  • Hours Demand — mode: "telemetry": derselbe Ingest-Pfad wie Plant Telemetry ist jetzt auch direkt über POST /v1/decision/hours-demand mit mode: "telemetry" erreichbar
  • Bridge-Anteil in Hours Demand: neue Felder hours_needed_cover, hours_needed_opp, hours_needed_bridge sowie plant_freshness in der Decide-Antwort
  • Webhook plant.plan_updated (neu): wird bei materieller Änderung von hours_needed oder charge_hours[] an Ihre hinterlegte Webhook-URL gesendet — dieselbe URL und dasselbe Secret wie forecast.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, Engine windows_v1) — zusammenhängende Zeitfenster mit vollem Constraint-Set (min_gap_hours, max_consecutive, allowed_hours, weekdays, allocation)
  • Decision API (GET /v1/decision, Engine quartile_v1) — Quartil-basierte Stunden-Signale charge/discharge/hold
  • Hours Demand Core (POST /v1/decision/hours-demand, Engine hours_demand_v1) — erste Version mit hours_needed aus 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-Feld api_version)
  • Engine-Tags pro Endpoint: quartile_v1 (Decision), windows_v1 (Windows). Hours Demand meldet hours_demand_v1.38, solange ein Storage-Plan-Flag an ist. Sind alle Storage-Flags aus und das Lead-Band an, ist es hours_demand_v1.37. Ist auch das Lead-Band aus (HOURS_ECON_LEAD_BAND=0), ist es hours_demand_v1.36.
  • Breaking Changes werden hier mit Datum, betroffenem Endpoint und Migrationszeitraum vermerkt

Nächste Schritte

Mit SpotpriceAPI starten

Community registrieren oder Code-Beispiele mit Ihrem persönlichen Key.

Live API-Status