From 3b2799b7b52d30ef9e53c3dc66807fab69c62d1f Mon Sep 17 00:00:00 2001 From: Jens Cornelsen <79703163+IB-Cornelsen@users.noreply.github.com> Date: Mon, 30 Dec 2024 18:10:14 +0100 Subject: [PATCH] Korrektur flaeche zu nutzflaeche, Belastungsgrad --- .../A12NutzenergiebedarfHeizung.svelte | 270 ++++++++++++++++++ .../Tabellen/A9Trinkwassererwaermung.svelte | 26 +- .../BerechnungMonatlicherBelastungsgradT9.ts | 101 +++++++ .../BerechnungTrinkwarmwasser.ts | 10 +- .../funktionMonatlicherBelastungsgrad.ts | 34 --- .../BedarfsausweisWohnenModule.svelte | 10 + .../geg-2024/berechnungstabellen/index.astro | 231 +-------------- 7 files changed, 406 insertions(+), 276 deletions(-) create mode 100644 src/components/Tabellen/A12NutzenergiebedarfHeizung.svelte create mode 100644 src/lib/Berechnungen/BedarfsausweisWohnen/BerechnungMonatlicherBelastungsgradT9.ts delete mode 100644 src/lib/Berechnungen/BedarfsausweisWohnen/funktionMonatlicherBelastungsgrad.ts diff --git a/src/components/Tabellen/A12NutzenergiebedarfHeizung.svelte b/src/components/Tabellen/A12NutzenergiebedarfHeizung.svelte new file mode 100644 index 00000000..619ee702 --- /dev/null +++ b/src/components/Tabellen/A12NutzenergiebedarfHeizung.svelte @@ -0,0 +1,270 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Tabelle A.12 — Heizung – Berechnung des Nutzenergiebedarfs

