Over mij

Nieuwe oplossingen voor Victron thuisbatterijen

Op verzoek van onze klanten hebben we de afgelopen maanden diverse thuisbatterijen geleverd waarbij bestaande, meestal al wat oudere, PV omvormers zijn vervangen door een efficiente MPPT lader waarmee de zonnepanelen direct op de batterijen worden aangesloten. Victron biedt hiervoor een uitbreide serie MPPT laders maar in 90% van de gevallen kiezen voor we de complete RS450-100 of RS45-200 lader. Met de RS450-100 kunnen we maximaal 2 strings aansluiten met een gecombineerd vermogen van maximaal 5.5 kWp. We maken vooraf altijd een berekening om te zien of en hoe de oude panelen gekoppeld kunnen worden. Maar we hebben nu ook al configuraties gebouwd waarbij nieuwe 400Wp panelen worden toegepast. Maximaal kunnen we dan 18 panelen op de RS450-100 of 36 op de RS450-200 aansluiten. Daarmee kun je aardag wat zonnestroom oogsten! Reden genoeg om deze te verwerken in onze standaard concepten.

De meeste configuraties bouwen wij op een montage bord. Ze worden in een schuur of bijkeuken geplaatst, we vinden een plekje in de kelder en heel soms bouwen we het in een buitenkast. Ook best strak, al zeg ik het zelf. Je kunt het nieuwe overzicht met onze oplossingen hier downloaden.

Past een thuisbatterij in jouw huis?

In dit artikel som ik de verschillende ESS installaties op die wij de afgelopen maanden hebben gebouwd en opgeleverd. Het geeft de diversiteit aan van oplossingen die wij samen met de klant ontwikkelen, bouwen en beheren. Elke situatie is anders en dus is elke oplossing anders.

De eerste installatie omvat 3 Multiplus 3000 systemen die samen met een 15kWh batterij in een kleine kelder onder de woning zijn geplaatst. Het 10-jaar oude zonnesysteem is uitgebreid met extra panelen en voorzien van SolarEdge optimizers voor de oude en nieuwe panelen. De SolarEdge omvormer is geheel geïntegreerd in het ESS. De meterkast is in tweeën gedeeld: een deel parallel met het ESS en een deel in serie ivm backup bij stroomuitval.

Voor een andere installatie heeft de eigenaar gekozen voor een zelfgebouwde nieuwe buitenkast waarin de installatie is geplaatst. In de kast hangen 3 stuks Multiplus 3000 en staat de batterij opgesteld. Temperatuur sensoren bewaken de temperatuur en kunnen het laadproces beïnvloeden als het te koud wordt. De hele woning is in serie met het ESS geplaatst zodat bij stroomuitval alles toch blijft werken. Een SolarEdge omvormer is ook hier in het systeem geïntegreerd. De verticale zonnepanelen zijn enkele jaren geleden door Hetslimmehuis gemonteerd.

In een nieuw gebouwde schuur wilde deze bewoner het dak geheel met zonnepanelen bedekken en daarna de zelfopgewekte stroom efficient via een batterij kunnen benutten. De installatie bestaat uit 3 multiplus 3000 omvormers en een MPPT lader voor de zonnepanelen. De batterij is een 15kWH exemplaar.

Hierboven is een installatie weergegeven die in een kantoorgeving is geplaatst. Het kantoor is nog in aanbouw en de installatie zal straks in een fraaie kast worden geplaatst zodat bezoekers de installatie kunnen bekijken. Samen met deze klant is een ontwerp gemaakt voor zonnepanelen op het plattedak van het kantoor. Deze PV installatie bestaande uit 4 strings van elke 8 panelen is zelf geplaatst terwijl het elektrische gedeelte door Hetslimmehuis is geïnstalleerd en via een MPPT lader direct op de batterij is aangesloten. De batterij is nu nog een 15kWh exemplaar maar zal in de loop van 2023 worden verdubbeld in capaciteit. Tijdens de afbouw van het kantoor is er nog geen aansluiting op het grid mogelijk. Toch is de elektrische installatie nu al in werking en draait geheel op zonnestroom via de batterijen.

De installatie hierboven is eveneens een 3 fase installatie (3 stuks 3kVA) maar nu gebouwd in een buitenkast die op het balkon van de woning staat. De batterij staat aan de binnenzijde, net als het bedieningsdisplay. Twee bestaande GroWatt PV omvormers zijn met speciale CT klemmen op het systeem aangesloten zodat de opbrengst van de zonnepanelen gemeten kan worden in het ESS.

De installatie hierboven is geplaatst in een tussenruimte die een zeer oude boerderij verbind met een woonhuis. De bewoner heeft al vele verbouwklussen uitgevoerd en besloot tot een grondige renovatie van de elektrische installatie. Samen met de elektricien hebben wij een meterkast ontworpen en verschillende onderverdelers verbonden waar een laadpaal, een SolarEdge omvormer en andere verbruikers zijn gekoppeld. Het ESS heeft daarnaast ook nog een MPPT lader voor een 2e PV veld dat op de grond is gebouwd. De Victron omvormers zijn van het 5kVA type en er zijn 2 batterijen, totaal 30kWh aangesloten.

Een andere klant had al ervaring met een Victron ESS. Hij heeft 2 jaar gedraaid met een enkel fase omvormer samen met een zoutwaterbatterij. Maar deze deed niet meer wat hij ervan verwachtte en hij heeft ons gevraagd het systeem te vervangen door een volledig 3 fasen systeem bestaande uit 3 stuks Multiplus 5000 en een batterij van 30kWh. Voor deze installatie hebben wij twee bestaande SolarEdge omvormers geïntegreerd in het ESS. Het systeem staat opgesteld in een kelder onder de woning.

Terwijl je in de ene kelder sta hoogte hebt, is een andere kelder slechts bereikbaar op de knieën. Voor ons geen probleem en gelukkig bleek de eigenaar bereid om zelf alle kabels al te trekken zodat wij deze alleen nog hoefden aan te sluiten. De eigenaar besloot om tegelijkertijd de oude SMA omvormer te vervangen door een MPPT lader die direct op de batterijen is aangesloten. Efficiënter kan het niet. Inmiddels is deze eigenaar al bezig om zelf software te ontwikkelen om de besturing van het ESS volledig zelf uit te voeren. En daar helpen wij graag bij. Het systeem bestaat uit 3 stuks Multiplus 3000 met een 15kWH batterij.

Dat het niet altijd groot hoeft te zijn toont de installatie hierboven. Hoewel de volledig elektrische installatie 3 fasen is, is het ESS in een enkel fase uitvoering geleverd. Het ESS staat opgesteld in een schuur naast een oude onderverdeler. Wel is er een extra kabel gelegd naar de hoofdwoning zodat de belangrijkste verbruikers toch kunnen profiteren van een backup. De batterij is een 12kWh exemplaar. Overigens is er rekening gehouden met eventuele uitbreiding naar een 2e of 3e fase als dat in de toekomst wenselijk is.

Ook de volgende installatie hierboven toont een enkele omvormer, nu weggewerkt in een schuin hoekje achter een vriezer en wasmachine. Hier is er sprake van een Tiny House op een park waar de stroomaansluiting zeer twijfelachtig is. Het ESS is samen met een SolarEdge omvormer en een warmtepomp geïntegreerd zodat er efficiënt verwarmd kan worden zonder bang te zijn dat het elektriciteitsnetwerk van het park uitvalt. Met metingen is aangetoond dat op koude dagen de spanning van het grid kan zaken tot onder de 200 Volt. Het ESS met een 12kWH batterij vangt dat nu prima op. Ook het overschot aan zonnestroom zorgde er in de zomer wel eens voor dat de SolarEdge omvormer een standje lager moest werken. Ook dat probleem wordt nu opgelost met de batterij set.

