Over mij

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.

Een uitgewerkt concept voor een thuisbatterij

Als antwoord op de sterk gestegen vraag naar een oplossing voor thuisopslag heb ik bedrijfsmatig (via mijn bedrijf Hetslimmehuis) samen met ECO-Lithium (leverancier van batterijen) enkele standaard concepten ontwikkeld met behulp van het Victron Energy Storage System ESS.

In dit artikel tref je de verschillende mogelijkheden die wij voor je kunnen samenstellen. Natuurlijk is er nog veel meer mogelijk, maar door de keuze wat te beperken én toch ook rekening te houden met groei in de toekomst, kun je met deze oplossingen een mooie start maken met het opslaan en hergebruiken van jouw eigen opgewekte energie. Nieuwsgierig? Check ook het Youtube kanaal.

Vier opties of maatwerk

Wij hebben vier opties nader uitgewerkt. Deze vier opties hebben gemeen dat zij gebruik maken van bestaande PV-omvormers (AC type) zoals SMA, GroWatt, GoodWe of SolarEdge, met uitzondering van optie 4. Bij deze laatste is gekozen voor een zonnelader van Victron Energy die wordt geïntegreerd in het ESS.

  1. Een enkel fase oplossing, geschikt tot 5 kWp bestaand PV vermogen, met een ECO-Lithium batterij van 11 kWh bruto capaciteit (9 kWh nuttig te gebruiken);
  2. Een drie fase oplossing, geschikt tot 5 kWp bestaand PV vermogen, met een ECO-Lithium batterij van 15 kWh bruto capaciteit (14 kWh nuttig te gebruiken).
  3. Een drie fase oplossing, geschikt tot 15 kWp bestaand PV vermogen, met een ECO-Lithium batterij van 15 kWh bruto capaciteit (14 kWh nuttig te gebruiken).
  4. Als extra keuze hebben wij een 3 fasen oplossing samengesteld met een SmartSolar MPPT laadregelaar voor zonnepanelen met een aansluitwaarde van 6-11kWp. Hierbij past een 15kWh batterij. Voor deze optie heb je dan zelf geen AC omvormer meer nodig en er is minder energieverlies.

Uiteraard zijn ook andere configuraties mogelijk, neem in dat geval contact met ons op.

Batterijen kunnen wij op dit moment leveren in de grootte van 11 kWh of 15 kWh. Meerdere sets kunnen parallel geschakeld worden tot bijvoorbeeld 22 kWh, 30 kWh of 45 kWh.

Uitgangspunten

