Technische Details
Hoe werkt de simulatie?
De simulatie gebruikt een day-ahead optimization strategie:
- Elke dag om 13:00 worden de prijzen voor de komende 35 uur bekend
- De optimizer berekent de optimale laad/ontlaad strategie voor deze periode
- Deze strategie wordt uitgevoerd tot de volgende dag om 13:00, wanneer een nieuwe planning gemaakt wordt
Optimizer Algoritme
De implementatie gebruikt MILP (Mixed Integer Linear Programming) met de HiGHS solver:
Formulering
- Beslissingsvariabelen: Voor elke periode t:
- charge[t] = DC energie naar batterij (kWh)
- discharge[t] = DC energie uit batterij (kWh)
- soc[t] = State of Charge aan eind van periode t (kWh)
- Objectieve functie: Maximaliseer winst
profit = Σ[sell_price[t] × (discharge[t] × η_discharge) - buy_price[t] × (charge[t] / η_charge)]
- Constraints:
- SoC dynamica: soc[t] = soc[t-1] + charge[t] - discharge[t]
- Vermogen limieten: 0 ≤ charge[t] ≤ P_max, 0 ≤ discharge[t] ≤ P_max
- SoC limieten: SoC_min ≤ soc[t] ≤ SoC_max
HiGHS solver: Professionele LP/MILP solver ontwikkeld door University of Edinburgh, gecompileerd naar WebAssembly voor browser gebruik.
Deze implementatie volgt exact dezelfde MILP formulering als de originele Python implementatie met PuLP.
Efficienties
De simulatie gebruikt DC power als basis:
- Laden: AC van grid → omvormer → DC naar batterij
- Ontladen: DC uit batterij → omvormer → AC naar grid
De totale efficiëntie is: inverter_efficiency × battery_efficiency
Prijzen
De simulator ondersteunt vier prijs modes:
1. Standaard met salderen (Tibber 2025)
Inkoop: (EPEX + €0,10154) × 1,21 + €0,0248
Teruglevering: (EPEX + €0,10154) × 1,21 + €0,0248
EPEX is in EUR/kWh. Door saldering is inkoop = teruglevering. Formule bevat energiebelasting (€0,10154/kWh), BTW (21%) en Tibber inkoopvergoeding (€0,0248/kWh).
2. Standaard zonder salderen (Tibber 2025)
Inkoop: (EPEX + €0,10154) × 1,21 + €0,0248
Teruglevering: EPEX + €0,0248/1,21
Inkoop inclusief energiebelasting, BTW en Tibber inkoopvergoeding. Teruglevering is EPEX zonder BTW plus de Tibber inkoopvergoeding zonder BTW (€0,0248/1,21 = €0,0205/kWh).
3. Kaal (EPEX zonder BTW)
Inkoop: EPEX
Teruglevering: EPEX
Puur EPEX day-ahead prijzen zonder toeslagen of BTW.
4. Geavanceerd (eigen formules)
Gebruikers kunnen eigen JavaScript formules invoeren voor inkoop en teruglevering prijzen. De variabele epex (in EUR/kWh) is beschikbaar.
Cycles Berekening
Aantal cycles wordt berekend als:
cycles = gemiddelde_doorvoer / capaciteit
Waarbij gemiddelde doorvoer = (totaal_geladen + totaal_ontladen) / 2
Een volledige cyclus = 1× capaciteit laden + 1× capaciteit ontladen
Simulatie met PV en Verbruik
De "Met PV" pagina simuleert een realistischer scenario met zonnepanelen en huishoudelijk verbruik:
Zelfverbruik en Zelfvoorziening
De simulator berekent twee belangrijke metrics:
Zelfverbruik (Self-Consumption): Hoeveel van de opgewekte PV-energie wordt zelf gebruikt (niet teruggeleverd)?
- Zonder batterij:
Zelfverbruik = (PV direct naar verbruik) / (Totale PV opwek) × 100% - Met batterij:
Zelfverbruik = (PV direct naar verbruik + PV naar batterij) / (Totale PV opwek) × 100% - PV-energie die naar de batterij gaat, telt als "verbruikt" (niet teruggeleverd)
Zelfvoorziening (Self-Sufficiency): Hoeveel van je verbruik wordt gedekt door eigen opwek (niet van het net)?
- Zonder batterij:
Zelfvoorziening = (PV direct naar verbruik) / (Totaal verbruik) × 100% - Met batterij:
Zelfvoorziening = (PV direct naar verbruik + Batterij naar verbruik) / (Totaal verbruik) × 100% - Alle batterij-ontlading telt als zelfvoorziening, ook als de batterij deels vanaf het net is geladen
NB: Bij dynamische prijzen kan de batterij zowel vanaf PV als vanaf het net worden geladen. De zelfvoorzieningsmetric telt alle batterij-ontlading, ongeacht de bron. Dit geeft een praktische maat voor de totale onafhankelijkheid van het net op elk moment.
Vier scenario's
- Vast contract zonder batterij: Vaste inkoop/teruglevering prijzen, geen batterij
- Vast contract met batterij: Greedy strategie om zelfverbruik te maximaliseren
- Dynamisch zonder batterij: EPEX prijzen, geen batterij
- Dynamisch met batterij: MILP optimalisatie op basis van EPEX prijzen
Greedy strategie (vast met batterij)
Bij vaste prijzen is er geen arbitrage mogelijk. De batterij maximaliseert zelfverbruik:
- PV → direct naar verbruik
- Overschot PV → batterij laden
- Tekort → batterij ontladen
- Net alleen als laatste optie
Verbruiks- en PV-profielen
De simulatie ondersteunt realistische Nederlandse profielen:
- Verbruik: Basis (~3,5 MWh/jaar), met warmtepomp (+3 MWh), met EV (+3 MWh), of beide
- PV: 0-10 kWp systemen met realistische zonnehoek en wolkendekking voor Nederland
Eigen P1 Data Upload
De "Eigen Data" pagina ondersteunt upload van eigen P1 meter data:
CSV Format
Verwacht formaat: time, Import T1 kWh, Import T2 kWh, Export T1 kWh, Export T2 kWh
Meterstanden zijn cumulatief. De simulator berekent automatisch de deltas tussen opeenvolgende metingen.
Automatische Interval Detectie
De parser detecteert automatisch het meetinterval (5 min, 10 min, 15 min, 60 min, etc.) en aggregeert naar het fijnste prijsdata interval:
- 2013-september 2025: 60 minuten (uurlijks)
- Oktober 2025-2025: 15 minuten (kwartier)
Drill-down Navigatie
Net als de arbitrage simulatie biedt de P1 data pagina drill-down navigatie:
- Maandoverzicht: Klik op een maand om dagdetails te zien
- Dagoverzicht: Klik op een dag om uur/kwartier grafiek te zien
- Timestep grafiek: Multi-axis chart met SoC, grid flows, battery flows en prijzen
De grafiek toont automatisch uurlijkse of kwartier data afhankelijk van het prijsdata interval.
Beperkingen
- Geen onbalans of intraday markten
- Arbitrage simulatie (index.html): Geen eigen verbruik of PV-productie
- Basis simulaties (index.html, with_solar.html, custom_data.html): Constante efficiency (instelbaar, standaard 89%, niet vermogensafhankelijk)
- Geavanceerde analyse (advanced.html): Vermogensafhankelijke efficiency curves (Victron MultiPlus 5000)
Broncode
Deze implementatie is gebaseerd op een Python simulator en is volledig herschreven in JavaScript voor client-side uitvoering.
Technologieën:
- Vanilla JavaScript (geen frameworks)
- HiGHS solver (WebAssembly) voor MILP optimalisatie
- Chart.js voor visualisaties
- 100% client-side (privacy vriendelijk)