diff --git a/templates/definition/tariff/open-meteo.yaml b/templates/definition/tariff/open-meteo.yaml new file mode 100644 index 000000000..d8d2786bd --- /dev/null +++ b/templates/definition/tariff/open-meteo.yaml @@ -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 }}