fbpx
Categories
fronius Koduautomaatika nordpool päikesepark

Kuidas nutikalt piirata päikeseenergia tootmist

Oli aeg mil energiahinnad tõusid ja alustasin antud blogi kirjutamist mõttega kuidas veidikene odavamalt elektrit tarbida läbi nutika ajastamise vastavalt börsihinnale. Möödas on poolteist aastat ja tekkinud on uued mured – mida teha kui majapidamises on tootmisüksus aga elektrihind on hoopis negatiivne?

Igat moodi kalkuleerides jõuab lõpuks järeldusele, et kõige otstarbekam on võimalikult palju elektrit oma majapidamises ise ära kasutada. Selleks tegin ringi ka oma süsteemi veidikene, mis arvestaks ka müügist saadava tuluga ning ajastaks tarbimist, arvestades seda et müügist ei saa võrguasu ega käibemaksu, mis ostu puhul arvele juurde tekivad. Lisaks on kasulik ka osta endale elektriauto ning sõita tasuta “kütusega”, mille puhul laadimishind võrdub kokkuhoitud bensiini/diisli hinnaga.

Kui auto on täis laetud, maja köetud, samas päike väljas ja hind negatiivne – ehk maksad hoopis müügi pealt peale, siis järgmine samm on piirata tootmist. Järgnev postitus kajastabki kuidas ma endal selle piiramise korraldasin.

Riistvara

Inverter. Mul majapidamises on tootmisüksuseks Fronius Symo 10kW päikeseinverter. Kirjutan lähtuvalt antud toote vaatepunktist.
Elektriarvesti. Et piirata tootmist peab saama kuidagi aimu palju energiat võrku anname või sealt võtame. Selleks on mul Selly 3EM elektriarvesti. Sobib ka Froniuse enda smartmeter, samas kuna mul seda pole ning pole ka oluline, siis lähtusin olemasolevast riistvarst.
Kontroller. Eelnevates blogipostitustes kirjeldatud Home Assistant tarkvara, mis nüüdseks jookseb mul Synologi võrgukettas olevas virtuaalmasinas.

Kõik vidinad on ühendatud ühtsesse arvutivõrku ning saavad seal omavahel suhelda.

Seadistamine

Elektrihind Nordpoolist
Elektrihinna saamiseks kasutan Nordpooli integratsiooni, mis on saadaval Home Assistanti HACS lisadest. Selle seadistamisest on ka varasemalt juttu. Eelnevates postitustes kirjeldatule lisasin hinna arvutusse olukorra, kus arvestan et peale päikese tõusu kaks tundi ning enne päikeseloojangut tund lahutatakse hinnast maha võrgutasu, käibemaks ning müügimarginal, mida maksame energiavahendajale. Eeldame siis et päeval antud kellaaegadel päike paistab ja toimub müük – elektrihind on siis minu jaoks müügist saadud tulu, mis viimasel ajal muutub negatiivseks.

Graafikul on näha punasega siis see raha mida ma saan/kaotan müügist. Sinine on hind mida maksaks kui mul poleks tootmist. Sellise (punase) hinna saamiseks kasutan järgmist koodilõiku. Kuna mul päikesepaneelid on paigutatud ida ja lääne suunale, siis kellaajad millal arvestan enne ja pärast päikesetõusu on arvestuslikud vastavatele suundadele. Lõunasse suunatud paneelide puhul ilmselt oleks mõistlik ca 3h enne loojangut ja 3h peale tõusu sättida parameetrid. Koodis ajad sekundites.

sensor:
  - platform: nordpool
    low_price_cutoff: 1
    VAT: false
    region: "EE"
    precision: 3
    price_type: MWh
    additional_costs: '
{% set sunrise_offset = 10800 %}
{% set sunset_offset = 3600 %}
{% set now2 = as_timestamp(now()) %}
{% set sunset = as_timestamp(state_attr("sun.sun", "next_setting")) %}
{% set sunrise = as_timestamp(state_attr("sun.sun", "next_rising")) %}
{% set nextday = as_timestamp(states("sensor.date")) + 86400 %}

{% if nextday < sunset %}
  {% set sunset = sunset - 86400 %}
{% endif %}
 
{% if nextday < sunrise %} 
  {% set sunrise = sunrise - 86400 %}
{% endif %}