Heb je ook een geschikte plek en zoek je een thuisbatterij? Of wil je eerst nog eens overleggen? Kom maar op!“

Sluipverbruik? Weg ermee!

Elektrische apparaten die de hele dag aan het stroomnet zitten maar eigenlijk niets doen. Of gewoon teveel stroom verbruiken omdat het apparaat oud en versleten is. Het leidt tot veel verspilling en ik heb daar veel onderzoek naar gedaan. En de gegevens die ik heb verzameld deel ik graag met je. Ik heb dat ondersteund met een filmpje op Youtube.

Het elektrische verbruik waar ik op doel noemen we sluipverbruik. Neem de televisie in je woonkamer. Terwijl deze uitstaat verbruikt deze toch energie als hij standby staat. Je ziet bijvoorbeeld het rode controle lampje dan branden. Dat verbruik gaat 24 uur per dag door en dat 365 dagen per jaar. Voor een moderne televisie is dat misschien maar een paar Watt, laten we zeggen 5 Watt. Per jaar is dat dan 44 kWh aan verbruikte energie. En met een prijs van € 0,50 hebben we het dan dus over 22 euro in een jaar. Nu zal jij zeggen: ja maar dat sluipverbruik van die televisie is toch helemaal niets? Nee, dat ene apparaat is misschien niet zoveel. Maar kijk eens goed rond in je huis en tel het dan maar eens op. Dan zul je zien dat het wel heel erg veel is. En je kunt er wat aan doen! Bekijk de video en gebruik de onderstaande lijst om zelf eens op onderzoek uit te gaan. trek de stekker uit het apparaat als je hem niet gebruikt. Of gebruik een standby killer (Schakelaar) of vervang het apparaat door een modern nieuwe apparaat. En zeg dan niet “ja maar de koelkast doet het toch nog en het is dan toch zonde om deze te vervangen?”. Nou, dat is maar hoe je het bekijkt. Als de koelkast jaarlijks 400 euro aan energie teveel verbruikt is de aanschaf van een nieuwe misschien binnen 3 jaar al terugverdiend. Aan de slag dus.

Lijst van verbruikers

Elektrische  verbruikersStandby verbruik
(Watt)
Aantal uren / dagDagen / jaar Verbruik/jaar (kWh) Standby/jaar (kWh) 
2e televisie (keuken)21300                         4,5                     17,5
Apple airdevice1524365                     192,7131,4
Beveiliging (alarm, cameras, opslag)524365                       43,843,8
Burolamp halogeen2490                         4,3                     17,5
Computer Apple A18365                     350,48,76
Computer Apple B18365                     438,08,76
CV Ketel Kantoor22471                     110,817,52
CV Ketel woning22471                     110,817,52
Deurbel / trafo424365                       35,035,04
Elektrische boiler, close-in keuken00,5365                     401,50
Elektrische fiets0870                           –  0
Elektrische kachel0810                     176,00
Elektrische vloerverwarming22180                  1.080,017,52
Elektrische vloerverwarming22180                     720,017,52
Enelogic youless p1024365                           –  0
Gas Haard0                           –  0
Haus und Leistungsverstarker1524365                     131,4131,4
HP Inkjet printer Pro697050,550                         0,943,8
HP Laserjet Printer pagewide 47720,1200                         1,617,52
Infraroodsauna0253                     424,00
Internet kabel modem splitser324365                       78,826,28
Internet Router924365                       78,878,84
Keuken apparatuur divers Ben60,1200                       24,052,56
Klik aan / klik uit verlichting324365                     438,026,28
Koelkast Ben14365                       94,98,76
Koelkast keuken012365                     262,80
Koffie apparaat0,50,1300                       36,04,38
Kookplaat inductie10,5300                     375,08,76
Kookplaatje elektrisch B000                           –  0
LED driver/dimmer7,54300                         9,065,7
LG subwoover Ben2220                         3,017,52
Luchtverfrisser28120                       96,017,52
Magnetron10,1150                       18,08,76
Oven10,1100                       35,08,76
Panasonic TV B2220                         6,017,52
Phillips beeldscherm HDMI 284E025                         0,30
Phillips device (onbekend)124365                         8,88,76
Phillips dockingstation/wekker124365                         8,88,76
Pomp vloerverwarming3624365                     315,4315,36
Sonos / TP link router112180                       10,896,36
Sonos draadloze speaker (2 stuks)8250                         4,070,08
Sonos en LG DVD speler12220                         1,4105,12
Stereo en TV slaapkamer31300                       37,526,28
Stereo installatie Woonkamer16150                         5,0140,16
Stereo installatie zolder1200                           –  105,12
Stoomoven10,1150                       37,58,76
Telefoontoestellen424365                       35,035,04
Terrasverwarmer0430                     240,00
TP Link router724365                       61,361,32
Tv scherm woonkamer23300                     198,017,52
Tweede koelkast8024365                     902,3700,8
Tweede vriezer000                           –  0
Vaatwasser10,75300                     450,08,76
Ventilatie2424365                     569,4210,24
Verlichting04180                     360,00
Wasdroger03100                     300,00
wasmachine00,5100                     110,00
                          318,0                  9.436,5                2.785,7

Klimaatburgermeester

Sinds vorige week ben ik Klimaatburgemeester voor mijn gemeente #Wormerland. Een vrijwilligersrol om inwoners te helpen bij de energie transitie. Duurzame energie heeft mijn belangstelling al sinds 2008. Destijds werden wij (mijn vrouw en ik) gevraagd om een energiewedstrijd de organiseren tussen gezinnen uit West- en Oostknollendam. Behalve een overwinning, heeft dat een schat aan informatie opgeleverd. Het motiveerde ons om onze eigen woning uit 2000, volledig energie neutraal te maken. Niet in één keer, maar in stapjes; elk jaar dat er energie bespaard werd, terugkwam uit de eigen opwek via de energieleverancier of via subsidies beschikbaar werd gesteld, hebben we die bedragen weer opnieuw geïnvesteerd in de verdere verduurzaming van onze woning. Vaak ging dat goed, soms ging dat wat minder. Maar het resultaat is dat onze woning en het gastenverblijf net zo veel energie verbruikt als dat wij zelf opwekken. En ook voldoende zelfopgewekte energie voor onze elektrische auto’s en zelf(s) geëlektrificeerde vaartuigen. Al mijn kennis en ervaring heb ik samengevat in een grote serie blogs (https://lnkd.in/ewUN8HmR) en vlogs (https://lnkd.in/ed5rSUvf). Maar ik deel deze ervaring ook als energiecoach voor inwoners van mijn gemeente. De komende weken zal ik en anderen hier aandacht voor vragen: deel de kennis om energie te besparen. Samen is veel mogelijk. #klimaatburgemeester

Update HomeAssistant code

De code in mijn vorige post was niet alleen moeilijk leesbaar, hij was ook niet volledig.

Hoewel ik nog steeds bezig ben om de code te verbeteren, wil ik je deze tussentijdse versie niet onthouden. Doe er je voordeel mee en heb jij zelf verbeteringen aangebracht, ik blijf graag op de hoogte.

configuration.yaml

