Add Open-Meteo solar forecast (#19111)
This commit is contained in:
parent
6345635924
commit
b638445745
1 changed files with 148 additions and 0 deletions
148
templates/definition/tariff/open-meteo.yaml
Normal file
148
templates/definition/tariff/open-meteo.yaml
Normal file
|
|
@ -0,0 +1,148 @@
|
|||
template: open-meteo
|
||||
products:
|
||||
- brand: OpenMeteo
|
||||
requirements:
|
||||
description:
|
||||
en: Free Weather API [open-meteo.com](https://open-meteo.com) Open-Meteo is an open-source weather API and offers free access for non-commercial use. No API key required.
|
||||
de: Freie Wetter API [open-meteo.com](https://open-meteo.com) Open-Meteo ist eine Open-Source-Wetter-API und bietet kostenlosen Zugriff für nicht-kommerzielle Nutzung. Kein API-Schlüssel erforderlich.
|
||||
evcc: ["skiptest"]
|
||||
group: solar
|
||||
params:
|
||||
- name: lat
|
||||
description:
|
||||
en: Latitude
|
||||
de: Breitengrad
|
||||
example: "55.7351"
|
||||
required: true
|
||||
- name: lon
|
||||
description:
|
||||
en: Longitude
|
||||
de: Längengrad
|
||||
example: "9.1275"
|
||||
required: true
|
||||
- name: dec
|
||||
description:
|
||||
en: Decline
|
||||
de: Neigung
|
||||
help:
|
||||
en: 0 = horizontal, 90 = vertical
|
||||
de: 0 = horizontal, 90 = vertikal
|
||||
example: 25
|
||||
required: true
|
||||
- name: az
|
||||
description:
|
||||
en: Azimuth
|
||||
de: Azimut
|
||||
help:
|
||||
en: -180 = north, -90 = east, 0 = south, 90 = west, 180 = north
|
||||
de: -180 = Norden, -90 = Osten, 0 = Süden, 90 = Westen, 180 = Norden
|
||||
example: 0
|
||||
required: true
|
||||
- name: kwp
|
||||
description:
|
||||
en: Maximum generator power [kWp]
|
||||
de: Maximale Generatorleistung [kWp]
|
||||
example: 9.8
|
||||
required: true
|
||||
- name: ac
|
||||
description:
|
||||
en: AC Power [kW]
|
||||
de: AC Leistung [kW]
|
||||
default: 1000
|
||||
advanced: true
|
||||
- name: dm
|
||||
description:
|
||||
en: Damping morning (0 = no damping 100 = full damping
|
||||
de: Dämpfung morgens (0 = keine Dämpfung 100 = volle Dämpfung)
|
||||
default: 0
|
||||
advanced: true
|
||||
- name: de
|
||||
description:
|
||||
en: Damping evening (0 = no damping 100 = full damping)
|
||||
de: Dämpfung abends (0 = keine Dämpfung 100 = volle Dämpfung)
|
||||
default: 0
|
||||
advanced: true
|
||||
- name: efficiency
|
||||
description:
|
||||
en: Efficiency [%]
|
||||
de: Wirkungsgrad [%]
|
||||
default: 100
|
||||
advanced: true
|
||||
- name: alphatemp
|
||||
description:
|
||||
en: Temperature coefficient
|
||||
de: Temperaturkoeffizient
|
||||
example: -0.004
|
||||
default: -0.004
|
||||
advanced: true
|
||||
- name: rossmodel
|
||||
description:
|
||||
en: Cooling type [Ross Model]
|
||||
de: Kühlung [Ross-Modell]
|
||||
help:
|
||||
en: Well Cooled (0.0200), Free Standing (0.0208), Flat on Roof (0.0260), Not So Well Cooled (0.0342), Transparent PV (0.0455), Facade Integrated (0.0538), On Sloped Roof (0.0563) [Paper](https://www.sciencedirect.com/science/article/pii/S0038092X20309107)
|
||||
de: Gut Gekühlt (0.0200), Freistehend (0.0208), Flach auf Dach (0.0260), Nicht So Gut Gekühlt (0.0342), Transparentes PV (0.0455), Fassadenintegriert (0.0538), Auf Schrägdach (0.0563) [Paper](https://www.sciencedirect.com/science/article/pii/S0038092X20309107)
|
||||
example: 0.0342
|
||||
default: 0.0342
|
||||
advanced: true
|
||||
- name: interval
|
||||
default: 1h
|
||||
advanced: true
|
||||
render: |
|
||||
type: custom
|
||||
tariff: solar
|
||||
forecast:
|
||||
source: http
|
||||
uri: https://api.open-meteo.com/v1/forecast?latitude={{ .lat }}&longitude={{ .lon }}&azimuth={{ .az }}&tilt={{ .dec }}&hourly=temperature_2m,global_tilted_irradiance&daily=sunrise,sunset&forecast_days=3&timezone=auto&timeformat=unixtime
|
||||
jq: |
|
||||
def alphatemp: {{ .alphatemp }}; # temperature coefficient
|
||||
def rossmodel: {{ .rossmodel }}; # cooling type
|
||||
def eff: {{ .efficiency }} / 100; # efficiency 1 = 100%
|
||||
def kwp: {{ .kwp }} * 1000 ; # kWp
|
||||
def ac: {{ .ac }} * 1000 ; # AC
|
||||
def dm: {{ .dm }} / 100; # 1 = 100% damping morning (0 = no damping)
|
||||
def de: {{ .de }} / 100; # damping evening
|
||||
def clamp(min; x; max):
|
||||
if x < min then min elif x > max then max else x end;
|
||||
def midday(sunrise; sunset):
|
||||
sunrise + ((sunset - sunrise) / 2);
|
||||
def calculate_damping(time; sunrise; sunset; m; e):
|
||||
if time < sunrise then m
|
||||
elif time < midday(sunrise; sunset) then
|
||||
m * (1 - ((time - sunrise) / (midday(sunrise; sunset) - sunrise)))
|
||||
elif time < sunset then
|
||||
e * ((time - midday(sunrise; sunset)) / (sunset - midday(sunrise; sunset)))
|
||||
else
|
||||
e
|
||||
end;
|
||||
.hourly as $h
|
||||
| .daily as $d
|
||||
| [ range(0; ($h.time | length))
|
||||
| . as $i
|
||||
| $h.time[$i] as $time
|
||||
| ($i / 24 | floor) as $day
|
||||
| {
|
||||
start: ($time | todateiso8601),
|
||||
end: (($time + 3600) | todateiso8601),
|
||||
price: (
|
||||
kwp
|
||||
* ($h.global_tilted_irradiance[$i] / 1000)
|
||||
* (1 + ( alphatemp *
|
||||
(
|
||||
( ($h.temperature_2m[$i]
|
||||
+ ($h.temperature_2m[$i-1] // $h.temperature_2m[$i])
|
||||
) / 2)
|
||||
+ ($h.global_tilted_irradiance[$i] / 800.0) * rossmodel - 25.0
|
||||
)
|
||||
))
|
||||
* (1 - calculate_damping($time;
|
||||
$d.sunrise[$day];
|
||||
$d.sunset[$day];
|
||||
dm; de))
|
||||
* eff
|
||||
| clamp(0; .; ac)
|
||||
)
|
||||
}
|
||||
]
|
||||
| tostring
|
||||
interval: {{ .interval }}
|
||||
Loading…
Add table
Add a link
Reference in a new issue