HEMS project

Pagina: 1
Acties:

  • TKroon
  • Registratie: December 2006
  • Niet online
Al jaren stuurt Homey mijn hele huis aan. EV's, warmtepomp, airco's, batterijen, etc. Dit begon met bijzonder complexe advanced flows. Het lastige is dat het moeilijk is om goed vooruit te kijken. Dat lukte een beetje. Toen kwam AI op en werd het mogelijk om homeyscripts te gebruiken voor een betere planning op basis van mijn wensen. Dat werkte prima per apparaat, maar bracht het geheel nog niet samen. Dat was nog niet zo'n ramp omdat er nog gesaldeerd kon worden, maar die energieplanning wordt een stuk complexer vanaf 1 januari. Dus ik ben eens met Claude aan de slag gegaan. Probleem uitgelegd, requirements opgesteld en begonnen om een Home Energy Management System-docker te bouwen. Homey moet ernaast gaan draaien en alle planningen uitvoeren, maar HEMS moet de energieplanning maken.

Dit is in 2,5 maand met Claude Pro gemaakt. Bijzonder indrukwekkend wat er mogelijk is tegenwoordig.

Afbeeldingslocatie: https://tweakers.net/i/XqPW467UuI0RA83GRwwbmvTsqRQ=/800x/filters:strip_exif()/f/image/oBVT9qICn1dI1ZkH5lvEDdRL.png?f=fotoalbum_large
---

## De taakverdeling tussen Homey en HEMS

De belangrijkste keuze in het hele ontwerp is een knip. Homey meet en schakelt. Hij leest de P1-meter, de laadstand van de auto's, de temperatuur van de boiler, het vermogen van de omvormers. En hij voert uit: de Zappi in FAST zetten, de accu op een vermogen, de warmtepomp aan met een aanvoertemperatuur. HEMS rekent. Hij weet niets van Z-Wave of Zigbee en heeft geen enkele driver. Hij krijgt getallen binnen op MQTT, rekent drie dagen vooruit, en publiceert wat er moet gebeuren. Die knip is meer waard dan hij lijkt. Homey-flows zijn uitstekend in "als dit, dan dat" en hopeloos in "wat is over drieënzeventig uur de goedkoopste combinatie". Omgekeerd wil ik in een planner geen apparaatprotocollen hebben. Gaat HEMS onderuit, dan voert Homey gewoon de laatste bekende planning uit. Een voorbeeld:

```

hems/auto/208/plan

{"blokken":[{"van":"2026-09-24 0000","tot":"2026-09-24 0127","modus":"UIT"},

            {"van":"2026-09-24 0127","tot":"2026-09-24 0251","modus":"FAST"}]}

```

Geen kwartierraster, geen vermogens die de Zappi toch niet kent. "Zoek het blok waar nu in valt" is het hele protocol. Dat de planner intern op drie minuten rekent hoeft de ontvanger niet te weten.

---

## De energieprijzen