Hieronder tref je de wijzigingen die ik heb aangebracht in configuration.yaml. Alle sensoren die ik heb gemaakt zitten er in. Bedenk wel dat deze soms refereren naar sensoren in mijn HomeMatic systeem. Je moet deze dus aanpassen naar jouw fysieke sensoren.

template:
  - sensor:
      - name: "EV_Laadpaal_Actueel"
        device_class: power
        unit_of_measurement: W
        state: >
          {{ states('sensor.leq0147882_18_frequency') | float * 3.6 * 10.0}}
  - sensor:
      - name: "EV_Solar_Actueel"
        device_class: power
        unit_of_measurement: W
        state: >
          {{ states('sensor.leq0147882_16_frequency') | float * 3.6 * 1.0}}
  - sensor:
      - name: "EV_Tuinhuis_Actueel"
        device_class: power
        unit_of_measurement: W
        state: >
          {{ states('sensor.leq0147882_17_frequency') | float * 3.6 * 1.0}}
  - sensor:
      - name: "EV_Heating_Actueel"
        device_class: power
        unit_of_measurement: W
        state: >
          {{ states('sensor.leq0147882_15_frequency') | float * 3.6 * 1.0}}
  - sensor:
      - name: "EV_Huishoudverbruik_Actueel"
        device_class: power
        unit_of_measurement: W
        state: >
          {{ states('sensor.leq0147882_19_frequency') | float * 3.6 * 10.0}}
  - sensor:
      - name: "EV_Boot_Actueel"
        device_class: power
        unit_of_measurement: W
        state: >
          {{ states('sensor.leq0147882_20_frequency') | float * 3.6 * 10.0}}
          
  - sensor:
      - name: "Day_Ahead_Avg_Price"
        device_class: monetary
        unit_of_measurement: €
        state: >
          {{ state_attr ('sensor.day_ahead_price', 'avg_price')}}  
  - sensor:
      - name: "Day_Ahead_Current_Price"
        #device_class: monetary
        unit_of_measurement: €/kWh
        state: >
          {{ state_attr ('sensor.day_ahead_price', 'day_ahead_price')}}
  - sensor:
      - name: "Day_Ahead_Min_Price"
        device_class: monetary
        unit_of_measurement: €
        state: >
          {{ state_attr ('sensor.day_ahead_price', 'min_price')}}
  - sensor:
      - name: "Day_Ahead_Max_Price"
        device_class: monetary
        unit_of_measurement: €
        state: >
          {{ state_attr ('sensor.day_ahead_price', 'max_price')}}
  - sensor:
      - name: "Day_Ahead_Lowerband_Price"
        device_class: monetary
        unit_of_measurement: €
        state: >
          {{ (1-(states ('input_number.ess_price_lower_band')) | int / 100) * (states ('sensor.day_ahead_avg_price') | float ) }}
  - sensor:
      - name: "Day_Ahead_Upperband_Price"
        device_class: monetary
        unit_of_measurement: €
        state: >
          {{ (1+(states ('input_number.ess_price_upper_band')) | int / 100) * (states ('sensor.day_ahead_avg_price') | float )}}        
  - sensor:
      - name: "VE Grid Power"
        device_class: power
        unit_of_measurement: W
        state: >
          {{ states("sensor.ve_grid_power_l1") |float + states("sensor.ve_grid_power_l2") | float + states("sensor.ve_grid_power_l3") |float }}
  - sensor:
      - name: "ESS_Grid_Setpoint"
      ## use this to set ESS grid setpoint. Values are determined by maximum grid connection point
      ## substract value from 65535 for negative vaule
        device_class: power
        unit_of_measurement: W
        state: >
          {% if is_state("input_number.ess_grid_feedin", "0.0") -%}
            0
          {%- elif is_state("input_number.ess_grid_feedin", "1.0") -%}
            17250
          {%- elif is_state("input_number.ess_grid_feedin", "-1.0") -%}
            48285
          {%- endif %}

mqtt: 
  sensor:
    - state_topic: entsoe/day-ahead
      name: 'Day-ahead-price'
      unit_of_measurement: "€"
      value_template: '{{ value_json.day_ahead_price }}'
      json_attributes_topic: entsoe/day-ahead

Automations.yaml

Hieronder de automations die ik heb gemaakt. Meestal heb ik hiervoor de wizzards gebruikt maar uiteindelijk wordt alles in code omgezet. Ik verwijs graag naar mij Youtube video voor uitleg over de automations. Anders begrijp je niet zo goed wat deze doen. Ook voor dit bestand geldt dat enkele verwijzingen refereren aan specifieke hardware en/of sensoren.

- id: '1662234306246'
  alias: Switch on Energy Import and Energy Consumers
  description: ''
  trigger:
  - platform: numeric_state
    entity_id: sensor.day_ahead_price
    attribute: day_ahead_price
    below: sensor.day_ahead_lowerband_price
  condition: []
  action:
  - service: switch.turn_on
    data: {}
    target:
      entity_id:
      - switch.peq1418450_7
  - service: input_number.set_value
    data:
      value: 1
    target:
      entity_id: input_number.ess_grid_feedin
  - service: switch.turn_off
    data: {}
    target:
      entity_id: switch.peq1418450_8
  mode: single
- id: '1662899027507'
  alias: Set ESS Grid Feed by writing Modbus register
  description: This automation sets the Victron ESS Grid feed to in, out or 0
  trigger:
  - platform: state
    entity_id:
    - input_number.ess_grid_feedin
  condition: []
  action:
  - service: modbus.write_register
    data:
      address: 2700
      slave: 100
      value: '{{ states(''sensor.ess_grid_setpoint'') }}'
      hub: victron
  mode: single
- id: '1663360219833'
  alias: Switch off Energy Import and Consumers and Export Energy to Grid
  description: ''
  trigger:
  - platform: numeric_state
    entity_id: sensor.day_ahead_price
    attribute: day_ahead_price
    above: sensor.day_ahead_upperband_price
  condition:
  - condition: numeric_state
    entity_id: sensor.ve_battery_state_of_charge_system
    above: 50
  action:
  - service: switch.turn_off
    data: {}
    target:
      entity_id: switch.peq1418450_7
  - service: input_number.set_value
    data:
      value: -1
    target:
      entity_id: input_number.ess_grid_feedin
  - service: switch.turn_on
    data: {}
    target:
      entity_id: switch.peq1418450_8
  mode: single
- id: '1663360672817'
  alias: Switch off Energy Import and set Grid setpoint to 0
  description: ''
  trigger:
  - platform: numeric_state
    entity_id: sensor.day_ahead_price
    attribute: day_ahead_price
    above: sensor.day_ahead_lowerband_price
    below: sensor.day_ahead_upperband_price
  condition: []
  action:
  - service: switch.turn_off
    data: {}
    target:
      entity_id:
      - switch.peq1418450_8
      - switch.peq1418450_7
  - service: input_number.set_value
    data:
      value: 0
    target:
      entity_id: input_number.ess_grid_feedin
  - service: switch.turn_off
    data: {}
    target:
      entity_id: switch.peq1418450_9
  mode: single
- id: '1663598422950'
  alias: Switch off Energy Export to grid if SoC < 50%
  description: ''
  trigger:
  - platform: numeric_state
    entity_id: sensor.ve_battery_state_of_charge_system
    below: 50
  condition: []
  action:
  - service: input_number.set_value
    data:
      value: 0
    target:
      entity_id: input_number.ess_grid_feedin
  mode: single