Voor deze oplossingen hebben wij de volgende uitgangspunten samengesteld. Deze uitgangspunten zijn gebaseerd op onze ervaringen.

  • Hetslimmehuis is van mening dat een thuis batterij alleen bestaansrecht heeft als deze wordt aangesloten op een PV (zonnepanelen) installatie. Natuurlijk kun je het opslagsysteem ook gebruiken zonder een PV-systeem maar erg logisch is dat niet.
  • Als vuistregel voor de omvang van de batterij hanteren wij het gemiddelde dagverbruik over een jaar gemeten. Bijvoorbeeld: u verbruikt jaarlijks 3.500 kWh elektriciteit in uw huishouden (zonder verrekening/saldering van PV opwek), hierbij past een capaciteit van 3500/365=9.6 kWh batterij.
  • Een tweede vuistregel zegt ons dat de batterij capaciteit moet passen bij de capaciteit van de hybride omvormer van Victron én bij de opwek capaciteit van jouw PV installatie.
    • Voorbeeld 1: je hebt 10 zonnepanelen van elk 350 Wp, totaal dus 3.500 Wp, aangesloten op een enkelfase GroWatt omvormer van 3.500 Watt. De omvormer van Victron moet in staat zijn om dit vermogen in de batterij te laden of uit de batterij te halen. Hierbij past een Multiplus II 5000 VA.
    • Voorbeeld 2: je hebt 16 zonnepanelen van elk 350 Wp, totaal 5.600 Wp, aangesloten op een 3 fasen omvormer van SolarEdge van 5 kW. In dit geval kies je de 3-fasen oplossing van Victron met 3 stuks Multiplus II 3000 VA. Samen hebben deze een opgeteld vermogen dat ruim voldoende is om dit opgewekte vermogen in de batterijen te laden of uit de batterijen te halen.
    • Voorbeeld 3: je hebt 24 panelen van elk 350 Wp, totaal 8.400 Wp, aangesloten op een 3 fasen omvormer van SMA van 8 kW. je hebt dan 2 keuzes: je kunt kiezen voor de 3 fasen oplossing met 3 stuks Multiplus II 3000 (maximaal 5,5 kW laden/ontladen) of 3 stuks Multiplus II 5000 (maximaal 11 kW laden/ontladen).
  • Een grotere batterij dan door ons bepaald heeft geen voordeel. Je moet immers ook in staat zijn om de batterij te laden met voldoende zonnestroom. In de zomer kan een 3.500 Watt PV omvormer gemiddeld 20 kWh op een dag “oogsten”, daar gaat dan het eigen verbruik voor bijvoorbeeld vaatwasser, keukenboiler e.d. vanaf. Stel dat dit overdag 5 kWh is, dan is er maximaal 15 kWh beschikbaar voor de batterij. Een te grote batterij heeft dus geen zin. De kans is groot dat er te veel dagen in het jaar zijn dat de batterijen niet voldoende geladen kunnen worden. Een batterij gaat langer mee als deze minder wordt gebruikt maar de batterij is beveiligd tegen te diepe ontlading.
  • De omvang van de Victron omvormers is van invloed op de maximale belasting die kan optreden in geval van een netspanningsstoring of als u werkelijk al het verbruik in jouw huis wenst te compenseren tot 0.
    • Voorbeeld 1: het benodigd vermogen voor jouw huishouden is s ‘avonds 2.000 Watt. Als de stroom uitvalt wil je dat alle apparatuur die samen die 2.000 Watt verbruikt, blijft functioneren. Alle opties kunnen dit ondersteunen.
    • Voorbeeld 2: het benodigd vermogen voor jouw huishouden is s ‘avonds 2.000 Watt en de laadpaal staat aan en verbruikt ook 3.500 Watt. In geval van een stroomstoring kan dat niet opgevangen worden door de Victron omvormers en zullen deze overbelast worden. In dat geval kiezen wij ervoor om zware verbruikers (zoals boilers, warmtepomp, laadpaal e.d.) parallel te schakelen met de Victron omvormers. Dit betekent in ons voorbeeld dat de laadpaal gedurende de stroomstoring uit zal gaan maar de overige apparaten in jouw huis gewoon blijven functioneren. Overbelasting van omvormers wordt zo voorkomen.
    • Voorbeeld 3: het benodigde vermogen voor jouw huishouden is op een grijze regenachtige dag 2.000 Watt. De zonnepanelen leveren slechts 500 Watt. Het Victron Energie systeem zal het verschil compenseren door 1.500 Watt uit de batterijen te halen zodat jij  geen stroom hoeft te kopen. Maar als plotseling de laadpaal wordt aangezet met een vermogen van 11.000 Watt is dit te veel om gecompenseerd te worden door de Victron Multiplus II 3000. Deze levert maximaal 5.500 Watt in drie fasen. Het nettoverschil zal vanaf het elektriciteitsnetwerk worden geladen (2.000+11.000-500-5.500=7.000 Watt.

Wat zit er in onze Victron ESS oplossing?

Afhankelijk van de gekozen optie krijg je 1 of 3 omvormers en een batterij van 11 kWh of 15kWh door ons geleverd. Daarnaast een Cerbo CX besturingseenheid met een 5 inch Touchscreen en een Lynx distributie eenheid inclusief zekeringen voor het aansluiten van de batterij en de bekabeling van en naar de meterkast. Ook worden er veiligheidsautomaten geleverd zodat de installatie veilig aangesloten kan worden op de huisinstallatie in de meterkast.

Het geheel wordt door ons gemonteerd op een houten multiplexplaat, voorzien van een brandvertragende coating die uiteindelijk op een droge, stofvrije en vorstvrije plaats in of nabij de woning moet worden geplaats. Tegen een meerprijs kan een volledig rvs-kast met afsluitbare deuren worden geleverd waarin de installatie wordt geplaatst. De omvormers kunnen in warme zomerse omstandigheden geluid produceren. De ruimte waarin de apparatuur wordt geplaatst moet dus geventileerd kunnen worden.

In uw meterkast wordt een extra tussenmeter geplaatst die met een datakabel wordt verbonden met de Cerbo CX besturingseenheid. In de meterkast splitsen wij de noodzakelijke aansluitingen naar de woning (verlichting, keuken, televisie e.d.) van de niet noodzakelijke aansluitingen (boiler, warmtepomp, laadpaal e.d.). Daarnaast wordt een extra veiligheidsautomaat in de meterkast gebouwd. Als de meterkast onvoldoende ruimte heeft voor deze uitbreidingen, leveren wij een uitbreiding tegen een kleine meerprijs.

Het gemonteerde systeem heeft een totaalgewicht van 50-150 kg, afhankelijk van de uitvoering (exclusief de optionele rvs-straatkast. Daarnaast krijgt u de batterijen geleverd. Een batterij van 10 kWh heeft een gewicht van 60 kg. Een batterij van 15 kWh heeft een gewicht van 85 kg. Batterijen kunnen op de grond worden geplaatst maar wij kunnen ook exemplaren leveren die tegen de muur worden geplaatst. Neem contact met ons op voor de mogelijkheden.

Hieronder zijn de 4 opties nader uitgewerkt.

Optioneel kan een extra batterij worden toegevoegd tegen de volgende prijs:

  • 10 kWh        € 4.400,-
  • 15 kWh        € 6.000,-
  • Meerprijs RVS-buitenkast is op aanvraag en afhankelijk van de situatie.

Momenteel ontwikkelen wij software waarmee het mogelijk is om op basis van de energietarieven, energie in te kopen of te verkopen via het batterij systeem. Zodra wij een werkend en stabiel systeem hebben, zullen wij je hierover berichten. De verwachting is dat dit eind 2022 tot een eerste versie kan leiden.

Opstelling optie 1: 1 fase Multiplus II-5000

Optie 1: Enkel Fase 5kVA/10kWh
Victron Multiplus II 5000 48/70-50 PMP482505010 1
Victron Cerbo X ESS controller BPP900450100 1
Victron Touchscreen HDMI 50 BPP900455050 1
Victron Touchscreen wallmount BPP900465050 1
Victron Carlo Gavazi gridmeter ET112 REL300100000 1
Victron RS485 to USB 5 mtr kabel ASS030572050 1
Victron SmartShunt 500A SHU050150050 1
Victron Megafuse zekering CIP137250010 2
ECO-Lithium 10kW batterij ECO-Lithium 10/48 1
Toebehoren (kabels, automaten) 1
Montage kosten 1
TOTAAL, excl. BTW € 8.350,-

Opstelling optie 2: 3 fasen Multiplus II-3000

Optie 2: drie-fasen 9kVA/15kWh
Victron Multiplus II 3000 48/35-32 PMP482305010 3
Victron Cerbo X ESS Controller BPP900450100 1
Victron Touchscreen HDMI 50 BPP900455050 1
Victron Touchscreen wallmount BPP900465050 1
Victron Carlo Gavazi gridmeter ET340 REL300300000 1
Victron RS485 to USB 5 mtr kabel ASS030572050 1
Victron SmartShunt 500A SHU050150050 1
Victron Lynx Distributor LYN060102000 1
Victron Mega Fuse 250A CIP137250010 4
Eco-Lithium batterij 15kWh/48V ECO-Lithium 15/48 1
Toebehoren (kabels, automaten) 1
Montage Kosten 1
TOTAAL, excl. BTW € 11.950,-

Opstelling optie 3: 3 fasen Multiplus II 5000

Optie 3: drie-fasen 15kVA/15kWh
Victron Multiplus II 5000 48/70-50 PMP482505010 3
Victron Cerbo X ESS Controller BPP900450100 1
Victron Touchscreen HDMI 50 BPP900455050 1
Victron Touchscreen wallmount BPP900465050 1
Victron Carlo Gavazi gridmeter ET340 REL300300000 1
Victron RS485 to USB 5 mtr kabel ASS030572050 1
Victron SmartShunt 500A SHU050150050 1
Victron Lynx Distributor LYN060102000 1
Victron Mega Fuse 250A CIP137250010 4
Eco-Lithium batterij 15kWh/48V ECO-Lithium 15/48 1
Toebehoren (kabels, automaten) 1
Montage Kosten 1
TOTAAL excl. BTW € 13.750,-

Optie 4: 3 fasen Multiplus II 3000 inclusief SmartSolar MPPT 6-11kWp

Optie 4: drie-fasen 9kVA/15kWh, incl SmartSolar 6-11kWp
Victron Multiplus II 3000 48/35-32 PMP482305010 3
Victron Cerbo X ESS Controller BPP900450100 1
Victron Touchscreen HDMI 50 BPP900455050 1
Victron Touchscreen wallmount BPP900465050 1
Victron Carlo Gavazi gridmeter ET340 REL300300000 1
Victron RS485 to USB 5 mtr kabel ASS030572050 1
Victron SmartShunt 500A SHU050150050 1
Victron Lynx Distributor LYN060102000 1
Victron Mega Fuse 250A CIP137250010 5
Victron MPPT Smartsolar RS450/100 SCC145110410 1
Eco-Lithium batterij 15kWh/48V ECO-Lithium 15/48 1
Toebehoren (kabels, automaten) 1
Montage Kosten 1
TOTAAL excl. BTW € 13.500,-

Garantie en overige voorwaarden

  • Alle prijzen in deze aanbieding zijn excl. 21% BTW.
  • Deze prijslijst is geldig voor het 3e kwartaal van 2022. Prijzen na 1 oktober 2022 zijn nog onbekend.
  • Er zijn nog geen landelijke subsidies voor Energie Opslag Systemen. Neem contact met je gemeente of er lokale subsidies beschikbaar zijn. Zakelijk zijn er wel subsidies, zoals VAMIL (EIA). Neem contact met RVO voor meer informatie.
  • Op het werkende systeem leveren wij een garantie van 5 jaar. Voor een Doe Het Zelf oplossing geldt alleen de garantie op defecte onderdelen.
  • Het Victron ESS vereist een Internet aansluiting. Hiermee kunt u als eigenaar en wij als systeem integrator het systeem monitoren en eventuele storingen oplossen. Een ethernet aansluiting is aan te bevelen, ook voor toekomstige functionele uitbreidingen. Optioneel kan tegen meerprijs een Wifi oplossing worden geboden als de reikwijdte van uw Wifi niet toereikend is.
  • Het Victron ESS beschikt standaard over een backup-faciliteit: bij stroomuitval blijft de woning volledig voorzien van stroom. Dit vereist wel een extra kabel tussen de Victron ESS omvormers en de meterkast (samen dus 2 kabels!). Kies altijd een 6mm2 kabel (enkel fase of 3-fase, afhankelijk van de gewenste opstelling).
  • Levertijd is in overleg en afhankelijk van de beschikbaarheid van onderdelen.
  • Leveringsvoorwaarden Hetslimmehuis zijn van toepassing. Deze zijn beschikbaar op onze website: https://www.hetslimmehuis.nl/leveringsvoorwaarden

Een publiek bedankje

Lieve mensen,

Vier jaar geleden was ik best trots dat ik na mijn ondernemerschap als wethouder een bijdrage mocht gaan leveren aan een betere maatschappij. Want zo voelt dat. Je hebt idealen over hoe de samenleving kan zijn en als je daar een praktische bijdrage aan wilt leveren, moet je dat vooral als lokaal bestuurder gaan doen.

Maar hoe doe je dat? Waar begin je dan? Welke knoppen zijn er om aan te draaien en waar zitten die knoppen? Als ondernemer neem je zelf de touwtjes in handen en kies je koers. Maar de overheid is geen bedrijf. Al snel kreeg ik de vraag wat ik van het wethoudersvak vond. En zeker de eerste 1 ½ jaar antwoordde ik dan met twijfels. Wat doe ik hier en waar ben ik aan begonnen?

Ik miste het raadswerk. Dat zag ik toch als een leuke competitie, een wedstrijd. Je zoekt coalities voor jouw standpunten, verdiept je in de inhoud en viert een overwinning als de wedstrijd is gewonnen. Maar die competitie is er niet in een college. Ik zat bijna altijd met kromme tenen te luisteren naar raadsvergaderingen. Maar ingrijpen kun je niet. De raad is immers het hoogste orgaan. En de wethouder moet zijn plek kennen.

Ik twijfelde of dit wel mijn ding was. En toen daar de vertrouwenscrisis en het bestuurlijke gedoe met Oostzaan, de directie en het MT en leegloop van personeel achteraan kwam, overwoog ik serieus om mijn wethoudersbaan op te zeggen.

Toch heb ik geleerd.
Als je iets wil veranderen moet je het complete systeem doorgronden en tot de grond toe durven afbreken om er iets beters voor terug te bouwen. Het vraagt lef. Een mooie term is trouwens creatieve destructie. En daarna kun je er nog wat aan schaven en vijlen.

Maar ook:
Kies je voor handelen vanwege een verkregen mandaat of kies je voor handelen op basis van wederzijds vertrouwen?
Blijf je hangen in goede intenties en getekende overeenkomsten of toon je daadkracht met zichtbaar resultaat?
Doe je 5 dingen half of heb je focus en doe je 1 ding goed?
Gaan we neuzelen over punten en komma’s of nemen we een besluit op basis van de inhoud?

Ik denk dat een goede bestuurder naast visie vooral over een gezonde portie lef, focus en daadkracht moet beschikken. En geduld natuurlijk.
Tja, daar blink ik niet zo in uit. 😉

Ik ben trots op het behaalde resultaat met de jeugdzorg. Rust in de uitvoering en vooral onderscheidende resultaten. Ik wil iedereen die daaraan heeft meegewerkt bedanken voor hun enthousiasme en inzet om samen iets moois neer te zetten voor de jeugd in Wormerland en misschien ook wel voor andere gemeenten in de toekomst.

Ik ben trots op het behaalde resultaat met het afval dossier. Natuurlijk had het eerder opgeleverd moeten worden maar je hebt niet alle omstandigheden onder controle. Maar dankzij de focus en de vele uren die ik via Facebook, telefoon, appjes e.d. met inwoners heb gecommuniceerd heb ik het gevoel dat er inmiddels een geaccepteerd systeem is ingevoerd. Natuurlijk moet er hier en daar nog wat geschaafd en gevijld worden.

Ik ben blij dat er goede plannen liggen voor een duurzame toekomst voor Wormerland. Maar met plannen alleen kom je er niet, we moeten nu daadkracht tonen met de echte energietransitie. Mijn kinderen verdienen ook een toekomst.

Het is leuk dat er nieuwe reuring in het Dorpshuis in Wijdewormer is gekomen. Lekker eten en compleet met cabaret. Er ligt nog een gevalletje Westertil overigens. Maar vooral ben ik blij met de wijze waarop de samenwerking met Oostzaan en de directie is hersteld.

In de zomer vorig jaar kreeg ik de smaak van besturen een beetje te pakken. De resultaten binnen mijn portefeuilles werden beter zichtbaar en tastbaar. En dan zie je opeens andere onderwerpen die in onze gemeente aandacht behoeven en waar ik wel een bijdrage aan zou kunnen leveren. En dus zag ik een 2e termijn wel zitten. Daar is het niet van gekomen, de kiezer wilde iets anders en dan moet je concluderen dat 4 jaar eigenlijk te kort is. Dus ik ga wat anders doen.

Eén onderwerp houd ik vast: de energietransitie. Daar is veel in te doen en daar zoek ik nu nieuwe uitdagingen. Na de zomer ga ik als vrijwillig Energiecoach onze inwoners helpen bij het realiseren van besparingen op de energierekening. Maar ook professioneel ben ik al bezig met leuke projecten op het gebied van besparing en duurzame opwek en opslag. Mijn actieve aanwezigheid op de sociale media werkt als een mooi uithangbord en ik ga vast nog veel plezier beleven aan mijn nieuwe projecten.

Dank jullie wel voor het vertrouwen en de samenwerking, het ga jullie goed!

Bevroren warmtepomp

Verwarmen met een aan/uit warmtepomp en een stooklijn

Ik heb nu 5 jaar een warmtepomp in gebruik en ben daar best tevreden over. Ik heb er al wat blogjes over geschreven. Het hele verwarmingssysteem heb ik zelf gebouwd door verschillende oplossingen te integreren. De warmtepomp zelf is van Chinese makelij. Simpel aan/uit maar redelijk efficiënt en weinig tot geen mogelijkheden om hem speciaal aan te sturen. Toch ben ik gaan zoeken naar manieren om met zo min mogelijk energie het huis en het tuinhuis te verwarmen. En verwarmen met een stooklijn is zoiets.

De eerste 4 jaar schakelde de warmtepomp in als de temperatuur in het buffervat onder de 35 graden Celsius kwam. Dat zou de ideale temperatuur moeten zijn voor de vloerverwarming. Maar ik merkte ook dat het tuinhuis daar eigenlijk tekort aan had. Er zitten wat leidingverliezen in de ondergrondse leidingen en het is een houten huisje met weinig accumulerend vermogen. Bovendien werd het buffervat ook wel eens onnodig opgewarmd naar die 35 graden. Bijvoorbeeld als er helemaal geen warmtevraag was.

Het optimaliseren is dus begonnen met het koppelen van het opwarmen aan de warmtevraag. En als het tuinhuis warmte nodig had, verhoogde ik de temperatuur met 3 graden om het verlies te compenseren. Het hielp in het energieverbruik maar er moest meer inzitten. In de tijd dat ik het huis nog met een gas CV ketel verwarmde, heb ik de weersafhankelijke regeling met een stooklijn juist uitgeschakeld. Dat had een positief effect op de gasrekening.

Tijd om mij eens te verdiepen in het concept van stooklijnen: afhankelijk van de buitentemperatuur en enkele variabelen bereken je de optimale en gewenste temperatuur van het water dat in de vloerverwarming wordt gepompt. In veel stooklijnberekeningen kun je ook rekenen met het vermogen van de warmtebron. In mijn geval kan dat niet, de warmtepomp is een aan/uit systeem en werkt niet modulerend. Dat maakt mijn formule iets eenvoudiger.

Formule voor stooklijn berekening

Er is heel erg veel te lezen op Internet over stooklijnen en adaptief stoken. Ik heb mij beperkt tot een relatief eenvoudige aanpak en heb proefondervindelijk de volgende formule samengesteld en toegepast:

Stookwaarde = 20 + Stooklijn * (voetpunt – buitentemperatuur )

  • De stookwaarde is dan de temperatuur die nodig is voor de vloerverwarming. En die waarde is geen vaste waarde maar deze is afhankelijk van een paar variabelen:
  • 20 is de basis temperatuur (zonder verliezen) om de woning op 20 graden te houden bij een buitentemperatuur van 20. Deze waarde is o.a. afhankelijk van je eigen gewenste comfort maar ook van de warmteverliezen én warmte inbreng (vd zon bijvoorbeeld) van de woning. Ik heb deze waarde proefondervindelijk vastgesteld.
  • Stooklijn is een vast getal dat past bij het type verwarmingsinstallatie, het afgiftesysteem dus en de mate van isolatie. Voor vloerverwarming kies je 0.7. Voor radiatoren kun je 1.2 kiezen en voor een gecombineerd afgifte systeem van vloerverwarming en radiatoren bijvoorbeeld 1.0. Uit mijn gas-cv-tijdperk weet ik dat de waarden in de handleidingen veel hoger waren en meestal afgestemd op een hoge ketelwatertemperatuur. Om die reden heb ik de stooklijn voor het tuinhuis op 0.9 ingesteld. Met een lagere temperatuur van 55 graden kan ook de Stooklijn-waarde naar beneden. Idem voor een lage temperatuur warmtepomp in een super geïsoleerd huis met een optimaal warmteafgiftesysteem.
  • Voetpunt is het punt waarop bij een buitentemperatuur van 20 graden, het warmteafgiftesysteem nog warmte afgeeft om de 20 graden (de basis temperatuur) in huis te behouden. Ik gebruik hiervoor 2 waarden: 20 voor de woning en 24 voor het tuinhuis waarbij de correctie in de leidingverliezen dan worden verrekend.
  • Buitentemperatuur is de gemeten buitentemperatuur van een sensor van het domoticasysteem.

Al deze waarden moet je proefondervindelijk vaststellen. Daar gaat wel wat tijd overheen! Ik had veel data verzameld in de afgelopen jaren en kon de verkregen meetgegevens mooi naast de berekende waarden leggen om te bekijken of de formule standhield. Een Excelsheet kan helpen om de berekende waarden per temperatuur te vinden:

En dit resulteert dan in een grafiek:

Ik heb de formule vervolgens verwerkt in een script voor mijn domotica systeem:

! Script voor stooklijn berekenen en stelt var VV Stookwaarde in

! Dit script berekent de stookwaarde obj2 aan de hand van een formule en een paar vaste waarden

! de formule is Stookwaarde = 20 + Stooklijn * ( voetpunt – buitentemperatuur (obj1) )

! het voetpunt is vastgesteld op 24 graden voor Tuinhuis en 20 graden voor de woning

! De stooklijn is vastgesteld op 0,9 (vloerverwarming met verlies) voor tuinhuis en 0,7 voor de woning

! de buitentemperatuur wordt in een ander script gemeten en berekend en is een Variabele obj1

! de berekende aanvoertemperatuur wordt in een variabele gestopt voor verdere verwerking

! in het besturingsprogramma voor de Warmtepomp obj8

!Defineer de variabelen

real obj1 = dom.GetObject(“HmIP-RF.0010DD898987E1:1.ACTUAL_TEMPERATURE”).Value();

real obj2 = dom.GetObject(‘VV Stookwaarde’);

real obj5 = dom.GetObject(“ThermTHaanv”);

var obj6 = dom.GetObject(‘WP-Stay-Off’);

var obj7 = dom.GetObject(‘Warmtevraag Tuinhuis’);

var obj8 = dom.GetObject(“BidCos-Wired.PEQ1418450:1.STATE”);

var obj9 = dom.GetObject(‘Warmtevraag Woning’);

var BuitenTemp= obj1;

var Stookwaarde = obj2.Value();

var Aanvoer = obj5.Value();

var WPuit = obj6.Value();

var WarmtevraagTuinhuis = obj7.Value();

var WarmtevraagWoning = obj9.Value();

!bereken nu het voetpunt en de stooklijn

if (WarmtevraagWoning == 1)

{

real Voetpunt = 20.0;

real Stooklijn = 0.7;

if (WarmtevraagTuinhuis == 1)

{

real Voetpunt = 24.0;

real Stooklijn = 0.9;

}

!Bereken nu de Stookwaarde

if (Voetpunt == 0)

{

real Voetpunt = 20;

real Stooklijn = 0.7;

}

Stookwaarde = 20.0 + (Stooklijn * (Voetpunt – BuitenTemp));

WriteLine (Stookwaarde);

!Schrijf de stookwaarde terug naar Variabele

dom.GetObject (obj2).State(Stookwaarde);

! Nu gaan we de Warmtepomp sturen

!Controleer eerst of de Warmtepomp aan staat ivm energiesturing, anders exit

if (WPuit == 1)

{

! (“de warmtepomp staat uit”);

obj8.State(0);

quit;

}

! Nu gaan we de Warmtepomp sturen

! Controleer daarna of er warmtevraag is, anders exit

if ((WarmtevraagTuinhuis == 0) && (WarmtevraagWoning == 0))

{

! (“er is geen warmtevraag”);

obj8.State(0);

quit;

}

! Controleer de aanvoer temperatuur

if (Aanvoer > Stookwaarde)

{

! (“er hoeft geen warmte geleverd te worden”);

! schakel dan de warmtepomp uit

obj8.State(0);

quit;

}

if (Aanvoer < Stookwaarde)

{

! (“er is warmte nodig”);

! schakel de warmtepomp aan

obj8.State(1);

}

Groot besparingseffect

Dit script draait nu ruim 15 maanden en ik heb dus een heel stookseizoen kunnen kijken welk effect dit zou hebben op comfort en elektriciteitsverbruik. Er is geen comfort verschil. Door de juiste waarden te kiezen (proefondervindelijk vastgesteld) en deze te vertalen naar de formule, is een prima comfort in zowel de woning als in het tuinhuis te vinden. Maar de verschillen in energieverbruik zijn spectaculair; er is maar liefst 29% energie bespaard met deze regeling!

Dus het verschil tussen een dynamische regeling op basis van buitentemperatuur of een regeling die warmte vasthoudt in een buffer is zo groot dat ik mijzelf afvraag waarom ik dit niet eerder heb bedacht.

Bijkomend effect: verhoogde opbrengst van zonneboilers

En dan is er nog iets. Doordat de temperaturen in het buffervat nu lager waren, bleek de zonneboiler beter instaat om in de winterperiode toch nog warmte toe te voegen. De zonneboilers komen in de winter normaal gesproken niet boven de 30 graden uit. Maar doordat het buffervat nu minder warm werd gestookt door de warmtepomp konden de zonneboilers toch nog een bijdrage leveren. En dat levert dus nog een extra rendement op voor de warmtepomp omdat de retourtemperatuur van de vloerverwarming onderin het buffervat wordt gemengd met de afgifte van de zonneboilers. En laat die temperatuur nou net op of boven de retourtemperatuur komen. De winst in de koude kwartalen is bijna 110%!

Secundaire winst

Er is ook nog bijvangst. Door deze regeling hoeft de warmtepomp niet meer te pendelen rondom de vastgestelde waarde van 35 graden. Hij wordt nu alleen geschakeld als er werkelijk warmtebehoefte is. Daarnaast wordt de warmtepomp voor een periode van minstens 20 minuten aangeschakeld. Overtollige energie wordt daarmee alsnog in het buffervat opgeslagen maar algemeen draait de warmtepomp veel rustiger, minder vaak gestart en zal daardoor de levensduur toenemen.

Hoera.