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! 🙂