- id: '1664573680849'
  alias: VSW ultra low switch on
  description: Schakelt schakelaar aan als de elec prijs zeer laag is.
  trigger:
  - platform: numeric_state
    entity_id: sensor.day_ahead_price
    attribute: day_ahead_price
    below: 0.02
  condition: []
  action:
  - service: switch.turn_on
    data: {}
    target:
      entity_id: switch.peq1418450_9
  mode: single
- id: '1664573871793'
  alias: VSW ultra low switch off
  description: ''
  trigger:
  - platform: numeric_state
    entity_id: sensor.day_ahead_price
    attribute: day_ahead_price
    above: 0.02
  condition: []
  action:
  - service: switch.turn_off
    data: {}
    target:
      entity_id: switch.peq1418450_9
  mode: single
- id: '1665776652412'
  alias: Increase Low Bandwidth Price to 20%
  description: Verlaag de bandbreedte met naar 20 als SoC <50%
  trigger:
  - platform: numeric_state
    entity_id: sensor.ve_battery_state_of_charge_system
    below: 50
    above: 40
  condition: []
  action:
  - service: input_number.set_value
    data:
      value: 20
    target:
      entity_id: input_number.ess_price_lower_band
  mode: single
- id: '1665776936570'
  alias: Decrease Low Bandwidth Price to 10%
  description: Verlaag de bandbreedte naar 10% als SoC <40%
  trigger:
  - platform: numeric_state
    entity_id: sensor.ve_battery_state_of_charge_system
    below: 40
    above: 30
  condition: []
  action:
  - service: input_number.set_value
    data:
      value: 10
    target:
      entity_id: input_number.ess_price_lower_band
  mode: single
- id: '1665778310119'
  alias: Switch off Energy Import when Sunny or Partly Cloudy
  description: ''
  trigger:
  - platform: state
    entity_id:
    - weather.vriendschap
    to:
    - sunny
    - partlycloudy
  condition:
  - condition: numeric_state
    entity_id: sun.sun
    attribute: rising
    above: 0
  action:
  - service: switch.turn_off
    data: {}
    target:
      entity_id: switch.peq1418450_7
  mode: single
- id: '1666123826682'
  alias: Decrease Upper Bandwidth to 15% if SoC > 80%
  description: Verlaag de bandbreedte met naar 20 als SoC >80%
  trigger:
  - platform: numeric_state
    entity_id: sensor.ve_battery_state_of_charge_system
    below: 100
    above: 80
  condition: []
  action:
  - service: input_number.set_value
    data:
      value: 15
    target:
      entity_id: input_number.ess_price_upper_band
  mode: single
- id: '1666124043886'
  alias: Increase Upper Bandwidth to 20% if SoC is > 50% and < 80%
  description: Verhoog de bandbreedte met naar 20 als SoC <80%
  trigger:
  - platform: numeric_state
    entity_id: sensor.ve_battery_state_of_charge_system
    below: 80
    above: 50
  condition: []
  action:
  - service: input_number.set_value
    data:
      value: 20
    target:
      entity_id: input_number.ess_price_upper_band
  mode: single

Modbus.yaml

DIt bevat de lijst van registers die ik in modbus aanspreek om de informatie uit te lezen (en te schrijven) voor de Victron Energy Multiplus inverters.

# modbus victron ess
  - name: victron
    retry_on_empty: true
    retries: 10
    type: tcp
    host: <your IP address of the Cerbo/CCGX device>
    port: 502
# REMARK: scan_interval: <5 can cause troubles
    sensors:
    - name: 'VE AC Consumption L1'
      unit_of_measurement: "W"
      slave: 100
      address: 817
      data_type: uint16
      scan_interval: 5
      device_class: power

    - name: 'VE AC Consumption L2'
      unit_of_measurement: "W"
      slave: 100
      address: 818
      data_type: uint16
      scan_interval: 5
      device_class: power

    - name: 'VE AC Consumption L3'
      unit_of_measurement: "W"
      slave: 100
      address: 819
      data_type: uint16
      scan_interval: 5
      device_class: power
  
    - name: 'VE Grid power L1'
      unit_of_measurement: "W"
      slave: 100
      address: 820
      data_type: int16
      scan_interval: 5
      device_class: power

    - name: 'VE Grid power L2'
      unit_of_measurement: "W"
      slave: 100
      address: 821
      data_type: int16
      scan_interval: 5
      device_class: power    

    - name: 'VE Grid power L3'
      unit_of_measurement: "W"
      slave: 100
      address: 822
      data_type: int16
      scan_interval: 5
      device_class: power

    - name: 'VE Critical Loads power L1'
      unit_of_measurement: "W"
      slave: 246
      address: 23
      data_type: int16
      scale: 10
      scan_interval: 5
      device_class: power
    
    - name: 'VE Critical Loads power L2'
      unit_of_measurement: "W"
      slave: 246
      address: 24
      data_type: int16
      scale: 10
      scan_interval: 5
      device_class: power
    
    - name: 'VE Critical Loads power L3'
      unit_of_measurement: "W"
      slave: 246
      address: 25
      data_type: int16
      scale: 10
      scan_interval: 5
      device_class: power

# ESS Settings
    - name: 'VE ESS Minimum SoC setpoint'
      unit_of_measurement: "%"
      data_type: uint16
      slave: 100
      address: 2901
      scan_interval: 5
      scale: 0.1
      
    - name: 'VE Maximum System Grid Feed In'
      unit_of_measurement: "W"
      data_type: uint16
      slave: 100
      address: 2706
      scale: 0.01
      device_class: power
      # command_on: 4000
      # command_off: 40
      # verify_state: false

    - name: 'VE ESS BatteryLife state'
      data_type: uint16
      slave: 100
      address: 2900
      scan_interval: 5
      
    - name: 'VE ESS Grid setpoint'
      unit_of_measurement: "W"
      data_type: int16
      slave: 100
      address: 2700
      device_class: power

#Battery 
    - name: 'VE Battery current'
      unit_of_measurement: "A DC"
      slave: 100
      address: 841
      data_type: int16
      scale: 0.1
      precision: 0
      device_class: current
      
    - name: 'VE Battery Power System'
      unit_of_measurement: "W"
      slave: 100
      address: 842
      data_type: int16
      scale: 1.0
      precision: 0
      device_class: power

      # VE Charge power. deze gebruiken voor omrekenen van min en pos
    - name: 'VE Charge Power System'
      unit_of_measurement: "W"
      slave: 100
      address: 866
      data_type: int16
      scale: 1.0
      precision: 0
      device_class: energy
      
    - name: 'VE Battery State of Charge System'
      unit_of_measurement: "%"
      slave: 100
      address: 843
      data_type: uint16
      scale: 1
      precision: 0

    - name: 'VE Battery Discharged Energy'
      unit_of_measurement: "kWh"
      slave: 245
      address: 301
      data_type: uint16
      scale: 0.1
      precision: 0
      device_class: energy
      state_class: total_increasing

    - name: 'VE Battery Charged Energy'
      unit_of_measurement: "kWh"
      slave: 245
      address: 302
      data_type: uint16
      scale: 0.1
      precision: 0
      device_class: energy
      state_class: total_increasing

 # Victron device over Modbus: vebus
      # Grid Voltage
    - name: 'VE Grid Voltage L1 in'
      unit_of_measurement: "V AC"
      slave: 246
      address: 3
      data_type: uint16
      scale: 0.1
      offset: 0
      precision: 2
      device_class: voltage

    - name: 'VE Grid Voltage L2 in'
      unit_of_measurement: "V AC"
      slave: 246
      address: 4
      data_type: uint16
      scale: 0.1
      offset: 0
      precision: 2
      device_class: voltage

    - name: 'VE Grid Voltage L3 in'
      unit_of_measurement: "V AC"
      slave: 246
      address: 5
      data_type: uint16
      scale: 0.1
      offset: 0
      precision: 2
      device_class: voltage
      
    - name: "VE Multi Inverter State"
      slave: 246
      address: 31
      data_type: uint16
      # Inverter States, 0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=Bulk protection   
 
