Ausweis Verbrauchsausweis Gewerbe + Skala + Berechnung

This commit is contained in:
Moritz Utcke
2025-02-10 16:20:55 +07:00
parent 18ad4aa855
commit c7b1bc7958
14 changed files with 789 additions and 14 deletions

View File

@@ -0,0 +1,281 @@
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<ReturnType<typeof getKlimafaktoren>> = [{
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 umrechnungsfaktor = 1, primaerfaktor = 1, coe = 1;
let umrechnungsfaktor_1 = 1, primaerfaktor_1 = 1, coe_1 = 1;
if (ausweis.brennstoff_1 && ausweis.einheit_1) {
let result = getHeizwertfaktor(ausweis.brennstoff_1, ausweis.einheit_1);
umrechnungsfaktor = result.umrechnungsfaktor
primaerfaktor = result.primaerenergiefaktor
coe = result.coe
}
if (ausweis.brennstoff_2 && ausweis.einheit_2) {
let result = getHeizwertfaktor(ausweis.brennstoff_2, ausweis.einheit_2);
umrechnungsfaktor_1 = result.umrechnungsfaktor
primaerfaktor_1 = result.primaerenergiefaktor
coe_1 = result.coe
}
let energieVerbrauchGesamt_1 = ((ausweis.verbrauch_1 || 0) + (ausweis.verbrauch_2 || 0) + (ausweis.verbrauch_3 || 0)) * umrechnungsfaktor;
let energieVerbrauchGesamt_2 = ((ausweis.verbrauch_4 || 0) + (ausweis.verbrauch_5 || 0) + (ausweis.verbrauch_6 || 0)) * umrechnungsfaktor_1;
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;
let kuehlungsZuschlag_2: number;
if (ausweis.wird_gekuehlt) {
kuehlungsZuschlag_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_kuehlung_1 || 0) / 100);
kuehlungsZuschlag_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_kuehlung_2 || 0) / 100);
} else {
kuehlungsZuschlag_1 = kuehlungsZuschlag_2 = 0;
}
// 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 + ausweis.strom_2 + ausweis.strom_3;
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 * primaerfaktor;
let primaerEnergieVerbrauch_2 = endEnergieVerbrauch_2 * primaerfaktor_1;
let primaerEnergieVerbrauchLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * primaerfaktor;
let primaerEnergieVerbrauchKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * primaerfaktor;
let primaerEnergieVerbrauchKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * primaerfaktor_1;
let co2Emissionen_1 = endEnergieVerbrauch_1 * coe;
let co2Emissionen_2 = endEnergieVerbrauch_2 * coe_1;
let co2EmissionenLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * coe;
let co2EmissionenKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * coe;
let co2EmissionenKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * coe_1;
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 {
umrechnungsfaktor : umrechnungsfaktor,
primaerfaktor : primaerfaktor,
coe : coe,
umrechnungsfaktor_1 : umrechnungsfaktor_1,
primaerfaktor_1 : primaerfaktor_1,
coe_1 : coe_1,
kuehlungsZuschlag_1 : Math.round(kuehlungsZuschlag_1),
kuehlungsZuschlag_2: Math.round(kuehlungsZuschlag_2),
durchschnittsKlimafaktor : Math.round(durchschnittsKlimafaktor,2),
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 * umrechnungsfaktor,
verbrauch_2_kwh: ausweis.verbrauch_2 * umrechnungsfaktor,
verbrauch_3_kwh: ausweis.verbrauch_3 * umrechnungsfaktor,
verbrauch_4_kwh: ausweis.verbrauch_4 * umrechnungsfaktor_1,
verbrauch_5_kwh: ausweis.verbrauch_5 * umrechnungsfaktor_1,
verbrauch_6_kwh: ausweis.verbrauch_6 * umrechnungsfaktor_1,
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 / 100,
anteil_warmwasser_2: ausweis.anteil_warmwasser_2 / 100,
energieVerbrauchHeizungBereinigt_1: Math.round(energieVerbrauchHeizungBereinigt_1),
energieVerbrauchHeizungBereinigt_2: Math.round(energieVerbrauchHeizungBereinigt_2),
durchschnittsEnergieVerbrauchHeizungBereingt: Math.round(durchschnittsEnergieVerbrauchHeizungBereingt),
faktorDurchschnittsEnergieVerbrauchHeizungBereinigt: Math.round(faktorDurchschnittsEnergieVerbrauchHeizungBereinigt,3),
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,
}
}