HEMS haalt de day-ahead prijzen op bij Nord Pool: 96 kwartieren per dag, de volgende dag komt pas rond 13:00 beschikbaar. Dat is een probleem, want het is natuurlijk zonde als de auto om 11:00 vol gaat laden terwijl hij ook morgen tegen een fors lager tarief had kunnen laden. Daarvoor gebruik ik [url=https://energypriceforecast.eu] Energy Price Forecast[/url] waarbij HEMS via de api op uurresolutie een voorspelling kan ophalen. En die blijkt behoorlijk accuraat!

Dit wordt gecombineerd met de totale PV-verwachting op kwartierresolutie. Dat rekent HEMS weer terug naar 3-minuten-resolutie, want daar draait het model op. Een nog fijnere resolutie kostte teveel rekenkracht en een grovere resolutie was niet nauwkeurig genoeg.

---

### De tijdstraf: een kilowattuur nu is meer waard dan morgen

Alle prijzen krijgen een opslag naarmate ze verder in de toekomst liggen: twee cent per etmaal. Dat is geen rente maar onzekerheid. De EPEX-prijzen staan misschien nog niet vast, de PV-prognose van overmorgen is een gok, en de agenda kan veranderen. Het effect is dat de planner niet gaat fladderen. En daar komt de prijsverwachting binnen. De tijdstraf zegt "doe het nu, tenzij". De verwachting is wat dat "tenzij" invult.

---

## Hoe de planning werkt

Elke twee minuten draait er een ronde. Die begint bij de prijzen en de PV-prognose, en eindigt bij blokken op MQTT. Wat ertussen zit verschilt per soort apparaat, en dat is met opzet: een auto is een heel ander soort probleem dan een accu. Ik heb gekeken naar een solver voor de perfecte oplossing, maar dat bleek niet beter dan hoe het nu is. Jobs hebben bepaalde prioriteiten en die krijgen dan voorrang. Ook wil ik niet dat de warmtepomp stopt met verwarmen zodat de auto net 1 cent goedkoper kan laden bijvoorbeeld. Het gebeurt stapsgewijs, met wel nog enkele checks of ruilingen nog iets toevoegen.

### Auto's: de agenda als invoer

Dit is het onderdeel waar ik zelf het meest plezier van heb, want het vraagt niets van me. Ik zet een afspraak in mijn agenda en de auto staat op tijd vol genoeg. Daarvoor draait er een tweede container naast HEMS: de iCal-planner. Die leest onze agenda's — werk, kinderen, de mijne, die van mijn vrouw — en maakt daar ritten van. Dat is minder triviaal dan het klinkt, want een agenda staat vol dingen die geen rit zijn. Wat hij uitzoekt, per afspraak: Is dit wel een rit? Een afspraak zonder locatie is dat niet. Een afspraak op het thuisadres ook niet. Er zitten regels in voor welke agenda's meedoen en welke trefwoorden iets juist uitsluiten. Waar is het en hoe lang duurt het? Hij zoekt de locatie op en berekent de reistijd over de echte route. Vertrek is de starttijd min de reistijd min een marge van een kwartier. Terugkomst is het einde plus de reistijd terug. Alles daartussen is de auto weg en kan er dus niet geladen worden. Horen deze afspraken bij elkaar? Drie afspraken op één dag in dezelfde stad zijn één rit met twee tussenstukken, geen drie keer heen en weer. Hij bundelt ze als ze aansluiten, en telt de kilometers van de hele ketting op. Hoeveel moet erin? Dit is het echte rekenwerk. De afstand retour, het verbruik per honderd kilometer bij de verwachte buitentemperatuur van dat moment — een winterrit kost merkbaar meer dan dezelfde rit in mei — plus een toeslag voor avond- en nachtritten, want dan wordt er harder gereden. Daar bovenop een buffer van 12% en een reserve van 8%. Wat eruit komt is één getal: de laadstand die de auto bij vertrek moet hebben. Voor mijn dienst van morgen ziet dat er zo uit: 87 kilometer retour, 17 graden, 16,3 kWh per 100 km, dus 14,2 kWh netto. Dat is 36,5% van de accu, plus de buffer: 48,5% bij vertrek.

Dat is de beschikbaarheid: de vensters waarin de auto thuis aan de paal hangt. En daarnaast per rit het vertrekmoment met de vereiste laadstand. Meer heeft HEMS niet nodig. Elke rit wordt een deadline job — "vóór donderdag 07:20 moet er 36 kWh in" — en die mag alleen laden binnen de vensters vóór zijn eigen deadline. De goedkoopste kwartieren gaan naar het laden, ongeacht bij welke rit ze horen — een vroege rit mag niet de goedkope uren opsnoepen die een latere rit nodig heeft. Daarna volgt een consolidatiestap. Water-filling kiest namelijk keurig de goedkoopste kwartieren, en die liggen verspreid over de nacht. Voor de elektriciteitsrekening maakt dat een paar cent uit; voor de laadpaal en de auto is vier keer starten en stoppen gewoon slechter. Er zit dus een schakelstraf in.

Afbeeldingslocatie: https://tweakers.net/i/dFS0D2d-d3Qp98iFV7rJd40kkco=/800x/filters:strip_exif()/f/image/ewu87jtLQWslP3pUHJE0FsMM.png?f=fotoalbum_large

### Accu's: dynamisch programmeren over de laadstand

De twee thuisaccu's — een Marstek van 15 kWh en een Nexus van 20 kWh — worden gepland met dynamisch programmeren. De toestandsruimte is de laadstand maal de richting van het vorige kwartier, dat laatste zodat er een straf op het wisselen van stand kan zitten. Wat daar allemaal in moet:

- Slijtage. Elke kilowattuur die erin en eruit gaat kost een paar cent aan levensduur. Zonder die post handelt de planner zichzelf kapot voor een halve cent verschil.

- Rendement. Wat erin gaat komt er niet helemaal uit.

- Restwaarde. Zonder een waarde voor wat er aan het eind van de horizon in zit, maakt de planner de accu leeg omdat ontladen daar gratis winst lijkt.

- Noodstroomreserve. Eén accu levert bij stroomuitval het huis. Hoeveel er minimaal in moet zitten verschuift over de dag: overdag mag hij dieper, tegen de avond loopt de grens op — en de planner ziet die stijging aankomen. Er zijn 4 panelen direct DC aangesloten en HEMS kent de PV-prognose.

Afbeeldingslocatie: https://tweakers.net/i/CAjJR-0Bm532dnpLqOohG6z4DYw=/800x/filters:strip_exif()/f/image/pwr1QiPOPJIRwL5ri9znToPV.png?f=fotoalbum_large

En nog een leuke toevoeging: ik heb nog twee modi toegevoegd NOM-laden en NOM-ontladen. Zo wil ik niet dat de accu terug gaat leveren op de allergoedkoopste prijzen, maar hij wél overtollige zonnestroom op kan slaan. Met NOM-laden regelt Homey het laadvermogen dus alleen tussen 0 en +max.

### Warmtepomp: twee massa's en een comfortband

De verwarming is het lastigste onderdeel, en het leukste. Het huis is gemodelleerd als twee massa's: de dekvloer (2 kWh per graad, reageert in uren) en de rest — lucht, muren, meubels (19 kWh per graad, reageert in dagen). Homey logt al jaren alle data in Influx, en die heb ik Claude laten analyseren om een juiste warmteverliesberekening te maken.

De vloer is de buffer waar je mee kunt schuiven; het huis is de traagheid die je niet kunt negeren. Daar komt bij dat comfort niet alleen luchttemperatuur is. Een warme vloer straalt, en dat voel je. In het model schuift de onderkant van de comfortband daarom mee met hoe ver de vloer boven de kamer staat: met een hete vloer is 20,2 graden prima, met een koude vloer wil je 20,5. Ook geeft HEMS de aanvoertemperatuur terug, die Homey weer instelt op de warmtepomp. 28 is in principe het minimum, maar als het flink kouder wordt, of een erg lage stroomprijs wordt kan deze oplopen. (ik heb de temperaturen fictief verlaagd zodat ik het verwarmingsmodel kan testen. Door die offset zie je nu dus verwarmingsmomenten.)

Afbeeldingslocatie: https://tweakers.net/i/7Us8_KROSbZELsy8UbdJ2thvdds=/800x/filters:strip_exif()/f/image/BZxQsvN3wGEldKVrqB8gbq4L.png?f=fotoalbum_large

### Boiler: een voorraad, geen apparaat

De warmwatertank wordt niet als "aan/uit" gepland maar als voorraad. HEMS houdt bij hoeveel liter water van veertig graden erin zit, hoeveel er per dag uitgaat volgens een verbruiksprofiel, en plant runs zodat de voorraad nooit onder de vraag komt. De tank is gelaagd — warm bovenin, koud onderin — en dat zit in het model, want anders onderschat je stelselmatig hoe lang een run duurt.

---

## De fasebelasting

Mijn aansluiting is 3×25 A: 5,75 kW per fase, ruim 17 kW in totaal. Dat lijkt veel tot je gaat tellen: de 208 laadt met 10 kW over drie fasen, de 508 met 3.6 kW op één fase, de warmtepomp piekt bij ontdooien, en de boiler heeft een element van 3 kW. HEMS houdt daarom per fase bij wat er gebeurt, per drie minuten. Drie dingen daarbij zijn niet vanzelfsprekend: De zekering zit per fase, niet op het totaal. Een wasmachine op L1 zegt niets over de ruimte op L2. Elk apparaat staat met zijn fase op de stamkaart; driefasige apparaten verdelen gelijk, eenfasige niet. Wat de zekering ziet is netto. Zonnepanelen die op dezelfde fase invoeden compenseren de afname daar — en alleen daar. Mijn grote omvormer staat op drie fasen, de kleine op L2, de micro-omvormers op L3. Dat bepaalt mede hoeveel ruimte er per fase overblijft. Marge hoort alleen op een schatting. Het huisverbruik is een schatting en krijgt marge. Wat HEMS zelf plant is geen schatting — daar weet hij het precieze getal van. Marge stapelen op dingen die je al weet maakt de planning alleen maar banger. De Zappi bewaakt de aansluiting bovendien zelf. Die kan dus onder zijn minimum gemiddeld blijven door te pauzeren en te hervatten in seconden, waar HEMS in minuten rekent. Dat betekent dat HEMS met een lager vermogen mag rekenen maar de stand op FAST mag laten staan.

Nu draait alles nog als test op de achtergrond, maar als het over enkele weken nog goed draait wil ik hem al eerder in gebruik nemen :) dan maak ik de import en export prijzen gewoon aan elkaar gelijk en dan werkt het al goed.