#Alarm Sensors
    - name: 'VE Grid lost alarm'
      slave: 246
      address: 64
      data_type: uint16
      unit_of_measurement: "0=Ok;1=Warning"
      
    - name: 'VE Multi Temperature alarm'
      slave: 246
      address: 34
      data_type: uint16
      unit_of_measurement: "0=Ok;1=Warning;2=Alarm"
      
    - name: 'VE Multi Overload alarm'
      slave: 246
      address: 36
      data_type: uint16
      unit_of_measurement: "0=Ok;1=Warning;2=Alarm"
      

Node Red Generate URL

Vandaag heb ik nog een fout gevonden in de onderstaande code. Deze houdt namelijk geen rekening met de zomertijd waardoor de data in de grafieken een uur te vroeg staat. Het maakt voor de werking niets uit.

const today = new Date()
let todayDate = ("0" + today.getDate()).slice(-2)
let todayMonth = ("0" + (today.getMonth() + 1)).slice(-2);
let todayYear = today.getFullYear();
let todayString = todayYear + todayMonth + todayDate;

var urlAddr = "https://transparency.entsoe.eu/api?securityToken=<your token>&documentType=A44&in_Domain=10YNL----------L&out_Domain=10YNL----------L&periodStart=" + todayString + "0000&periodEnd=" + todayString + "2300"
msg.url = urlAddr;
return msg;

Node Red Get Next Hour Price

In onderstaande code staan nog de max_price en min_price genoemd. Ik gebruik deze verder niet in mijn algoritmes. Maar als je er gebruik van wilt maken dan kan dat.

var priceArray = [];
priceArray = flow.get("pArray");
const today = new Date();
let todayHour = today.getHours();
let todayDate = ("0" + today.getDate()).slice(-2)
let todayMonth = ("0" + (today.getMonth() + 1)).slice(-2);
let todayYear = today.getFullYear();

msg.payload = {
    "day_ahead_price": priceArray[todayHour] / 1000,
    "avg_price": priceArray[24] / 1000,
    "max_price": priceArray[25] / 1000,
    "min_price": priceArray[26] / 1000,
    "records": [
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T00:00:00",
            "Price": priceArray[0] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T01:00:00",
            "Price": priceArray[1] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T02:00:00",
            "Price": priceArray[2] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T03:00:00",
            "Price": priceArray[3] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T04:00:00",
            "Price": priceArray[4] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T05:00:00",
            "Price": priceArray[5] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T06:00:00",
            "Price": priceArray[6] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T07:00:00",
            "Price": priceArray[7] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T08:00:00",
            "Price": priceArray[8] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T09:00:00",
            "Price": priceArray[9] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T10:00:00",
            "Price": priceArray[10] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T11:00:00",
            "Price": priceArray[11] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T12:00:00",
            "Price": priceArray[12] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T13:00:00",
            "Price": priceArray[13] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T14:00:00",
            "Price": priceArray[14] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T15:00:00",
            "Price": priceArray[15] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T16:00:00",
            "Price": priceArray[16] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T17:00:00",
            "Price": priceArray[17] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T18:00:00",
            "Price": priceArray[18] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T19:00:00",
            "Price": priceArray[19] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T20:00:00",
            "Price": priceArray[20] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T21:00:00",
            "Price": priceArray[21] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T22:00:00",
            "Price": priceArray[22] / 1000
        },
        {
            "Time": todayYear + "-" + todayMonth + "-" + todayDate + "T23:00:00",
            "Price": priceArray[23] / 1000
        }
    ]
};
return msg;

De Apex-chart grafiek

Hier kan nog iets aan verbeterd worden maar inmiddels geeft het wel een goed overzicht.

de apex-chart grafiek
type: custom:apexcharts-card
experimental:
  color_threshold: true
graph_span: 24h
show:
  last_updated: true
span:
  start: day
header:
  title: Energy Prices today
  standard_format: false
  show: true
  show_states: false
  colorize_states: true
apex_config:
  chart:
    height: 370
    curve: stepline
  legend:
    show: true
    showForSingleSeries: false
    showForNullSeries: true
    showForZeroSeries: true
    position: bottom
    horizontalAlign: left
    floating: false
    inverseorder: true
    onItemHover:
      highlightDataSeries: false
    ontimeClick:
      toggleDataSeries: false
    tooltip:
      enabled: true
now:
  show: false
  color: red
  label: Now
yaxis:
  - id: first
    min: -0.1
    max: ~0.5
    decimals: 2
    apex_config:
      tickAmount: 12
  - id: second
    opposite: true
    min: 0
    max: 100
    decimals: 0
    apex_config:
      tickAmount: 10
series:
  - entity: sensor.day_ahead_lowerband_price
    yaxis_id: first
    type: line
    color: hotpink
    unit: ' €'
    float_precision: 3
    stroke_width: 2
  - entity: sensor.day_ahead_upperband_price
    yaxis_id: first
    type: line
    color: steelblue
    unit: ' €'
    float_precision: 3
    stroke_width: 2
  - entity: sensor.day_ahead_price
    yaxis_id: first
    type: column
    color: black
    unit: ' €'
    float_precision: 3
    stroke_width: 10
    show:
      header_color_threshold: true
      legend_value: false
    data_generator: |
      return entity.attributes.records.map((record, index) => {
        return [record.Time, record.Price];
      });
    color_threshold:
      - value: 0
        color: green
      - value: 0.05
        color: lightgreen
      - value: 0.1
        color: yellowgreen
      - value: 0.15
        color: yellow
      - value: 0.2
        color: yelloworange
      - value: 0.3
        color: orange
      - value: 0.4
        color: orangered
      - value: 0.5
        color: red
      - value: 0.6
        color: purple
      - value: 0.7
        color: blue
  - entity: sensor.ve_battery_state_of_charge_system
    yaxis_id: second
    stroke_width: 3
    color: blue
view_layout:
  position: main

Energie besturing met Home Assistant

Deze pagina is gemaakt met als doel om mijn zelf gebouwde automatisering in Home Assistant te documenteren. Misschien is er een liefhebber die dit op Github kan zetten, je bent welkom. Ik heb geen ervaring met Github maar heb wel een account, Hhalewijn. Dus wees dan in ieder geval zo vriendelijk om naar mij te verwijzen.

HomeMatic integratie

Een eerste belangrijk component dat ik gebruik is het monitoren van diverse tussenmeters in mijn meterkast. Deze worden gemonitord door mijn domotica installatie HomeMatic. Ook de besturing van laadpaal, warmtepomp en alle apparatuur in huis verloopt via sensoren en aktoren in HomeMatic. Er is dus een integratie gemaakt tussen HomeMatic en HomeAssistant.

In configuration.yaml heb ik een include opgenomen:

homematic: !include homematic.yaml

De homematic.yaml file bevat de volgende regels:

#Homematic configuration

interfaces:

wireless:

host: 192.168.2.3

port: 2001

wired:

host: 192.168.2.3

port: 2000

IP:

host: 192.168.2.3

port: 2010

Achter de wired poorten zitten de frequentie meters die de pulsen meten van de tussenmeters.

In HomeAssistant kan ik deze pulsen overnemen en vertalen naar sensoren. Deze zijn benoemd in configuration.yaml

