Add Open-Meteo solar forecast (#19111)

This commit is contained in:
thecem 2025-03-04 19:37:30 +01:00 • committed by GitHub
parent 6345635924
commit b638445745
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View 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 }}