import { AufnahmeClient, ObjektClient, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js"; import { getKlimafaktoren } from "#lib/Klimafaktoren.js"; import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor.js"; import moment from "moment"; import bauwerkskatalog from "./bauwerkskatalog.json" assert { type: "json" } function vergleichsWertNichtWohngebaeude(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient) { let tekWerte = new Array(8).fill(0); if (aufnahme.gebaeudetyp && aufnahme.gebaeudetyp in bauwerkskatalog){ tekWerte = bauwerkskatalog[aufnahme.gebaeudetyp as keyof typeof bauwerkskatalog]; } if (!tekWerte) { return [0,0]; } let faktorWarmwasser = 1; if (ausweis.stromverbrauch_enthaelt_warmwasser) { faktorWarmwasser = 0.9; } let faktorHeizung = 0; if (aufnahme.nutzflaeche && aufnahme.nutzflaeche <= 500) { faktorHeizung = 1.46; } else if (aufnahme.nutzflaeche && aufnahme.nutzflaeche > 500 && aufnahme.nutzflaeche <= 50000) { faktorHeizung = 4.53 * (aufnahme.nutzflaeche ** -0.215) + 0.27; } else { faktorHeizung = 0.71; } let tekHeizung = tekWerte[0] * faktorHeizung; let tekWarmwasser = tekWerte[1] * faktorWarmwasser; let tekLueftung = ausweis.stromverbrauch_enthaelt_lueftung ? tekWerte[2] : 0; let tekEingebauteBeleuchtung = ausweis.stromverbrauch_enthaelt_beleuchtung ? tekWerte[3] : 0; let tekKaelte = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[4] : 0; let tekHilfsenergieKuehlung = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[5] : 0; let tekBeEntfeuchtung = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[6] : 0; // TODO: let tekAufzug = ausweis.nwaufzug ? 2 : 0; let tekAufzug = 0; let tekSonstiges = (ausweis.stromverbrauch_enthaelt_sonstige != null && ausweis.stromverbrauch_enthaelt_sonstige.length > 0) ? tekWerte[7] : 0; let vergleichsWertWaerme = tekHeizung + tekKaelte + tekBeEntfeuchtung; let vergleichsWertStrom = tekWarmwasser + tekLueftung + tekEingebauteBeleuchtung + tekHilfsenergieKuehlung + tekAufzug + tekSonstiges; return [vergleichsWertWaerme, vergleichsWertStrom]; } /** * Gibt einen array bestehend aus * [0]: Endenergieverbrauch * [1]: Primärenergiebedarf * zurück. * * @param Ausweis ausweis Ein Ausweis dessen Energiebedarf berechnet werden soll * @return VerbrauchsausweisGewerbeCalculationResult */ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient) { if (!aufnahme || !objekt || !ausweis) { return null; } const nutzflaeche = aufnahme.nutzflaeche || 0; let startdatum = moment(ausweis.startdatum); let klimafaktoren: Awaited> = [{ month: startdatum.month(), year: startdatum.year(), klimafaktor: 1 }, { month: startdatum.month(), year: startdatum.year() + 1, klimafaktor: 1 }, { month: startdatum.month(), year: startdatum.year() + 2, klimafaktor: 1 }]; try { const response = await getKlimafaktoren(ausweis.startdatum, objekt.plz) if (response) { klimafaktoren = response } } catch (e) { // TODO: Entweder setzen wir hier mit falschen Klimafaktoren fort, oder wir geben null zurück. // Im Moment setzen wir einfach fort, aber das ist nicht unbedingt die beste Lösung. // return null } // Endenergieverbrauch // Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden. let brennstoff_1 = { coe: 0, energietraeger: "", einheit: "", umrechnungsfaktor: 0, primaerenergiefaktor: 0 }, brennstoff_2 = { coe: 0, energietraeger: "", einheit: "", umrechnungsfaktor: 0, primaerenergiefaktor: 0 }; if (aufnahme.brennstoff_1 && ausweis.einheit_1) { brennstoff_1 = getHeizwertfaktor(aufnahme.brennstoff_1, ausweis.einheit_1); } if (aufnahme.brennstoff_2 && ausweis.einheit_2) { brennstoff_2 = getHeizwertfaktor(aufnahme.brennstoff_2, ausweis.einheit_2); } let energieVerbrauchGesamt_1 = ((ausweis.verbrauch_1 || 0) + (ausweis.verbrauch_2 || 0) + (ausweis.verbrauch_3 || 0)) * brennstoff_1?.umrechnungsfaktor; let energieVerbrauchGesamt_2 = ((ausweis.verbrauch_4 || 0) + (ausweis.verbrauch_5 || 0) + (ausweis.verbrauch_6 || 0)) * brennstoff_2?.umrechnungsfaktor; let energieVerbrauchWarmwasser_1 = 0; let energieVerbrauchWarmwasser_2 = 0; if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 != 0) { // Wenn Warmwasser enthalten und Anteil bekannt energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_warmwasser_1 || 0) / 100); energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100); } else if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 == 0){ if (aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre)" || aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre) & teilstationäre Versorgung" || aufnahme.gebaeudetyp == "Schwimmhallen") { energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * 0.5; energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100); } else { energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * 0.05; energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100); } } else { energieVerbrauchWarmwasser_1 = 0; energieVerbrauchWarmwasser_2 = 0; } let kuehlungsZuschlag_1: number = 0, kuehlungsZuschlag_2: number = 0; if (aufnahme.kuehlung) { kuehlungsZuschlag_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_kuehlung_1 || 0) / 100); kuehlungsZuschlag_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_kuehlung_2 || 0) / 100); } // Leerstand wird in Prozent angegeben, muss hier aber in eine Zahl zwischen 0 und 1 umgerechnet werden. let leerstand = (aufnahme.leerstand || 0) / 100; let energieVerbrauchHeizung_1 = energieVerbrauchGesamt_1 - energieVerbrauchWarmwasser_1 - kuehlungsZuschlag_1; let energieVerbrauchHeizung_2 = energieVerbrauchGesamt_2 - energieVerbrauchWarmwasser_2 - kuehlungsZuschlag_2; let durchschnittsKlimafaktor = klimafaktoren.reduce((acc, c) => acc + c.klimafaktor, 0) / klimafaktoren.length; let energieVerbrauchHeizungBereinigt_1 = energieVerbrauchHeizung_1 * durchschnittsKlimafaktor; let energieVerbrauchHeizungBereinigt_2 = energieVerbrauchHeizung_2 * durchschnittsKlimafaktor; let durchschnittsEnergieVerbrauchHeizungBereingt = (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchHeizungBereinigt_2) / (3 * nutzflaeche); let faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = -0.0028 * durchschnittsEnergieVerbrauchHeizungBereingt + 0.9147; if (faktorDurchschnittsEnergieVerbrauchHeizungBereinigt <= 0.25) { faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = 0.25; } else if (faktorDurchschnittsEnergieVerbrauchHeizungBereinigt >= 1.0) { faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = 1.0; } let leerstandsZuschlagHeizung = faktorDurchschnittsEnergieVerbrauchHeizungBereinigt * leerstand * (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchHeizungBereinigt_2); let leerstandsZuschlagWarmwasser = leerstand * (energieVerbrauchWarmwasser_1 + energieVerbrauchWarmwasser_2); let leerstandsZuschlagKuehlung = leerstand * (kuehlungsZuschlag_1 + kuehlungsZuschlag_2); let endEnergieVerbrauch_1 = (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchWarmwasser_1 + kuehlungsZuschlag_1) / (3 * nutzflaeche); let endEnergieVerbrauch_2 = (energieVerbrauchHeizungBereinigt_2 + energieVerbrauchWarmwasser_2 + kuehlungsZuschlag_2) / (3 * nutzflaeche); let energieVerbrauchStrom = (ausweis.strom_1 || 0) + (ausweis.strom_2 || 0) + (ausweis.strom_3 || 0); let leerstandsZuschlagStrom = leerstand * energieVerbrauchStrom; let endEnergieVerbrauchStrom = (energieVerbrauchStrom + leerstandsZuschlagStrom) / (3 * nutzflaeche); let primaerEnergieVerbrauchStrom = endEnergieVerbrauchStrom * 1.8; let co2EmissionenStrom = endEnergieVerbrauchStrom * 0.560; let endEnergieVerbrauchLeerstandsZuschlag = (leerstandsZuschlagHeizung + leerstandsZuschlagWarmwasser + leerstandsZuschlagKuehlung) / (3 * nutzflaeche); let endEnergieVerbrauchKuehlungsZuschlag_1 = kuehlungsZuschlag_1 / (3 * nutzflaeche); let endEnergieVerbrauchKuehlungsZuschlag_2 = kuehlungsZuschlag_2 / (3 * nutzflaeche); let primaerEnergieVerbrauch_1 = endEnergieVerbrauch_1 * brennstoff_1.primaerenergiefaktor; let primaerEnergieVerbrauch_2 = endEnergieVerbrauch_2 * brennstoff_2.primaerenergiefaktor; let primaerEnergieVerbrauchLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * brennstoff_1.primaerenergiefaktor; let primaerEnergieVerbrauchKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * brennstoff_1.primaerenergiefaktor; let primaerEnergieVerbrauchKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * brennstoff_2.primaerenergiefaktor; let co2Emissionen_1 = endEnergieVerbrauch_1 * brennstoff_1.coe; let co2Emissionen_2 = endEnergieVerbrauch_2 * brennstoff_2.coe; let co2EmissionenLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * brennstoff_1.coe; let co2EmissionenKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * brennstoff_1.coe; let co2EmissionenKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * brennstoff_2.coe; let endEnergieVerbrauchGesamt = endEnergieVerbrauch_1 + endEnergieVerbrauch_2 + endEnergieVerbrauchLeerstandsZuschlag; let primaerEnergieVerbrauchGesamt = primaerEnergieVerbrauch_1 + primaerEnergieVerbrauch_2 + primaerEnergieVerbrauchLeerstandsZuschlag + primaerEnergieVerbrauchStrom; let co2EmissionenGesamt = co2Emissionen_1 + co2Emissionen_2 + co2EmissionenLeerstandsZuschlag + co2EmissionenStrom; let [vergleichsWertWaerme, vergleichsWertStrom] = vergleichsWertNichtWohngebaeude(ausweis, aufnahme); // Return all the steps that this function includes for debugging as a json object return { brennstoff_1, brennstoff_2, kuehlungsZuschlag_1 : Math.round(kuehlungsZuschlag_1), kuehlungsZuschlag_2: Math.round(kuehlungsZuschlag_2), durchschnittsKlimafaktor : Math.round(durchschnittsKlimafaktor * 100) / 100, Klimafaktor_1 : klimafaktoren[0], Klimafaktor_2 : klimafaktoren[1], Klimafaktor_3 : klimafaktoren[2], anteil_heizung_1: 1 - ((ausweis.anteil_warmwasser_1 || 0) / 100), anteil_heizung_2: 1 - ((ausweis.anteil_warmwasser_2 || 0) / 100), verbrauch_1_kwh: (ausweis.verbrauch_1 || 0) * brennstoff_1.umrechnungsfaktor, verbrauch_2_kwh: (ausweis.verbrauch_2 || 0) * brennstoff_1.umrechnungsfaktor, verbrauch_3_kwh: (ausweis.verbrauch_3 || 0) * brennstoff_1.umrechnungsfaktor, verbrauch_4_kwh: (ausweis.verbrauch_4 || 0) * brennstoff_2.umrechnungsfaktor, verbrauch_5_kwh: (ausweis.verbrauch_5 || 0) * brennstoff_2.umrechnungsfaktor, verbrauch_6_kwh: (ausweis.verbrauch_6 || 0) * brennstoff_2.umrechnungsfaktor, klimafaktoren : klimafaktoren, nutzflaeche : Math.round(nutzflaeche), leerstand : leerstand, leerstandsZuschlagHeizung: Math.round(leerstandsZuschlagHeizung), leerstandsZuschlagWarmwasser: Math.round(leerstandsZuschlagWarmwasser), leerstandsZuschlagKuehlung: Math.round(leerstandsZuschlagKuehlung), endEnergieVerbrauchLeerstandsZuschlag: Math.round(endEnergieVerbrauchLeerstandsZuschlag), endEnergieVerbrauchKuehlungsZuschlag_1: Math.round(endEnergieVerbrauchKuehlungsZuschlag_1), endEnergieVerbrauchKuehlungsZuschlag_2: Math.round(endEnergieVerbrauchKuehlungsZuschlag_2), coeeffkg : co2EmissionenGesamt, energieVerbrauchGesamt_1: Math.round(energieVerbrauchGesamt_1), energieVerbrauchGesamt_2: Math.round(energieVerbrauchGesamt_2), energieVerbrauchWarmwasser_1: Math.round(energieVerbrauchWarmwasser_1), energieVerbrauchWarmwasser_2: Math.round(energieVerbrauchWarmwasser_2), energieVerbrauchHeizung_1: energieVerbrauchHeizung_1, energieVerbrauchHeizung_2: energieVerbrauchHeizung_2, anteil_warmwasser_1: (ausweis.anteil_warmwasser_1 || 0) / 100, anteil_warmwasser_2: (ausweis.anteil_warmwasser_2 || 0) / 100, energieVerbrauchHeizungBereinigt_1: Math.round(energieVerbrauchHeizungBereinigt_1), energieVerbrauchHeizungBereinigt_2: Math.round(energieVerbrauchHeizungBereinigt_2), durchschnittsEnergieVerbrauchHeizungBereingt: Math.round(durchschnittsEnergieVerbrauchHeizungBereingt), faktorDurchschnittsEnergieVerbrauchHeizungBereinigt: Math.round(faktorDurchschnittsEnergieVerbrauchHeizungBereinigt * 1000) / 1000, endEnergieVerbrauch_1: Math.round(endEnergieVerbrauch_1), endEnergieVerbrauch_2: Math.round(endEnergieVerbrauch_2), energieVerbrauchStrom: energieVerbrauchStrom, leerstandsZuschlagStrom: leerstandsZuschlagStrom, endEnergieVerbrauchStrom: Math.round(endEnergieVerbrauchStrom), primaerEnergieVerbrauchStrom: Math.round(primaerEnergieVerbrauchStrom), primaerEnergieVerbrauch_1: Math.round(primaerEnergieVerbrauch_1), primaerEnergieVerbrauch_2: Math.round(primaerEnergieVerbrauch_2), primaerEnergieVerbrauchLeerstandsZuschlag: Math.round(primaerEnergieVerbrauchLeerstandsZuschlag), primaerEnergieVerbrauchKuehlungsZuschlag_1: Math.round(primaerEnergieVerbrauchKuehlungsZuschlag_1), primaerEnergieVerbrauchKuehlungsZuschlag_2: Math.round(primaerEnergieVerbrauchKuehlungsZuschlag_2), co2Emissionen_1: co2Emissionen_1, co2Emissionen_2: co2Emissionen_2, co2EmissionenLeerstandsZuschlag: co2EmissionenLeerstandsZuschlag, co2EmissionenKuehlungsZuschlag_1: co2EmissionenKuehlungsZuschlag_1, co2EmissionenKuehlungsZuschlag_2: co2EmissionenKuehlungsZuschlag_2, co2EmissionenGesamt: Math.round(co2EmissionenGesamt), endEnergieVerbrauchGesamt: Math.round(endEnergieVerbrauchGesamt), primaerEnergieVerbrauchGesamt: Math.round(primaerEnergieVerbrauchGesamt), vergleichsWertWaerme: vergleichsWertWaerme, vergleichsWertStrom: vergleichsWertStrom, } }