Daikin Altherma 3 LT 8 kW + 16 kWp PV


  • GaMbiNo
  • Registratie: April 2001
  • Laatst online: 21:36

GaMbiNo

1337

Gaaf. Ik zit een beetje in dezelfde situatie. Ik stuur al alles aan (warmtepomp, ev, zonnepanelen, Nexus) maar de samenhang is er nog niet genoeg.

Heb je toevallig al iets op GitHub staan? :)

  • TKroon
  • Registratie: December 2006
  • Niet online
@GaMbiNo nee, (nog) niks op GitHub. Ik twijfel een beetje of het iets toevoegt. Het betreft best wat specifieke zaken die niet universeel toepasbaar zijn:

- warmteverlies van ons huis
- type laadpalen van de auto en specifieke output
- iCal planner
- integratie van Nexus (mag zelfconsumptie aanzetten, maar bewaakt ook onbalans en schakelt dus terug indien nodig)

Ik wil de code best delen, maar laat aan jou of je het handiger vindt om het zelf te bouwen of mijn code aan te passen. Ik kan ook de readme delen. Wat je wilt :)

Daikin Altherma 3 LT 8 kW + 16 kWp PV


  • GaMbiNo
  • Registratie: April 2001
  • Laatst online: 21:36

GaMbiNo