{% set s = { "day": 44.300, "night": 25.200, "sunup": -7.5 } %} 
{% if now().weekday() in (5,6) %} 
  {% if ((sunrise + sunrise_offset) < now2) and (now2 < (sunset - sunset_offset)) %}
    {{s.sunup|float}}
  {% else %} 
    {{current_price * 0.2 + s.night|float}} 
  {% endif %} 
{% else %} 
  {% if ((sunrise + sunrise_offset) < now2) and (now2 < (sunset - sunset_offset)) %}
    {{s.sunup|float}}
  {% elif now().hour >=7 and now().hour < 22 %} 
    {{current_price * 0.2 + s.day|float}} 
  {% else %} 
    {{current_price * 0.2 + s.night|float}} 
  {% endif %} 
{% endif %}

Kolme faasi tarbimise arvestamine
Edasi tegin ühe sensori, mis liidab kolme faasi pealt liikuva võimsuse kokku ja väljastab selle kogutarbimisena. Kuna mu inverterit faaside kaupa nagunii juhtida ei saa, siis eeldan et tarbimine on sümmeetriline (tarbitakse kõiki faase võrdselt, mis alati päris täpne pole)

#tarbimine
  - sensor:
      - name: "Peaarvesti Maja current power"
        unique_id: maja_current_power
        state: >
          {{ 
            [ states('sensor.shellyem3_34945475eeb9_channel_a_power'), 
              states('sensor.shellyem3_34945475eeb9_channel_b_power'),
              states('sensor.shellyem3_34945475eeb9_channel_c_power'),
            ] | map('float') | sum
          }}
        availability: >
          {{ 
            [ states('sensor.shellyem3_34945475eeb9_channel_a_power'), 
              states('sensor.shellyem3_34945475eeb9_channel_b_power'),
              states('sensor.shellyem3_34945475eeb9_channel_c_power'),
            ] | map('is_number') | min
          }}
        unit_of_measurement: w
        device_class: power
        state_class: measurement

Inverterilt tootmisnäitude lugemine ModBusi/TCP kaudu
Antud inverteril on ka spetsiaalne integratsioon Home Assistantiga, kuid selle kaudu saab lugeda ainult põhiparameetreid ning juhtida ei saa. Juhtimiseks on õnneks tal olemas Modbus/TCP tugi, mida oskab ka HA. Kõigepealt loeme sealt välja parameetrid, mida meil juhtimiseks on tarvis kasutada. Piisab aktiivvõimsuse lugemisest – seda mõõdame ka Shelly arvestist. IP aadressid tuleb valida sellised mis on teile seadmetel. Modbusi registriväärtused on erinevad igal inverteri mudelil ja neid tuleb tootja kodulehtedelt otsida. Antud näites loeme veidikene rohkem parameetreid kuid vaja hetkel on vaid aktiivvõimsust.

modbus:
  name: FroniusMODBUS
  type: tcp
  host: 192.168.0.78
  port: 502
  sensors:
  #- name: "fronius_Phase_L1L2_voltage"
  #  slave: 1
  #  scan_interval: 20
  #  count: 2
  #  address: 40079
  #  data_type: float32
  #  unit_of_measurement: V
    
  #- name: "fronius_Phase_L2L3_voltage"
  #  slave: 1
  #  scan_interval: 20
  #  count: 2
  #  address: 40081
  #  data_type: float32
  #  unit_of_measurement: V'
    
  #- name: "fronius_Phase_L1L3_voltage"
  #  slave: 1
  #  scan_interval: 20
  #  count: 2
  #  address: 40083
  #  data_type: float32
  #  unit_of_measurement: V

  - name: "fronius_Phase_L1N_voltage"
    slave: 1
    scan_interval: 20
    count: 2
    address: 40085
    data_type: float32
    unit_of_measurement: V
    
  - name: "fronius_Phase_L2N_voltage"
    slave: 1
    scan_interval: 20
    count: 2
    address: 40087
    data_type: float32
    unit_of_measurement: V

  - name: "fronius_Phase_L3N_voltage"
    slave: 1
    scan_interval: 20
    count: 2
    address: 40089
    data_type: float32
    unit_of_measurement: V    

  - name: "fronius_AC_Power"
    slave: 1
    scan_interval: 10
    count: 2
    address: 40091
    data_type: float32
    unit_of_measurement: W
    
  - name: "fronius_Line_Frequency"
    slave: 1
    scan_interval: 20
    count: 2
    address: 40093
    data_type: float32
    unit_of_measurement: Hz
    
  #- name: "fronius_Apparant_Power"
  #  slave: 1
  #  scan_interval: 10
  #  count: 2
  #  address: 40095
  #  data_type: float32
  #  unit_of_measurement: VA
    
  - name: "fronius_power_limit"
    slave: 1
    scan_interval: 20
    address: 40242
    data_type: uint16
    unit_of_measurement: W
    
  - name: "fronius_power_limit_active"
    slave: 1
    scan_interval: 20
    address: 40246
    data_type: uint16