template:

– sensor:

– name: “EV_Laadpaal_Actueel”

device_class: power

unit_of_measurement: W

state: >

{{ states(‘sensor.leq0147882_18_frequency’) | float * 3.6 * 10.0}}

– sensor:

– name: “EV_Solar_Actueel”

device_class: power

unit_of_measurement: W

state: >

{{ states(‘sensor.leq0147882_16_frequency’) | float * 3.6 * 1.0}}

– sensor:

– name: “EV_Tuinhuis_Actueel”

device_class: power

unit_of_measurement: W

state: >

{{ states(‘sensor.leq0147882_17_frequency’) | float * 3.6 * 1.0}}

– sensor:

– name: “EV_Heating_Actueel”

device_class: power

unit_of_measurement: W

state: >

{{ states(‘sensor.leq0147882_15_frequency’) | float * 3.6 * 1.0}}

– sensor:

– name: “EV_Huishoudverbruik_Actueel”

device_class: power

unit_of_measurement: W

state: >

{{ states(‘sensor.leq0147882_19_frequency’) | float * 3.6 * 10.0}}

– sensor:

– name: “EV_Boot_Actueel”

device_class: power

unit_of_measurement: W

state: >

{{ states(‘sensor.leq0147882_20_frequency’) | float * 3.6 * 10.0}}


 

Integratie Victron Energy componenten

De integratie met Victron Energy via een CX device loopt over Modbus. Hiervoor is geen specifieke integratie nodig of beschikbaar. Wel moeten de sensoren gemaakt worden. Er zijn vele honderden registers die je kunt uitlezen. Ik heb de belangrijkste hieronder opgenomen.

LET OP! De slave ID’s en register adressen kunnen per configuratie afwijken. Raadpleeg dus eerst de modbus documentatie van Victron en maak gebruik van de referentie Excel sheet die je kunt downloaden van de Victron website.

Ik heb gekozen voor Modbus ipv MQTT omdat volgens de documentatie van Victron de poorten van MQTT wel eens wijzigen met software releases.

Eerst in configuration.yaml de volgende include:

modbus: !include modbus.yaml

In de file modbus.yaml dan de volgende sensoren definieren:

# modbus victron ess

– name: victron

retry_on_empty: true

retries: 10

type: tcp

host: 192.168.2.86

port: 502

# REMARK: scan_interval: <5 can cause troubles

sensors:

– name: ‘VE AC Consumption L1’

unit_of_measurement: “W”

slave: 100

address: 817

data_type: uint16

scan_interval: 5

device_class: power

– name: ‘VE AC Consumption L2’

unit_of_measurement: “W”

slave: 100

address: 818

data_type: uint16

scan_interval: 5

device_class: power

– name: ‘VE AC Consumption L3’

unit_of_measurement: “W”

slave: 100

address: 819

data_type: uint16

scan_interval: 5

device_class: power

– name: ‘VE Grid power L1’

unit_of_measurement: “W”

slave: 100

address: 820

data_type: int16

scan_interval: 5

device_class: power

– name: ‘VE Grid power L2’

unit_of_measurement: “W”

slave: 100

address: 821

data_type: int16

scan_interval: 5

device_class: power

– name: ‘VE Grid power L3’

unit_of_measurement: “W”

slave: 100

address: 822

data_type: int16

scan_interval: 5

device_class: power

– name: ‘VE Critical Loads power L1’

unit_of_measurement: “W”

slave: 246

address: 23

data_type: int16

scale: 10

scan_interval: 5

device_class: power

– name: ‘VE Critical Loads power L2’

unit_of_measurement: “W”

slave: 246

address: 24

data_type: int16

scale: 10

scan_interval: 5

device_class: power

– name: ‘VE Critical Loads power L3’

unit_of_measurement: “W”

slave: 246

address: 25

data_type: int16

scale: 10

scan_interval: 5

device_class: power

# GRID meter waarden

# ESS Settings

– name: ‘VE ESS Minimum SoC setpoint’

unit_of_measurement: “%”

data_type: uint16

slave: 100

address: 2901

scan_interval: 5

scale: 0.1

– name: ‘VE Maximum System Grid Feed In’

unit_of_measurement: “W”

data_type: uint16

slave: 100

address: 2706

scale: 0.01

device_class: power

# command_on: 4000

# command_off: 40

# verify_state: false

– name: ‘VE ESS BatteryLife state’

data_type: uint16

slave: 100

address: 2900

scan_interval: 5

– name: ‘VE ESS Grid setpoint’

unit_of_measurement: “W”

data_type: int16

slave: 100

address: 2700

device_class: power

#Battery

– name: ‘VE Battery current’

unit_of_measurement: “A DC”

slave: 100

address: 841

data_type: int16

scale: 0.1

precision: 0

device_class: current

– name: ‘VE Battery Power System’

unit_of_measurement: “W”

slave: 100

address: 842

data_type: int16

scale: 1.0

precision: 0

device_class: power

# VE Charge power. deze gebruiken voor omrekenen van min en pos

– name: ‘VE Charge Power System’

unit_of_measurement: “W”

slave: 100

address: 866

data_type: int16

scale: 1.0

precision: 0

device_class: energy

– name: ‘VE Battery State of Charge System’

unit_of_measurement: “%”

slave: 100

address: 843

data_type: uint16

scale: 1

precision: 0

– name: ‘VE Battery Discharged Energy’

unit_of_measurement: “kWh”

slave: 245

address: 301

data_type: uint16

scale: 0.1

precision: 0

device_class: energy

state_class: total_increasing

– name: ‘VE Battery Charged Energy’

unit_of_measurement: “kWh”

slave: 245

address: 302

data_type: uint16

scale: 0.1

precision: 0

device_class: energy

state_class: total_increasing

# Victron device over Modbus: vebus

# Grid Voltage

– name: ‘VE Grid Voltage L1 in’

unit_of_measurement: “V AC”

slave: 246

address: 3

data_type: uint16

scale: 0.1

offset: 0

precision: 2

device_class: voltage

– name: ‘VE Grid Voltage L2 in’

unit_of_measurement: “V AC”

slave: 246

address: 4

data_type: uint16

scale: 0.1

offset: 0

precision: 2

device_class: voltage

– name: ‘VE Grid Voltage L3 in’

unit_of_measurement: “V AC”

slave: 246

address: 5

data_type: uint16

scale: 0.1

offset: 0

precision: 2

device_class: voltage

– name: “VE Multi Inverter State”

slave: 246

address: 31

data_type: uint16

# Inverter States, 0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=Bulk protection

#Alarm Sensors

– name: ‘VE Grid lost alarm’

slave: 246

address: 64

data_type: uint16

unit_of_measurement: “0=Ok;1=Warning”

– name: ‘VE Multi Temperature alarm’

slave: 246

address: 34

data_type: uint16

unit_of_measurement: “0=Ok;1=Warning;2=Alarm”

– name: ‘VE Multi Overload alarm’

slave: 246

address: 36

data_type: uint16

unit_of_measurement: “0=Ok;1=Warning;2=Alarm”

#### Binary sensors (no binary in victron) ########

# binary_sensors:

Er is geen sensor die het vermogen weergeeft van de 3 fasen opgeteld. Daarom heb ik in configuration.yaml nog een extra sensor gemaakt die een berekening maken adhv enkele modbus sensoren. Ook heb hier de Modbus write sensor gemaakt die we straks gebruiken om het laad en ontlaad proces te besturen adhv de day-ahead tarieven. De Victron ESS wordt dus bestuurd mbv modbus write via de sensor ESS_Grid_Setpoint. Hiervoor is een automation gemaakt in HomeAssistant. Zie verder.

