Energieplanner
Hoe SEM met één gezamenlijk plan de hele energiedag plant: auto, batterij, uitstelbare lasten en comfort, binnen je pieklimiet en op de goedkoopste momenten.
Status: aansturing standaard aan. De planner berekent het plan voor de hele energiedag — daglicht en de komende nacht in één grootboek — en de vensters van het plan sturen de bestaande nachtsignalen: zie Aansturing en Waar je het ziet.
switch.sem_energy_plan_actuationis de noodschakelaar: zet hem uit en de planner gaat terug naar puur schaduwen, waarbij elke echte beslissing door de reactieve laag van SEM wordt genomen, precies zoals vóór deze versie.Upgrade je vanaf een oudere SEM? De upgrade schrijft die keuze voor je vast (hij staat aan) en plaatst één melding die dat zegt — er gaat niets stilletjes aan, en een installatie die hem al had uitgezet, houdt hem uit.
Het probleem in één beeld
“Alles geladen tegen de ochtend” is een gezamenlijk probleem. Vóór de planner beslisten vier onafhankelijke delen van SEM elk alleen over de nacht, elk met een eigen kijk erop:
EV tariff planner ──── "cheapest hours for MY charge floor" ─┐
battery scheduler ──── "cheapest hours for MY pre-charge" ├─ all pick the same
cheap-hours loads ──── "run when the price level says cheap" │ cheap hour, collide,
Tier-2 loads ────────── "run off the battery at night" ─┘ peak shed picks a loser
Geen van hen wist wat de anderen namen. Geen van hen wist wat het huis zelf ’s nachts uit de batterij zou nemen. En niets kon de vraag beantwoorden die er bij het slapengaan toe doet: past alles vannacht — en zo niet, wat moet er wijken?
De gezamenlijke planner sluit dat met één gedeelde structuur — het nacht- grootboek — en één bewust eenvoudige set regels. Het is een gretige prioriteitspakker, geen optimalisator: zuiver, deterministisch, en elke toewijzing legt zichzelf in één regel uit.
Sturing tegenover boekhouding
In SEM lopen twee klokken, en ze uit elkaar houden maakt het ontwerp makkelijk te doorgronden:
- De scheidsrechter (de reactieve laag — overschotregeling, de beslisketen voor de auto, de batterijpijplijn, de piekbeheerder) draait op de nu-klok: elke tien seconden verdeelt hij wat er werkelijk stroomt — wie krijgt deze watt, wie wordt afgeschakeld voor de piek. De energiestroomgrafiek op het dashboard (het sankey-diagram) is de uitkomst van de scheidsrechter.
- De planner draait op de dag-klok: hij verplaatst de flexibele behoeften (EV-ondergrenzen, looptijden van lasten, comfortbuffering, voorladen van de batterij) naar de juiste plek in de tijd, zodat wanneer de scheidsrechter zijn verdeling van tien seconden doet, de goedkope of gratis bron er toevallig is.
Binnen de planner zijn er drie delen met taken van één woord: het grootboek (de boeken — een eerlijk model per uur van prijzen, huisverbruik, zon, het traject van de batterij, ruimte onder de piek), het plan (een dienstregeling die volgt uit het inpakken van behoeften in de boeken), en het oordeel (de kleine, fail-open signalen die de scheidsrechter raadpleegt — het enige deel dat het gedrag raakt). In één regel elk: het sankey-diagram is wat er gebeurde, het grootboek is wat we verwachten, het plan is wat we van plan zijn, het oordeel is wat we durven af te dwingen.
Stap 1 — Het nachtgrootboek opbouwen
Eén tabel, één rij per marktvak (per uur bij een statisch HT/NT-tarief, per 15 min waar de markt per 15 min werkt — de vakken volgen het tarief). Elke kolom komt uit gegevens die SEM al heeft:
│ price │ level │ home draw │ battery SOC │ grid headroom
slot │ (tariff │ (cheap │ (learned │ (trajectory,│ (peak limit − home-on-
│ curve) │ gate) │ weekday- │ see step 2)│ grid − already
│ │ │ hour │ │ committed draws)
│ │ │ profile) │ │
──────┼─────────┼────────┼────────────┼─────────────┼───────────────
22:00 │ 0.36 │ no │ 450 W │ 11.6 kWh │ 6000 W
23:00 │ 0.22 │ YES │ 420 W │ 11.1 kWh │ 6000 W
00:00 │ 0.22 │ YES │ 400 W │ 10.7 kWh │ 6000 W
... │ ... │ ... │ ... │ ... │ ...
06:00 │ 0.22 │ YES │ 500 W │ 8.3 kWh │ 6000 W
- price — de curve van de tariefleverancier. Vakken die de day-aheadmarkt nog niet heeft gepubliceerd, zijn eerlijk ongeprijsd: prijsgedreven behoeften worden eromheen gepakt, en het plan wordt opnieuw afgeleid zodra de reeks binnenkomt.
- level — of de leverancier dat uur als goedkoop indeelt. Dit is dezelfde poort die beslist of een last voor goedkope uren echt draait, zodat het plan nooit een run kan inplannen die de uitvoering zou weigeren.
- home draw — het geleerde verbruiksprofiel: één vak per (weekdag, uur), getraind op de eigen historie van dit huis, met verstandige terugvalwaarden zolang het nog leert.
- battery SOC / grid headroom — berekend door de trajectwandeling, hierna.
Stap 2 — De trajectwandeling (het huis gaat voor)
Het huis is de eerste klant van de batterij, en niemand plant dat — het eigen verbruik van de hybride omvormer bedient het huis automatisch uit de batterij. Dus simuleert de planner het, uur voor uur:
battery
energy 11.6 ●
(kWh) ●───● home draws ~0.4 kWh each hour
●───●
floor ─────────────●━━━━━━━━━━━ ← max( reserve SOC,
▲ the scheduler's sunrise target )
│
THE TAKEOVER HOUR: the battery reaches its floor here.
From this hour on the house draws from the GRID METER —
so this hour's (and every later hour's) grid headroom
shrinks by the home draw.
Twee hardwaregrenzen bewaken de wandeling, beide uit de sectie Batterij van de configuratiekaart:
- Totale ontlaadlimiet batterij — een gedeelde, ogenblikkelijke bottleneck: de afname van het huis uit de batterij plus elke geplande last op de batterij mag op geen enkel moment boven die limiet uitkomen. 500 W huis + een pomp van 1 kW + een tweede pomp van 1 kW is 2,5 kW zolang ze overlappen — de planner pakt de tweede pomp in een later uur, of meldt dat hij niet past.
- De ondergrens bij zonsopkomst — wat morgenochtend nodig is (de reserve-SOC, of het doel van de batterijplanner als dat hoger is), is onaantastbaar. Het plan geeft vannacht nooit de energie van de ochtend uit.
Houdt de batterij het ruim langer vol dan de nacht (ruim boven de ondergrens, een bescheiden huis), dan vindt de overname nooit plaats — en zegt het plan dat.
Stap 3 — De behoeften inpakken, in de sleepvolgorde
Elke “moet er morgenochtend zijn” wordt een behoefte. Er zijn vier soorten, en elk heeft zijn eigen regels:
DEMAND SOURCE RULES
─────────────────────────────────── ──────── ──────────────────────────────
battery pre-charge (the scheduler's) GRID cheapest priced slots
EV floor "at least X by Charge-by" GRID cheapest priced slots BEFORE
the deadline; never below the
charger's min amps; NEVER from
the home battery
cheap-hours load (runtime deficit) GRID only LEVEL-cheap slots; blocks
respect the anti-cycle minimum
run / minimum pause
Tier-2 load ("finish overnight from BATTERY earliest slots, price-blind,
battery", runtime deficit) free — spends only what the
trajectory leaves above the
floor AFTER the house
Ze worden ingepakt in de prioriteitsvolgorde van de lijst op het tabblad Besturing — dezelfde ene sleeplijst die de overschotronde overdag en de piekafschakeling bepaalt. De behoefte met de hoogste prioriteit neemt de goedkoopste geschikte uren; elke volgende behoefte wordt ingepakt in wat overblijft. Apparaten in de modus Uit of Alleen piek worden nooit ingepland — het plan spiegelt precies wat de uitvoering zou doen.
De koppeling is de kern: elke toewijzing verandert de wereld die de volgende toewijzing ziet. Een behoefte vanaf het net verbruikt de ruimte van dat vak. Een last op de batterij trekt het traject omlaag — dat opnieuw wordt gewandeld, waardoor het overnamemoment mogelijk eerder komt en de netruimte van elk later uur krimpt.
22:00 23:00 00:00 01:00 02:00 03:00 04:00 05:00 06:00
───────────────────────────────────────────────────────────────
home ████████ on battery ████████████████░░░░░░░░░░░░░░░░░░ ░ = on grid
EV ▓▓▓▓▓▓▓▓▓▓▓▓▓ (after takeover)
pump ▒▒▒▒▒▒
heizb. ░░░░░░ (from battery, earliest, free)
In every column: grid draws sum ≤ the peak limit,
battery draws sum ≤ the discharge limit.
Stap 4 — Het antwoord
De uitvoer is een rapport, één regel per behoefte — iets wat je om 22:00 kunt lezen in plaats van om 06:30 te ontdekken:
ENERGY-PLAN (shadow): battery carries home until 03:00 — the grid takes over from there
ENERGY-PLAN (shadow): ev:ev_charger: fits — 8.0 kWh planned, est 2.70
ENERGY-PLAN (shadow): load:pump: fits — 3.0 kWh planned, est 0.31
ENERGY-PLAN (shadow): load:heizband: YIELDS 1.1 kWh — 2.0/3.1 kWh fits above the floor
Wijken is een rapport, geen beslissing. De planner verplaatst alleen ooit wanneer een ondergrens wordt gevuld en hoe snel — nooit of. Elke garantie (het forceren van de deadline van de auto, de reservepoorten van de batterij, anti-pendelen) blijft bij de reactieve laag van SEM, die alle echte beslissingen blijft nemen. Een verkeerd plan kan nauwkeurigheid in het rapport kosten; het kan geen koude auto of een lege batterij kosten.
Wanneer het draait
once per ENERGY DAY (night-end to night-end) — retried until the
world is ready (devices registered AND the battery SOC reporting):
│
▼
build the ledger (day + night) → pack → log + stash + publish
│
▼
re-plan whenever the ASK or the SUPPLY honestly changes:
EV plug/unplug · a charge target, deadline or mode ·
a load's runtime deficit · a comfort ask appearing or moving ·
the day-ahead price curve landing · the solar forecast revising
Eén plan per energiedag overleeft herstarts en middernacht: een herstart om
00:48 is de rest van de horizon nog steeds een plan verschuldigd en krijgt er een. Elke
herplanning zegt waarom ze bestaat — het attribuut replan_cause van de sensor toont
initial voor het eerste antwoord van de dag en ask changed voor een nieuwe stempel.
Kleine schommelingen leiden bewust niet tot herplannen: doelen worden vergeleken in
stappen van 0,1 kWh, tekorten van lasten in stappen van 6 minuten, comfortvragen in
stappen van 0,5 kWh/30 minuten, en prijzen op de cent — een thermometer die
verloopt is tijd die verstrijkt, geen veranderende vraag.
De zonkant wordt vergeleken als wat het plan werkelijk uitgeeft: de uren die vandaag nog komen, en de dag van morgen (de ondergrens bij zonsopkomst, en de ruimte waarin arbitrage mag inkopen). Elk is verankerd met een dode zone van 3 kWh, en het opbranden van de dag wordt verklaard door je gemeten productie — zolang de resterende voorspelling ongeveer daalt in het tempo waarin de panelen leveren, is het de dag die volgens plan verloopt en wordt de nacht niet opnieuw gepland. Wolken die opkomen, of de leverancier die de curve herziet, openen een gat ten opzichte van die verwachting en plannen één keer opnieuw. Een correctie achteraf — de demping die uren die al zijn geproduceerd opnieuw prijst — verandert bewust niets: die uren zijn op, en het plan leest ze nooit.
Een echte herziening plant opnieuw, maar alleen een veranderd antwoord krijgt een nieuwe stempel. Voorspellings-
leveranciers per uur (Forecast.Solar) publiceren de hele nacht opnieuw, en op een
onrustige nacht verschuift elke herziening de getallen echt — dus wordt het plan
elke keer opnieuw opgebouwd. Is het opnieuw opgebouwde antwoord dezelfde beslissing die de nacht
al heeft — dezelfde blokken, dezelfde oordelen, dezelfde kosten — dan blijft de bestaande stempel
staan: computed_at markeert wanneer de beslissing is genomen, en een identieke
herverpakking is gratis. Een handmatige herplanning stempelt altijd, omdat “beslis opnieuw,
nu” zichtbaar moet antwoorden, ook als het antwoord “hetzelfde” is.
De vergelijking houdt ook op waar het plan ophoudt. Een apparaat dat de planner
nooit zou inpakken, wordt niet gevolgd: een laadpaal waarvan de modus niet aan de nacht meedoet (Off,
of Solar only zonder ondergrens “Minstens”), kan worden aangesloten, losgekoppeld en
gevuld zonder dat er iets opnieuw wordt gepland, en dat geldt ook voor een last die SEM niet mag schakelen
(Off / Peak only) of een last die de nacht niet kan bedienen. Verander je de knop
zelf — de modus, de ondergrens — dan krijgt het plan meteen een nieuwe stempel, want dat
is de vraag die verandert. Alles wat SEM niet kan beoordelen, blijft gevolgd: een
onleesbare poort neigt naar herplannen, nooit naar stilte.
Een loskoppeling telt pas als die bevestigd is. Een laadpaal die via UDP wordt gepolld, mist af en toe een meting en leest dan één cyclus “geen auto” terwijl de kabel er nog in zit; dat is een gemiste meting, geen vertrek, en die mag de nacht niet opnieuw plannen — dus een loskoppeling wordt pas geloofd nadat drie opeenvolgende cycli dat zeggen, en nooit tijdens de eerste twee minuten na een herstart, als een sensor die nog niets heeft gezegd geen sensor is die “nee” zegt. Een aansluiting wordt daarentegen direct verwerkt: een auto aansluiten geeft binnen de cyclus een nieuwe stempel.
Die bevestiging gebeurt één keer per cyclus, waar de stekker wordt gelezen — niet
op elke plek die het vraagt. Het plan, de laadtoestand, de eigen beslissing van elke laadpaal,
de sessietellers en de eigen connected-entiteiten van SEM worden allemaal
beantwoord vanuit dezelfde bevestigde meting, zodat ze elkaar in dezelfde update niet kunnen
tegenspreken over dezelfde auto. Daarom kan een hapering de auto niet meer
uit het nachtplan laten vallen, een lopende sessie beëindigen, of de
laadtoestand op System ready zetten terwijl de kabel erin zit.
De horizon van de energiedag
Het plan beslaat altijd nu → het einde van de komende nacht (het door zonsopkomst begrensde einde van de nacht dat je instelt — dezelfde grens waarop elke nacht- bron draait). Gestempeld tijdens de dag plant het de middag en de nacht samen; zonsopkomst opent de volgende periode. Alles is aan de zon verankerd, dus seizoenen hebben geen configuratie nodig: een decemberdag draagt gewoon een paar korte daglichturen bij en de nacht overheerst.
Daglichturen komen in twee eerlijke vormen in het grootboek:
- uren met verwacht overschot — de zonnevoorspelling (gevormd over de echte daglengte) is hoger dan het verwachte huisverbruik. Die zijn gratis maar eindig: prijs 0, begrensd op het verwachte overschotvermogen. Het huis draait op dezelfde zon, dus kost het het grootboek daar niets.
- tekorturen — het huis neemt het verschil af, geprijsd door de zelfde tariefleverancier die de nacht gebruikt (er is bewust geen tweede prijsroute), en afgelopen via het normale traject batterij-dan-meter.
Is er geen zonnevoorspelling geïnstalleerd, dan wordt de dag gewone geprijsde uren — de horizon beslaat nog steeds alles, er wordt niets gratis verzonnen.
Comfortbuffering
Een kamer met een comfortband (de doelvelden van #705 op een climate- of verwarmingsapparaat) is thermische massa — een batterij van lucht. De planner leert twee snelheden uit metingen die SEM al doet: hoe snel de kamer naar haar grens verloopt terwijl het apparaat uit staat, en hoe snel ze herstelt terwijl het aan staat. Samen maken ze van comfort een behoefte met een deadline, precies zoals de EV-ondergrens van vannacht:
“de kamer raakt om 17:20 haar grens — terugbufferen naar het doel kost 0,6 kWh — zet die run daarvóór in een gratis venster.”
De band volgt het eigen live setpoint van de thermostaat waar dat bestaat: je schema, aanwezigheidslogica of het eigen voorkoelen van de unit verschuift de hele band, en de waarden die je hebt ingetypt dragen alleen hun offsets bij.
Twee garanties: een comfortrun in het plan wordt alleen in uren met gratis zon of een goedkoop niveau gepakt — bufferen is opportunisme, nooit betaald vermogen tegen het normale tarief (een echte grensoverschrijding wordt direct bediend door het GEFORCEERDE niveau van de band, volgens je eigen voorwaarden voor de bronas); en elke twijfel (nog geen driftmodel, een stille thermometer, een tegenstrijdige meting) levert geen behoefte op in plaats van een geraden behoefte.
De arbitrage-adviseur
De adviseur beantwoordt bij elk plan één vraag: zou goedkope
energie in de batterij kopen en die in een duur uur leveren echt
lonen? Hij leest dezelfde boeken als al het andere — de prijscurve
over beide horizonnen, de ruimte in de batterij, de laad-/ontlaadgrenzen,
de netafname van het huis per uur, de voorspelling voor morgen — en publiceert
zijn oordeel met de getallen op de plankaart en in het attribuut
arbitrage van de sensor.
De eerlijkheidsregels, elk een test:
- het verschil moet de rondgang en de slijtage overleven
(
η·sell − buy − wearper gekochte kWh, met je ingestelde rondgaand rendement); - energie stroomt nooit terug in de tijd — lever alleen na het kopen;
- vermeden afname vereist een afname om te vermijden: levering telt alleen in uren waarin het huis echt van het net zou afnemen;
- laad nooit vanaf het net wat de zon van morgen gratis vult — de voorspelling begrenst de koopruimte;
- een gratis overschotuur is de zon die zichzelf opspaart, geen aankoop;
- ongeprijsde uren zijn geen markt.
Alleen advies. De adviseur stuurt niets aan — de commandolijn van de batterij blijft precies zoals ingesteld, en een gangbaar antwoord bij een gezond systeem in het zonnige seizoen is het eerlijke “het beste verschil loont niet”. Zijn diepere taak is controleren: hij is de enige lezer van elke pagina van het grootboek, dus als de boeken ergens niet kloppen, is een economisch absurd advies het eerste zichtbare symptoom.
Daarom draait hij ook als hij niet kan handelen — en daarom zie je hem meestal
niet. Arbitrage is een opt-in: het is alleen open als een batterij op
arbitrage toestaan staat, of de arbitrageschakelaar van de planner aan staat.
Overal anders is het oordeel een meterstand, geen antwoord aan
jou — een kaartregel “geen ruimte om in te kopen…” bij een batterij op
auto leest alsof SEM wilde handelen en iets het tegenhield,
terwijl er nooit iets zou worden verhandeld. Daarom bevat het plan of
arbitrage kan handelen naast het oordeel, en toont de kaart de regel
alleen waar dat kan. De controle blijft hoe dan ook draaien: het oordeel
blijft in het attribuut arbitrage en in de logregel ENERGY-PLAN … arbitrage:
voor elke installatie.
Waar je het ziet
- Op het dashboard — de kaart Energieplan op het tabblad Besturing
(
custom:sem-energy-plan-card; de tag van vóór de naamswijziging,custom:sem-overnight-plan-card, werkt nog als alias totdat de volgendegenerate_dashboardde YAML herschrijft). Eén rij per behoefte over een gedeelde uur- as: waar elk blok is gepland, welke uren goedkoop zijn, en de eigen rij van de batterij die blauwgroen kleurt zolang ze het huis bedient en staalblauw na de overname. Een labelshadowen een voetregel zeggen duidelijk dat SEM er nog niet op handelt — met de aansturing aan worden ze een groen labelactiveen een voetregel “de vensters van het plan sturen vannacht”. De kaart verbergt zichzelf totdat er een plan is gestempeld, zodat hij overdag niets kost. Comfortbufferruns verschijnen als eigen blauwgroene thermometerrijen; waar arbitrage open is (een batterij op arbitrage toestaan, of de schakelaar van de planner aan) toont een arbitrageregel onder de strook het oordeel van de adviseur met zijn getallen — beweeg over een rij of de regel voor het volledige verhaal, en de kleine boekpictogrammen linken direct naar dit document. - Als entiteit —
sensor.sem_energy_plan(diagnose; hernoemd vansensor.sem_energy_plantoen de horizon voorbij de nacht groeide — de oude entiteit wordt bij een herstart automatisch uit het register opgeruimd). De toestand is het oordeelwoordfits/yields/idle/pending; het plan zelf zit in de attributen (demands,slots,blocks,takeover,total_cost,computed_at,replan_cause,arbitrage), en die leest de kaart. Handig voor je eigen template-sensoren of een automatisering die je waarschuwt als een nacht niet past. Die attributen zijn een projectie: het logproza en de interne kolommen van het grootboek blijven erbuiten, en opeenvolgende toewijzingen worden samengevoegd tot runs, zodat de payload onder de attribuutgrens van 16 KiB van de recorder blijft (daarboven slaat HA helemaal geen attributen op). Bij een uitzonderlijk grote nacht valt alleen de tijdlijn weg —timeline_omitted: true, de kaart valt terug op de lijst met behoeften en zegt dat.diagnoseheeft altijd alle details. - Logboeken — regels
ENERGY-PLAN (shadow)((active)zolang de aansturing aan staat): de samenvatting op INFO, één regel per toewijzing op DEBUG. Nooit stil: zelfs “no overnight demands tonight” wordt gelogd, met de aantallen die het verklaren. - Op verzoek — het antwoord van de service
solar_energy_management.diagnosebevatenergy_plan_shadow: de tijdstempel, de samenvatting fits/yields, het overnamemoment en elke toewijzingsregel van het meest recente plan.
Waar de nauwkeurigheid van afhangt
Het plan is zo goed als zijn invoer — en die houdt SEM allemaal toch al bij:
- het vermogen van een last is zijn gekalibreerde nominale afname (geleerd uit het echte verbruik, niet de ingestelde gok);
- de huiscurve is het geleerde profiel per weekdag en uur, met als terugval het voortschrijdende gemiddelde tijdens het trainen;
- afwijkingen maken niets stuk — ze leiden tot een herplanning, en de reactieve laag was in de eerste plaats nooit van het plan afhankelijk.
Aansturing (G4)
Aansturing voegt geen stuurroute toe — ze voert de vensters van het plan
in de twee signaalfamilies die de reactieve laag al gebruikt
(coordinator/energy_plan_actuation.py):
- Auto — binnen een van zijn geplande blokken krijgt de laadpaal een ampère-
ondergrens die is afgeleid van het geplande vermogen van het blok (via het
bestaande signaal
deadline_amps, zodat de piekregelaar en de eigen [min, max] van de laadpaal er nog bovenop gelden). Buiten zijn blokken wacht hij (de bestaande tariefwachttoestand) — maar alleen zolang de resterende blokken de resterende ondergrens nog kunnen leveren. - Lasten — de starts in goedkope uren en de nachtelijke starts van niveau 2 krijgen één extra EN-poort: start nu niet als het plan de blokken van deze last vannacht ergens anders heeft gezet. De poort maakt nooit een run — het tekort, het prijsniveau, de reserve-SOC en de anti-pendeltimers blijven beslissen of; het plan vernauwt alleen wanneer.
De vertrouwensregel, per behoefte, fail-open naar het gedrag van vóór G4: de schakelaar staat
aan, het plan van vannacht is gestempeld en vers, now ligt binnen de eigen
nachtspanne van het plan, en het oordeel van deze behoefte is fits. Een behoefte
yields/partial, een verouderde stempel, een misvormd blok — elke twijfel — en die
behoefte gedraagt zich precies alsof de planner niet bestond. De reactieve
garanties blijven voorgaan, ook als ze gedekt zijn: een forcerende deadline of een
onhaalbare ondergrens wordt nooit tegengehouden, en een piekafschakeling wint nog steeds van elk
gepland venster.
Zet hem om met switch.sem_energy_plan_actuation (categorie Config op het SEM-
apparaat; blijft bewaard na een herstart, standaard aan sinds de één-poortversie —
zie de volgende sectie). Het label van de kaart, het attribuut actuation van de sensor
en de logtag tonen allemaal de live toestand.
De ene poort (de unificatie)
Sinds de één-poortversie is er nergens een tweede vensterkiezer:
- de eigen selectie van een goedkoop venster door de auto (
find_cheapest_hoursinev_control) is verwijderd — de blokken van het plan zijn het enige WANNEER voor de nacht, en een CI-ratel (tests/test_638_one_selector.py) faalt bij elke nieuwe aanroeper; - de batterijplanner houdt het WAT (tekort, break-even-economie,
doel-SOC, laadvermogen) en het plan is eigenaar van het WANNEER —
decide_batterylaadt alleen geforceerd binnen hetbattery-blok van het plan; - comfortbuffering wordt via dezelfde poort aangestuurd (behoeften
comfort:worden samengevoegd met behoeftenload:per apparaat); - de verkoopblokken voor arbitrage worden via dezelfde vertrouwensregels aangestuurd — gekoppeld, maar elke standaard houdt die route sluimerend.
Fail-open-richtingen, per familie (elk bewust, elk genoemd in de
logregel #638 coverage en op het label “reactief” van de kaart):
| Behoefte | Plan dekt het niet → | Waarom deze richting |
|---|---|---|
| Auto | laden op de deadline-/aanvulondergrens | de ondergrens is een garantie; een dure nacht is een zichtbare fout, een gemiste ondergrens is een gestrande auto |
| Voorladen batterij | niet geforceerd laden | voorladen is optimalisatie, geen garantie |
| Lasten | hun eigen reactieve regels | poorten voor tekort/prijs/reserve blijven beslissen of |
| Comfortbuffering | geen bufferrun | bufferen heeft geen reactieve reden om te draaien — het bestaat alleen als gepland blok |
| Arbitrageverkoop | geen verkoop | verkopen is dubbel opt-in (modus + schakelaar) en door het plan getimed |
Reactieve poorten die GEEN vensterselectie zijn, blijven actief en gaan voor: de prijspauze overdag van solar_plus_cheap, de overschrijving van de batterij bij negatieve prijs, piekafschakeling, reserve-SOC, anti-pendeltimers, het forceren van deadlines.
Het plan van vannacht lezen
De kaart Energieplan (tabblad Besturing) is het ene antwoord:
Een rij per behoefte — de vensterstrook toont wanneer, de tooltip toont de blokken met vermogen en prijs (waarom dit venster: het was het goedkoopste dat de beperkingen toestonden), en de kWh-cel toont hoeveel van de behoefte past. Een rij die wijkt, zegt waarom in de eigen woorden van de pakker.
Labels — zolang de aansturing aan staat, heeft elke rij zijn live toestand: stuurt nu, wacht op zijn blok, klaar — of “reactief — waarom” als het plan de behoefte op dit moment niet dekt (nog geen plan, plan verouderd, kon het niet inpassen, vannacht niets in te plannen, aansturing uit). Reactief is zichtbaar, nooit stil.
Een rustige nacht zegt dat ook. Heeft niets de nacht nodig — batterij vol, auto op doel, geen last die iets vraagt — dan wordt het plan bewust gestempeld met een leeg schema en toont elke rij vannacht niets in te plannen. Dat is een antwoord, geen fout; “plan onleesbaar” is gereserveerd voor een plan dat echt het vertrouwen heeft geschonden (een misvormd blok, een onleesbare payload). Alles wat geen planning is, verschijnt nog steeds: de uur- strook met de prijzen van vannacht, het verwachte traject van de batterij, het aandeel eigen verbruik en het arbitrage-oordeel. Een nacht waarin niets te doen is, is precies de nacht waarin die getallen het lezen waard zijn.
“Vannacht niet ingepland” — elk apparaat dat de verzamelaar bewust heeft weggelaten, met de reden. Laadpalen: de laadmodus sluit nacht- laden uit, er is geen auto aangesloten, de auto is al vol. Lasten: de modus van het apparaat sluit overschotsturing uit, er is geen looptijd meer in te halen, het zit al op zijn doel, het is een apparaat dat alleen overdag draait, of SEM heeft er nog geen gemeten vermogen voor. Een ontbrekende rij is nooit een raadsel.
De lijst noemt kandidaten, niet het hele bestand. Een apparaat wordt alleen een nachtelijke behoefte via zijn minimale dagelijkse looptijd — die instelling is de vraag, en de taak van de nacht is eraan te voldoen. Een apparaat zonder ingestelde minimale looptijd heeft om niets gevraagd, kan in geen enkele stuurmodus worden gepland, en wordt dus helemaal niet getoond. Dat doet ertoe bij een installatie via het Energie-dashboard, waar elke verbruiker in het grootboek van HA binnenkomt als
een regel en begint op alleen-piek: zonder de kandidaattoets zou de lijst elke nacht gewoon de standaardtoestand van het bestand opnieuw afdrukken. Mist een apparaat dat je verwacht in beide lijsten, geef het dan een minimale dagelijkse looptijd — dan verschijnt het, ingepland of met de reden waarom niet.
“Al vol” heeft twee getuigen nodig. Een auto telt alleen als vol als de eigen laadboekhouding van SEM dat zegt en de meter van de laadpaal het daarmee eens is — een auto die meer afneemt dan de handshakestroom van zijn laadpaal, wordt nooit als vol beantwoord, wat de boekhouding midden in het laden ook zegt. Zowel de lijst met behoeften als de herplanningstrigger vragen het aan dezelfde bron, zodat de nacht niet kan wisselen tussen een plan met de auto en een plan zonder.
De noodschakelaar —
switch.sem_energy_plan_actuationzet het gezag van het plan volledig uit; elk apparaat draait dan op zijn reactieve regels en de kaart zegt dat. Elke rij gaat binnen één cyclus naar aansturing uit: de labels worden bij elke publicatie opnieuw beoordeeld via dezelfde ene beoordelaar die de logregel gebruikt, zodat de kaart nooit een achtergebleven oordeel kan tonen van vóór het omzetten van de schakelaar.
Wat het register laat zien (#755)
Een plan dat nooit wordt gecontroleerd, is een gok met een grafiek. Daarom schrijft de planner elke nacht een derde getal op naast de twee die hij al had:
| Het getal | Waar het vandaan komt |
|---|---|
| gevraagd | wat het apparaat zei nodig te hebben |
| gepland | wat de pakker het heeft beloofd |
| werkelijk | wat het echt heeft afgenomen, geïntegreerd over de nacht |
De nacht is één eenheid — de registrator telt gewoon door over middernacht heen en staat in de blijvende opslag, zodat een reboot om 02:00 hem niet halveert. Hij houdt ook de twee splitsingen bij die antwoord geven op “heeft het plan dit echt gestuurd?”: energie binnen het geplande blok tegenover daarbuiten, en tijd die door de poort gedekt was tegenover niet gedekt.
Alleen gemeten nachten leren. Was een meting een schatting in plaats van een uitlezing, dan wordt de nacht als ongeschikt om van te leren gemarkeerd. Een behoefte zonder enige meting is niet “nul” — het is stilte. Een gat in het register (herstart, een sensor die wegviel) wordt geweigerd, nooit overbrugd. Een geraden getal mag nooit een model leren dat later beslissingen neemt.
De ochtendregel lezen. De sectie Wat het register laat zien van de kaart zegt één ding per behoefte:
- nog aan het leren — tot nu toe N schone nachten — nog niet genoeg bewijs. Het zegt dat in plaats van te gokken.
- de vraag komt overeen met wat het gebruikt — niets te veranderen.
- heeft meestal ongeveer X kWh nodig van de gevraagde Y kWh — de behoefte stopt structureel vóór haar vraag. De vraag verlagen maakt de nacht vrij voor iets anders.
- gebruikt elke nacht de volledige vraag — heeft misschien meer nodig — het kwam nooit zelf tot stilstand, dus de echte behoefte is onbekend maar minstens zoveel.
De laatste twee zijn de hele truc. Een nacht mag een vraag alleen verlagen als de behoefte haar volledige toewijzing kreeg en uit zichzelf stopte; een nacht die door het plan werd afgekapt (of die haar vraag opgebruikte) kan alleen een ondergrens omhoog duwen. De suggestie is een hoog percentiel van de leernachten, geen gemiddelde — onderbrekingen duwen de energie van een nacht alleen maar omlaag, dus een gemiddelde zou voor altijd te laag uitkomen.
SEM past deze nooit zelf toe. Het zijn aanbevelingen; jij past het doel aan, of niet.
De zonneregel vergelijkt het aandeel van je eigen zon waarvan het plan voorspelde dat je het zou houden met wat je werkelijk hebt gehouden — de reden dat het grootboek nu een overschotuur prijst tegen wat terugleveren zou hebben opgeleverd, in plaats van tegen nul. Zon die per definitie gratis is, won altijd; geprijsde zon moet winnen op de getallen, waardoor een echt goedkoper nachtuur ervan kan winnen. Zonder een terugleveringstarief is het tarief nul en is de zon echt gratis.
De weg vooruit (de verificatieladder)
- Basislijn — nachtelijke metingen van het ongewijzigde reactieve systeem: netenergie, kosten, elke gehaalde ondergrens. (klaar — het getal om te verslaan)
- Corpus — de zuivere inpakscenario’s in
tests/test_638_energy_planner.py. (klaar) - Schaduw — het plan elke nacht berekend en gelogd naast de werkelijkheid, en elke ochtend vergeleken. (klaar — zes bevindingen opgelost)
- Aansturing (huidig) — de uitvoer van het plan voedt de bestaande
signalen (de nachtampère van de auto, de vensterpoorten van de lasten), achter
switch.sem_energy_plan_actuation, standaard aan sinds de één-poort- versie (met de kiezers uitgefaseerd zou uit betekenen dat er helemaal geen timing van goedkope vensters meer is). De reconcilers veranderen niet. Duurtest: nachten in schaduw verifiëren met de schakelaar uit, daarna omzetten en dezelfde nachten vergelijken met aansturing.
Mis geen nieuwe SEM-versie
Krijg een mail bij nieuwe SEM-versies, bijgewerkte Nederlandse documentatie en praktijkcijfers. Je downloadt direct ook de gratis checklist voor het einde van de saldering.
Geen spam. Afmelden kan altijd met één klik.