Ausweis Verbrauchsausweis Gewerbe + Skala + Berechnung
This commit is contained in:
@@ -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,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user