Juhtimine

Nüüd on kõik vajalik olemas, et saaks saata inverterile piiramise käske. Antud inverter eeldab et enne piirangu etteande väärtust on piiramise aktiveerimise registri väärtus “0”, seejärel anname ette etteandeväärtuse ning siis aktiveerime piiraja.
Automaatika trigeriks on võimuse näidu muutus arvestis ning tingimuseks et piirang rakendatakse on negatiivne hind

Automaatikaid saab seadistada Settings->Automation, seal tuleks lisada New Automation ja edasi Edit in YAML lisada järgnev kood:

alias: Fronius limit power
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.peaarvesti_maja_current_power
condition:
  - condition: template
    value_template: "{{ states('sensor.nordpool_mwh_ee_eur_3_10_0')|int < 0 }}"
action:
  - service: modbus.write_register
    data:
      hub: FroniusMODBUS
      slave: 1
      address: 40246
      value: "0"
  - service: modbus.write_register
    data:
      hub: FroniusMODBUS
      address: 40242
      slave: 1
      value: >-
        {%- set peaaervesti_power =
        states('sensor.peaarvesti_maja_current_power') %} {%- set inverter_power
        = states('sensor.fronius_ac_power') %} {%- set total_power =
        peaaervesti_power|int + inverter_power|int + 200 %} {{ total_power }}
  - service: modbus.write_register
    data:
      hub: FroniusMODBUS
      slave: 1
      address: 40246
      value: "1"
mode: single

Kui nüüd hind muutub positiivseks on vaja piiraja eemaldada, selleks tegin täiendava automaatika

alias: Fronius Limit power off when price is positive
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.peaarvesti_maja_current_power
condition:
  - condition: template
    value_template: "{{ states('sensor.nordpool_mwh_ee_eur_3_10_0')|int > 0 }}"
action:
  - service: modbus.write_register
    data:
      hub: FroniusMODBUS
      slave: 1
      address: 40246
      value: "0"
  - service: modbus.write_register
    data:
      hub: FroniusMODBUS
      address: 40242
      slave: 1
      value: 10000
mode: single

Antud asju teglikult on tarvis veidi veakindlamaks teha – lisada oleks tavis juhud kui näiteks börsihind pole saadaval või siis näiteks mõne arvesti väärtus hetkel on kättesaamatu HA-le (unknown või unavailable). Kunagi hiljem täiendan. Samas hetkel ta mul ilusasti töötab.

Visualiseerimine

Automaatikate sisse välja lülitamiseks lisasin paar nupukest – sellega peaksid kõik ise hakkama saama 🙂

Nagu näha lisasin ka käsitsi juhtimise võimaluse. Selleks tegin kaks helperit Settings->Devices->Helpers menüüs

Üks nendest siis slider ja teine toggle switch. Nende nuppude vajutuse peale inf osaatmiseks inverterisse tegin mõlema jaoks eraldi veel automaatikad:
Piiraja aktiveerimine

alias: Fronius Turn On Power Limit
description: ""
trigger:
  - platform: state
    entity_id:
      - input_boolean.fronius_power_limit_active
condition: []
action:
  - service: modbus.write_register
    data:
      hub: FroniusMODBUS
      slave: 1
      address: 40246
      value: >-
        {{ 1 if states('input_boolean.fronius_power_limit_active') == 'on' else
        0 }}
mode: single

Piiraja etteandeväärtuse muutmine

alias: Fronius Change Power Limit
description: ""
trigger:
  - platform: state
    entity_id:
      - input_number.fronius_power_limit
condition: []
action:
  - service: modbus.write_register
    data:
      hub: FroniusMODBUS
      address: 40242
      slave: 1
      value: "{{ states('input_number.fronius_power_limit') }}"
mode: single

Täna on esimene päev kus katsetasin ja tundub et töötab päris ilusasti. Näha on et veidikene tootsin rohkem – see tulenes sellest et käsitsilisasin 200W rohkem tootmist kui vaja, et veidikene siluda faaside ebasümmeetriast tulenevat valearvestust. Odavam on pigem veidikene müüa negatiivse hinnaga kui osteds maksta võrgutasu ja käibemaksu.

Kena katsetamiset! 🙂