Spelen met dynamische tarieven en de PIB
De herfst breekt aan. Wat minder zon. Wat meer bewolking en wat meer regen. De meeste van jullie zullen het herkennen dat de batterij wat minder snel gevuld zal raken en ook sneller leeg is dan je eigenlijk wilt. Niet raar natuurlijk en iets waar iedere PIB tegenaan zal lopen.
Afhankelijk van je energiecontract zou je nog wat kunnen spelen in deze periode. De herfst en winter zullen bij uitstek daar de geschikte periode voor zijn. De spread zou dan kleiner worden? Is dat zo? We gaan het meemaken de komende maanden.
Het doel dat ons gezin zich een paar maanden terug stelden na de kennismaking met de PIB en de ervaring die we er mee op deden is het verlagen van onze energierekening. Het moest verder gaan dan de terugleverboete besparing. Echter het was natuurlijk wel een leuk begin van het avontuur "thuisbatterij". Het avontuur gaat verder.......
We rijden daarnaast EV. Altijd laden aan de openbare laadpaal. Het blokje wandelen er naar toe maakte mij niets uit, de tarieven wel. Dat moest goedkoper kunnen. We namen de boel onder de loep en besloten naast de batterijen ook een laadpaal aan te schaffen. Dit terzijde voor dit topic maar deze geeft wel een extra impuls aan ons doel...... lagere energiekosten.
Wat doet dynamisch nu met de PIB in de herfst tot nu toe? Ik liet van de week al een plaatje zien:
Ik zag dat er toch wat dips zaten in de winst. Dips ontstaan om 2 redenen. Je gaat laden en dat kost geld en gaat ten koste van de winst. Winst verzilver je pas bij ontladen. 2e reden is dat de opbrengsten lager kunnen zijn dan de kosten. Dynamisch biedt mooie kansen maar ik besefte op basis van mijn grafieken dat ik beter moest gaan kijken naar de spread. Leuk om NOM te draaien maar als het uiteindelijk geld kost dan beter uit het net halen.
Ik heb een paar dagen de PIB maar eens anders bestuurd. Wat is er in die dagen geladen en ontladen? Wat waren de laadkosten en de laadopbrengsten?
Dit dus. De metingen zijn gestart bij 0% SoC en pas gestopt bij het bereiken weer van diezelfde 0% SoC. Uit het plaatje is te zien dat de laadkosten net iets hoger waren dan de ontlaadopbrengsten. 3 ct en een paar cycli verder. Niet het gewenste resultaat nog maar de dipjes die ik zag zijn dus afgevlakt.
Btw. de RTE was 71,45% over deze periode. Gemeten met de HW kWh MID meter.
Ik heb een automatisering gemaakt om het e.a. te sturen. Deze kijkt voor nu eerst naar een aantal criteria. Wat is de huidige uurprijs, wat zijn de gemiddelde laadkosten van de PIB en welke dynamische spread vind ik wenselijk. Daarnaast heb ik voor de test even aangegeven dat de PIB alleen mag ontladen als het voldoet aan de gestelde criteria en tussen zonsondergang en zonsopkomst.
Wat was de gemiddelde laadprijs? De gemiddelde ontlaadprijs? Welke spread had ik ingesteld?
Wat doet deze automatisering?
Tussen zonsondergang en zonsopkomst wordt er steeds gekeken wat de huidige dynamische uur prijs is. Als de uur prijs hoger is dan de gemiddelde laadkosten + spread dan mag de batterij gaan ontladen. Dit voorkomt dat je tegen lagere tarieven NOM gaat draaien t.o.v. de laadkosten. Daarmee probeer ik ook de laadkosten weg te werken (door te zoeken naar de juiste spread) en het als winstgevende run af te sluiten. Winstgevende run betekend dat het goedkoper was de PIB te laden dan uit het net te halen.
Ik zal de automatisering delen met jullie. Let op ik maak gebruik van een aantal sensoren die @
gielz in een eerdere automatisering heeft gemaakt.
Automatisch laden op dynamische uur- en kwartiertarieven / NOM ontladen
De automatisering:
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
| - alias: HW PIBS dynamisch laden en ontladen
description: Laadt tijdens goedkoopste uren, ontlaadt na goedkoopste uren afhankelijk van SoC, spread en nacht
trigger:
# dynamische triggers goedkoopste uren
- platform: state
entity_id: sensor.dynamisch_goedkoopste_periode
from: 'Nee'
to: 'Ja'
- platform: state
entity_id: sensor.dynamisch_goedkoopste_periode
from: 'Ja'
to: 'Nee'
# periodieke check elk vol uur
- platform: time_pattern
minutes: "0"
# triggers voor handmatige aanpassingen van SOC en spread
- platform: state
entity_id: input_number.gewenste_dynamische_spread_hw_pib
- platform: state
entity_id: input_number.gewenste_min_soc_hw_pib
# dure uren trigger
- platform: state
entity_id: sensor.dynamisch_duurste_periode
from: 'Nee'
to: 'Ja'
# dure uren trigger
- platform: state
entity_id: sensor.dynamisch_duurste_periode
from: 'Ja'
to: 'Nee'
condition:
- condition: state
entity_id: input_boolean.zendure_dynamisch_handelen
state: "on"
action:
- choose:
# DURE UREN = JA → HW altijd STANDBY
- conditions:
- condition: state
entity_id: sensor.dynamisch_duurste_periode
state: "Ja"
sequence:
- service: rest_command.mode_standby
- service: notify.notify
data:
message: >
HW batterij naar STANDBY tijdens dure uren.
Trigger={{ trigger.to_state.entity_id if trigger is defined and trigger.to_state is defined else 'periodic' }}
# Goedkoopste uren = JA → laden altijd
- conditions:
- condition: template
value_template: >
{{ is_state('sensor.dynamisch_goedkoopste_periode', 'Ja') and is_state('sensor.dynamisch_duurste_periode','Nee') }}
sequence:
- service: rest_command.mode_to_full
- service: notify.notify
data:
message: >
HW batterij start met laden tijdens goedkoopste uren.
Trigger={{ trigger.to_state.entity_id if trigger is defined and trigger.to_state is defined else 'periodic' }}
SoC1={{ states('sensor.plug_in_battery_laadpercentage') }},
SoC2={{ states('sensor.plug_in_battery_2_laadpercentage_3') }},
Spread (ct)={{ states('input_number.gewenste_dynamische_spread_hw_pib') | float(0) | round(1) }},
Nordpool={{ states('sensor.dynamisch_nordpool') }}
# Goedkoopste uren = NEE → check SoC, spread en nacht
- conditions:
- condition: template
value_template: >
{{ is_state('sensor.dynamisch_goedkoopste_periode', 'Nee') and is_state('sensor.dynamisch_duurste_periode','Nee') }}
sequence:
- variables:
soc1: "{{ states('sensor.plug_in_battery_laadpercentage') | float(0) }}"
soc2: "{{ states('sensor.plug_in_battery_2_laadpercentage_3') | float(0) }}"
gemiddelde_soc: "{{ (soc1 + soc2) / 2 }}"
zonshoogte: "{{ state_attr('sun.sun', 'elevation') | float(0) }}"
nacht: "{{ zonshoogte < 0 }}"
nordpool_eur: "{{ states('sensor.dynamisch_nordpool') | float(0) }}"
avg_load_eur: "{{ states('sensor.hw_pibs_gemiddelde_laadkosten_periode') | float(0) }}"
gewenste_spread_ct: "{{ states('input_number.gewenste_dynamische_spread_hw_pib') | float(0) }}"
gewenste_spread_eur: "{{ gewenste_spread_ct / 100 }}"
min_soc: "{{ states('input_number.gewenste_min_soc_hw_pib') | float(61) }}"
- choose:
# Voorwaarden voor ontladen 's nachts
- conditions:
- condition: template
value_template: >
{{ nacht
and (gemiddelde_soc < min_soc)
and (nordpool_eur > (avg_load_eur + gewenste_spread_eur)) }}
sequence:
- service: rest_command.mode_zero
- service: notify.notify
data:
message: >
HW batterij gaat ontladen (mode_zero).
Nacht={{ nacht }},
Gem_SoC={{ gemiddelde_soc | round(1) }},
Min_SoC={{ min_soc }},
Nordpool={{ nordpool_eur }},
Avg_Load={{ avg_load_eur }},
Spread_ct={{ gewenste_spread_ct | round(1) }},
Trigger={{ trigger.to_state.entity_id if trigger is defined and trigger.to_state is defined else 'periodic' }}
# Anders: standby
- conditions: []
sequence:
- service: rest_command.mode_standby
- service: notify.notify
data:
message: >
HW batterij gaat naar / blijft in standby.
Nacht={{ nacht }},
Gem_SoC={{ gemiddelde_soc | round(1) }},
Min_SoC={{ min_soc }},
Nordpool={{ nordpool_eur }},
Avg_Load={{ avg_load_eur }},
Spread_ct={{ gewenste_spread_ct | round(1) }},
Trigger={{ trigger.to_state.entity_id if trigger is defined and trigger.to_state is defined else 'periodic' }}
mode: single |
Mocht je de code willen gebruiken? Het stukje m.b.t. Zendure is meer voor mij handig, mag je skippen. Daarnaast gaan er ieder uur notificatties naar een mobiel bijvoorbeeld. Leuk voor debug doeleinden anders lekker verwijderen of een # voorzetten (commentaar in HA yaml).
Het is vooral kijken naar het ontladen nu dus. Ik heb de spread verhoogd. Deze stond op 7 ct per kWh. Uiteindelijk werd gerealiseerd:
Voor de nieuwe tests ga ik de spread naar 8 ct verhogen. Kijken of er ook meer gerealiseerd wordt en er ook nu een plus weer gaat ontstaan aan besparingen. Het blijft leuk om hiermee te stoeien. Voor de 1 gerommel in de marge, voor de ander een (hoog) tweak gehalte, weer een ander vindt het leuk om te lezen en de laatste groep verklaard je rammel gek ;-P
Doe er je eigen voordeel mee.
Denk in kansen, niet in problemen. Homewizard Plug-In Battery 5.4 kWh. Zendure 2400 AC 17.2 kWh. 3330 Wp zonnepanelen. EV 77 kWh. Peblar Business Laadpaal.