– sensor:

– name: “VE Grid Power”

device_class: power

unit_of_measurement: W

state: >

{{ states(“sensor.ve_grid_power_l1”) |float + states(“sensor.ve_grid_power_l2”) | float + states(“sensor.ve_grid_power_l3”) |float }}

– sensor:

– name: “ESS_Grid_Setpoint”

## use this to set ESS grid setpoint. Values are determined by maximum grid connection point

## substract value from 65535 for negative vaule

device_class: power

unit_of_measurement: W

state: >

{% if is_state(“input_number.ess_grid_feedin”, “0.0”) -%}

0

{%- elif is_state(“input_number.ess_grid_feedin”, “1.0”) -%}

17250

{%- elif is_state(“input_number.ess_grid_feedin”, “-1.0”) -%}

48285

{%- endif %}

Op basis van deze 2 integraties kan een dashboard in Home Assistant worden gemaakt die de actuele gegevens weergeeft.

Integratie SolarEdge en P1

Ik heb aan Home Assistant toegevoegd de integratie met SolarEdge voor de zonnestroom informatie. Hierbij moet wel opgemerkt worden dat deze gegevens 1x per 15 minuten worden opgehaald. De informatie is dus alleen statistisch van waarde, je kunt er nauwelijks mee sturen.

Ook heb ik een Youless energie meter aan de P1 poort van de slimme meter gekoppeld. Dit levert enkele extra sensoren op en samen met de eerdere integraties kun je nu het Home Assistant Energy dashboard inrichten.

Onderin het scherm kun je de overige sensoren toevoegen. In mijn situatie zijn dat dus de sensoren die ik via HomeMatic inlees:

Ik heb als extra integratie de Forecast Solar integratie toegevoegd. Deze kan de solar forecast in het energy dashboard weergeven. Maar ik vind de kwaliteit onvoldoende om hiervan gebruik te maken. Zeker als je een bijzondere solar configuratie hebt diverse oriëntaties zoals ik.

Het dashboard ziet er dan zo uit:

De energie tarieven die op de kaart zijn ingevuld komen verderop aan bod. Dit zijn namelijk de berekende tarieven vanuit de day-ahead tool.

Day ahead software

Voor de day ahead software moeten er een aantal componenten worden toegevoegd aan Home Assistant: Node Red en MQTT broker. Dit zijn standaard add-ons die via een menu knop geinstalleerd kunnen worden.

Ik heb gebruik gemaakt van wat code die ik via Internet heb gevonden: https://community.home-assistant.io/t/electricity-day-ahead-prices-for-home-assistant-using-node-red-and-entso-e-api/394484

De reden om met ENTSO te werken is dat dit een europees prijssysteem is waarvan de nederlandse providers zoals Nieuwestroom of ANWB hun prijzen ook vandaan halen. Bovendien hoef je geen contract te hebben om de data van de ENTSO website af te halen. Wel moet je eenmalig een API aanvragen, dit kun je via bovenstaande link terughalen.

De code heb ik op enkele plaatsen wat aangepast dus ik plaats hieronder opnieuw de schermafdrukken en de aangepast code. Zo heb ik in de berekening de waarden geconverteerd en bereken ik een gemiddelde, maximale en minimale prijs.

Allereerst de MQTT sensor in configuration.yaml

mqtt:

sensor:

– state_topic: entsoe/day-ahead

name: ‘Day-ahead-price’

unit_of_measurement: “€”

value_template: ‘{{ value_json.day_ahead_price }}’

json_attributes_topic: entsoe/day-ahead

Dan in Node Red de volgende entiteiten:

Ik heb daar een paar kleine aanpassingen in gedaan:

De code in de Generate URL node:

const today = new Date()

let todayDate = (“0” + today.getDate()).slice(-2)

let todayMonth = (“0” + (today.getMonth() + 1)).slice(-2);

let todayYear = today.getFullYear();

let todayString = todayYear + todayMonth + todayDate;

var urlAddr = “https://transparency.entsoe.eu/api?securityToken=&documentType=A44&in_Domain=10YNL———-L&out_Domain=10YNL———-L&periodStart=” + todayString + “0000&periodEnd=” + todayString + “2300”

msg.url = urlAddr;

return msg;

De code in de Generate Aray node:

var priceArray = [];

var avgprice = 0;

var maxprice = 0;

var minprice = 9999;

for (let i = 0; i < 24; i++) {

priceArray[i] = parseFloat (msg.payload.Publication_MarketDocument.TimeSeries[0].Period[0].Point[i][“price.amount”][0]);

avgprice = avgprice + parseFloat (priceArray[i]);

if (parseFloat(priceArray[i]) > maxprice) {

maxprice = parseFloat(priceArray[i]);

}

if (parseFloat(priceArray[i]) < minprice) {

minprice = parseFloat(priceArray[i]);

}

}

avgprice = (avgprice / 24);

priceArray[24] = (avgprice);

priceArray[25] = (maxprice);

priceArray[26] = (minprice);

flow.set(“pArray”, priceArray);

msg.payload = { “day_ahead_price”: priceArray };

return msg;

Dan voor de 2e flow die elk uur draait de volgende instellingen in de node gemaakt:

De timing is relevant (ook in de 1e flow) omdat ik heb gemerkt dat de timing anders niet geheel verloopt zoals je wenst; op het hele uur. Dat heeft met een bug of gedrag van Node Red te maken.

Dan de code in de node Get next hour rate

var priceArray = [];

priceArray = flow.get(“pArray”);

const today = new Date();

let todayHour = today.getHours();

let todayDate = (“0” + today.getDate()).slice(-2)

let todayMonth = (“0” + (today.getMonth() + 1)).slice(-2);

let todayYear = today.getFullYear();

msg.payload = {

“day_ahead_price”: priceArray[todayHour] / 1000,

“avg_price”: priceArray[24] / 1000,

“max_price”: priceArray[25] / 1000,

“min_price”: priceArray[26] / 1000,

“records”: [

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T00:00:00”,

“Price”: priceArray[0] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T01:00:00”,

“Price”: priceArray[1] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T02:00:00”,

“Price”: priceArray[2] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T03:00:00”,

“Price”: priceArray[3] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T04:00:00”,

“Price”: priceArray[4] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T05:00:00”,

“Price”: priceArray[5] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T06:00:00”,

“Price”: priceArray[6] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T07:00:00”,

“Price”: priceArray[7] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T08:00:00”,

“Price”: priceArray[8] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T09:00:00”,

“Price”: priceArray[9] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T10:00:00”,

“Price”: priceArray[10] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T11:00:00”,

“Price”: priceArray[11] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T12:00:00”,

“Price”: priceArray[12] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T13:00:00”,

“Price”: priceArray[13] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T14:00:00”,

“Price”: priceArray[14] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T15:00:00”,

“Price”: priceArray[15] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T16:00:00”,

“Price”: priceArray[16] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T17:00:00”,

“Price”: priceArray[17] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T18:00:00”,

“Price”: priceArray[18] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T19:00:00”,

“Price”: priceArray[19] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T20:00:00”,

“Price”: priceArray[20] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T21:00:00”,

“Price”: priceArray[21] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T22:00:00”,

“Price”: priceArray[22] / 1000

},

{

“Time”: todayYear + “-” + todayMonth + “-” + todayDate + “T23:00:00”,

“Price”: priceArray[23] / 1000

}

]

};