1337

TKroon schreef op donderdag 24 september 2026 @ 13:29:
@GaMbiNo nee, (nog) niks op GitHub. Ik twijfel een beetje of het iets toevoegt. Het betreft best wat specifieke zaken die niet universeel toepasbaar zijn:

- warmteverlies van ons huis
- type laadpalen van de auto en specifieke output
- iCal planner
- integratie van Nexus (mag zelfconsumptie aanzetten, maar bewaakt ook onbalans en schakelt dus terug indien nodig)

Ik wil de code best delen, maar laat aan jou of je het handiger vindt om het zelf te bouwen of mijn code aan te passen. Ik kan ook de readme delen. Wat je wilt :)
Ik ben zelf ook al even aan het puzzelen geslagen met iets soortgelijks. :) Dit geeft me mooi weer wat inspiratie om eens te onderzoeken of ik iets moois kan maken dat warmtepomp, ev, en de thuisbatterij kan combineren.

  • TKroon
  • Registratie: December 2006
  • Niet online
@GaMbiNo vooralsnog laat ik de Nexus zijn gang nog gaan. Opbrengsten ben ik tevreden over en die haal ik er uit eigen aansturing zeker niet uit. Los daarvan zou ik qua planning wel graag de totale controle willen ;) maar op dit moment zit de Nexus me nergens in de weg, hij kan alleen soms helpen.

Daikin Altherma 3 LT 8 kW + 16 kWp PV