Analyzing our electricity use - dynamic contract or not?
With the energy transition, and more dynamic electriciy generation, Dutch electricity contracts are becoming more complicated. By analyzing our historical electricity consumption & production, I wanted to investigate if we can have a (significant) benefit by switching contract.
TL;DR: with ~3070 kWh supplied to grid and ~2660 kWh consumed in 2023, a variable contract costs € 201/yr (€ -95/yr with 2023 rates), and € -28/yr with dynamic contract.
Electricity providers ¶
There’s 2.5 types of contracts you can choose from in the Netherlands:
- Dynamic - electricity at spotprice
- Variable - electricity at fixed price every quarter
- Fixed - electricity at fixed price for >=1 year
Prices ¶
For variable and fixed contracts, there’s a few different rates (examples Greenchoice variable contract August 2024, rounded):
- Electricity price inc. tax: € 0.227/kWh
- Production cost (to return electricity to grid): € 0.116/kWh
- Production compensation (for yearly net producted elecitricy): € 0.145/kWh
- Fixed cost: € -0.261/day
Last year, the prices looked like this:
Consumption | Production | Fixed | |||||||
---|---|---|---|---|---|---|---|---|---|
Electricity | Tax | Total | Oversupply | Supply | Provider | Grid | Tax | Fixed | |
€/kWh* | €/kWh* | €/kWh | €/kWh | €/kWh | €/day | €/day | €/day | €/day | |
Aug ‘23 | 0.186 | 0.126 | 0.377 | -0.05 | 0.00 | 0.256 | 0.971 | -1.635 | -0.408 |
Jan ‘24 | 0.180 | 0.109 | 0.350 | -0.05 | 0.00 | 0.336 | 1.162 | -1.725 | -0.227 |
Apr ‘24 | 0.134 | 0.109 | 0.294 | -0.05 | 0.00 | 0.336 | 1.162 | -1.725 | -0.227 |
Jul ‘24 | 0.110 | 0.109 | 0.264 | -0.05 | 0.00 | 0.336 | 1.162 | -1.725 | -0.227 |
Aug ‘24 | 0.078 | 0.109 | 0.227 | -0.145 | 0.116 | 0.306 | 1.159 | -1.725 | -0.261 |
* Numbers are excluding VAT
Dynamic ¶
For dynamic contracst, the price is derived from the spotprice. E.g. Tibber (tibber.com) actuals (tibber.com) look like (see also here (tibber.com)):
- Electricity price: spotprice (Jul 27: € 0.08/kWh)
- VAT: 21% (Jul 27: € 0.043/kWh)
- Tax: (Jul 27: € 0.109/kWh)
- Other: (Jul 27: € 0.018/kWh)
- Total variable price: (Jul 27: € 0.25/kWh)
- Fixed cost: € -0.3693/day
In general, the price is given by: spotprice (shown at epexspot (epexspot.com)) + tax (€ 0.10880/kWh) + uplift (e.g. due to inbalance cost & GVO (tibber.com)) + VAT (21%).
Comparison ¶
Using historical data I compare the two options for my situation. For pricing, only two metrics are relevant:
- Electricity supplied to grid (
elproducted
). In my case this is ~3070 kWh - Electricity consumed from grid (
elconsumed
). In my case this is ~2660 kWh
Self-consumption does not trigger meter changes, and hence does not impact electricity cost (it can of course prevent cost in some situations).
Scenario 1a: Variable contract at Greenchoice ¶
Variable cost:
elproducted = 3070
elconsumed = 2660
elproduced_cost_rate = 0.11616
elproduced_reward_rate = -0.145
elconsumed_cost_rate = 0.350 # doesn't matter because we produce more than we consume
elproduced_cost = min(elconsumed, elproducted) * elproduced_cost_rate # € 309
elproduced_reward = max(elproducted - elconsumed, 0) * (elproduced_reward_rate + elproduced_cost_rate) # € -12
elconsumed_cost = max(elconsumed - elproducted, 0) * elconsumed_cost_rate # € 0
elvariable_cost = elproduced_cost + elproduced_reward + elconsumed_cost # € 297
Only elproduced_reward
or elconsumed_cost
is nonzero, you can either consume more than produced or vice versa.
Fixed cost:
elfixed_cost = -0.26102 * 365 # = € -95
Total:
elvariable_cost + elfixed_cost # € 201
With newly introduced production cost, I would have paid € 201 for my 2023 energy usage.
Scenario 1b: Variable contract at Greenchoice ¶
Previously without production cost, I would pay €309 less, or € -103/yr.
Scenario 2: Dynamic contract at Tibber ¶
Here the price rate is simpler, except I have to multiply with time-dependent spotprice which I got from epexspot.
Variable cost:
elproduced = # time resolved production to grid
elconsumed = # time resolved consumption from grid
elproduced_cost_rate = elconsumed_cost_rate = # time resolved spotprice
elconsumed_cost = (elconsumed * (elconsumed_cost_rate+1.8+10.9)*1.21).sum() # € 675, € 0.254/kWh
# For all produced electricity we get the spot price + minimal uplift (i.e. no tax/VAT)
elproduced_reward1 = (elproduced * (elproduced_cost_rate+1.8)).sum() # -186
# For produced electricity we also consume we also get tax + VAT back
elproduced_reward2 = (elproduced * (elproduced_cost_rate+1.8+10.9)*0.21).sum() # € -93
elproduced_reward3 = (elproduced * (10.9)).sum() # € -290
elproduced_reward = elproduced_reward1 + elproduced_reward2 + elproduced_reward3 # € -569
elvariable_cost = elproduced_reward + elconsumed_cost # € 106
Fixed cost:
elfixed_cost = -0.3693 * 365 # = € -135
Total:
elvariable_cost + elfixed_cost # € -28
Scenario 3: Dynamic contract at Tibber without saldering ¶
If ‘saldering’ is discontinued, with a dynamic contract I would not get the tax returns and at worst would pay € 93 + € 290 = € 383 extra per year. It’s unclear to me what the specific no saldering situation looks like, and hence whether a home battery would be a good idea or not. Better wait until the regulation is pushed out & battery tech is improved.
Home battery benefit - WIP ¶
Battery offerings are becoming more common in the Netherlands and Europe in general. Based on above analysis, I want to calculate:
- How much I can increase self-consumption with a 5 or 10kWh battery
- How much I could earn by trading electricity at the spot market & how much this would increase my use of the grid connection (e.g. in Belgium grid connection pricing is dependent on maximum power usage per month, having a battery would increase this)
Appendix ¶
Code used - note to self.
import influx2web
run influx2web.py --secretsfile ../secrets.yaml --debug --dry-run
mask3a = (dfspotprice.index >= '2023-09-01') & (dfspotprice.index <= '2024-07-27')
mask3b = (dfgridconsumption.index >= '2023-09-01') & (dfgridconsumption.index <= '2024-07-27')
mask3c = (dfelecmeter.index >= '2023-09-01') & (dfelecmeter.index <= '2024-07-27')
mask3d = (dfgridproduction.index >= '2023-09-01') & (dfgridproduction.index <= '2024-07-27')
mask3e = (dfconsumption.index >= '2023-09-01') & (dfconsumption.index <= '2024-07-27')
mask3f = (dfpvproduction.index >= '2023-09-01') & (dfpvproduction.index <= '2024-07-27')
maskcoverage = (365-35)/365
## Scenario 1: greenchoice average electricity price + terugleverkosten + grid connection
elterugleverkosten = 0.11616
# elterugleverkosten = 0
elterugleverwinst = 0.11616-0.145
elvast = 365*0.30551
elnetbeheer = 365*1.15858
elvermindering = 365*-1.72511
elconsumed = dfgridconsumption[mask3b].sum()/maskcoverage
elproduced = dfgridproduction[mask3d].sum()/maskcoverage
elcostselfconsumed = min(elconsumed, abs(elproduced)) * elterugleverkosten
elcostproduced = max(abs(elproduced) - elconsumed, 0) * elterugleverwinst
elcostconsumed = max(elconsumed - abs(elproduced), 0) * 0.22052
eltotal = elvast + elnetbeheer + elvermindering + elcostselfconsumed + elcostproduced + elcostconsumed
# eltotal 234.50976195107444 with cost
# eltotal -74.67723031839223 without cost
## Scenario 2: Tibber/ANWB
elvast = 12*6
elnetbeheer = 365*1.15858
elvermindering = 365*-1.72511
elconsumed = dfgridconsumption[mask3b].sum()/maskcoverage
elproduced = dfgridproduction[mask3d].sum()/maskcoverage
eloverproduction = max(abs(elproduced/elconsumed),1)
elcostconsumed = (dfgridconsumption[mask3b]/maskcoverage * (dfspotprice[mask3a]/10+1.8+10.9)*1.21).sum()/100
# elcostproduced = (dfgridproduction[mask3d]/maskcoverage * (dfspotprice[mask3a]/10+1.8+10.9)*1.21).sum()/100
elcostproduced1 = (dfgridproduction[mask3d]/maskcoverage * (dfspotprice[mask3a]/10+1.8)).sum()/100 # spot price
elcostproduced2 = (dfgridproduction[mask3d]/maskcoverage/eloverproduction * (dfspotprice[mask3a]/10+1.8+10.9)*0.21).sum()/100 # VAT
elcostproduced3 = (dfgridproduction[mask3d]/maskcoverage/eloverproduction * (10.9)).sum()/100 # tax
elcostproduced = elcostproduced1 + elcostproduced2 + elcostproduced3
eltotal = elvast + elnetbeheer + elvermindering + elcostproduced + elcostconsumed
# eltotal -27.879592891208404 (after only giving spotprice for overproduction)
#Heating #Home-Improvement #Smarthome #Electricity #Solar #Epex