return msg;

Zoals je ziet zijn de waarden hier meteen al geconverteerd naar centen.

En tot slot de MQTT node:

Het IP adres is het adres van mijn HA installatie. Het poort adres van de MQTT broker die daarop draait.

Na bewaren en deploy moet je zien dat de MQTT broker verbinding maakt. Je kunt dan de waardes inlezen.

Hierna kun je Apexchart maken. Ik heb deze gemodificeerd als volgt:

type: custom:apexcharts-card

experimental:

color_threshold: true

graph_span: 24h

show:

last_updated: true

span:

start: day

header:

title: Day Ahead Prices

standard_format: false

show: true

show_states: false

colorize_states: true

apex_config:

chart:

height: 250

stroke:

width: 1

curve: smooth

now:

show: true

color: red

label: Nu

yaxis:

– min: -0.1

max: 1

decimals: 2

apex_config:

tickAmount: 11

series:

– entity: sensor.day_ahead_price

type: column

unit: ‘ €’

float_precision: 3

show:

header_color_threshold: true

data_generator: |

return entity.attributes.records.map((record, index) => {

return [record.Time, record.Price];

});

color_threshold:

– value: 0.1

color: lightgreen

– value: 0.2

color: green

– value: 0.3

color: yellow

– value: 0.4

color: orange

– value: 0.5

color: orangered

– value: 0.6

color: red

– value: 0.7

color: purple

En dat moet dan ongeveer dit resultaat opleveren:

Om de verschillende waarden uit de sensor.day-ahead-price atributen te halen, heb ik nieuwe sensoren gedefinieerd in configurations.yaml (templates dus).

– sensor:

– name: “Day_Ahead_Avg_Price”

device_class: monetary

unit_of_measurement: €

state: >

{{ state_attr (‘sensor.day_ahead_price’, ‘avg_price’)}}

– sensor:

– name: “Day_Ahead_Current_Price”

#device_class: monetary

unit_of_measurement: €/kWh

state: >

{{ state_attr (‘sensor.day_ahead_price’, ‘day_ahead_price’)}}

– sensor:

– name: “Day_Ahead_Min_Price”

device_class: monetary

unit_of_measurement: €

state: >

{{ state_attr (‘sensor.day_ahead_price’, ‘min_price’)}}

– sensor:

– name: “Day_Ahead_Max_Price”

device_class: monetary

unit_of_measurement: €

state: >

{{ state_attr (‘sensor.day_ahead_price’, ‘max_price’)}}

– sensor:

– name: “Day_Ahead_Lowerband_Price”

device_class: monetary

unit_of_measurement: €

state: >

{{ (1-(states (‘input_number.ess_price_lower_band’)) | int / 100) * (states (‘sensor.day_ahead_avg_price’) | float ) }}

– sensor:

– name: “Day_Ahead_Upperband_Price”

device_class: monetary

unit_of_measurement: €

state: >

{{ (1+(states (‘input_number.ess_price_upper_band’)) | int / 100) * (states (‘sensor.day_ahead_avg_price’) | float )}}

Automations

In principe ben je nu klaar om automations te maken met de sensoren die nu gemaakt zijn.

Ik heb hiervoor de grafische interface gebruikt maar in enkele gevallen moet je de yaml code zelf invullen of aanpassen. Deze automations sturen de switches aan die op hun beurt dus aktoren zijn in mijn HomeMatic domotica systeem. Ik ben op dit moment bezig met het verder uitwerken van diverse scenario’s. Hier zal dus nog wel het e.e.a. aan gewijzigd gaan worden, net als aan de scripts in mijn domotica installatie.

Het resultaat uit mijn automations.yaml file:

– id: ‘1662234306246’

alias: Switch on Energy Storage and Energy Consumers

description: ”

trigger:

– platform: numeric_state

entity_id: sensor.day_ahead_price

attribute: day_ahead_price

below: sensor.day_ahead_lowerband_price

condition: []

action:

– service: switch.turn_on

data: {}

target:

entity_id:

– switch.peq1418450_7

– service: input_number.set_value

data:

value: 1

target:

entity_id: input_number.ess_grid_feedin

– service: switch.turn_off

data: {}

target:

entity_id: switch.peq1418450_8

mode: single

– id: ‘1662899027507’

alias: Set ESS Grid Feed by Modbus

description: This automation sets the Victron ESS Grid feed to in, out or 0

trigger:

– platform: state

entity_id:

– input_number.ess_grid_feedin

condition: []

action:

– service: modbus.write_register

data:

address: 2700

slave: 100

value: ‘{{ states(”sensor.ess_grid_setpoint”) }}’

hub: victron

mode: single

– id: ‘1663360219833’

alias: Switch off Energy Storage and Consumers and Dump Energy to Grid

description: ”

trigger:

– platform: numeric_state

entity_id: sensor.day_ahead_price

attribute: day_ahead_price

above: sensor.day_ahead_upperband_price

condition:

– condition: numeric_state

entity_id: sensor.ve_battery_state_of_charge_system

above: 50

action:

– service: switch.turn_off

data: {}

target:

entity_id: switch.peq1418450_7

– service: input_number.set_value

data:

value: -1

target:

entity_id: input_number.ess_grid_feedin

– service: switch.turn_on

data: {}

target:

entity_id: switch.peq1418450_8

mode: single

– id: ‘1663360672817’

alias: Switch off Energy Storage and set Grid setpoint to 0

description: ”

trigger:

– platform: numeric_state

entity_id: sensor.day_ahead_price

attribute: day_ahead_price

above: sensor.day_ahead_lowerband_price

below: sensor.day_ahead_upperband_price

condition: []

action:

– service: switch.turn_off

data: {}

target:

entity_id:

– switch.peq1418450_8

– switch.peq1418450_7

– service: input_number.set_value

data:

value: 0

target:

entity_id: input_number.ess_grid_feedin

– service: switch.turn_off

data: {}

target:

entity_id: switch.peq1418450_9

mode: single

– id: ‘1663598422950’

alias: Switch Energy Dump if SoC below 50

description: ”

trigger:

– platform: numeric_state

entity_id: sensor.ve_battery_state_of_charge_system

below: 50

condition: []

action:

– service: input_number.set_value

data:

value: 0

target:

entity_id: input_number.ess_grid_feedin

mode: single

– id: ‘1664573680849’

alias: VSW ultra switch on

description: Schakelt schakelaar aan als de elec prijs zeer laag is.

trigger:

– platform: numeric_state

entity_id: sensor.day_ahead_price

attribute: day_ahead_price

below: 0.02

condition: []

action:

– service: switch.turn_on

data: {}

target:

entity_id: switch.peq1418450_9

mode: single

– id: ‘1664573871793’

alias: VSW ultra switch off

description: ”

trigger:

– platform: numeric_state

entity_id: sensor.day_ahead_price

attribute: day_ahead_price

above: 0.02

condition: []

action:

– service: switch.turn_off

data: {}

target:

entity_id: switch.peq1418450_9

mode: single

Wishlist

Dit draait nu een paar weken en ik begin er aardig wat ervaring mee op te doen. Wat ik mis is een voorspelling voor de volgende dag. De day-ahead prijzen zijn in de loop van de middag bekend en eigenlijk wil je die al weten om daarmee het laden/ontladen en het sturen van andere aktoren voor de rest van de dag, optimaal te kunnen besturen. Via de link uit de HA community (hiervoor) heb ik gezien dat ook anderen hiermee bezig zijn. Dus ik ga dat nog verder volgen.