+
+ Heizbedarf des Wohngebäudes +
min. Außen-
temperatur
θe,min [°C]
Innen-
temperatur
θi,h,soll [°C]
maximaler Wärmestrom
ges [W]
aus Tabelle A.6 (1)
-1220
Tage im Monat
dmth [d]
Bilanzinnen-
temperatur
θi,h [°C]
aus Tabelle 8 (EFH) bzw. 10 (MFH)
mittlere Außen-
temp.
θe,m [°C]
Mittlere Belastung
βe,m
aus Tabelle 9 bzw. 11 (2)
Ph,sink = Q̇ges · (θi,h - θe,min) / (θi,h,soll - θe,min) · βe,m [W] (3)Ph,source = Pi,ges
aus Tabelle A.11 (4)
γm = Ph,source / Ph,sink
(5) = (4) / (3)
ηm = f(γ) aus Tabelle 18
(6)
(7) = max[1 - (5) · (6);0]βm
(8) = (2) · (7)
th,m [h] (9)Qh,b [kWh] (10)
311,0 + {Math.round(interpolatedValuesZeitkonstante90[0].interpolatedValue*1000)/1000} +
281,9 + {Math.round(interpolatedValuesZeitkonstante90[1].interpolatedValue*1000)/1000} +
314,7 + {Math.round(interpolatedValuesZeitkonstante90[2].interpolatedValue*1000)/1000} +
309,2 + {Math.round(interpolatedValuesZeitkonstante90[3].interpolatedValue*1000)/1000} +
3114,1 + {Math.round(interpolatedValuesZeitkonstante90[4].interpolatedValue*1000)/1000} +
3016,7 + {Math.round(interpolatedValuesZeitkonstante90[5].interpolatedValue*1000)/1000} +
3119,0 + {Math.round(interpolatedValuesZeitkonstante90[6].interpolatedValue*1000)/1000} +
3118,6 + {Math.round(interpolatedValuesZeitkonstante90[7].interpolatedValue*1000)/1000} +
3014,3 + {Math.round(interpolatedValuesZeitkonstante90[8].interpolatedValue*1000)/1000} +
319,4 + {Math.round(interpolatedValuesZeitkonstante90[9].interpolatedValue*1000)/1000} +
304,1 + {Math.round(interpolatedValuesZeitkonstante90[10].interpolatedValue*1000)/1000} +
310,9 + {Math.round(interpolatedValuesZeitkonstante90[11].interpolatedValue*1000)/1000} +
Spalte 9:  (8) > 0,05 → (9) = dmth · 24     + (8) ≤ 0,05 → (9) = (8) / 0,05 · dmth · 24Summe
Spalte 10:  (10) = (3) · (7) · (9) / 1000
+
\ No newline at end of file diff --git a/src/components/Tabellen/A9Trinkwassererwaermung.svelte b/src/components/Tabellen/A9Trinkwassererwaermung.svelte index 17a2e90a..57696a0b 100644 --- a/src/components/Tabellen/A9Trinkwassererwaermung.svelte +++ b/src/components/Tabellen/A9Trinkwassererwaermung.svelte @@ -32,7 +32,7 @@ - + {flaechenBezogenerWaermebedarf} @@ -48,62 +48,62 @@ Januar 31 - {trinkwasserWaermebedarf / 365 * 31} + {Math.round(trinkwasserWaermebedarf / 365 * 31)} Februar 28 - {trinkwasserWaermebedarf / 365 * 28} + {Math.round(trinkwasserWaermebedarf / 365 * 28)} März 31 - {trinkwasserWaermebedarf / 365 * 31} + {Math.round(trinkwasserWaermebedarf / 365 * 31)} April 30 - {trinkwasserWaermebedarf / 365 * 30} + {Math.round(trinkwasserWaermebedarf / 365 * 30)} Mai 31 - {trinkwasserWaermebedarf / 365 * 31} + {Math.round(trinkwasserWaermebedarf / 365 * 31)} Juni 30 - {trinkwasserWaermebedarf / 365 * 30} + {Math.round(trinkwasserWaermebedarf / 365 * 30)} Juli 31 - {trinkwasserWaermebedarf / 365 * 31} + {Math.round(trinkwasserWaermebedarf / 365 * 31)} August 31 - {trinkwasserWaermebedarf / 365 * 31} + {Math.round(trinkwasserWaermebedarf / 365 * 31)} September 30 - {trinkwasserWaermebedarf / 365 * 30} + {Math.round(trinkwasserWaermebedarf / 365 * 30)} Oktober 31 - {trinkwasserWaermebedarf / 365 * 31} + {Math.round(trinkwasserWaermebedarf / 365 * 31)} November 30 - {trinkwasserWaermebedarf / 365 * 30} + {Math.round(trinkwasserWaermebedarf / 365 * 30)} Dezember 31 - {trinkwasserWaermebedarf / 365 * 31} + {Math.round(trinkwasserWaermebedarf / 365 * 31)} diff --git a/src/lib/Berechnungen/BedarfsausweisWohnen/BerechnungMonatlicherBelastungsgradT9.ts b/src/lib/Berechnungen/BedarfsausweisWohnen/BerechnungMonatlicherBelastungsgradT9.ts new file mode 100644 index 00000000..ad48a9e4 --- /dev/null +++ b/src/lib/Berechnungen/BedarfsausweisWohnen/BerechnungMonatlicherBelastungsgradT9.ts @@ -0,0 +1,101 @@ +import { BedarfsausweisWohnenClient, GebaeudeAufnahmeClient } from "#components/Ausweis/types.js"; + +/** +// Berechnung des monatlichen Belastungsgrades aus Tabelle 9 EFH (Zeitkonstante 90,130) + * @see 18599-Tabellenverfahren-Wohngebaeude.pdf + * @export + * @param {BedarfsausweisWohnenClient} ausweis + * @param {GebaeudeAufnahmeClient} gebaeude_aufnahme + */ + +export function BerechnungMonatlicherBelastungsgradT9(ausweis: BedarfsausweisWohnenClient, gebaeude_aufnahme: GebaeudeAufnahmeClient) { + + let bezugsflaeche = gebaeude_aufnahme.nutzflaeche ?? 0; + let heizlastGebaeude = 2000 / bezugsflaeche; + + //let heizlastGebaeude = 17.5 + +type MonthData = { + month: string; + values: number[]; +}; + +const datasetZeitkonstante90: MonthData[] = [ + { month: "Januar", values: [0.562, 0.559, 0.555, 0.548, 0.541, 0.538, 0.536, 0.535] }, + { month: "Februar", values: [0.536, 0.532, 0.529, 0.522, 0.515, 0.512, 0.510, 0.510] }, + { month: "März", values: [0.453, 0.450, 0.447, 0.441, 0.436, 0.433, 0.431, 0.431] }, + { month: "April", values: [0.320, 0.318, 0.316, 0.311, 0.307, 0.306, 0.305, 0.304] }, + { month: "Mai", values: [0.175, 0.173, 0.172, 0.170, 0.168, 0.167, 0.166, 0.166] }, + { month: "Juni", values: [0.098, 0.097, 0.096, 0.095, 0.094, 0.093, 0.093, 0.093] }, + { month: "Juli", values: [0.030, 0.029, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028] }, + { month: "August", values: [0.041, 0.041, 0.041, 0.040, 0.040, 0.040, 0.039, 0.039] }, + { month: "September", values: [0.169, 0.168, 0.167, 0.164, 0.162, 0.161, 0.161, 0.161] }, + { month: "Oktober", values: [0.311, 0.309, 0.307, 0.303, 0.299, 0.297, 0.296, 0.296] }, + { month: "November", values: [0.471, 0.467, 0.465, 0.459, 0.453, 0.450, 0.448, 0.448] }, + { month: "Dezember", values: [0.565, 0.562, 0.558, 0.551, 0.544, 0.540, 0.539, 0.538] } +]; + +const datasetZeitkonstante130: MonthData[] = [ + { month: "Januar", values: [0.567, 0.563, 0.560, 0.553, 0.545, 0.542, 0.540, 0.539, 0.539] }, + { month: "Februar", values: [0.540, 0.537, 0.533, 0.526, 0.520, 0.516, 0.515, 0.514, 0.513] }, + { month: "März", values: [0.457, 0.454, 0.451, 0.445, 0.439, 0.435, 0.435, 0.434, 0.434] }, + { month: "April", values: [0.322, 0.320, 0.318, 0.314, 0.310, 0.308, 0.307, 0.307, 0.306] }, + { month: "Mai", values: [0.176, 0.175, 0.174, 0.172, 0.169, 0.168, 0.168, 0.168, 0.167] }, + { month: "Juni", values: [0.098, 0.097, 0.096, 0.095, 0.094, 0.094, 0.094, 0.094, 0.094] }, + { month: "Juli", values: [0.030, 0.030, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028, 0.028] }, + { month: "August", values: [0.042, 0.041, 0.041, 0.040, 0.040, 0.040, 0.040, 0.040, 0.040] }, + { month: "September", values: [0.170, 0.169, 0.168, 0.166, 0.164, 0.163, 0.162, 0.162, 0.162] }, + { month: "Oktober", values: [0.313, 0.311, 0.309, 0.305, 0.301, 0.300, 0.299, 0.298, 0.298] }, + { month: "November", values: [0.474, 0.471, 0.469, 0.462, 0.456, 0.454, 0.453, 0.451, 0.451] }, + { month: "Dezember", values: [0.570, 0.566, 0.563, 0.555, 0.548, 0.545, 0.543, 0.542, 0.542] }, +]; + +// Für "Ohne Teilbeheizung" habe ich hier einfach 0 genommen. Prakmatisch würde ich sagen. +const HeizLastTabelle = [0, 5, 10, 25, 50, 75, 100, 125, 150]; + +/** + * Linearly interpolates a value for the given x. + * @param heizlastGebaeude The heating load value (e.g., 82). + * @param values The array of y-values corresponding to heating loads. + * @param loads The array of heating load values (x-axis). + * @returns The interpolated value. + */ +function interpolate(heizlastGebaeude: number, values: number[], loads: number[]): number { + if (heizlastGebaeude <= loads[0]) return values[0]; + if (heizlastGebaeude >= loads[loads.length - 1]) return values[values.length - 1]; + + for (let i = 0; i < loads.length - 1; i++) { + if (heizlastGebaeude >= loads[i] && heizlastGebaeude <= loads[i + 1]) { + const x1 = loads[i]; + const x2 = loads[i + 1]; + const y1 = values[i]; + const y2 = values[i + 1]; + + return y1 + ((heizlastGebaeude - x1) * (y2 - y1)) / (x2 - x1); + } + } + throw new Error("Interpolation error: Value is out of bounds."); +} + +// Example: Interpolate for Zeitkonstante zwischen 90-130 + +const interpolatedValuesZeitkonstante90 = datasetZeitkonstante90.map(data => ({ + month: data.month, + interpolatedValue: interpolate(heizlastGebaeude, data.values, HeizLastTabelle) +})); + +// Example: Interpolate for Zeitkonstante >= 130 + +// const interpolatedValuesZeitkonstante130 = datasetZeitkonstante130.map(data => ({ +// month: data.month, +// interpolatedValue: interpolate(heizlastGebaeude, data.values, HeizLast) +// })); + +// console.log(interpolatedValuesZeitkonstante90); +// console.log(interpolatedValuesZeitkonstante130); + +return { + interpolatedValuesZeitkonstante90 +} + +} \ No newline at end of file diff --git a/src/lib/Berechnungen/BedarfsausweisWohnen/BerechnungTrinkwarmwasser.ts b/src/lib/Berechnungen/BedarfsausweisWohnen/BerechnungTrinkwarmwasser.ts index ee600461..e007ded1 100644 --- a/src/lib/Berechnungen/BedarfsausweisWohnen/BerechnungTrinkwarmwasser.ts +++ b/src/lib/Berechnungen/BedarfsausweisWohnen/BerechnungTrinkwarmwasser.ts @@ -10,9 +10,10 @@ import { linearInterpolation } from "js-interpolate" * @param {BedarfsausweisWohnenClient} ausweis * @param {GebaeudeAufnahmeClient} gebaeude_aufnahme */ + export function berechnungTrinkwarmwasserWaermebedarf(ausweis: BedarfsausweisWohnenClient, gebaeude_aufnahme: GebaeudeAufnahmeClient) { // A_NGF - const bezugsflaeche = gebaeude_aufnahme.flaeche ?? 0; + const bezugsflaeche = gebaeude_aufnahme.nutzflaeche ?? 0; const einheiten = gebaeude_aufnahme.einheiten ?? 1; @@ -24,9 +25,7 @@ export function berechnungTrinkwarmwasserWaermebedarf(ausweis: BedarfsausweisWoh if (flaecheProEinheit < 10) { flaechenBezogenerWaermebedarf = 16.5 - } else if (flaecheProEinheit >= 160) { - flaechenBezogenerWaermebedarf = 8.5 - } else { + } else if (flaecheProEinheit < 160) { flaechenBezogenerWaermebedarf = linearInterpolation([{ x: 10, y: 16 @@ -34,6 +33,9 @@ export function berechnungTrinkwarmwasserWaermebedarf(ausweis: BedarfsausweisWoh x: 150, y: 9 }], flaecheProEinheit) + + } else { + flaechenBezogenerWaermebedarf = 8.5 } // Q_w,b diff --git a/src/lib/Berechnungen/BedarfsausweisWohnen/funktionMonatlicherBelastungsgrad.ts b/src/lib/Berechnungen/BedarfsausweisWohnen/funktionMonatlicherBelastungsgrad.ts deleted file mode 100644 index 986647d8..00000000 --- a/src/lib/Berechnungen/BedarfsausweisWohnen/funktionMonatlicherBelastungsgrad.ts +++ /dev/null @@ -1,34 +0,0 @@ - -// Funktion zur Berechnung des monatlichen Belastungsgrades aus Tabelle 17,8, (Januar, Zeitkonstante 90) - -function monatlicherBelastungsGradT90( - wertZwei: number, - wertEins: number, - maxHeizlast: number, - maxHeizlastEins: number, - maxHeizlastZwei: number -): number { - return ( - wertZwei - - ((wertZwei - wertEins) * (maxHeizlast - maxHeizlastEins)) / - (maxHeizlastZwei - maxHeizlastEins) - ); -} - -// Beispielwerte -const wertZwei = 0.541; -const wertEins = 0.548; -const maxHeizlast = 37.86; -const maxHeizlastEins = 25; -const maxHeizlastZwei = 50; - -// Berechnung -const monatlicherBelastungsgradT90 = monatlicherBelastungsGradT90( - wertZwei, - wertEins, - maxHeizlast, - maxHeizlastEins, - maxHeizlastZwei -); - -console.log("Monatlicher Belastungsgrad T90:", monatlicherBelastungsgradT90); \ No newline at end of file diff --git a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte index 8b9bc038..69081082 100644 --- a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte +++ b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte @@ -3,6 +3,7 @@ import Progressbar from "#components/Ausweis/Progressbar.svelte"; import Hilfe from "#components/Ausweis/Hilfe.svelte"; import Ausweisart from "#components/Ausweis/Ausweisart.svelte"; + import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte"; import Label from "#components/Label.svelte"; import HelpLabel from "#components/HelpLabel.svelte"; import ZipSearch from "#components/PlzSuche.svelte"; @@ -170,6 +171,15 @@ /> + + + + +
+ -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Tabelle A.12 — Heizung – Berechnung des Nutzenergiebedarfs

-
- Heizbedarf des Wohngebäudes -
min. Außen-
temperatur
θe,min [°C]
Innen-
temperatur
θi,h,soll [°C]
maximaler Wärmestrom
ges [W]
aus Tabelle A.6 (1)
-1220
Tage im Monat
dmth [d]
Bilanzinnen-
temperatur
θi,h [°C]
aus Tabelle 8 (EFH) bzw. 10 (MFH)
mittlere Außen-
temp.
θe,m [°C]
Mittlere Belastung
βe,m
aus Tabelle 9 bzw. 11 (2)
Ph,sink = Q̇ges · (θi,h - θe,min) / (θi,h,soll - θe,min) · βe,m [W] (3)Ph,source = Pi,ges
aus Tabelle A.11 (4)
γm = Ph,source / Ph,sink
(5) = (4) / (3)
ηm = f(γ) aus Tabelle 18
(6)
(7) = max[1 - (5) · (6);0]βm
(8) = (2) · (7)
th,m [h] (9)Qh,b [kWh] (10)
311,0
281,9
314,7
309,2
3114,1
3016,7
3119,0
3118,6
3014,3
319,4
304,1
310,9
Spalte 9:  (8) > 0,05 → (9) = dmth · 24     - (8) ≤ 0,05 → (9) = (8) / 0,05 · dmth · 24Summe
Spalte 10:  (10) = (3) · (7) · (9) / 1000
-
-