Merge pull request #347 from IBCornelsen/main

getMain
This commit is contained in:
UMBENOMENA
2025-02-17 15:49:55 +01:00
committed by GitHub
62 changed files with 3397 additions and 579 deletions

View File

@@ -39,7 +39,7 @@ bun link @ibcornelsen/database
PERSISTENT_DIR="${HOME}/persistent/${APP_NAME}"; PERSISTENT_DIR="${HOME}/persistent/${APP_NAME}";
mkdir -p $PERSISTENT_DIR; mkdir -p $PERSISTENT_DIR;
# TODO: Wir legen hier die .env Datei an, die die SSL Zertifikate enthält. # Wir legen hier die .env Datei an, die die SSL Zertifikate enthält.
rm -f ~/$APP_NAME/.env; rm -f ~/$APP_NAME/.env;
touch ~/$APP_NAME/.env; touch ~/$APP_NAME/.env;
echo "PRIVATE_KEY=$(cat /etc/letsencrypt/live/ibcornelsen.de/privkey.pem | base64 | tr -d '\n')" >> ~/$APP_NAME/.env; echo "PRIVATE_KEY=$(cat /etc/letsencrypt/live/ibcornelsen.de/privkey.pem | base64 | tr -d '\n')" >> ~/$APP_NAME/.env;

View File

@@ -8,9 +8,9 @@ export const createCaller = createCallerFactory({
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
"auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"), "auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"),
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
"bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"),
"bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"), "bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"),
"objekt": await import("../src/pages/api/objekt/index.ts"), "objekt": await import("../src/pages/api/objekt/index.ts"),
"rechnung": await import("../src/pages/api/rechnung/index.ts"), "rechnung": await import("../src/pages/api/rechnung/index.ts"),
"ticket": await import("../src/pages/api/ticket/index.ts"), "ticket": await import("../src/pages/api/ticket/index.ts"),

View File

@@ -5,7 +5,7 @@
//import Label from "#components/Label.svelte"; //import Label from "#components/Label.svelte";
import { auditHeizungGebaeudeBaujahr } from "../Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js"; import { auditHeizungGebaeudeBaujahr } from "../Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js";
import { addNotification, deleteNotification } from "@ibcornelsen/ui"; import { addNotification, deleteNotification } from "#components/Notifications/shared.js";
import TagInput from "../TagInput.svelte"; import TagInput from "../TagInput.svelte";
import { Enums } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { import {

View File

@@ -86,22 +86,6 @@
} }
} }
$: {
console.log(month, year);
if ((availableDates.filter(date => date.month === month && date.year === year).length === 0) && typeof month === "number" && typeof year === "number") {
addNotification({
message: "Monat nicht verfügbar.",
subtext: "Der ausgewählte Monat ist in diesem Jahr nicht verfügbar, bitte wählen sie einen neuen Start Monat.",
dismissable: true,
type: "warning",
timeout: 0,
uid: "monat_nicht_verfuegbar",
selector: "select[name='energieverbrauch_zeitraum_monat']"
})
}
}
$: abweichung = auditVerbrauchAbweichung(ausweis, aufnahme); $: abweichung = auditVerbrauchAbweichung(ausweis, aufnahme);
</script> </script>

View File

@@ -11,7 +11,6 @@
ObjektClient, ObjektClient,
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "./types.js"; } from "./types.js";
import { addNotification } from "#components/Notifications/shared.js";
export let objekt: ObjektClient; export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient; export let aufnahme: AufnahmeClient;
@@ -20,6 +19,7 @@
// Wir dürfen bis zu 4.5 Jahre alte Klimafaktoren benutzen, also nehmen wir alle Monate seitdem und generieren daraus die Auswahl. // Wir dürfen bis zu 4.5 Jahre alte Klimafaktoren benutzen, also nehmen wir alle Monate seitdem und generieren daraus die Auswahl.
// Allerdings müssen wir auch berücksichtigen, dass wir drei folgende Jahre brauchen, also // Allerdings müssen wir auch berücksichtigen, dass wir drei folgende Jahre brauchen, also
// kann der Nutzer nur 36 + 18 Monate zurückgehen. // kann der Nutzer nur 36 + 18 Monate zurückgehen.
let availableDates: { let availableDates: {
year: number; year: number;
month: number; month: number;
@@ -62,8 +62,8 @@
fuelMap[fuel[0]].push(fuel[1]); fuelMap[fuel[0]].push(fuel[1]);
} }
let month = ausweis.startdatum?.getMonth(); let month = moment(ausweis.startdatum).month();
let year = ausweis.startdatum?.getFullYear(); let year = moment(ausweis.startdatum).year();
$: { $: {
if (typeof month === "number" && typeof year === "number") { if (typeof month === "number" && typeof year === "number") {
@@ -78,29 +78,6 @@
} }
} }
$: {
console.log(month, year);
if (
availableDates.filter(
(date) => date.month === month && date.year === year
).length === 0 &&
typeof month === "number" &&
typeof year === "number"
) {
addNotification({
message: "Monat nicht verfügbar.",
subtext:
"Der ausgewählte Monat ist in diesem Jahr nicht verfügbar, bitte wählen sie einen neuen Start Monat.",
dismissable: true,
type: "warning",
timeout: 0,
uid: "monat_nicht_verfuegbar",
selector: "select[name='energieverbrauch_zeitraum_monat']",
});
}
}
$: abweichung = auditVerbrauchAbweichung(ausweis, aufnahme); $: abweichung = auditVerbrauchAbweichung(ausweis, aufnahme);
</script> </script>

View File

@@ -2,27 +2,31 @@
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js"; import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import moment from "moment"; import moment from "moment";
import { import {
AufnahmeClient,
getAusweisartFromUUID,
ObjektClient,
UploadedGebaeudeBild,
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "./Ausweis/types.js"; } from "./Ausweis/types.js";
import AusweisPruefenTooltip from "./AusweisPruefenTooltip.svelte"; import AusweisPruefenTooltip from "./AusweisPruefenTooltip.svelte";
import { addNotification } from "./NotificationProvider/shared.js"; import { addNotification } from "./NotificationProvider/shared.js";
import { CheckCircled, CrossCircled, Image } from "radix-svelte-icons"; import { CheckCircled, CrossCircled, Image } from "radix-svelte-icons";
import ChevronDown from "radix-svelte-icons/src/lib/icons/ChevronDown.svelte"; import ChevronDown from "radix-svelte-icons/src/lib/icons/ChevronDown.svelte";
import { Event } from "@ibcornelsen/database/client";
export let ausweis: VerbrauchsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient;
export let aufnahme: AufnahmeClient;
export let objekt: ObjektClient;
export let bilder: UploadedGebaeudeBild[]
export let events: Event[]
export let calculations: Awaited< export let calculations: Awaited<
ReturnType<typeof endEnergieVerbrauchVerbrauchsausweis_2016> ReturnType<typeof endEnergieVerbrauchVerbrauchsausweis_2016>
>; >;
console.log(ausweis);
const aufnahme = ausweis.aufnahme
const ausweisArt = "VA"; // TODO: Das ist ein Platzhalter, hier muss die Ausweisart aus dem Ausweisobjekt kommen const ausweisArt = getAusweisartFromUUID(ausweis.uid) // TODO: Das ist ein Platzhalter, hier muss die Ausweisart aus dem Ausweisobjekt kommen
const images = ausweis.aufnahme.objekt.gebaeude_bilder;
let verbrauchWWGesamt_1 = ""; let verbrauchWWGesamt_1 = "";
let verbrauchWWGesamt_2 = ""; let verbrauchWWGesamt_2 = "";
@@ -145,13 +149,13 @@
) { ) {
if (aufnahme.solarsystem_warmwasser) { if (aufnahme.solarsystem_warmwasser) {
// Wenn Warmwasser enthalten und Anteil bekannt und Solarsystem // Wenn Warmwasser enthalten und Anteil bekannt und Solarsystem
verbrauchWWGesamt_1 = `${calculations?.energieVerbrauchGesamt_1} kWh x ${ausweis.anteil_warmwasser_1 / 100} x 0.6`; verbrauchWWGesamt_1 = `${calculations?.energieVerbrauchGesamt_1} kWh x ${(ausweis.anteil_warmwasser_1 || 0) / 100} x 0.6`;
verbrauchWWGesamt_2 = `${calculations?.energieVerbrauchGesamt_2} kWh x ${ausweis.anteil_warmwasser_2 / 100} x 0.6`; verbrauchWWGesamt_2 = `${calculations?.energieVerbrauchGesamt_2} kWh x ${(ausweis.anteil_warmwasser_2 || 0) / 100} x 0.6`;
solarsystemWarmwasser = "Solarsystem Warmwasser"; solarsystemWarmwasser = "Solarsystem Warmwasser";
} else { } else {
// Wenn Warmwasser enthalten und Anteil bekannt und **kein** Solarsystem // Wenn Warmwasser enthalten und Anteil bekannt und **kein** Solarsystem
verbrauchWWGesamt_1 = `${calculations?.energieVerbrauchGesamt_1} kWh x ${ausweis.anteil_warmwasser_1 / 100} x 0.6` verbrauchWWGesamt_1 = `${calculations?.energieVerbrauchGesamt_1} kWh x ${(ausweis.anteil_warmwasser_1 || 0) / 100} x 0.6`
verbrauchWWGesamt_2 = `${calculations?.energieVerbrauchGesamt_2} kWh x ${ausweis.anteil_warmwasser_2 / 100} x 0.6` verbrauchWWGesamt_2 = `${calculations?.energieVerbrauchGesamt_2} kWh x ${(ausweis.anteil_warmwasser_2 || 0) / 100} x 0.6`
solarsystemWarmwasser = "kein Solarsystem Warmwasser"; solarsystemWarmwasser = "kein Solarsystem Warmwasser";
} }
} else { } else {
@@ -674,13 +678,13 @@
<button class="btn btn-square" on:click={() => bilderModal.showModal()}><Image size={22}></Image></button> <button class="btn btn-square" on:click={() => bilderModal.showModal()}><Image size={22}></Image></button>
<dialog bind:this={bilderModal} class="modal"> <dialog bind:this={bilderModal} class="modal">
<div class="modal-box flex flex-row gap-4 items-center justify-center"> <div class="modal-box flex flex-row gap-4 items-center justify-center">
{#if images.length === 0} {#if bilder.length === 0}
<div class="flex flex-col gap-4 items-center justify-center"> <div class="flex flex-col gap-4 items-center justify-center">
<p>Für diesen Ausweis sind noch keine Bilder vorhanden.</p> <p>Für diesen Ausweis sind noch keine Bilder vorhanden.</p>
<button class="btn btn-primary" tabindex="0">Erinnerung Verschicken</button> <button class="btn btn-primary" tabindex="0">Erinnerung Verschicken</button>
</div> </div>
{:else} {:else}
{#each images as image} {#each bilder as image}
<div> <div>
<h2 class="text-lg mb-4 font-bold">{image.kategorie}</h2> <h2 class="text-lg mb-4 font-bold">{image.kategorie}</h2>
<img src="/bilder/{image.uid}.webp"> <img src="/bilder/{image.uid}.webp">
@@ -837,7 +841,7 @@
</div> </div>
<hr/> <hr/>
</li> </li>
{#each ausweis.aufnahme.events as event, i} {#each events as event, i}
<li> <li>
<hr /> <hr />
<div class="timeline-middle"> <div class="timeline-middle">

View File

@@ -1,3 +1,7 @@
<script lang="ts">
</script>
<div class="dropdown dropdown-hover dropdown-bottom"> <div class="dropdown dropdown-hover dropdown-bottom">
<div role="button" tabindex="0"> <div role="button" tabindex="0">
<slot></slot> <slot></slot>

View File

@@ -1,5 +1,7 @@
<script lang="ts"></script> <script lang="ts">
<div class="fixed right-8 bottom-8 max-w-[400px] flex flex-col gap-4 z-50"> </script>
<div class="fixed right-8 bottom-8 max-w-[400px] flex flex-col gap-4 z-50" {...$$restProps}>
<slot></slot> <slot></slot>
</div> </div>

View File

@@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import { A14BerechnungAufwandszahlenMittlereBelastung } from "#lib/Berechnungen/BedarfsausweisWohnen/A14BerechnungAufwandszahlenMittlereBelastung.js"; import { A14BerechnungAufwandszahlenMittlereBelastung } from "#lib/Berechnungen/BedarfsausweisWohnen/A14BerechnungAufwandszahlenMittlereBelastung.js";
import { funktionNennleistungWaermeerzeugerWarmwasserA14 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionNennleistungWaermeerzeugerWarmwasserA14.js"; import { funktionNennleistungWaermeerzeugerWarmwasserT139 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionNennleistungWaermeerzeugerWarmwasserT139.js";
import { SystemModule } from "@faker-js/faker"; import { SystemModule } from "@faker-js/faker";
$: result = A14BerechnungAufwandszahlenMittlereBelastung(); $: result = A14BerechnungAufwandszahlenMittlereBelastung();

View File

@@ -75,7 +75,7 @@
on:focusin={onFocusIn} on:focusin={onFocusIn}
on:focusout={onFocusOut} on:focusout={onFocusOut}
on:blur={() => { on:blur={() => {
if (tag.toString().length >= minlength && tag.toString().length < maxlength) { if (tag.toString().length >= minlength && tag.toString().length <= maxlength) {
addTag(tag) addTag(tag)
tag = "" tag = ""
} }

View File

@@ -1,15 +1,24 @@
import { ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import {
ObjektClient,
VerbrauchsausweisWohnenClient,
} from "#components/Ausweis/types.js";
import { AuditType, hidden } from "./hidden.js"; import { AuditType, hidden } from "./hidden.js";
import { getKlimafaktoren } from "#lib/Klimafaktoren.js"; import { getKlimafaktoren } from "#lib/Klimafaktoren.js";
export async function auditKlimaFaktoren(ausweis: VerbrauchsausweisWohnenClient, gebaeude: ObjektClient): Promise<boolean> { export async function auditKlimaFaktoren(
ausweis: VerbrauchsausweisWohnenClient,
gebaeude: ObjektClient
): Promise<boolean> {
if (hidden.has(AuditType.KLIMA_FAKTOREN)) { if (hidden.has(AuditType.KLIMA_FAKTOREN)) {
return false; return false;
} }
if (ausweis.startdatum && gebaeude.plz && ausweis.verbrauch_1) { if (ausweis.startdatum && gebaeude.plz && ausweis.verbrauch_1) {
try { try {
const response = await getKlimafaktoren(ausweis.startdatum, gebaeude.plz); const response = await getKlimafaktoren(
ausweis.startdatum,
gebaeude.plz
);
return true; // Alle Klimfaktoren konnten abgefragt werden. return true; // Alle Klimfaktoren konnten abgefragt werden.
} catch (e) { } catch (e) {
return true; return true;

View File

@@ -2,7 +2,7 @@ import { AufnahmeClient } from "#components/Ausweis/types.js";
import { AuditType, hidden } from "./hidden.js"; import { AuditType, hidden } from "./hidden.js";
export function auditLeerStand(gebaeude: AufnahmeClient): boolean { export function auditLeerStand(gebaeude: AufnahmeClient): boolean {
if (gebaeude.leerstand && !hidden.has(AuditType.LEER_STAND)) { if (gebaeude.leerstand) {
return ( return (
(gebaeude.leerstand > 30) (gebaeude.leerstand > 30)
); );

View File

@@ -1,7 +1,7 @@
import { AufnahmeClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { AufnahmeClient, ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { AuditType, hidden } from "./hidden.js"; import { AuditType, hidden } from "./hidden.js";
export function auditVerbrauchAbweichung(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient): number[] { export function auditVerbrauchAbweichung(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient): number[] {
if (aufnahme.leerstand && (aufnahme.leerstand > 0)) { if (aufnahme.leerstand && (aufnahme.leerstand > 0)) {
return []; return [];
} }

View File

@@ -16,21 +16,25 @@ const { title } = Astro.props;
<script> <script>
window.addEventListener("scroll", (event) => { window.addEventListener("scroll", (event) => {
let scroll = window.scrollY; let scroll = window.scrollY;
const skala = document.getElementById("skala")
console.log(scroll);
if(scroll>=400){ if(scroll>=400){
if (skala) {
document.getElementById('skala')?.classList.add('2xl:fixed','2xl:py-4','2xl:top-0','2xl:z-20'); skala.classList.add('2xl:fixed','2xl:py-4','2xl:top-0','2xl:z-20');
document.getElementById('skala')?.classList.remove('w-full'); skala.classList.remove('w-full');
skala.style.borderBottom = "3px solid #e6e6e6";
}
document.getElementById('skala').style.borderBottom = "3px solid #e6e6e6"; const performanceBox = document.getElementById('performance-box')
if (performanceBox) {
performanceBox.style.maxWidth = "688.5px";
}
const progressBox = document.getElementById('progress-box');
if (progressBox) {
document.getElementById('performance-box').style.maxWidth = "688.5px"; progressBox.style.maxWidth = "688.5px"
document.getElementById('progress-box').style.maxWidth = "688.5px"; }
document.getElementById('formInput-1')?.classList.add('2xl:mt-[370px]'); document.getElementById('formInput-1')?.classList.add('2xl:mt-[370px]');
@@ -38,11 +42,12 @@ console.log(scroll);
}else{ }else{
if (skala) {
skala.classList.remove('2xl:fixed','2xl:py-4','2xl:top-0','2xl:z-20')
skala.classList.add('w-full')
skala.style.borderBottom = "none";
}
document.getElementById('skala')?.classList.remove('2xl:fixed','2xl:py-4','2xl:top-0','2xl:z-20');
document.getElementById('skala')?.classList.add('w-full');
document.getElementById('skala').style.borderBottom = "none";
document.getElementById('formInput-1')?.classList.remove('2xl:mt-[370px]'); document.getElementById('formInput-1')?.classList.remove('2xl:mt-[370px]');

View File

@@ -15,20 +15,12 @@ if (!valid) {
Astro.redirect("/auth/login", 302) Astro.redirect("/auth/login", 302)
} }
const caller = createCaller(Astro)
const benutzer = (await caller.user.self.GET.fetch(undefined, {
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
})) || {} as BenutzerClient;
export interface Props { export interface Props {
title: string; title: string;
user: BenutzerClient
} }
const { title } = Astro.props; const { title, user } = Astro.props;
const schema = JSON.stringify({ const schema = JSON.stringify({
"@context": "http://schema.org", "@context": "http://schema.org",
@@ -107,7 +99,7 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
</head> </head>
<body class="min-h-screen grid md:grid-cols-[300px_1fr]"> <body class="min-h-screen grid md:grid-cols-[300px_1fr]">
<DashboardSidebar lightTheme={lightTheme} {benutzer} client:load></DashboardSidebar> <DashboardSidebar lightTheme={lightTheme} benutzer={user} client:load></DashboardSidebar>
<main class="p-4 md:p-8 overflow-auto h-screen bg-base-100 pt-20 md:!pt-24"> <main class="p-4 md:p-8 overflow-auto h-screen bg-base-100 pt-20 md:!pt-24">
<slot /> <slot />
</main> </main>

View File

@@ -3,7 +3,7 @@ import { A9BerechnungNutzenergiebedarfTrinkwarmwasser } from "#lib/Berechnungen/
import { A12BerechnungNutzenergiebedarfHeizung } from "#lib/Berechnungen/BedarfsausweisWohnen/A12BerechnungNutzenergiebedarfHeizung.js"; import { A12BerechnungNutzenergiebedarfHeizung } from "#lib/Berechnungen/BedarfsausweisWohnen/A12BerechnungNutzenergiebedarfHeizung.js";
import { A13BerechnungRechnerischeLaufzeitHeizung } from "#lib/Berechnungen/BedarfsausweisWohnen/A13BerechnungRechnerischeLaufzeitHeizung.js"; import { A13BerechnungRechnerischeLaufzeitHeizung } from "#lib/Berechnungen/BedarfsausweisWohnen/A13BerechnungRechnerischeLaufzeitHeizung.js";
import { funktionKorrekturfaktorMittlereBelastungT32 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionKorrekturfaktorMittlereBelastungT32.js"; import { funktionKorrekturfaktorMittlereBelastungT32 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionKorrekturfaktorMittlereBelastungT32.js";
import { funktionNennleistungWaermeerzeugerWarmwasserA14 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionNennleistungWaermeerzeugerWarmwasserA14.js"; import { funktionNennleistungWaermeerzeugerWarmwasserT139 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionNennleistungWaermeerzeugerWarmwasserT139.js";
import { funktionAufwandszahlErzeugungHeizungT77 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionAufwandszahlErzeugungHeizungT77.js"; import { funktionAufwandszahlErzeugungHeizungT77 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionAufwandszahlErzeugungHeizungT77.js";
@@ -97,8 +97,8 @@ export function A14BerechnungAufwandszahlenMittlereBelastung() {
} }
]; ];
const resultfunktionNennleistungWaermeerzeugerWarmwasserA14 = funktionNennleistungWaermeerzeugerWarmwasserA14(NettoGrundflaeche, flaechenBezogenerWaermebedarf); const resultfunktionNennleistungWaermeerzeugerWarmwasserT139 = funktionNennleistungWaermeerzeugerWarmwasserT139(NettoGrundflaeche, flaechenBezogenerWaermebedarf);
const NennleistungWaermeerzeugerWarmwasser = resultfunktionNennleistungWaermeerzeugerWarmwasserA14; const NennleistungWaermeerzeugerWarmwasser = resultfunktionNennleistungWaermeerzeugerWarmwasserT139;
if (anlass === "Neubau") { if (anlass === "Neubau") {

View File

@@ -0,0 +1,434 @@
export const datasetGesamtluftWechselKorrekturfaktorT12T13 = [
{
"LuftDichtheit": "Kategorie I - mit geplanter Dichtheitsprüfung",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 2.00,
"LueftungsAnlage": "Ohne mech. Lüftung",
"LueftungBedarfsgefuehrt": "-",
"ηt": 0,
"nnutz": 0,
"nAnl": 0,
"n0": 0.6,
"fwin1": 0.766
},
{
"LuftDichtheit": "Kategorie II - neues Gebäude",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 4.00,
"LueftungsAnlage": "Ohne mech. Lüftung",
"LueftungBedarfsgefuehrt": "-",
"ηt": 0,
"nnutz": 0,
"nAnl": 0,
"n0": 0.7,
"fwin1": 0.598
},
{
"LuftDichtheit": "Kategorie III - Gebäudebestand",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 6.00,
"LueftungsAnlage": "Ohne mech. Lüftung",
"LueftungBedarfsgefuehrt": "-",
"ηt": 0,
"nnutz": 0,
"nAnl": 0,
"n0": 0.79,
"fwin1": 0.471
},
{
"LuftDichtheit": "Kategorie VI - mit offensichtlichen Undichtheiten",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 11.00,
"LueftungsAnlage": "Ohne mech. Lüftung",
"LueftungBedarfsgefuehrt": "-",
"ηt": 0,
"nnutz": 0,
"nAnl": 0,
"n0": 0.99,
"fwin1": 0.293
},
{
"LuftDichtheit": "Kategorie I - mit geplanter Dichtheitsprüfung",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 2.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.52,
"fwin1": 0.192
},
{
"LuftDichtheit": "Kategorie II - neues Gebäude",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 4.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.73,
"fwin1": 0.137
},
{
"LuftDichtheit": "Kategorie III - Gebäudebestand",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 6.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.87,
"fwin1": 0.115
},
{
"LuftDichtheit": "Kategorie VI - mit offensichtlichen Undichtheiten",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 11.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 1.15,
"fwin1": 0.087
},
{
"LuftDichtheit": "Kategorie I - mit geplanter Dichtheitsprüfung",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 2.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0.6,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.31,
"fwin1": 0.323
},
{
"LuftDichtheit": "Kategorie II - neues Gebäude",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 4.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0.6,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.52,
"fwin1": 0.192
},
{
"LuftDichtheit": "Kategorie III - Gebäudebestand",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 6.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0.6,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.66,
"fwin1": 0.152
},
{
"LuftDichtheit": "Kategorie VI - mit offensichtlichen Undichtheiten",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 11.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0.6,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.94,
"fwin1": 0.106
},
{
"LuftDichtheit": "Kategorie I - mit geplanter Dichtheitsprüfung",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 2.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0.8,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.24,
"fwin1": 0.417
},
{
"LuftDichtheit": "Kategorie II - neues Gebäude",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 4.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0.8,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.45,
"fwin1": 0.222
},
{
"LuftDichtheit": "Kategorie III - Gebäudebestand",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 6.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0.8,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.59,
"fwin1": 0.169
},
{
"LuftDichtheit": "Kategorie VI - mit offensichtlichen Undichtheiten",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 11.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0.8,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.87,
"fwin1": 0.115
},
{
"LuftDichtheit": "Kategorie I - mit geplanter Dichtheitsprüfung",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 2.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.57,
"fwin1": 0.175
},
{
"LuftDichtheit": "Kategorie II - neues Gebäude",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 4.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.78,
"fwin1": 0.128
},
{
"LuftDichtheit": "Kategorie III - Gebäudebestand",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 6.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.92,
"fwin1": 0.109
},
{
"LuftDichtheit": "Kategorie VI - mit offensichtlichen Undichtheiten",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 11.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 1.20,
"fwin1": 0.083
},
{
"LuftDichtheit": "Kategorie I - mit geplanter Dichtheitsprüfung",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 2.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0.6,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.33,
"fwin1": 0.303
},
{
"LuftDichtheit": "Kategorie II - neues Gebäude",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 4.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0.6,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.54,
"fwin1": 0.185
},
{
"LuftDichtheit": "Kategorie III - Gebäudebestand",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 6.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0.6,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.68,
"fwin1": 0.147
},
{
"LuftDichtheit": "Kategorie VI - mit offensichtlichen Undichtheiten",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 11.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0.6,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.96,
"fwin1": 0.104
},
{
"LuftDichtheit": "Kategorie I - mit geplanter Dichtheitsprüfung",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 2.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0.8,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.25,
"fwin1": 0.400
},
{
"LuftDichtheit": "Kategorie II - neues Gebäude",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 4.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0.8,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.46,
"fwin1": 0.217
},
{
"LuftDichtheit": "Kategorie III - Gebäudebestand",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 6.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0.8,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.60,
"fwin1": 0.167
},
{
"LuftDichtheit": "Kategorie VI - mit offensichtlichen Undichtheiten",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 11.00,
"LueftungsAnlage": "Zu-/Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0.8,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.88,
"fwin1": 0.114
},
{
"LuftDichtheit": "Kategorie I - mit geplanter Dichtheitsprüfung",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 2.00,
"LueftungsAnlage": "Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.48,
"fwin1": 0.210
},
{
"LuftDichtheit": "Kategorie II - neues Gebäude",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 4.00,
"LueftungsAnlage": "Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.60,
"fwin1": 0.165
},
{
"LuftDichtheit": "Kategorie III - Gebäudebestand",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 6.00,
"LueftungsAnlage": "Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.72,
"fwin1": 0.139
},
{
"LuftDichtheit": "Kategorie VI - mit offensichtlichen Undichtheiten",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 11.00,
"LueftungsAnlage": "Abluftanlage",
"LueftungBedarfsgefuehrt": "bedarfsgeführt",
"ηt": 0,
"nnutz": 0.45,
"nAnl": 0.35,
"n0": 0.95,
"fwin1": 0.105
},
{
"LuftDichtheit": "Kategorie I - mit geplanter Dichtheitsprüfung",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 2.00,
"LueftungsAnlage": "Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.52,
"fwin1": 0.193
},
{
"LuftDichtheit": "Kategorie II - neues Gebäude",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 4.00,
"LueftungsAnlage": "Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.63,
"fwin1": 0.160
},
{
"LuftDichtheit": "Kategorie III - Gebäudebestand",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 6.00,
"LueftungsAnlage": "Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.73,
"fwin1": 0.137
},
{
"LuftDichtheit": "Kategorie VI - mit offensichtlichen Undichtheiten",
"LueftungsArt": "Fenster und Infiltration",
"Luftwechsel_50Pa": 11.00,
"LueftungsAnlage": "Abluftanlage",
"LueftungBedarfsgefuehrt": "nicht bedarfsgeführt",
"ηt": 0,
"nnutz": 0.50,
"nAnl": 0.40,
"n0": 0.95,
"fwin1": 0.106
}
]

View File

@@ -0,0 +1,69 @@
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
export function funktionAufwandszahlEndenergieKraftWaermeKopplungBrennwertbezogenT105(BrennStoff: string, suchSpalte: number, datenZeile: number) {
let dataBox: any[] = [];
if (suchSpalte < 0.1) { suchSpalte = 0.1; }
if (suchSpalte > 1) { suchSpalte = 1; }
if (datenZeile < 0.1) { datenZeile = 0.1; }
if (datenZeile > 1) { datenZeile = 1; }
if (BrennStoff === "Erdgas") {
dataBox = [
{ SuchSpalte: [0.10], DatenSpalte: [0.136, 0.148, 0.16, 0.173, 0.185, 0.197, 0.21, 0.222, 0.234, 0.247] },
{ SuchSpalte: [0.15], DatenSpalte: [0.204, 0.222, 0.241, 0.259, 0.278, 0.296, 0.315, 0.333, 0.352, 0.37] },
{ SuchSpalte: [0.2], DatenSpalte: [0.271, 0.296, 0.321, 0.345, 0.37, 0.395, 0.419, 0.444, 0.469, 0.493] },
{ SuchSpalte: [0.25], DatenSpalte: [0.339, 0.37, 0.401, 0.432, 0.463, 0.493, 0.524, 0.555, 0.586, 0.617] },
{ SuchSpalte: [0.3], DatenSpalte: [0.407, 0.444, 0.481, 0.518, 0.555, 0.592, 0.629, 0.666, 0.703, 0.74] },
{ SuchSpalte: [0.35], DatenSpalte: [0.475, 0.518, 0.561, 0.604, 0.648, 0.691, 0.734, 0.777, 0.82, 0.863] },
{ SuchSpalte: [0.4], DatenSpalte: [0.543, 0.592, 0.641, 0.691, 0.74, 0.789, 0.839, 0.888, 0.937, 0.987] },
{ SuchSpalte: [0.45], DatenSpalte: [0.611, 0.666, 0.722, 0.777, 0.833, 0.888, 0.944, 0.999, 1.055, 1.11] },
{ SuchSpalte: [0.5], DatenSpalte: [0.678, 0.74, 0.802, 0.863, 0.925, 0.987, 1.048, 1.11, 1.172, 1.233] },
{ SuchSpalte: [0.55], DatenSpalte: [0.746, 0.814, 0.882, 0.95, 1.018, 1.085, 1.153, 1.221, 1.289, 1.357] },
{ SuchSpalte: [0.6], DatenSpalte: [0.814, 0.888, 0.962, 1.036, 1.11, 1.184, 1.258, 1.332, 1.406, 1.48] },
{ SuchSpalte: [0.65], DatenSpalte: [0.882, 0.962, 1.042, 1.122, 1.203, 1.283, 1.363, 1.443, 1.523, 1.603] },
{ SuchSpalte: [0.7], DatenSpalte: [0.95, 1.036, 1.122, 1.209, 1.295, 1.381, 1.468, 1.554, 1.64, 1.727] },
{ SuchSpalte: [0.75], DatenSpalte: [1.018, 1.11, 1.203, 1.295, 1.388, 1.48, 1.573, 1.665, 1.758, 1.85] },
{ SuchSpalte: [0.8], DatenSpalte: [1.085, 1.184, 1.283, 1.381, 1.48, 1.579, 1.677, 1.776, 1.875, 1.973] },
{ SuchSpalte: [0.85], DatenSpalte: [1.153, 1.258, 1.363, 1.468, 1.573, 1.677, 1.782, 1.887, 1.992, 2.097] },
{ SuchSpalte: [0.9], DatenSpalte: [1.221, 1.332, 1.443, 1.554, 1.665, 1.776, 1.887, 1.998, 2.109, 2.22] },
{ SuchSpalte: [0.95], DatenSpalte: [1.289, 1.406, 1.523, 1.64, 1.758, 1.875, 1.992, 2.109, 2.226, 2.343] },
{ SuchSpalte: [1], DatenSpalte: [1.357, 1.48, 1.603, 1.727, 1.85, 1.973, 2.097, 2.22, 2.343, 2.467] }
];
}
else if (BrennStoff === "Heizoel") {
dataBox = [
{ SuchSpalte: [0.10], DatenSpalte: [0.13, 0.141, 0.153, 0.165, 0.177, 0.188, 0.2, 0.212, 0.224, 0.236] },
{ SuchSpalte: [0.15], DatenSpalte: [0.194, 0.212, 0.23, 0.247, 0.265, 0.283, 0.3, 0.318, 0.336, 0.353] },
{ SuchSpalte: [0.2], DatenSpalte: [0.259, 0.283, 0.306, 0.33, 0.353, 0.377, 0.4, 0.424, 0.448, 0.471] },
{ SuchSpalte: [0.25], DatenSpalte: [0.324, 0.353, 0.383, 0.412, 0.442, 0.471, 0.501, 0.53, 0.559, 0.589] },
{ SuchSpalte: [0.3], DatenSpalte: [0.389, 0.424, 0.459, 0.495, 0.53, 0.565, 0.601, 0.636, 0.671, 0.707] },
{ SuchSpalte: [0.35], DatenSpalte: [0.453, 0.495, 0.536, 0.577, 0.618, 0.66, 0.701, 0.742, 0.783, 0.824] },
{ SuchSpalte: [0.4], DatenSpalte: [0.518, 0.565, 0.612, 0.66, 0.707, 0.754, 0.801, 0.848, 0.895, 0.942] },
{ SuchSpalte: [0.45], DatenSpalte: [0.583, 0.636, 0.689, 0.742, 0.795, 0.848, 0.901, 0.954, 1.007, 1.06] },
{ SuchSpalte: [0.5], DatenSpalte: [0.648, 0.707, 0.766, 0.824, 0.883, 0.942, 1.001, 1.06, 1.119, 1.178] },
{ SuchSpalte: [0.55], DatenSpalte: [0.713, 0.777, 0.842, 0.907, 0.972, 1.036, 1.101, 1.166, 1.231, 1.296] },
{ SuchSpalte: [0.6], DatenSpalte: [0.777, 0.848, 0.919, 0.989, 1.06, 1.131, 1.201, 1.272, 1.343, 1.413] },
{ SuchSpalte: [0.65], DatenSpalte: [0.842, 0.919, 0.995, 1.072, 1.148, 1.225, 1.301, 1.378, 1.455, 1.531] },
{ SuchSpalte: [0.7], DatenSpalte: [0.907, 0.989, 1.072, 1.154, 1.237, 1.319, 1.402, 1.484, 1.566, 1.649] },
{ SuchSpalte: [0.75], DatenSpalte: [0.972, 1.06, 1.148, 1.237, 1.325, 1.413, 1.502, 1.59, 1.678, 1.767] },
{ SuchSpalte: [0.8], DatenSpalte: [1.036, 1.131, 1.225, 1.319, 1.413, 1.508, 1.602, 1.696, 1.79, 1.884] },
{ SuchSpalte: [0.85], DatenSpalte: [1.101, 1.201, 1.301, 1.402, 1.502, 1.602, 1.702, 1.802, 1.902, 2.002] },
{ SuchSpalte: [0.9], DatenSpalte: [1.166, 1.272, 1.378, 1.484, 1.59, 1.696, 1.802, 1.908, 2.014, 2.12] },
{ SuchSpalte: [0.95], DatenSpalte: [1.231, 1.343, 1.455, 1.566, 1.678, 1.79, 1.902, 2.014, 2.126, 2.238] },
{ SuchSpalte: [1], DatenSpalte: [1.296, 1.413, 1.531, 1.649, 1.767, 1.884, 2.002, 2.12, 2.238, 2.356] }
];
}
const dataZeile = [ { DatenZeile: [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1] } ];
const AufwandszahlEndenergieKraftWaermeKopplungBrennwertbezogen = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
return AufwandszahlEndenergieKraftWaermeKopplungBrennwertbezogen;
}

View File

@@ -0,0 +1,66 @@
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
export function funktionAufwandszahlEndenergieWaermeErzeugerBrennwertbezogenT106(BrennStoff: string, suchSpalte: number, datenZeile: number) {
let dataBox: any[] = [];
if (suchSpalte < 0.1) { suchSpalte = 0.1; }
if (suchSpalte > 1) { suchSpalte = 1; }
if (datenZeile < 1.05) { datenZeile = 1.05; }
if (datenZeile > 1.2) { datenZeile = 1.2; }
if (BrennStoff = "Erdgas") {
const dataBox = [
{ SuchSpalte: [0.10], DatenSpalte: [1.049, 1.099, 1.149, 1.199] },
{ SuchSpalte: [0.15], DatenSpalte: [0.991, 1.038, 1.085, 1.132] },
{ SuchSpalte: [0.2], DatenSpalte: [0.932, 0.977, 1.021, 1.066] },
{ SuchSpalte: [0.25], DatenSpalte: [0.874, 0.916, 0.957, 0.999] },
{ SuchSpalte: [0.3], DatenSpalte: [0.816, 0.855, 0.894, 0.932] },
{ SuchSpalte: [0.35], DatenSpalte: [0.758, 0.794, 0.83, 0.866] },
{ SuchSpalte: [0.4], DatenSpalte: [0.699, 0.733, 0.766, 0.799] },
{ SuchSpalte: [0.45], DatenSpalte: [0.641, 0.672, 0.702, 0.733] },
{ SuchSpalte: [0.5], DatenSpalte: [0.583, 0.611, 0.638, 0.666] },
{ SuchSpalte: [0.55], DatenSpalte: [0.524, 0.549, 0.574, 0.599] },
{ SuchSpalte: [0.6], DatenSpalte: [0.466, 0.488, 0.511, 0.533] },
{ SuchSpalte: [0.65], DatenSpalte: [0.408, 0.427, 0.447, 0.466] },
{ SuchSpalte: [0.7], DatenSpalte: [0.35, 0.366, 0.383, 0.4] },
{ SuchSpalte: [0.75], DatenSpalte: [0.291, 0.305, 0.319, 0.333] },
{ SuchSpalte: [0.8], DatenSpalte: [0.233, 0.244, 0.255, 0.266] },
{ SuchSpalte: [0.85], DatenSpalte: [0.175, 0.183, 0.191, 0.2] },
{ SuchSpalte: [0.9], DatenSpalte: [0.117, 0.122, 0.128, 0.133] },
{ SuchSpalte: [0.95], DatenSpalte: [0.058, 0.061, 0.064, 0.067] },
{ SuchSpalte: [1], DatenSpalte: [0, 0, 0, 0] }
];
}
else if (BrennStoff = "Heizoel") {
const dataBox = [
{ SuchSpalte: [0.10], DatenSpalte: [1.002, 1.049, 1.097, 1.145] },
{ SuchSpalte: [0.15], DatenSpalte: [0.946, 0.991, 1.036, 1.081] },
{ SuchSpalte: [0.2], DatenSpalte: [0.89, 0.933, 0.975, 1.018] },
{ SuchSpalte: [0.25], DatenSpalte: [0.835, 0.875, 0.914, 0.954] },
{ SuchSpalte: [0.3], DatenSpalte: [0.779, 0.816, 0.853, 0.89] },
{ SuchSpalte: [0.35], DatenSpalte: [0.723, 0.758, 0.792, 0.827] },
{ SuchSpalte: [0.4], DatenSpalte: [0.668, 0.7, 0.731, 0.763] },
{ SuchSpalte: [0.45], DatenSpalte: [0.612, 0.641, 0.67, 0.7] },
{ SuchSpalte: [0.5], DatenSpalte: [0.557, 0.583, 0.61, 0.636] },
{ SuchSpalte: [0.55], DatenSpalte: [0.501, 0.525, 0.549, 0.572] },
{ SuchSpalte: [0.6], DatenSpalte: [0.445, 0.466, 0.488, 0.509] },
{ SuchSpalte: [0.65], DatenSpalte: [0.39, 0.408, 0.427, 0.445] },
{ SuchSpalte: [0.7], DatenSpalte: [0.334, 0.35, 0.366, 0.382] },
{ SuchSpalte: [0.75], DatenSpalte: [0.278, 0.292, 0.305, 0.318] },
{ SuchSpalte: [0.8], DatenSpalte: [0.223, 0.233, 0.244, 0.254] },
{ SuchSpalte: [0.85], DatenSpalte: [0.167, 0.175, 0.183, 0.191] },
{ SuchSpalte: [0.9], DatenSpalte: [0.111, 0.117, 0.122, 0.127] },
{ SuchSpalte: [0.95], DatenSpalte: [0.056, 0.058, 0.061, 0.064] },
{ SuchSpalte: [1], DatenSpalte: [0, 0, 0, 0] }
];
}
const dataZeile = [ { DatenZeile: [1.05,1.1,1.15,1.2] } ];
const AufwandszahlEndenergieWaermeErzeugerBrennwertbezogen = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
return AufwandszahlEndenergieWaermeErzeugerBrennwertbezogen;
}

View File

@@ -2,6 +2,11 @@ import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisW
export function funktionAufwandszahlErzeugungHeizungFernwaermeT102(suchSpalte: number, datenZeile: number) { export function funktionAufwandszahlErzeugungHeizungFernwaermeT102(suchSpalte: number, datenZeile: number) {
if (suchSpalte < 5) { suchSpalte = 5; }
if (suchSpalte > 400) { suchSpalte = 400; }
if (datenZeile < 0.1) { datenZeile = 0.1; }
if (datenZeile > 1) { datenZeile = 1; }
const dataBox = [ const dataBox = [
{ SuchSpalte: [5], DatenSpalte: [1.008, 1.009, 1.009, 1.009, 1.009, 1.009, 1.010, 1.010, 1.010, 1.010] }, { SuchSpalte: [5], DatenSpalte: [1.008, 1.009, 1.009, 1.009, 1.009, 1.009, 1.010, 1.010, 1.010, 1.010] },
{ SuchSpalte: [10], DatenSpalte: [1.005, 1.005, 1.006, 1.006, 1.006, 1.006, 1.006, 1.006, 1.006, 1.006] }, { SuchSpalte: [10], DatenSpalte: [1.005, 1.005, 1.006, 1.006, 1.006, 1.006, 1.006, 1.006, 1.006, 1.006] },

View File

@@ -2,6 +2,11 @@ import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisW
export function funktionAufwandszahlErzeugungHeizungT77(suchSpalte: number, datenZeile: number) { export function funktionAufwandszahlErzeugungHeizungT77(suchSpalte: number, datenZeile: number) {
if (suchSpalte < 5) { suchSpalte = 5; }
if (suchSpalte > 350) { suchSpalte = 350; }
if (datenZeile < 0.1) { datenZeile = 0.1; }
if (datenZeile > 1) { datenZeile = 1; }
const dataBox = [ const dataBox = [
{ SuchSpalte: [5], DatenSpalte: [1.013, 1.019, 1.024, 1.042, 1.061, 1.079, 1.098, 1.117, 1.135, 1.154] }, { SuchSpalte: [5], DatenSpalte: [1.013, 1.019, 1.024, 1.042, 1.061, 1.079, 1.098, 1.117, 1.135, 1.154] },
{ SuchSpalte: [10], DatenSpalte: [1.011, 1.017, 1.023, 1.041, 1.059, 1.077, 1.096, 1.114, 1.132, 1.150] }, { SuchSpalte: [10], DatenSpalte: [1.011, 1.017, 1.023, 1.041, 1.059, 1.077, 1.096, 1.114, 1.132, 1.150] },

View File

@@ -2,6 +2,11 @@ import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisW
export function funktionAufwandszahlErzeugungHeizungUmlaufWasserheizerT82(suchSpalte: number, datenZeile: number) { export function funktionAufwandszahlErzeugungHeizungUmlaufWasserheizerT82(suchSpalte: number, datenZeile: number) {
if (suchSpalte < 11) { suchSpalte = 11; }
if (suchSpalte > 24) { suchSpalte = 24; }
if (datenZeile < 0.1) { datenZeile = 0.1; }
if (datenZeile > 1) { datenZeile = 1; }
const dataBox = [ const dataBox = [
{ SuchSpalte: [11], DatenSpalte: [1.038,1.069,1.098,1.122,1.145,1.169,1.192,1.216,1.240,1.263] }, { SuchSpalte: [11], DatenSpalte: [1.038,1.069,1.098,1.122,1.145,1.169,1.192,1.216,1.240,1.263] },
{ SuchSpalte: [18], DatenSpalte: [1.037,1.068,1.096,1.120,1.143,1.166,1.189,1.212,1.236,1.259] }, { SuchSpalte: [18], DatenSpalte: [1.037,1.068,1.096,1.120,1.143,1.166,1.189,1.212,1.236,1.259] },

View File

@@ -0,0 +1,37 @@
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
export function funktionAufwandszahlStromProduktionKraftWaermekopplungT107(suchSpalte: number, datenZeile: number) {
if (suchSpalte < 0.1) { suchSpalte = 0.1; }
if (suchSpalte > 1) { suchSpalte = 1; }
if (datenZeile < 0.1) { datenZeile = 0.1; }
if (datenZeile > 1) { datenZeile = 1; }
const dataBox = [
{ SuchSpalte: [0.1], DatenSpalte: [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1] },
{ SuchSpalte: [0.15], DatenSpalte: [0.015, 0.03, 0.045, 0.06, 0.075, 0.09, 0.105, 0.12, 0.135, 0.15] },
{ SuchSpalte: [0.2], DatenSpalte: [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] },
{ SuchSpalte: [0.25], DatenSpalte: [0.025, 0.05, 0.075, 0.1, 0.125, 0.15, 0.175, 0.2, 0.225, 0.25] },
{ SuchSpalte: [0.3], DatenSpalte: [0.03, 0.06, 0.09, 0.12, 0.15, 0.18, 0.21, 0.24, 0.27, 0.3] },
{ SuchSpalte: [0.35], DatenSpalte: [0.035, 0.07, 0.105, 0.14, 0.175, 0.21, 0.245, 0.28, 0.315, 0.35] },
{ SuchSpalte: [0.4], DatenSpalte: [0.04, 0.08, 0.12, 0.16, 0.2, 0.24, 0.28, 0.32, 0.36, 0.4] },
{ SuchSpalte: [0.45], DatenSpalte: [0.045, 0.09, 0.135, 0.18, 0.225, 0.27, 0.315, 0.36, 0.405, 0.45] },
{ SuchSpalte: [0.5], DatenSpalte: [0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5] },
{ SuchSpalte: [0.55], DatenSpalte: [0.055, 0.11, 0.165, 0.22, 0.275, 0.33, 0.385, 0.44, 0.495, 0.55] },
{ SuchSpalte: [0.6], DatenSpalte: [0.06, 0.12, 0.18, 0.24, 0.3, 0.36, 0.42, 0.48, 0.54, 0.6] },
{ SuchSpalte: [0.65], DatenSpalte: [0.065, 0.13, 0.195, 0.26, 0.325, 0.39, 0.455, 0.52, 0.585, 0.65] },
{ SuchSpalte: [0.7], DatenSpalte: [0.07, 0.14, 0.21, 0.28, 0.35, 0.42, 0.49, 0.56, 0.63, 0.7] },
{ SuchSpalte: [0.75], DatenSpalte: [0.075, 0.15, 0.225, 0.3, 0.375, 0.45, 0.525, 0.6, 0.675, 0.75] },
{ SuchSpalte: [0.8], DatenSpalte: [0.08, 0.16, 0.24, 0.32, 0.4, 0.48, 0.56, 0.64, 0.72, 0.8] },
{ SuchSpalte: [0.85], DatenSpalte: [0.085, 0.17, 0.255, 0.34, 0.425, 0.51, 0.595, 0.68, 0.765, 0.85] },
{ SuchSpalte: [0.9], DatenSpalte: [0.09, 0.18, 0.27, 0.36, 0.45, 0.54, 0.63, 0.72, 0.81, 0.9] },
{ SuchSpalte: [0.95], DatenSpalte: [0.095, 0.19, 0.285, 0.38, 0.475, 0.57, 0.665, 0.76, 0.855, 0.95] },
{ SuchSpalte: [1], DatenSpalte: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1] }
];
const dataZeile = [ { DatenZeile: [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1] } ];
const AufwandszahlStromProduktionKraftWaermekopplung = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
return AufwandszahlStromProduktionKraftWaermekopplung;
}

View File

@@ -2,6 +2,11 @@ import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisW
export function funktionAusnutzungsgradT18(suchSpalte: number, datenZeile: number) { export function funktionAusnutzungsgradT18(suchSpalte: number, datenZeile: number) {
if (suchSpalte < 30) { suchSpalte = 30; }
if (suchSpalte > 150) { suchSpalte = 150; }
if (datenZeile < 0.1) { datenZeile = 0.1; }
if (datenZeile > 15) { datenZeile = 15; }
const dataBox = [ const dataBox = [
{ SuchSpalte: [30], DatenSpalte: [0.999, 0.992, 0.978, 0.956, 0.927, 0.893, 0.856, 0.818, 0.78, 0.742, 0.706, 0.671, 0.638, 0.608, 0.579, 0.553, 0.528, 0.505, 0.483, 0.463, 0.445, 0.428, 0.411, 0.396, 0.382, 0.369, 0.357, 0.345, 0.334, 0.324, 0.314, 0.305, 0.296, 0.288, 0.28, 0.273, 0.266, 0.259, 0.253, 0.246, 0.22, 0.198, 0.181, 0.166, 0.153, 0.142, 0.133, 0.125, 0.117, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] }, { SuchSpalte: [30], DatenSpalte: [0.999, 0.992, 0.978, 0.956, 0.927, 0.893, 0.856, 0.818, 0.78, 0.742, 0.706, 0.671, 0.638, 0.608, 0.579, 0.553, 0.528, 0.505, 0.483, 0.463, 0.445, 0.428, 0.411, 0.396, 0.382, 0.369, 0.357, 0.345, 0.334, 0.324, 0.314, 0.305, 0.296, 0.288, 0.28, 0.273, 0.266, 0.259, 0.253, 0.246, 0.22, 0.198, 0.181, 0.166, 0.153, 0.142, 0.133, 0.125, 0.117, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] },
{ SuchSpalte: [40], DatenSpalte: [1.0, 0.997, 0.99, 0.975, 0.954, 0.926, 0.892, 0.855, 0.817, 0.778, 0.739, 0.702, 0.667, 0.634, 0.603, 0.574, 0.547, 0.522, 0.498, 0.477, 0.457, 0.438, 0.421, 0.405, 0.39, 0.376, 0.363, 0.351, 0.339, 0.329, 0.318, 0.309, 0.3, 0.291, 0.283, 0.276, 0.268, 0.261, 0.255, 0.249, 0.221, 0.199, 0.181, 0.166, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] }, { SuchSpalte: [40], DatenSpalte: [1.0, 0.997, 0.99, 0.975, 0.954, 0.926, 0.892, 0.855, 0.817, 0.778, 0.739, 0.702, 0.667, 0.634, 0.603, 0.574, 0.547, 0.522, 0.498, 0.477, 0.457, 0.438, 0.421, 0.405, 0.39, 0.376, 0.363, 0.351, 0.339, 0.329, 0.318, 0.309, 0.3, 0.291, 0.283, 0.276, 0.268, 0.261, 0.255, 0.249, 0.221, 0.199, 0.181, 0.166, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] },

View File

@@ -1,134 +1,133 @@
// Funktion zur Berechnung der Bilanzinnentemperatur aus Tabelle 8 EFH oder Tabelle 10 MFH import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
import { cubicSplineInterpolation } from "js-interpolate";
// aus Eingabeformular // aus Eingabeformular
let WohnEinheiten = 2; let WohnEinheiten = 2;
let teilBeheizung = "mit Teilbeheizung";
const datasetEinfamilienHaus = { const datasetEinfamilienHaus = {
Januar: { Januar: [
50: [18.83, 18.71, 18.61, 18.38, 18.16, 18.05, 17.99, 17.97, 17.95], { SuchSpalte: [50], DatenSpalte: [18.83, 18.71, 18.61, 18.38, 18.16, 18.05, 17.99, 17.97, 17.95] },
90: [18.99, 18.87, 18.77, 18.54, 18.31, 18.20, 18.15, 18.12, 18.11], { SuchSpalte: [90], DatenSpalte: [18.99, 18.87, 18.77, 18.54, 18.31, 18.20, 18.15, 18.12, 18.11] },
130: [19.14, 19.02, 18.92, 18.68, 18.45, 18.34, 18.29, 18.26, 18.25], { SuchSpalte: [130], DatenSpalte: [19.14, 19.02, 18.92, 18.68, 18.45, 18.34, 18.29, 18.26, 18.25] },
}, ],
Februar: { Februar: [
50: [18.88, 18.76, 18.67, 18.44, 18.23, 18.13, 18.08, 18.05, 18.04], { SuchSpalte: [50], DatenSpalte: [18.88, 18.76, 18.67, 18.44, 18.23, 18.13, 18.08, 18.05, 18.04] },
90: [19.04, 18.93, 18.83, 18.60, 18.39, 18.29, 18.23, 18.21, 18.20], { SuchSpalte: [90], DatenSpalte: [19.04, 18.93, 18.83, 18.60, 18.39, 18.29, 18.23, 18.21, 18.20] },
130: [19.18, 19.07, 18.97, 18.74, 18.53, 18.42, 18.37, 18.34, 18.33], { SuchSpalte: [130], DatenSpalte: [19.18, 19.07, 18.97, 18.74, 18.53, 18.42, 18.37, 18.34, 18.33] },
}, ],
März: { März: [
50: [19.05, 18.95, 18.87, 18.68, 18.50, 18.42, 18.37, 18.35, 18.34], { SuchSpalte: [50], DatenSpalte: [19.05, 18.95, 18.87, 18.68, 18.50, 18.42, 18.37, 18.35, 18.34] },
90: [19.19, 19.09, 19.01, 18.82, 18.64, 18.55, 18.51, 18.49, 18.48], { SuchSpalte: [90], DatenSpalte: [19.19, 19.09, 19.01, 18.82, 18.64, 18.55, 18.51, 18.49, 18.48] },
130: [19.31, 19.21, 19.13, 18.94, 18.75, 18.67, 18.62, 18.60, 18.59], { SuchSpalte: [130], DatenSpalte: [19.31, 19.21, 19.13, 18.94, 18.75, 18.67, 18.62, 18.60, 18.59] },
}, ],
April: { April: [
50: [19.33, 19.26, 19.20, 19.07, 18.94, 18.88, 18.85, 18.84, 18.83], { SuchSpalte: [50], DatenSpalte: [19.33, 19.26, 19.20, 19.07, 18.94, 18.88, 18.85, 18.84, 18.83] },
90: [19.43, 19.36, 19.30, 19.17, 19.04, 18.98, 18.95, 18.93, 18.92], { SuchSpalte: [90], DatenSpalte: [19.43, 19.36, 19.30, 19.17, 19.04, 18.98, 18.95, 18.93, 18.92] },
130: [19.51, 19.44, 19.38, 19.25, 19.12, 19.06, 19.03, 19.01, 19.00], { SuchSpalte: [130], DatenSpalte: [19.51, 19.44, 19.38, 19.25, 19.12, 19.06, 19.03, 19.01, 19.00] },
}, ],
Mai: { Mai: [
50: [19.63, 19.60, 19.56, 19.49, 19.42, 19.39, 19.37, 19.36, 19.36], { SuchSpalte: [50], DatenSpalte: [19.63, 19.60, 19.56, 19.49, 19.42, 19.39, 19.37, 19.36, 19.36] },
90: [19.69, 19.65, 19.62, 19.55, 19.48, 19.44, 19.42, 19.42, 19.41], { SuchSpalte: [90], DatenSpalte: [19.69, 19.65, 19.62, 19.55, 19.48, 19.44, 19.42, 19.42, 19.41] },
130: [19.73, 19.70, 19.66, 19.59, 19.52, 19.49, 19.47, 19.46, 19.46], { SuchSpalte: [130], DatenSpalte: [19.73, 19.70, 19.66, 19.59, 19.52, 19.49, 19.47, 19.46, 19.46] },
}, ],
Juni: { Juni: [
50: [19.80, 19.77, 19.76, 19.72, 19.68, 19.66, 19.65, 19.64, 19.64], { SuchSpalte: [50], DatenSpalte: [19.80, 19.77, 19.76, 19.72, 19.68, 19.66, 19.65, 19.64, 19.64] },
90: [19.83, 19.80, 19.79, 19.75, 19.71, 19.69, 19.68, 19.67, 19.67], { SuchSpalte: [90], DatenSpalte: [19.83, 19.80, 19.79, 19.75, 19.71, 19.69, 19.68, 19.67, 19.67] },
130: [19.85, 19.83, 19.81, 19.77, 19.73, 19.71, 19.70, 19.70, 19.70], { SuchSpalte: [130], DatenSpalte: [19.85, 19.83, 19.81, 19.77, 19.73, 19.71, 19.70, 19.70, 19.70] },
}, ],
Juli: { Juli: [
50: [19.94, 19.93, 19.93, 19.91, 19.90, 19.90, 19.89, 19.89, 19.89], { SuchSpalte: [50], DatenSpalte: [19.94, 19.93, 19.93, 19.91, 19.90, 19.90, 19.89, 19.89, 19.89] },
90: [19.95, 19.94, 19.94, 19.92, 19.91, 19.91, 19.90, 19.90, 19.90], { SuchSpalte: [90], DatenSpalte: [19.95, 19.94, 19.94, 19.92, 19.91, 19.91, 19.90, 19.90, 19.90] },
130: [19.95, 19.95, 19.94, 19.93, 19.92, 19.91, 19.91, 19.91, 19.91], { SuchSpalte: [130], DatenSpalte: [19.95, 19.95, 19.94, 19.93, 19.92, 19.91, 19.91, 19.91, 19.91] },
}, ],
August: { August: [
50: [19.91, 19.90, 19.90, 19.88, 19.86, 19.86, 19.85, 19.85, 19.85], { SuchSpalte: [50], DatenSpalte: [19.91, 19.90, 19.90, 19.88, 19.86, 19.86, 19.85, 19.85, 19.85] },
90: [19.93, 19.92, 19.91, 19.89, 19.88, 19.87, 19.86, 19.86, 19.86], { SuchSpalte: [90], DatenSpalte: [19.93, 19.92, 19.91, 19.89, 19.88, 19.87, 19.86, 19.86, 19.86] },
130: [19.94, 19.93, 19.92, 19.90, 19.89, 19.88, 19.87, 19.87, 19.87], { SuchSpalte: [130], DatenSpalte: [19.94, 19.93, 19.92, 19.90, 19.89, 19.88, 19.87, 19.87, 19.87] },
}, ],
September: { September: [
50: [19.65, 19.61, 19.58, 19.51, 19.44, 19.41, 19.39, 19.39, 19.38], { SuchSpalte: [50], DatenSpalte: [19.65, 19.61, 19.58, 19.51, 19.44, 19.41, 19.39, 19.39, 19.38] },
90: [19.70, 19.66, 19.63, 19.56, 19.49, 19.46, 19.44, 19.44, 19.43], { SuchSpalte: [90], DatenSpalte: [19.70, 19.66, 19.63, 19.56, 19.49, 19.46, 19.44, 19.44, 19.43] },
130: [19.74, 19.71, 19.68, 19.60, 19.54, 19.50, 19.49, 19.48, 19.47], { SuchSpalte: [130], DatenSpalte: [19.74, 19.71, 19.68, 19.60, 19.54, 19.50, 19.49, 19.48, 19.47] },
}, ],
Oktober: { Oktober: [
50: [19.35, 19.28, 19.23, 19.10, 18.97, 18.91, 18.88, 18.87, 18.86], { SuchSpalte: [50], DatenSpalte: [19.35, 19.28, 19.23, 19.10, 18.97, 18.91, 18.88, 18.87, 18.86] },
90: [19.44, 19.38, 19.32, 19.19, 19.07, 19.01, 18.98, 18.96, 18.95], { SuchSpalte: [90], DatenSpalte: [19.44, 19.38, 19.32, 19.19, 19.07, 19.01, 18.98, 18.96, 18.95] },
130: [19.53, 19.46, 19.40, 19.27, 19.15, 19.08, 19.05, 19.04, 19.03], { SuchSpalte: [130], DatenSpalte: [19.53, 19.46, 19.40, 19.27, 19.15, 19.08, 19.05, 19.04, 19.03] },
}, ],
November: { November: [
50: [19.01, 18.91, 18.83, 18.63, 18.45, 18.35, 18.31, 18.29, 18.28], { SuchSpalte: [50], DatenSpalte: [19.01, 18.91, 18.83, 18.63, 18.45, 18.35, 18.31, 18.29, 18.28] },
90: [19.16, 19.06, 18.97, 18.77, 18.59, 18.49, 18.45, 18.43, 18.42], { SuchSpalte: [90], DatenSpalte: [19.16, 19.06, 18.97, 18.77, 18.59, 18.49, 18.45, 18.43, 18.42] },
130: [19.28, 19.18, 19.09, 18.90, 18.71, 18.61, 18.57, 18.55, 18.53], { SuchSpalte: [130], DatenSpalte: [19.28, 19.18, 19.09, 18.90, 18.71, 18.61, 18.57, 18.55, 18.53] },
}, ],
Dezember: { Dezember: [
50: [18.83, 18.71, 18.61, 18.38, 18.15, 18.04, 17.99, 17.96, 17.95], { SuchSpalte: [50], DatenSpalte: [18.83, 18.71, 18.61, 18.38, 18.15, 18.04, 17.99, 17.96, 17.95] },
90: [18.99, 18.87, 18.76, 18.53, 18.30, 18.19, 18.14, 18.11, 18.10], { SuchSpalte: [90], DatenSpalte: [18.99, 18.87, 18.76, 18.53, 18.30, 18.19, 18.14, 18.11, 18.10] },
130: [19.14, 19.02, 18.91, 18.67, 18.45, 18.33, 18.28, 18.25, 18.24], { SuchSpalte: [130], DatenSpalte: [19.14, 19.02, 18.91, 18.67, 18.45, 18.33, 18.28, 18.25, 18.24] },
}, ],
}; };
const datasetMehrfamilienHaus = { const datasetMehrfamilienHaus = {
Januar: { Januar: [
50: [19.41, 19.37, 19.33, 19.24, 19.16, 19.12, 19.10, 19.09, 19.08], { SuchSpalte: [50], DatenSpalte: [19.41, 19.37, 19.33, 19.24, 19.16, 19.12, 19.10, 19.09, 19.08] },
90: [19.50, 19.45, 19.41, 19.33, 19.24, 19.20, 19.18, 19.17, 19.17], { SuchSpalte: [90], DatenSpalte: [19.50, 19.45, 19.41, 19.33, 19.24, 19.20, 19.18, 19.17, 19.17] },
130: [19.57, 19.53, 19.49, 19.40, 19.32, 19.28, 19.26, 19.25, 19.24], { SuchSpalte: [130], DatenSpalte: [19.57, 19.53, 19.49, 19.40, 19.32, 19.28, 19.26, 19.25, 19.24] },
}, ],
Februar: { Februar: [
50: [19.44, 19.40, 19.36, 19.28, 19.20, 19.16, 19.14, 19.13, 19.13], { SuchSpalte: [50], DatenSpalte: [19.44, 19.40, 19.36, 19.28, 19.20, 19.16, 19.14, 19.13, 19.13] },
90: [19.52, 19.48, 19.44, 19.36, 19.28, 19.24, 19.22, 19.21, 19.21], { SuchSpalte: [90], DatenSpalte: [19.52, 19.48, 19.44, 19.36, 19.28, 19.24, 19.22, 19.21, 19.21] },
130: [19.59, 19.55, 19.51, 19.43, 19.35, 19.31, 19.29, 19.28, 19.28], { SuchSpalte: [130], DatenSpalte: [19.59, 19.55, 19.51, 19.43, 19.35, 19.31, 19.29, 19.28, 19.28] },
}, ],
März: { März: [
50: [19.53, 19.49, 19.46, 19.39, 19.32, 19.29, 19.27, 19.27, 19.26], { SuchSpalte: [50], DatenSpalte: [19.53, 19.49, 19.46, 19.39, 19.32, 19.29, 19.27, 19.27, 19.26] },
90: [19.60, 19.56, 19.53, 19.46, 19.39, 19.36, 19.34, 19.33, 19.33], { SuchSpalte: [90], DatenSpalte: [19.60, 19.56, 19.53, 19.46, 19.39, 19.36, 19.34, 19.33, 19.33] },
130: [19.66, 19.62, 19.59, 19.52, 19.45, 19.42, 19.40, 19.39, 19.39], { SuchSpalte: [130], DatenSpalte: [19.66, 19.62, 19.59, 19.52, 19.45, 19.42, 19.40, 19.39, 19.39] },
}, ],
April: { April: [
50: [19.66, 19.64, 19.62, 19.57, 19.52, 19.50, 19.49, 19.48, 19.48], { SuchSpalte: [50], DatenSpalte: [19.66, 19.64, 19.62, 19.57, 19.52, 19.50, 19.49, 19.48, 19.48] },
90: [19.71, 19.69, 19.67, 19.62, 19.57, 19.55, 19.54, 19.53, 19.53], { SuchSpalte: [90], DatenSpalte: [19.71, 19.69, 19.67, 19.62, 19.57, 19.55, 19.54, 19.53, 19.53] },
130: [19.76, 19.73, 19.71, 19.66, 19.61, 19.59, 19.58, 19.57, 19.57], { SuchSpalte: [130], DatenSpalte: [19.76, 19.73, 19.71, 19.66, 19.61, 19.59, 19.58, 19.57, 19.57] },
}, ],
Mai: { Mai: [
50: [19.82, 19.80, 19.79, 19.76, 19.74, 19.73, 19.72, 19.72, 19.72], { SuchSpalte: [50], DatenSpalte: [19.82, 19.80, 19.79, 19.76, 19.74, 19.73, 19.72, 19.72, 19.72] },
90: [19.84, 19.83, 19.82, 19.79, 19.77, 19.75, 19.75, 19.74, 19.74], { SuchSpalte: [90], DatenSpalte: [19.84, 19.83, 19.82, 19.79, 19.77, 19.75, 19.75, 19.74, 19.74] },
130: [19.87, 19.85, 19.84, 19.81, 19.79, 19.78, 19.77, 19.77, 19.76], { SuchSpalte: [130], DatenSpalte: [19.87, 19.85, 19.84, 19.81, 19.79, 19.78, 19.77, 19.77, 19.76] },
}, ],
Juni: { Juni: [
50: [19.90, 19.89, 19.88, 19.87, 19.85, 19.85, 19.84, 19.84, 19.84], { SuchSpalte: [50], DatenSpalte: [19.90, 19.89, 19.88, 19.87, 19.85, 19.85, 19.84, 19.84, 19.84] },
90: [19.91, 19.91, 19.90, 19.88, 19.87, 19.86, 19.86, 19.86, 19.86], { SuchSpalte: [90], DatenSpalte: [19.91, 19.91, 19.90, 19.88, 19.87, 19.86, 19.86, 19.86, 19.86] },
130: [19.93, 19.92, 19.91, 19.90, 19.88, 19.87, 19.87, 19.87, 19.87], { SuchSpalte: [130], DatenSpalte: [19.93, 19.92, 19.91, 19.90, 19.88, 19.87, 19.87, 19.87, 19.87] },
}, ],
Juli: { Juli: [
50: [19.97, 19.97, 19.96, 19.96, 19.96, 19.95, 19.95, 19.95, 19.95], { SuchSpalte: [50], DatenSpalte: [19.97, 19.97, 19.96, 19.96, 19.96, 19.95, 19.95, 19.95, 19.95] },
90: [19.97, 19.97, 19.97, 19.96, 19.96, 19.96, 19.96, 19.96, 19.96], { SuchSpalte: [90], DatenSpalte: [19.97, 19.97, 19.97, 19.96, 19.96, 19.96, 19.96, 19.96, 19.96] },
130: [19.98, 19.98, 19.97, 19.97, 19.96, 19.96, 19.96, 19.96, 19.96], { SuchSpalte: [130], DatenSpalte: [19.98, 19.98, 19.97, 19.97, 19.96, 19.96, 19.96, 19.96, 19.96] },
}, ],
August: { August: [
50: [19.96, 19.95, 19.95, 19.94, 19.94, 19.93, 19.93, 19.93, 19.93], { SuchSpalte: [50], DatenSpalte: [19.96, 19.95, 19.95, 19.94, 19.94, 19.93, 19.93, 19.93, 19.93] },
90: [19.96, 19.96, 19.96, 19.95, 19.94, 19.94, 19.94, 19.94, 19.94], { SuchSpalte: [90], DatenSpalte: [19.96, 19.96, 19.96, 19.95, 19.94, 19.94, 19.94, 19.94, 19.94] },
130: [19.97, 19.97, 19.96, 19.96, 19.95, 19.95, 19.95, 19.94, 19.94], { SuchSpalte: [130], DatenSpalte: [19.97, 19.97, 19.96, 19.96, 19.95, 19.95, 19.95, 19.94, 19.94] },
}, ],
September: { September: [
50: [19.82, 19.81, 19.80, 19.77, 19.75, 19.74, 19.73, 19.73, 19.73], { SuchSpalte: [50], DatenSpalte: [19.82, 19.81, 19.80, 19.77, 19.75, 19.74, 19.73, 19.73, 19.73] },
90: [19.85, 19.84, 19.82, 19.80, 19.77, 19.76, 19.76, 19.75, 19.75], { SuchSpalte: [90], DatenSpalte: [19.85, 19.84, 19.82, 19.80, 19.77, 19.76, 19.76, 19.75, 19.75] },
130: [19.87, 19.86, 19.85, 19.82, 19.80, 19.78, 19.78, 19.77, 19.77], { SuchSpalte: [130], DatenSpalte: [19.87, 19.86, 19.85, 19.82, 19.80, 19.78, 19.78, 19.77, 19.77] },
}, ],
Oktober: { Oktober: [
50: [19.67, 19.65, 19.63, 19.58, 19.53, 19.51, 19.50, 19.50, 19.49], { SuchSpalte: [50], DatenSpalte: [19.67, 19.65, 19.63, 19.58, 19.53, 19.51, 19.50, 19.50, 19.49] },
90: [19.72, 19.70, 19.68, 19.63, 19.58, 19.56, 19.55, 19.54, 19.54], { SuchSpalte: [90], DatenSpalte: [19.72, 19.70, 19.68, 19.63, 19.58, 19.56, 19.55, 19.54, 19.54] },
130: [19.76, 19.74, 19.72, 19.67, 19.62, 19.60, 19.59, 19.58, 19.58], { SuchSpalte: [130], DatenSpalte: [19.76, 19.74, 19.72, 19.67, 19.62, 19.60, 19.59, 19.58, 19.58] },
}, ],
November: { November: [
50: [19.51, 19.47, 19.44, 19.36, 19.30, 19.26, 19.25, 19.24, 19.23], { SuchSpalte: [50], DatenSpalte: [19.51, 19.47, 19.44, 19.36, 19.30, 19.26, 19.25, 19.24, 19.23] },
90: [19.58, 19.54, 19.51, 19.44, 19.37, 19.33, 19.32, 19.31, 19.30], { SuchSpalte: [90], DatenSpalte: [19.58, 19.54, 19.51, 19.44, 19.37, 19.33, 19.32, 19.31, 19.30] },
130: [19.64, 19.60, 19.57, 19.50, 19.43, 19.39, 19.38, 19.37, 19.37], { SuchSpalte: [130], DatenSpalte: [19.64, 19.60, 19.57, 19.50, 19.43, 19.39, 19.38, 19.37, 19.37] },
}, ],
Dezember: { Dezember: [
50: [19.41, 19.36, 19.32, 19.24, 19.15, 19.11, 19.09, 19.08, 19.08], { SuchSpalte: [50], DatenSpalte: [19.41, 19.36, 19.32, 19.24, 19.15, 19.11, 19.09, 19.08, 19.08] },
90: [19.49, 19.45, 19.41, 19.32, 19.24, 19.20, 19.18, 19.17, 19.16], { SuchSpalte: [90], DatenSpalte: [19.49, 19.45, 19.41, 19.32, 19.24, 19.20, 19.18, 19.17, 19.16] },
130: [19.57, 19.52, 19.49, 19.40, 19.31, 19.27, 19.25, 19.24, 19.24], { SuchSpalte: [130], DatenSpalte: [19.57, 19.52, 19.49, 19.40, 19.31, 19.27, 19.25, 19.24, 19.24] },
}, ],
}; };
function getDataset(WohnEinheiten: number) { function getDataset(WohnEinheiten: number) {
@@ -142,37 +141,20 @@ const datasetEinfamilienHaus = {
const dataset = getDataset(WohnEinheiten); const dataset = getDataset(WohnEinheiten);
// Für "Ohne Teilbeheizung" habe ich hier einfach 0 eingesetzt: // Für "Ohne Teilbeheizung" habe ich hier einfach 0 eingesetzt:
const HeizLast = [0, 5, 10, 25, 50, 75, 100, 125, 150]; const dataZeile = [{ DatenZeile: [0, 5, 10, 25, 50, 75, 100, 125, 150] }];
// Um über die beiden Tabellen zu interpolieren können wir einfach zuerst über
// jede einzeln interpolieren und dann zwischen den Tabellen interpolieren.
// Falls wir also den Wert an Stelle Heizlast: 120, Zeitkonstante 100, Monat:
// Januar haben wollen:
export function funktionBilanzInnentemperaturT8T10(heizlast: number, zeitkonstane: number, monat: keyof typeof dataset): number {
const data = dataset[monat]
const interpolations: number[] = [] export function funktionBilanzInnentemperaturT8T10(datenZeile: number, suchSpalte: number, monat: keyof typeof dataset): number {
for (const key in data) { if (teilBeheizung === "ohne Teilbeheizung") {datenZeile = 0;}
const values = data[key as unknown as keyof typeof data]
const interpolated = cubicSplineInterpolation( if (suchSpalte < 50) { suchSpalte = 50; }
values.map((value, i) => ({ x: HeizLast[i], y: value })), if (suchSpalte > 130) { suchSpalte = 130; }
heizlast if (datenZeile < 5) { datenZeile = 5; }
) if (datenZeile > 150) { datenZeile = 150; }
interpolations.push(interpolated) const dataBox = dataset[monat]
} const BilanzInnentemperatur = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
return BilanzInnentemperatur;
const interpolated = cubicSplineInterpolation(
interpolations.map((interpolation, i) => {
return {
x: Object.keys(data)[i],
y: interpolation
}
}),
zeitkonstane
)
return interpolated
} }

View File

@@ -1,4 +1,3 @@
export function funktionDoppelteInterpolation(SuchSpalte: number, DatenZeile: number, dataZeile: any, dataBox: any): number { export function funktionDoppelteInterpolation(SuchSpalte: number, DatenZeile: number, dataZeile: any, dataBox: any): number {
function interpolate(x: number, x0: number, y0: number, x1: number, y1: number): number { function interpolate(x: number, x0: number, y0: number, x1: number, y1: number): number {

View File

@@ -0,0 +1,63 @@
import { datasetGesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15 } from "#lib/Berechnungen/BedarfsausweisWohnen/datasetGesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15.js";
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
import { date } from "astro:schema";
export function funktionGesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15(LueftungsAnlage: string, LuftDichtheit: string, LueftungBedarfsgefuehrt: string, suchSpalte: number, datenZeile: number): any | null {
if (suchSpalte < 0.2) { suchSpalte = 0.2; }
if (suchSpalte > 0.8) { suchSpalte = 0.8; }
if (datenZeile < 0) { datenZeile = 0; }
if (datenZeile > 0.8) { datenZeile = 0.8; }
const filteredData = datasetGesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15.filter(item =>
item.LueftungsAnlage === LueftungsAnlage &&
item.LuftDichtheit === LuftDichtheit &&
item.LueftungBedarfsgefuehrt === LueftungBedarfsgefuehrt,
);
const dataBox = filteredData.reduce((acc: { SuchSpalte: (string | number)[], DatenSpalte: number[], DatenZeile: number[] }[], item) => {
const existingEntry = acc.find(entry => entry.SuchSpalte[0] === item.AdurchV);
if (existingEntry) {
existingEntry.DatenSpalte.push(item.n0);
existingEntry.DatenZeile.push(item.nt);
} else {
acc.push({
SuchSpalte: [item.AdurchV],
DatenSpalte: [item.n0],
DatenZeile: [item.nt],
});
}
return acc;
}, []);
const dataZeile = filteredData.reduce((acc: { SuchSpalte: (string | number)[], DatenSpalte: number[], DatenZeile: number[] }[], item) => {
const existingEntry = acc.find(entry => entry.SuchSpalte[0] === item.AdurchV);
if (existingEntry) {
existingEntry.DatenSpalte.push(item.n0);
existingEntry.DatenZeile.push(item.nt);
} else {
acc.push({
SuchSpalte: [item.AdurchV],
DatenSpalte: [item.n0],
DatenZeile: [item.nt],
});
}
return acc;
}, []);
const GesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15 = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
return {
GesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15,
dataBox,
dataZeile
}
}
const result = funktionGesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15("Zu-/Abluftanlage", "Kategorie I - mit geplanter Dichtheitsprüfung", "bedarfsgeführt", 0, 0.1);
console.log(result);

View File

@@ -0,0 +1,49 @@
import { datasetGesamtluftWechselKorrekturfaktorT12T13 } from "#lib/Berechnungen/BedarfsausweisWohnen/datasetGesamtluftWechselKorrekturfaktorT12T13.js";
export function funktionGesamtluftWechselKorrekturfaktorT12(LueftungsAnlage: string, LuftDichtheit: string, LueftungBedarfsgefuehrt: string, ηt: number): any | null {
const filteredData = datasetGesamtluftWechselKorrekturfaktorT12T13.filter(item =>
item.LueftungsAnlage === LueftungsAnlage &&
item.LuftDichtheit === LuftDichtheit &&
item.LueftungBedarfsgefuehrt === LueftungBedarfsgefuehrt
);
if (filteredData.length === 0) {
const GesamtluftWechselZuAbluftanlage = 1;
return GesamtluftWechselZuAbluftanlage;
}
const sortedData = filteredData.sort((a, b) => a.ηt - b.ηt);
for (let i = 0; i < sortedData.length - 1; i++) {
const current = sortedData[i];
const next = sortedData[i + 1];
if (current && next && ηt >= current.ηt && ηt <= next.ηt) {
const t = (ηt - current.ηt) / (next.ηt - current.ηt);
const GesamtluftWechselZuAbluftanlage = current.n0 + t * (next.n0 - current.n0);
return GesamtluftWechselZuAbluftanlage;
}
if (current && ηt === current.ηt) {
const GesamtluftWechselZuAbluftanlage = current.n0;
return GesamtluftWechselZuAbluftanlage;
}
}
if (filteredData.length === 1) {
const GesamtluftWechselZuAbluftanlage = filteredData[0].n0;
const Korrekturfaktor = filteredData[0].fwin1;
return {
GesamtluftWechselZuAbluftanlage,
Korrekturfaktor
}
}
}
const result = funktionGesamtluftWechselKorrekturfaktorT12("Abluftanlage", "Kategorie II - neues Gebäude", "bedarfsgeführt", 0);
console.log(result);

View File

@@ -2,6 +2,11 @@ import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisW
export function funktionHilfsenergieErzeugungHeizungT83(suchSpalte: number, datenZeile: number) { export function funktionHilfsenergieErzeugungHeizungT83(suchSpalte: number, datenZeile: number) {
if (suchSpalte < 5) { suchSpalte = 5; }
if (suchSpalte > 400) { suchSpalte = 400; }
if (datenZeile < 0.1) { datenZeile = 0.1; }
if (datenZeile > 1) { datenZeile = 1; }
const dataBox = [ const dataBox = [
{ SuchSpalte: [5], DatenSpalte: [0.0208, 0.0267, 0.0325, 0.0418, 0.0510, 0.0603, 0.0696, 0.0789, 0.0882, 0.0974] }, { SuchSpalte: [5], DatenSpalte: [0.0208, 0.0267, 0.0325, 0.0418, 0.0510, 0.0603, 0.0696, 0.0789, 0.0882, 0.0974] },
{ SuchSpalte: [10], DatenSpalte: [0.0251, 0.0352, 0.0453, 0.0582, 0.0712, 0.0841, 0.0971, 0.1100, 0.1230, 0.1359] }, { SuchSpalte: [10], DatenSpalte: [0.0251, 0.0352, 0.0453, 0.0582, 0.0712, 0.0841, 0.0971, 0.1100, 0.1230, 0.1359] },
@@ -25,7 +30,7 @@ const dataBox = [
{ SuchSpalte: [400], DatenSpalte: [0.0987, 0.1824, 0.2661, 0.3422, 0.4182, 0.4942, 0.5703, 0.6463, 0.7223, 0.7984] } { SuchSpalte: [400], DatenSpalte: [0.0987, 0.1824, 0.2661, 0.3422, 0.4182, 0.4942, 0.5703, 0.6463, 0.7223, 0.7984] }
]; ];
const dataZeile = [ { DatenZeile: [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0] } ]; const dataZeile = [ { DatenZeile: [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1] } ];
const HilfsenergieErzeugungHeizung = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox); const HilfsenergieErzeugungHeizung = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);

View File

@@ -2,6 +2,11 @@ import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisW
export function funktionHilfsenergieErzeugungPelletKesselT85(suchSpalte: number, datenZeile: number) { export function funktionHilfsenergieErzeugungPelletKesselT85(suchSpalte: number, datenZeile: number) {
if (suchSpalte < 5) { suchSpalte = 5; }
if (suchSpalte > 400) { suchSpalte = 400; }
if (datenZeile < 0.1) { datenZeile = 0.1; }
if (datenZeile > 1) { datenZeile = 1; }
const dataBox = [ const dataBox = [
{ SuchSpalte: [5], DatenSpalte: [0.0070, 0.0080, 0.0090, 0.0149, 0.0207, 0.0266, 0.0324, 0.0383, 0.0441, 0.0500] }, { SuchSpalte: [5], DatenSpalte: [0.0070, 0.0080, 0.0090, 0.0149, 0.0207, 0.0266, 0.0324, 0.0383, 0.0441, 0.0500] },
{ SuchSpalte: [10], DatenSpalte: [0.0107, 0.0143, 0.0180, 0.0240, 0.0300, 0.0360, 0.0420, 0.0480, 0.0540, 0.0600] }, { SuchSpalte: [10], DatenSpalte: [0.0107, 0.0143, 0.0180, 0.0240, 0.0300, 0.0360, 0.0420, 0.0480, 0.0540, 0.0600] },
@@ -25,7 +30,7 @@ const dataBox = [
{ SuchSpalte: [400], DatenSpalte: [0.2967, 0.5083, 0.7200, 0.7371, 0.7543, 0.7714, 0.7886, 0.8057, 0.8229, 0.8400] } { SuchSpalte: [400], DatenSpalte: [0.2967, 0.5083, 0.7200, 0.7371, 0.7543, 0.7714, 0.7886, 0.8057, 0.8229, 0.8400] }
]; ];
const dataZeile = [ { DatenZeile: [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0] } ]; const dataZeile = [ { DatenZeile: [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1] } ];
const HilfsenergieErzeugungPelletKessel = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox); const HilfsenergieErzeugungPelletKessel = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);

View File

@@ -2,13 +2,18 @@ import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisW
export function funktionHilfsenergieErzeugungUmlaufWasserheizerT88(suchSpalte: number, datenZeile: number) { export function funktionHilfsenergieErzeugungUmlaufWasserheizerT88(suchSpalte: number, datenZeile: number) {
if (suchSpalte < 11) { suchSpalte = 11; }
if (suchSpalte > 24) { suchSpalte = 24; }
if (datenZeile < 0.1) { datenZeile = 0.1; }
if (datenZeile > 1) { datenZeile = 1; }
const dataBox = [ const dataBox = [
{ SuchSpalte: [11], DatenSpalte: [0.0258, 0.0366, 0.0474, 0.0610, 0.0745, 0.0881, 0.1016, 0.1152, 0.1287, 0.1423] }, { SuchSpalte: [11], DatenSpalte: [0.0258, 0.0366, 0.0474, 0.0610, 0.0745, 0.0881, 0.1016, 0.1152, 0.1287, 0.1423] },
{ SuchSpalte: [18], DatenSpalte: [0.0300, 0.0450, 0.0601, 0.0772, 0.0944, 0.1115, 0.1287, 0.1459, 0.1630, 0.1802] }, { SuchSpalte: [18], DatenSpalte: [0.0300, 0.0450, 0.0601, 0.0772, 0.0944, 0.1115, 0.1287, 0.1459, 0.1630, 0.1802] },
{ SuchSpalte: [24], DatenSpalte: [0.0330, 0.0510, 0.0690, 0.0887, 0.1084, 0.1281, 0.1478, 0.1675, 0.1872, 0.2069] } { SuchSpalte: [24], DatenSpalte: [0.0330, 0.0510, 0.0690, 0.0887, 0.1084, 0.1281, 0.1478, 0.1675, 0.1872, 0.2069] }
]; ];
const dataZeile = [ { DatenZeile: [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0] } ]; const dataZeile = [ { DatenZeile: [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1] } ];
const HilfsenergieErzeugungUmlaufWasserheizer = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox); const HilfsenergieErzeugungUmlaufWasserheizer = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);

View File

@@ -0,0 +1,64 @@
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
export function funktionKorrekturfaktorAbweichendeErzeugerAufwandszahlenT109(suchSpalte: number, datenZeile: number) {
if (suchSpalte < 0.1) { suchSpalte = 0.1; }
if (suchSpalte > 1) { suchSpalte = 1; }
if (datenZeile < 1.05) { datenZeile = 1.05; }
if (datenZeile > 1.2) { datenZeile = 1.2; }
const dataBoxHP = [
{ SuchSpalte: [0.1], DatenSpalte: [0.98, 1.02, 1.06, 1.11] },
{ SuchSpalte: [0.15], DatenSpalte: [0.98, 1.02, 1.06, 1.1] },
{ SuchSpalte: [0.2], DatenSpalte: [0.98, 1.02, 1.06, 1.1] },
{ SuchSpalte: [0.25], DatenSpalte: [0.98, 1.02, 1.06, 1.09] },
{ SuchSpalte: [0.3], DatenSpalte: [0.98, 1.02, 1.05, 1.09] },
{ SuchSpalte: [0.35], DatenSpalte: [0.98, 1.02, 1.05, 1.08] },
{ SuchSpalte: [0.4], DatenSpalte: [0.98, 1.02, 1.05, 1.08] },
{ SuchSpalte: [0.45], DatenSpalte: [0.99, 1.01, 1.04, 1.07] },
{ SuchSpalte: [0.5], DatenSpalte: [0.99, 1.01, 1.04, 1.07] },
{ SuchSpalte: [0.55], DatenSpalte: [0.99, 1.01, 1.04, 1.06] },
{ SuchSpalte: [0.6], DatenSpalte: [0.99, 1.01, 1.03, 1.05] },
{ SuchSpalte: [0.65], DatenSpalte: [0.99, 1.01, 1.03, 1.05] },
{ SuchSpalte: [0.7], DatenSpalte: [0.99, 1.01, 1.03, 1.04] },
{ SuchSpalte: [0.75], DatenSpalte: [0.99, 1.01, 1.02, 1.04] },
{ SuchSpalte: [0.8], DatenSpalte: [0.99, 1.01, 1.02, 1.03] },
{ SuchSpalte: [0.85], DatenSpalte: [1, 1, 1.01, 1.02] },
{ SuchSpalte: [0.9], DatenSpalte: [1, 1, 1.01, 1.01] },
{ SuchSpalte: [0.95], DatenSpalte: [1, 1, 1, 1.01] },
{ SuchSpalte: [1], DatenSpalte: [1, 1, 1, 1] }
];
const dataBoxCHP = [
{ SuchSpalte: [0.1], DatenSpalte: [0.99, 1, 1, 1.01] },
{ SuchSpalte: [0.15], DatenSpalte: [0.99, 1, 1.01, 1.02] },
{ SuchSpalte: [0.2], DatenSpalte: [0.99, 1, 1.01, 1.02] },
{ SuchSpalte: [0.25], DatenSpalte: [0.98, 1, 1.01, 1.03] },
{ SuchSpalte: [0.3], DatenSpalte: [0.98, 1, 1.01, 1.03] },
{ SuchSpalte: [0.35], DatenSpalte: [0.97, 1, 1.02, 1.04] },
{ SuchSpalte: [0.4], DatenSpalte: [0.97, 0.99, 1.02, 1.04] },
{ SuchSpalte: [0.45], DatenSpalte: [0.97, 0.99, 1.02, 1.05] },
{ SuchSpalte: [0.5], DatenSpalte: [0.96, 0.99, 1.02, 1.06] },
{ SuchSpalte: [0.55], DatenSpalte: [0.96, 0.99, 1.03, 1.06] },
{ SuchSpalte: [0.6], DatenSpalte: [0.95, 0.99, 1.03, 1.07] },
{ SuchSpalte: [0.65], DatenSpalte: [0.95, 0.99, 1.03, 1.08] },
{ SuchSpalte: [0.7], DatenSpalte: [0.94, 0.99, 1.04, 1.08] },
{ SuchSpalte: [0.75], DatenSpalte: [0.94, 0.99, 1.04, 1.09] },
{ SuchSpalte: [0.8], DatenSpalte: [0.93, 0.99, 1.04, 1.1] },
{ SuchSpalte: [0.85], DatenSpalte: [0.93, 0.99, 1.05, 1.11] },
{ SuchSpalte: [0.9], DatenSpalte: [0.92, 0.99, 1.05, 1.11] },
{ SuchSpalte: [0.95], DatenSpalte: [0.92, 0.99, 1.05, 1.12] },
{ SuchSpalte: [1], DatenSpalte: [0.91, 0.98, 1.06, 1.13] }
];
const dataZeile = [ { DatenZeile: [1.05,1.1,1.15,1.2] } ];
const KorrekturfaktorAbweichendeErzeugerAufwandszahlenHP = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBoxHP);
const KorrekturfaktorAbweichendeErzeugerAufwandszahlenCHP = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBoxCHP);
return {
KorrekturfaktorAbweichendeErzeugerAufwandszahlenHP,
KorrekturfaktorAbweichendeErzeugerAufwandszahlenCHP
}
}

View File

@@ -2,6 +2,11 @@ import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisW
export function funktionKorrekturfaktorHilfsenergieErzeugungHolzhackSchnitzelT86(suchSpalte: number, datenZeile: number) { export function funktionKorrekturfaktorHilfsenergieErzeugungHolzhackSchnitzelT86(suchSpalte: number, datenZeile: number) {
if (suchSpalte < 5) { suchSpalte = 5; }
if (suchSpalte > 400) { suchSpalte = 400; }
if (datenZeile < 0.1) { datenZeile = 0.1; }
if (datenZeile > 1) { datenZeile = 1; }
const dataBox = [ const dataBox = [
{ SuchSpalte: [5], DatenSpalte: [2.9, 3.1, 3.3, 2.3, 1.8, 1.5, 1.4, 1.3, 1.2, 1.1] }, { SuchSpalte: [5], DatenSpalte: [2.9, 3.1, 3.3, 2.3, 1.8, 1.5, 1.4, 1.3, 1.2, 1.1] },
{ SuchSpalte: [10], DatenSpalte: [2.3, 2.2, 2.2, 1.8, 1.6, 1.5, 1.4, 1.3, 1.2, 1.2] }, { SuchSpalte: [10], DatenSpalte: [2.3, 2.2, 2.2, 1.8, 1.6, 1.5, 1.4, 1.3, 1.2, 1.2] },

View File

@@ -2,6 +2,11 @@ import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisW
export function funktionKorrekturfaktorHilfsenergieErzeugungGasSpezialHeizkesselT84(suchSpalte: number, datenZeile: number) { export function funktionKorrekturfaktorHilfsenergieErzeugungGasSpezialHeizkesselT84(suchSpalte: number, datenZeile: number) {
if (suchSpalte < 5) { suchSpalte = 5; }
if (suchSpalte > 400) { suchSpalte = 400; }
if (datenZeile < 0.1) { datenZeile = 0.1; }
if (datenZeile > 1) { datenZeile = 1; }
const dataBox = [ const dataBox = [
{ SuchSpalte: [5], DatenSpalte: [0.808, 0.700, 0.631, 0.564, 0.521, 0.491, 0.469, 0.452, 0.439, 0.428] }, { SuchSpalte: [5], DatenSpalte: [0.808, 0.700, 0.631, 0.564, 0.521, 0.491, 0.469, 0.452, 0.439, 0.428] },
{ SuchSpalte: [15], DatenSpalte: [0.665, 0.526, 0.450, 0.405, 0.375, 0.355, 0.340, 0.329, 0.320, 0.313] }, { SuchSpalte: [15], DatenSpalte: [0.665, 0.526, 0.450, 0.405, 0.375, 0.355, 0.340, 0.329, 0.320, 0.313] },

View File

@@ -31,5 +31,5 @@ export function funktionKorrekturfaktorMittlereBelastungT32(verteilung: string,
return KorrekturfaktorMittlereBelastung; return KorrekturfaktorMittlereBelastung;
} }
const result = funktionKorrekturfaktorMittlereBelastungT32("Verteilleitungen im beheizten Bereich", "IV (Strahlungs- und Luftheizung)", "35°C/28°C", 0.1); const result = funktionKorrekturfaktorMittlereBelastungT32("Verteilleitungen im beheizten Bereich", "IV (Strahlungs- und Luftheizung)", "35°C/28°C", 0.3);
console.log(result); console.log(result);

View File

@@ -2,6 +2,11 @@ import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisW
export function funktionKorrekturfaktorTemperaturDifferenzWaermePumpeT90(suchSpalte: number, datenZeile: number) { export function funktionKorrekturfaktorTemperaturDifferenzWaermePumpeT90(suchSpalte: number, datenZeile: number) {
if (suchSpalte < 3) { suchSpalte = 3; }
if (suchSpalte > 10) { suchSpalte = 10; }
if (datenZeile < 3) { datenZeile = 3; }
if (datenZeile > 15) { datenZeile = 15; }
const dataBox = [ const dataBox = [
{ SuchSpalte: [3], DatenSpalte: [1.000, 0.990, 0.980, 0.969, 0.959, 0.949, 0.939, 0.928, 0.918, 0.908, 0.898, 0.887, 0.877] }, { SuchSpalte: [3], DatenSpalte: [1.000, 0.990, 0.980, 0.969, 0.959, 0.949, 0.939, 0.928, 0.918, 0.908, 0.898, 0.887, 0.877] },
{ SuchSpalte: [4], DatenSpalte: [1.010, 1.000, 0.990, 0.980, 0.969, 0.959, 0.949, 0.939, 0.928, 0.918, 0.908, 0.898, 0.887] }, { SuchSpalte: [4], DatenSpalte: [1.010, 1.000, 0.990, 0.980, 0.969, 0.959, 0.949, 0.939, 0.928, 0.918, 0.908, 0.898, 0.887] },

View File

@@ -1,177 +1,162 @@
// Funktion zur Berechnung des monatlichen Belastungsgrades aus Tabelle 9 EFH und Tabelle 11 MFH // Funktion zur Berechnung des monatlichen Belastungsgrades aus Tabelle 9 EFH und Tabelle 11 MFH
import { cubicSplineInterpolation } from "js-interpolate"; import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
let WohnEinheiten = 3; // aus Eingabeformular
let WohnEinheiten = 2;
let teilBeheizung = "mit Teilbeheizung";
const datasetEinfamilienHausMittlereBelastung = { const datasetEinfamilienHaus = {
Januar: { Januar: [
50: [ 0.557, 0.554, 0.55, 0.543, 0.536, 0.533, 0.531, 0.53, 0.53 ], { SuchSpalte: [50], DatenSpalte: [0.557, 0.554, 0.55, 0.543, 0.536, 0.533, 0.531, 0.53, 0.53] },
90: [ 0.562, 0.559, 0.555, 0.548, 0.541, 0.538, 0.536, 0.535, 0.535 ], { SuchSpalte: [90], DatenSpalte: [0.562, 0.559, 0.555, 0.548, 0.541, 0.538, 0.536, 0.535, 0.535] },
130: [ 0.567, 0.563, 0.56, 0.553, 0.545, 0.542, 0.54, 0.539, 0.539 ], { SuchSpalte: [130], DatenSpalte: [0.567, 0.563, 0.56, 0.553, 0.545, 0.542, 0.54, 0.539, 0.539] },
}, ],
Februar: { Februar: [
50: [ 0.531, 0.527, 0.524, 0.517, 0.51, 0.507, 0.505, 0.504, 0.505 ], { SuchSpalte: [50], DatenSpalte: [0.531, 0.527, 0.524, 0.517, 0.51, 0.507, 0.505, 0.504, 0.505] },
90: [ 0.536, 0.532, 0.529, 0.522, 0.515, 0.512, 0.51, 0.51, 0.509 ], { SuchSpalte: [90], DatenSpalte: [0.536, 0.532, 0.529, 0.522, 0.515, 0.512, 0.51, 0.51, 0.509] },
130: [ 0.54, 0.537, 0.533, 0.526, 0.52, 0.516, 0.515, 0.514, 0.513 ], { SuchSpalte: [130], DatenSpalte: [0.54, 0.537, 0.533, 0.526, 0.52, 0.516, 0.515, 0.514, 0.513] },
}, ],
März: { März: [
50: [ 0.448, 0.445, 0.443, 0.437, 0.431, 0.427, 0.427, 0.426, 0.426 ], { SuchSpalte: [50], DatenSpalte: [0.448, 0.445, 0.443, 0.437, 0.431, 0.427, 0.427, 0.426, 0.426] },
90: [ 0.453, 0.45, 0.447, 0.441, 0.436, 0.433, 0.431, 0.431, 0.43 ], { SuchSpalte: [90], DatenSpalte: [0.453, 0.45, 0.447, 0.441, 0.436, 0.433, 0.431, 0.431, 0.43] },
130: [ 0.457, 0.454, 0.451, 0.445, 0.439, 0.435, 0.435, 0.434, 0.434 ], { SuchSpalte: [130], DatenSpalte: [0.457, 0.454, 0.451, 0.445, 0.439, 0.435, 0.435, 0.434, 0.434] },
}, ],
April: { April: [
50: [ 0.317, 0.314, 0.313, 0.308, 0.305, 0.303, 0.302, 0.301, 0.301 ], { SuchSpalte: [50], DatenSpalte: [0.317, 0.314, 0.313, 0.308, 0.305, 0.303, 0.302, 0.301, 0.301] },
90: [ 0.32, 0.318, 0.316, 0.311, 0.307, 0.306, 0.305, 0.304, 0.304 ], { SuchSpalte: [90], DatenSpalte: [0.32, 0.318, 0.316, 0.311, 0.307, 0.306, 0.305, 0.304, 0.304] },
130: [ 0.322, 0.32, 0.318, 0.314, 0.31, 0.308, 0.307, 0.307, 0.306 ], { SuchSpalte: [130], DatenSpalte: [0.322, 0.32, 0.318, 0.314, 0.31, 0.308, 0.307, 0.307, 0.306] },
}, ],
Mai: { Mai: [
50: [ 0.173, 0.172, 0.171, 0.169, 0.166, 0.165, 0.165, 0.165, 0.164 ], { SuchSpalte: [50], DatenSpalte: [0.173, 0.172, 0.171, 0.169, 0.166, 0.165, 0.165, 0.165, 0.164] },
90: [ 0.175, 0.173, 0.172, 0.17, 0.168, 0.167, 0.166, 0.166, 0.166 ], { SuchSpalte: [90], DatenSpalte: [0.175, 0.173, 0.172, 0.17, 0.168, 0.167, 0.166, 0.166, 0.166] },
130: [ 0.176, 0.175, 0.174, 0.172, 0.169, 0.168, 0.168, 0.168, 0.167 ], { SuchSpalte: [130], DatenSpalte: [0.176, 0.175, 0.174, 0.172, 0.169, 0.168, 0.168, 0.168, 0.167] },
}, ],
Juni: { Juni: [
50: [ 0.097, 0.096, 0.096, 0.094, 0.093, 0.092, 0.092, 0.092, 0.092 ], { SuchSpalte: [50], DatenSpalte: [0.097, 0.096, 0.096, 0.094, 0.093, 0.092, 0.092, 0.092, 0.092] },
90: [ 0.098, 0.097, 0.096, 0.095, 0.094, 0.093, 0.093, 0.093, 0.093 ], { SuchSpalte: [90], DatenSpalte: [0.098, 0.097, 0.096, 0.095, 0.094, 0.093, 0.093, 0.093, 0.093] },
130: [ 0.098, 0.097, 0.096, 0.095, 0.094, 0.094, 0.094, 0.094, 0.094 ], { SuchSpalte: [130], DatenSpalte: [0.098, 0.097, 0.096, 0.095, 0.094, 0.094, 0.094, 0.094, 0.094] },
}, ],
Juli: { Juli: [
50: [ 0.029, 0.029, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028, 0.028 ], { SuchSpalte: [50], DatenSpalte: [0.029, 0.029, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028, 0.028] },
90: [ 0.03, 0.029, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028, 0.028 ], { SuchSpalte: [90], DatenSpalte: [0.03, 0.029, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028, 0.028] },
130: [ 0.03, 0.03, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028, 0.028 ], { SuchSpalte: [130], DatenSpalte: [0.03, 0.03, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028, 0.028] },
}, ],
August: { August: [
50: [ 0.041, 0.041, 0.041, 0.04, 0.04, 0.04, 0.039, 0.039, 0.039 ], { SuchSpalte: [50], DatenSpalte: [0.041, 0.041, 0.041, 0.04, 0.04, 0.04, 0.039, 0.039, 0.039] },
90: [ 0.041, 0.041, 0.041, 0.04, 0.04, 0.04, 0.039, 0.039, 0.039 ], { SuchSpalte: [90], DatenSpalte: [0.041, 0.041, 0.041, 0.04, 0.04, 0.04, 0.039, 0.039, 0.039] },
130: [ 0.042, 0.041, 0.041, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04 ], { SuchSpalte: [130], DatenSpalte: [0.042, 0.041, 0.041, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04] },
}, ],
September: { September: [
50: [ 0.167, 0.166, 0.165, 0.163, 0.161, 0.16, 0.159, 0.159, 0.159 ], { SuchSpalte: [50], DatenSpalte: [0.167, 0.166, 0.165, 0.163, 0.161, 0.16, 0.159, 0.159, 0.159] },
90: [ 0.169, 0.168, 0.167, 0.164, 0.162, 0.161, 0.161, 0.161, 0.16 ], { SuchSpalte: [90], DatenSpalte: [0.169, 0.168, 0.167, 0.164, 0.162, 0.161, 0.161, 0.161, 0.16] },
130: [ 0.17, 0.169, 0.168, 0.166, 0.164, 0.163, 0.162, 0.162, 0.162 ], { SuchSpalte: [130], DatenSpalte: [0.17, 0.169, 0.168, 0.166, 0.164, 0.163, 0.162, 0.162, 0.162] },
}, ],
Oktober: { Oktober: [
50: [ 0.308, 0.306, 0.304, 0.3, 0.296, 0.294, 0.293, 0.293, 0.293 ], { SuchSpalte: [50], DatenSpalte: [0.308, 0.306, 0.304, 0.3, 0.296, 0.294, 0.293, 0.293, 0.293] },
90: [ 0.311, 0.309, 0.307, 0.303, 0.299, 0.297, 0.296, 0.296, 0.295 ], { SuchSpalte: [90], DatenSpalte: [0.311, 0.309, 0.307, 0.303, 0.299, 0.297, 0.296, 0.296, 0.295] },
130: [ 0.313, 0.311, 0.309, 0.305, 0.301, 0.3, 0.299, 0.298, 0.298 ], { SuchSpalte: [130], DatenSpalte: [0.313, 0.311, 0.309, 0.305, 0.301, 0.3, 0.299, 0.298, 0.298] },
}, ],
November: { November: [
50: [ 0.466, 0.463, 0.46, 0.454, 0.448, 0.445, 0.444, 0.443, 0.443 ], { SuchSpalte: [50], DatenSpalte: [0.466, 0.463, 0.46, 0.454, 0.448, 0.445, 0.444, 0.443, 0.443] },
90: [ 0.471, 0.467, 0.465, 0.459, 0.453, 0.45, 0.448, 0.448, 0.447 ], { SuchSpalte: [90], DatenSpalte: [0.471, 0.467, 0.465, 0.459, 0.453, 0.45, 0.448, 0.448, 0.447] },
130: [ 0.474, 0.471, 0.469, 0.462, 0.456, 0.454, 0.453, 0.451, 0.451 ], { SuchSpalte: [130], DatenSpalte: [0.474, 0.471, 0.469, 0.462, 0.456, 0.454, 0.453, 0.451, 0.451] },
}, ],
Dezember: { Dezember: [
50: [ 0.56, 0.557, 0.553, 0.546, 0.539, 0.536, 0.534, 0.533, 0.533 ], { SuchSpalte: [50], DatenSpalte: [0.56, 0.557, 0.553, 0.546, 0.539, 0.536, 0.534, 0.533, 0.533] },
90: [ 0.565, 0.562, 0.558, 0.551, 0.544, 0.54, 0.539, 0.538, 0.537 ], { SuchSpalte: [90], DatenSpalte: [0.565, 0.562, 0.558, 0.551, 0.544, 0.54, 0.539, 0.538, 0.537] },
130: [ 0.57, 0.566, 0.563, 0.555, 0.548, 0.545, 0.543, 0.542, 0.542 ], { SuchSpalte: [130], DatenSpalte: [0.57, 0.566, 0.563, 0.555, 0.548, 0.545, 0.543, 0.542, 0.542] },
}, ],
}
const datasetMehrfamilienHausMittlereBelastung = {
Januar: {
50: [0.575, 0.574, 0.573, 0.570, 0.567, 0.566, 0.566, 0.565, 0.565],
90: [0.578, 0.577, 0.575, 0.573, 0.570, 0.569, 0.568, 0.568, 0.568],
130: [0.580, 0.579, 0.578, 0.575, 0.572, 0.571, 0.571, 0.570, 0.570],
},
Februar: {
50: [0.548, 0.547, 0.546, 0.543, 0.541, 0.539, 0.539, 0.538, 0.538],
90: [0.551, 0.549, 0.548, 0.546, 0.543, 0.542, 0.541, 0.541, 0.541],
130: [0.553, 0.552, 0.550, 0.548, 0.545, 0.544, 0.543, 0.543, 0.543],
},
März: {
50: [0.463, 0.462, 0.461, 0.459, 0.457, 0.456, 0.455, 0.455, 0.455],
90: [0.465, 0.464, 0.463, 0.461, 0.459, 0.458, 0.458, 0.457, 0.457],
130: [0.467, 0.466, 0.465, 0.463, 0.461, 0.460, 0.459, 0.459, 0.459],
},
April: {
50: [0.327, 0.326, 0.326, 0.324, 0.323, 0.322, 0.321, 0.321, 0.321],
90: [0.329, 0.328, 0.327, 0.326, 0.324, 0.323, 0.323, 0.323, 0.323],
130: [0.330, 0.329, 0.328, 0.327, 0.325, 0.325, 0.324, 0.324, 0.324],
},
Mai: {
50: [0.179, 0.178, 0.178, 0.177, 0.176, 0.176, 0.176, 0.176, 0.175],
90: [0.179, 0.179, 0.179, 0.178, 0.177, 0.177, 0.176, 0.176, 0.176],
130: [0.180, 0.180, 0.179, 0.179, 0.178, 0.177, 0.177, 0.177, 0.177],
},
Juni: {
50: [0.100, 0.100, 0.099, 0.099, 0.099, 0.098, 0.098, 0.098, 0.098],
90: [0.100, 0.100, 0.100, 0.099, 0.099, 0.099, 0.099, 0.099, 0.099],
130: [0.101, 0.101, 0.100, 0.100, 0.099, 0.099, 0.099, 0.099, 0.099],
},
Juli: {
50: [0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030],
90: [0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030],
130: [0.031, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030],
},
August: {
50: [0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042],
90: [0.043, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042],
130: [0.043, 0.043, 0.043, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042],
},
September: {
50: [0.173, 0.172, 0.172, 0.171, 0.170, 0.170, 0.170, 0.170, 0.170],
90: [0.173, 0.173, 0.173, 0.172, 0.171, 0.171, 0.170, 0.170, 0.170],
130: [0.174, 0.174, 0.173, 0.173, 0.172, 0.171, 0.171, 0.171, 0.171],
},
Oktober: {
50: [0.318, 0.317, 0.317, 0.315, 0.314, 0.313, 0.313, 0.312, 0.312],
90: [0.319, 0.319, 0.318, 0.317, 0.315, 0.314, 0.314, 0.314, 0.314],
130: [0.321, 0.320, 0.319, 0.318, 0.316, 0.316, 0.315, 0.315, 0.315],
},
November: {
50: [0.481, 0.480, 0.479, 0.477, 0.475, 0.474, 0.473, 0.473, 0.473],
90: [0.484, 0.483, 0.482, 0.479, 0.477, 0.476, 0.476, 0.475, 0.475],
130: [0.486, 0.485, 0.484, 0.481, 0.479, 0.478, 0.477, 0.477, 0.477],
},
Dezember: {
50: [0.578, 0.577, 0.576, 0.573, 0.570, 0.569, 0.569, 0.568, 0.568],
90: [0.581, 0.580, 0.578, 0.576, 0.573, 0.572, 0.571, 0.571, 0.571],
130: [0.583, 0.582, 0.581, 0.578, 0.575, 0.574, 0.574, 0.573, 0.573],
},
}; };
function getDatasetBelastung(WohnEinheiten: number) { const datasetMehrfamilienHaus = {
if (WohnEinheiten < 3) { Januar: [
return datasetEinfamilienHausMittlereBelastung; { SuchSpalte: [50], DatenSpalte: [0.575, 0.574, 0.573, 0.570, 0.567, 0.566, 0.566, 0.565, 0.565] },
} else { { SuchSpalte: [90], DatenSpalte: [0.578, 0.577, 0.575, 0.573, 0.570, 0.569, 0.568, 0.568, 0.568] },
return datasetMehrfamilienHausMittlereBelastung; { SuchSpalte: [130], DatenSpalte: [0.580, 0.579, 0.578, 0.575, 0.572, 0.571, 0.571, 0.570, 0.570] },
} ],
} Februar: [
{ SuchSpalte: [50], DatenSpalte: [0.548, 0.547, 0.546, 0.543, 0.541, 0.539, 0.539, 0.538, 0.538] },
{ SuchSpalte: [90], DatenSpalte: [0.551, 0.549, 0.548, 0.546, 0.543, 0.542, 0.541, 0.541, 0.541] },
{ SuchSpalte: [130], DatenSpalte: [0.553, 0.552, 0.550, 0.548, 0.545, 0.544, 0.543, 0.543, 0.543] },
],
März: [
{ SuchSpalte: [50], DatenSpalte: [0.463, 0.462, 0.461, 0.459, 0.457, 0.456, 0.455, 0.455, 0.455] },
{ SuchSpalte: [90], DatenSpalte: [0.465, 0.464, 0.463, 0.461, 0.459, 0.458, 0.458, 0.457, 0.457] },
{ SuchSpalte: [130], DatenSpalte: [0.467, 0.466, 0.465, 0.463, 0.461, 0.460, 0.459, 0.459, 0.459] },
],
April: [
{ SuchSpalte: [50], DatenSpalte: [0.327, 0.326, 0.326, 0.324, 0.323, 0.322, 0.321, 0.321, 0.321] },
{ SuchSpalte: [90], DatenSpalte: [0.329, 0.328, 0.327, 0.326, 0.324, 0.323, 0.323, 0.323, 0.323] },
{ SuchSpalte: [130], DatenSpalte: [0.330, 0.329, 0.328, 0.327, 0.325, 0.325, 0.324, 0.324, 0.324] },
],
Mai: [
{ SuchSpalte: [50], DatenSpalte: [0.179, 0.178, 0.178, 0.177, 0.176, 0.176, 0.176, 0.176, 0.175] },
{ SuchSpalte: [90], DatenSpalte: [0.179, 0.179, 0.179, 0.178, 0.177, 0.177, 0.176, 0.176, 0.176] },
{ SuchSpalte: [130], DatenSpalte: [0.180, 0.180, 0.179, 0.179, 0.178, 0.177, 0.177, 0.177, 0.177] },
],
Juni: [
{ SuchSpalte: [50], DatenSpalte: [0.100, 0.100, 0.099, 0.099, 0.099, 0.098, 0.098, 0.098, 0.098] },
{ SuchSpalte: [90], DatenSpalte: [0.100, 0.100, 0.100, 0.099, 0.099, 0.099, 0.099, 0.099, 0.099] },
{ SuchSpalte: [130], DatenSpalte: [0.101, 0.101, 0.100, 0.100, 0.099, 0.099, 0.099, 0.099, 0.099] },
],
Juli: [
{ SuchSpalte: [50], DatenSpalte: [0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030] },
{ SuchSpalte: [90], DatenSpalte: [0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030] },
{ SuchSpalte: [130], DatenSpalte: [0.031, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030] },
],
August: [
{ SuchSpalte: [50], DatenSpalte: [0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042] },
{ SuchSpalte: [90], DatenSpalte: [0.043, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042] },
{ SuchSpalte: [130], DatenSpalte: [0.043, 0.043, 0.043, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042] },
],
September: [
{ SuchSpalte: [50], DatenSpalte: [0.173, 0.172, 0.172, 0.171, 0.170, 0.170, 0.170, 0.170, 0.170] },
{ SuchSpalte: [90], DatenSpalte: [0.173, 0.173, 0.173, 0.172, 0.171, 0.171, 0.170, 0.170, 0.170] },
{ SuchSpalte: [130], DatenSpalte: [0.174, 0.174, 0.173, 0.173, 0.172, 0.171, 0.171, 0.171, 0.171] },
],
Oktober: [
{ SuchSpalte: [50], DatenSpalte: [0.318, 0.317, 0.317, 0.315, 0.314, 0.313, 0.313, 0.312, 0.312] },
{ SuchSpalte: [90], DatenSpalte: [0.319, 0.319, 0.318, 0.317, 0.315, 0.314, 0.314, 0.314, 0.314] },
{ SuchSpalte: [130], DatenSpalte: [0.321, 0.320, 0.319, 0.318, 0.316, 0.316, 0.315, 0.315, 0.315] },
],
November: [
{ SuchSpalte: [50], DatenSpalte: [0.481, 0.480, 0.479, 0.477, 0.475, 0.474, 0.473, 0.473, 0.473] },
{ SuchSpalte: [90], DatenSpalte: [0.484, 0.483, 0.482, 0.479, 0.477, 0.476, 0.476, 0.475, 0.475] },
{ SuchSpalte: [130], DatenSpalte: [0.486, 0.485, 0.484, 0.481, 0.479, 0.478, 0.477, 0.477, 0.477] },
],
Dezember: [
{ SuchSpalte: [50], DatenSpalte: [0.578, 0.577, 0.576, 0.573, 0.570, 0.569, 0.569, 0.568, 0.568] },
{ SuchSpalte: [90], DatenSpalte: [0.581, 0.580, 0.578, 0.576, 0.573, 0.572, 0.571, 0.571, 0.571] },
{ SuchSpalte: [130], DatenSpalte: [0.583, 0.582, 0.581, 0.578, 0.575, 0.574, 0.574, 0.573, 0.573] },
],
};
const dataset = getDatasetBelastung(WohnEinheiten); function getDataset(WohnEinheiten: number) {
if (WohnEinheiten < 3) {
return datasetEinfamilienHaus;
} else {
return datasetMehrfamilienHaus;
}
}
const dataset = getDataset(WohnEinheiten);
// Für "Ohne Teilbeheizung" habe ich hier einfach 0 eingesetzt: // Für "Ohne Teilbeheizung" habe ich hier einfach 0 eingesetzt:
const HeizLast = [0, 5, 10, 25, 50, 75, 100, 125, 150]; const dataZeile = [{ DatenZeile: [0, 5, 10, 25, 50, 75, 100, 125, 150] }];
// Um über die beiden Tabellen zu interpolieren können wir einfach zuerst über
// jede einzeln interpolieren und dann zwischen den Tabellen interpolieren.
// Falls wir also den Wert an Stelle Heizlast: 120, Zeitkonstante 100, Monat:
// Januar haben wollen:
export function funktionMonatlicherBelastungsgradT9T11 (heizlast: number, zeitkonstane: number, monat: keyof typeof dataset) {
const data = dataset[monat]
const interpolations: number[] = [] export function funktionMonatlicherBelastungsgradT9T11(datenZeile: number, suchSpalte: number, monat: keyof typeof dataset): number {
for (const key in data) { if (teilBeheizung === "ohne Teilbeheizung") {datenZeile = 0;}
const values = data[key as unknown as keyof typeof data]
const interpolated = cubicSplineInterpolation( if (suchSpalte < 50) { suchSpalte = 50; }
values.map((value, i) => ({ x: HeizLast[i], y: value })), if (suchSpalte > 130) { suchSpalte = 130; }
heizlast if (datenZeile < 5) { datenZeile = 5; }
) if (datenZeile > 150) { datenZeile = 150; }
interpolations.push(interpolated) const dataBox = dataset[monat]
} const MonatlicherBelastungsgradT9T11 = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
return MonatlicherBelastungsgradT9T11;
const interpolated = cubicSplineInterpolation(
interpolations.map((interpolation, i) => {
return {
x: Object.keys(data)[i],
y: interpolation
}
}),
zeitkonstane
)
return interpolated
} }

View File

@@ -1,74 +0,0 @@
// Interpolationsfunktion für Nennleistung des Wärmeerzeugers
interface DatasetNennleistung {
flaeche: number[];
Nennleistung: number[];
}
interface DatasetNutzwaermeBedarf {
NutzwaermeBedarf: number[];
}
const datasetNennleistung: DatasetNennleistung[] = [
{ flaeche: [50], Nennleistung: [7.5, 7.3, 7.1, 7, 6.8, 6.6, 6.4, 6.3, 6.1, 5.9, 5.7, 5.6, 5.4, 5.2, 5, 4.8] },
{ flaeche: [100], Nennleistung: [12.1, 11.8, 11.6, 11.3, 11, 10.8, 10.5, 10.2, 9.9, 9.6, 9.3, 9, 8.7, 8.4, 8.1, 7.8] },
{ flaeche: [150], Nennleistung: [16.1, 15.7, 15.4, 15, 14.6, 14.3, 13.9, 13.5, 13.1, 12.8, 12.4, 12, 11.6, 11.2, 10.8, 10.3] },
{ flaeche: [200], Nennleistung: [19.7, 19.2, 18.8, 18.4, 17.9, 17.5, 17, 16.5, 16.1, 15.6, 15.1, 14.6, 14.2, 13.7, 13.1, 12.6] },
{ flaeche: [300], Nennleistung: [26.1, 25.6, 25, 24.4, 23.8, 23.2, 22.6, 22, 21.4, 20.7, 20.1, 19.5, 18.8, 18.1, 17.5, 16.8] },
{ flaeche: [400], Nennleistung: [32, 31.3, 30.5, 29.8, 29.1, 28.4, 27.6, 26.9, 26.1, 25.4, 24.6, 23.8, 23, 22.2, 21.4, 20.5] },
{ flaeche: [500], Nennleistung: [37.4, 36.5, 35.7, 34.9, 34, 33.2, 32.3, 31.4, 30.5, 29.6, 28.7, 27.8, 26.9, 25.9, 25, 24] },
{ flaeche: [600], Nennleistung: [42.4, 41.5, 40.6, 39.6, 38.7, 37.7, 36.7, 35.7, 34.7, 33.7, 32.7, 31.6, 30.5, 29.5, 28.4, 27.3] },
{ flaeche: [700], Nennleistung: [47.3, 46.2, 45.2, 44.1, 43.1, 42, 40.9, 39.8, 38.7, 37.5, 36.4, 35.2, 34, 32.8, 31.6, 30.4] },
{ flaeche: [800], Nennleistung: [51.9, 50.8, 49.6, 48.5, 47.3, 46.1, 44.9, 43.7, 42.4, 41.2, 39.9, 38.7, 37.4, 36, 34.7, 33.3] },
{ flaeche: [900], Nennleistung: [56.4, 55.1, 53.9, 52.6, 51.3, 50.1, 48.7, 47.4, 46.1, 44.7, 43.4, 42, 40.6, 39.1, 37.7, 36.2] },
{ flaeche: [1000], Nennleistung: [60.7, 59.4, 58, 56.6, 55.3, 53.9, 52.5, 51.1, 49.6, 48.2, 46.7, 45.2, 43.7, 42.1, 40.6, 39] },
{ flaeche: [2000], Nennleistung: [98.6, 96.4, 94.2, 92, 89.8, 87.5, 85.3, 82.9, 80.6, 78.2, 75.8, 73.4, 71, 68.4, 65.9, 63.3] },
{ flaeche: [3000], Nennleistung: [130.9, 128.1, 125.2, 122.2, 119.3, 116.3, 113.2, 110.2, 107.1, 103.9, 100.7, 97.5, 94.2, 90.9, 87.5, 84.1] },
{ flaeche: [4000], Nennleistung: [160.2, 156.6, 153.1, 149.5, 145.9, 142.2, 138.5, 134.7, 130.9, 127.1, 123.2, 119.3, 115.3, 111.2, 107.1, 102.9] },
{ flaeche: [5000], Nennleistung: [187.2, 183.1, 179, 174.8, 170.5, 166.2, 161.9, 157.5, 153.1, 148.6, 144, 139.4, 134.7, 130, 125.2, 120.3] }
];
const datasetNutzwaermeBedarf: DatasetNutzwaermeBedarf[] = [
{ NutzwaermeBedarf: [16, 15.5, 15, 14.5, 14, 13.5, 13, 12.5, 12, 11.5, 11, 10.5, 10, 9.5, 9, 8.5] }
];
export function funktionNennleistungWaermeerzeugerWarmwasserA14(flaeche: number, nutzwaermeBedarf: number): number {
const findClosestDatasets = (flaeche: number) => {
let lower = datasetNennleistung[0];
let upper = datasetNennleistung[datasetNennleistung.length - 1];
for (let i = 0; i < datasetNennleistung.length - 1; i++) {
if (datasetNennleistung[i].flaeche[0] <= flaeche && datasetNennleistung[i + 1].flaeche[0] >= flaeche) {
lower = datasetNennleistung[i];
upper = datasetNennleistung[i + 1];
break;
}
}
return { lower, upper };
};
const interpolate = (x: number, x0: number, y0: number, x1: number, y1: number) => {
return y0 + ((y1 - y0) * (x - x0)) / (x1 - x0);
};
const { lower, upper } = findClosestDatasets(flaeche);
const indexLower = datasetNutzwaermeBedarf[0].NutzwaermeBedarf.findIndex((value) => value <= nutzwaermeBedarf);
const indexUpper = indexLower > 0 ? indexLower - 1 : indexLower;
const nennleistungLowerLower = lower.Nennleistung[indexLower];
const nennleistungLowerUpper = lower.Nennleistung[indexUpper];
const nennleistungUpperLower = upper.Nennleistung[indexLower];
const nennleistungUpperUpper = upper.Nennleistung[indexUpper];
const interpolatedLower = interpolate(nutzwaermeBedarf, datasetNutzwaermeBedarf[0].NutzwaermeBedarf[indexUpper], nennleistungLowerUpper, datasetNutzwaermeBedarf[0].NutzwaermeBedarf[indexLower], nennleistungLowerLower);
const interpolatedUpper = interpolate(nutzwaermeBedarf, datasetNutzwaermeBedarf[0].NutzwaermeBedarf[indexUpper], nennleistungUpperUpper, datasetNutzwaermeBedarf[0].NutzwaermeBedarf[indexLower], nennleistungUpperLower);
const NennleistungWaermeerzeugerWarmwasser = interpolate(flaeche, lower.flaeche[0], interpolatedLower, upper.flaeche[0], interpolatedUpper);
return NennleistungWaermeerzeugerWarmwasser;
}
const result = funktionNennleistungWaermeerzeugerWarmwasserA14(154.2, 8.79);
console.log(result);

View File

@@ -0,0 +1,35 @@
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
export function funktionNennleistungWaermeerzeugerWarmwasserT139(suchSpalte: number, datenZeile: number) {
if (suchSpalte < 50) { suchSpalte = 50; }
if (suchSpalte > 5000) { suchSpalte = 5000; }
if (datenZeile < 8.5) { datenZeile = 8.5; }
if (datenZeile > 16) { datenZeile = 16; }
const dataBox = [
{ SuchSpalte: [50], DatenSpalte: [7.5, 7.3, 7.1, 7, 6.8, 6.6, 6.4, 6.3, 6.1, 5.9, 5.7, 5.6, 5.4, 5.2, 5, 4.8] },
{ SuchSpalte: [100], DatenSpalte: [12.1, 11.8, 11.6, 11.3, 11, 10.8, 10.5, 10.2, 9.9, 9.6, 9.3, 9, 8.7, 8.4, 8.1, 7.8] },
{ SuchSpalte: [150], DatenSpalte: [16.1, 15.7, 15.4, 15, 14.6, 14.3, 13.9, 13.5, 13.1, 12.8, 12.4, 12, 11.6, 11.2, 10.8, 10.3] },
{ SuchSpalte: [200], DatenSpalte: [19.7, 19.2, 18.8, 18.4, 17.9, 17.5, 17, 16.5, 16.1, 15.6, 15.1, 14.6, 14.2, 13.7, 13.1, 12.6] },
{ SuchSpalte: [300], DatenSpalte: [26.1, 25.6, 25, 24.4, 23.8, 23.2, 22.6, 22, 21.4, 20.7, 20.1, 19.5, 18.8, 18.1, 17.5, 16.8] },
{ SuchSpalte: [400], DatenSpalte: [32, 31.3, 30.5, 29.8, 29.1, 28.4, 27.6, 26.9, 26.1, 25.4, 24.6, 23.8, 23, 22.2, 21.4, 20.5] },
{ SuchSpalte: [500], DatenSpalte: [37.4, 36.5, 35.7, 34.9, 34, 33.2, 32.3, 31.4, 30.5, 29.6, 28.7, 27.8, 26.9, 25.9, 25, 24] },
{ SuchSpalte: [600], DatenSpalte: [42.4, 41.5, 40.6, 39.6, 38.7, 37.7, 36.7, 35.7, 34.7, 33.7, 32.7, 31.6, 30.5, 29.5, 28.4, 27.3] },
{ SuchSpalte: [700], DatenSpalte: [47.3, 46.2, 45.2, 44.1, 43.1, 42, 40.9, 39.8, 38.7, 37.5, 36.4, 35.2, 34, 32.8, 31.6, 30.4] },
{ SuchSpalte: [800], DatenSpalte: [51.9, 50.8, 49.6, 48.5, 47.3, 46.1, 44.9, 43.7, 42.4, 41.2, 39.9, 38.7, 37.4, 36, 34.7, 33.3] },
{ SuchSpalte: [900], DatenSpalte: [56.4, 55.1, 53.9, 52.6, 51.3, 50.1, 48.7, 47.4, 46.1, 44.7, 43.4, 42, 40.6, 39.1, 37.7, 36.2] },
{ SuchSpalte: [1000], DatenSpalte: [60.7, 59.4, 58, 56.6, 55.3, 53.9, 52.5, 51.1, 49.6, 48.2, 46.7, 45.2, 43.7, 42.1, 40.6, 39] },
{ SuchSpalte: [2000], DatenSpalte: [98.6, 96.4, 94.2, 92, 89.8, 87.5, 85.3, 82.9, 80.6, 78.2, 75.8, 73.4, 71, 68.4, 65.9, 63.3] },
{ SuchSpalte: [3000], DatenSpalte: [130.9, 128.1, 125.2, 122.2, 119.3, 116.3, 113.2, 110.2, 107.1, 103.9, 100.7, 97.5, 94.2, 90.9, 87.5, 84.1] },
{ SuchSpalte: [4000], DatenSpalte: [160.2, 156.6, 153.1, 149.5, 145.9, 142.2, 138.5, 134.7, 130.9, 127.1, 123.2, 119.3, 115.3, 111.2, 107.1, 102.9] },
{ SuchSpalte: [5000], DatenSpalte: [187.2, 183.1, 179, 174.8, 170.5, 166.2, 161.9, 157.5, 153.1, 148.6, 144, 139.4, 134.7, 130, 125.2, 120.3] }
];
const dataZeile = [ { DatenZeile: [16, 15.5, 15, 14.5, 14, 13.5, 13, 12.5, 12, 11.5, 11, 10.5, 10, 9.5, 9, 8.5] } ];
const NennleistungWaermeerzeugerWarmwasser = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
return NennleistungWaermeerzeugerWarmwasser;
}

View File

@@ -0,0 +1,37 @@
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
export function funktionPrimaerenergieFaktorenKraftWaermekopplungT108(suchSpalte: number, datenZeile: number) {
if (suchSpalte < 0.1) { suchSpalte = 0.1; }
if (suchSpalte > 1) { suchSpalte = 1; }
if (datenZeile < 0.1) { datenZeile = 0.1; }
if (datenZeile > 1) { datenZeile = 1; }
const dataBox = [
{ SuchSpalte: [0.1], DatenSpalte: [1.171, 1.155, 1.139, 1.123, 1.108, 1.092, 1.076, 1.06, 1.044, 1.029] },
{ SuchSpalte: [0.15], DatenSpalte: [1.165, 1.141, 1.117, 1.094, 1.07, 1.046, 1.023, 0.999, 0.975, 0.952] },
{ SuchSpalte: [0.2], DatenSpalte: [1.159, 1.127, 1.096, 1.064, 1.033, 1.001, 0.97, 0.938, 0.906, 0.875] },
{ SuchSpalte: [0.25], DatenSpalte: [1.153, 1.114, 1.074, 1.035, 0.995, 0.956, 0.916, 0.877, 0.837, 0.798] },
{ SuchSpalte: [0.3], DatenSpalte: [1.147, 1.1, 1.052, 1.005, 0.958, 0.91, 0.863, 0.816, 0.768, 0.721] },
{ SuchSpalte: [0.35], DatenSpalte: [1.141, 1.086, 1.031, 0.975, 0.92, 0.865, 0.81, 0.755, 0.699, 0.644] },
{ SuchSpalte: [0.4], DatenSpalte: [1.135, 1.072, 1.009, 0.946, 0.883, 0.82, 0.757, 0.693, 0.63, 0.567] },
{ SuchSpalte: [0.45], DatenSpalte: [1.129, 1.058, 0.987, 0.916, 0.845, 0.774, 0.703, 0.632, 0.561, 0.49] },
{ SuchSpalte: [0.5], DatenSpalte: [1.123, 1.045, 0.966, 0.887, 0.808, 0.729, 0.65, 0.571, 0.492, 0.413] },
{ SuchSpalte: [0.55], DatenSpalte: [1.117, 1.031, 0.944, 0.857, 0.77, 0.684, 0.597, 0.51, 0.423, 0.336] },
{ SuchSpalte: [0.6], DatenSpalte: [1.112, 1.017, 0.922, 0.828, 0.733, 0.638, 0.544, 0.449, 0.354, 0.26] },
{ SuchSpalte: [0.65], DatenSpalte: [1.106, 1.003, 0.901, 0.798, 0.695, 0.593, 0.49, 0.388, 0.285, 0.183] },
{ SuchSpalte: [0.7], DatenSpalte: [1.1, 0.989, 0.879, 0.768, 0.658, 0.548, 0.437, 0.327, 0.216, 0.106] },
{ SuchSpalte: [0.75], DatenSpalte: [1.094, 0.976, 0.857, 0.739, 0.62, 0.502, 0.384, 0.265, 0.147, 0.029] },
{ SuchSpalte: [0.8], DatenSpalte: [1.088, 0.962, 0.835, 0.709, 0.583, 0.457, 0.331, 0.204, 0.078, 0] },
{ SuchSpalte: [0.85], DatenSpalte: [1.082, 0.948, 0.814, 0.68, 0.546, 0.411, 0.277, 0.143, 0.009, 0] },
{ SuchSpalte: [0.9], DatenSpalte: [1.076, 0.934, 0.792, 0.65, 0.508, 0.366, 0.224, 0.082, 0, 0] },
{ SuchSpalte: [0.95], DatenSpalte: [1.07, 0.92, 0.77, 0.621, 0.471, 0.321, 0.171, 0.021, 0, 0] },
{ SuchSpalte: [1], DatenSpalte: [1.064, 0.907, 0.749, 0.591, 0.433, 0.275, 0.118, 0, 0, 0] }
];
const dataZeile = [ { DatenZeile: [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1] } ];
const PrimaerenergieFaktorenKraftWaermekopplung = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
return PrimaerenergieFaktorenKraftWaermekopplung;
}

View File

@@ -48,13 +48,15 @@
<span class="font-semibold">Falls sie ein Konto bei uns haben wurde eine Email an sie verschickt.</span> <span class="font-semibold">Falls sie ein Konto bei uns haben wurde eine Email an sie verschickt.</span>
</div> </div>
{/if} {/if}
<button type="submit" class="btn btn-primary" <button type="submit" class="button"
>Email zum Zurücksetzen des Passworts senden.</button >Email zum Zurücksetzen des Passworts senden.</button
> >
{#if showEmailSuccess}
<div class="flex-row justify-between" style="margin-top: 10px"> <div class="flex-row justify-between" style="margin-top: 10px">
<a class="link link-hover" <a class="link link-hover"
href="/auth/login{redirect ? `?redirect=${redirect}` : ""}">Einloggen</a href="/auth/login{redirect ? `?redirect=${redirect}` : ""}">Einloggen</a
> >
</div> </div>
{/if}
</form> </form>
</div> </div>

View File

@@ -70,14 +70,9 @@
required required
/> />
</div> </div>
<button type="submit" class="btn btn-primary" <button type="submit" class="button"
>Passwort zurückzusetzen</button >Passwort zurückzusetzen</button
> >
<div class="flex-row justify-between" style="margin-top: 10px">
<a class="link link-hover"
href="/auth/login">Einloggen</a
>
</div>
</form> </form>
</div> </div>

View File

@@ -1,18 +1,31 @@
<script lang="ts"> <script lang="ts">
import { import {
AufnahmeClient,
ObjektClient,
UploadedGebaeudeBild,
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "#components/Ausweis/types"; } from "#components/Ausweis/types.js";
import AusweisPruefenBox from "#components/AusweisPruefenBox.svelte"; import AusweisPruefenBox from "#components/AusweisPruefenBox.svelte";
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte"; import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016"; import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import AusweisPruefenNotification from "#components/AusweisPruefenNotification.svelte"; import AusweisPruefenNotification from "#components/AusweisPruefenNotification.svelte";
import { Event } from "@ibcornelsen/database/client";
export let ausweise: {
ausweis: VerbrauchsausweisWohnenClient,
aufnahme: AufnahmeClient,
objekt: ObjektClient,
bilder: UploadedGebaeudeBild[],
events: Event[]
}[];
console.log(ausweise);
export let ausweise: VerbrauchsausweisWohnenClient[];
</script> </script>
<div class="gap-4 flex flex-col"> <div class="gap-4 flex flex-col">
{#each ausweise as ausweis} {#each ausweise as { ausweis, objekt, aufnahme, bilder, events }}
{#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis)} {#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt)}
<div class="rounded-lg border w-full h-20 p-2.5 gap-4 flex flex-row items-center"> <div class="rounded-lg border w-full h-20 p-2.5 gap-4 flex flex-row items-center">
<div class="w-1/12 h-full flex flex-col gap-2"> <div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-8 h-8 rounded-full"></div> <div class="skeleton w-8 h-8 rounded-full"></div>
@@ -85,7 +98,7 @@
<div class="skeleton w-4 h-4"></div> <div class="skeleton w-4 h-4"></div>
</div> </div>
{:then calculations} {:then calculations}
<AusweisPruefenBox {ausweis} {calculations}></AusweisPruefenBox> <AusweisPruefenBox {ausweis} {aufnahme} {objekt} {bilder} {events} {calculations}></AusweisPruefenBox>
{/await} {/await}
{/each} {/each}
</div> </div>

View File

@@ -3,9 +3,6 @@
export let user: BenutzerClient; export let user: BenutzerClient;
export let objekte: ObjektClient[]; export let objekte: ObjektClient[];
console.log(objekte);
</script> </script>
<h1 class="text-4xl font-medium my-8">Willkommen zurück, {user.vorname}!</h1> <h1 class="text-4xl font-medium my-8">Willkommen zurück, {user.vorname}!</h1>

View File

@@ -10,6 +10,7 @@
import { BenutzerClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { BenutzerClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { PRICES } from "#lib/constants.js"; import { PRICES } from "#lib/constants.js";
import { RechnungClient } from "#components/Ausweis/types.js"; import { RechnungClient } from "#components/Ausweis/types.js";
import { api } from "astro-typesafe-api/client";
export let user: BenutzerClient; export let user: BenutzerClient;
export let ausweis: export let ausweis:
@@ -62,17 +63,21 @@
e.preventDefault(); e.preventDefault();
// TODO // TODO
const response = await client.v1.rechnungen.erstellen.mutate({ const response = await api.rechnung.PUT.fetch({
...rechnung, ...rechnung,
ausweisart: Enums.Ausweisart.VerbrauchsausweisWohnen, ausweisart: Enums.Ausweisart.VerbrauchsausweisWohnen,
uid: ausweis.uid, ausweis_uid: ausweis.uid,
bezahlmethode: selectedPaymentType, bezahlmethode: selectedPaymentType,
services: services services: services
.filter((service) => service.selected) .filter((service) => service.selected)
.map((service) => service.id), .map((service) => service.id),
}); });
window.location.href = response.checkout_url; if (selectedPaymentType === Enums.Bezahlmethoden.rechnung) {
window.location.href = `/payment/success?uid=${response.uid}`
} else {
window.location.href = response.checkout_url as string;
}
} }
const priceTotal = services.reduce((acc, service) => { const priceTotal = services.reduce((acc, service) => {

View File

@@ -5,9 +5,6 @@
import Ansprechpartner from "#components/Ausweis/Ansprechpartner.svelte"; import Ansprechpartner from "#components/Ausweis/Ansprechpartner.svelte";
import Rechnungsadresse from "#components/Ausweis/Rechnungsadresse.svelte"; import Rechnungsadresse from "#components/Ausweis/Rechnungsadresse.svelte";
import Bezahlung from "#components/Ausweis/Bezahlung.svelte"; import Bezahlung from "#components/Ausweis/Bezahlung.svelte";
import Pruefung from "#components/Ausweis/Pruefung.svelte";
import type { Bezahlmethoden } from "@ibcornelsen/database/client"; import type { Bezahlmethoden } from "@ibcornelsen/database/client";
import { Enums } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { dialogs } from "svelte-dialogs"; import { dialogs } from "svelte-dialogs";
@@ -24,7 +21,6 @@
} from "#components/Ausweis/types.js"; } from "#components/Ausweis/types.js";
import { validateAccessTokenClient } from "src/client/lib/validateAccessToken.js"; import { validateAccessTokenClient } from "src/client/lib/validateAccessToken.js";
import { api } from "astro-typesafe-api/client"; import { api } from "astro-typesafe-api/client";
import A10WaermequellenAnlagentechnikTrinkwarmwasser from "#components/Tabellen/A10WaermequellenAnlagentechnikTrinkwarmwasser.svelte";
export let user: BenutzerClient; export let user: BenutzerClient;
export let ausweis: VerbrauchsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient;
@@ -144,12 +140,31 @@
} }
}) })
window.location.href = checkout_url; if (bezahlmethode === Enums.Bezahlmethoden.rechnung) {
window.location.href = `/payment/success?uid=${uid}`
} else {
window.location.href = checkout_url as string;
}
} catch(e) { } catch(e) {
console.log(e); }
}
/**
* TODO
* Ausschlusskriterien: Neubau, Modernisierung
Baujahr vor 1978, unsaniert und bis 4 Wohneinheiten /
Heizung jünger als 3 Jahre / Verbrauchsjahre unvollständig / Verbrauchsjahre nicht aktuell genug /
Klimafaktoren unvollständig /
Leerstand größer 30% /
Fehlende oder unvollständige Bilder (pro Abschnitt mindestens ein Bild) /
Fehlende Angaben zum Sanierungsstand (Bei F mindestens 2 Haken), (Bei G mindestens 1 Haken)
*/
let bestellenNichtMoeglich = false;
if (((ausweis.ausstellgrund === "Neubau" || ausweis.ausstellgrund === "Modernisierung") && aufnahme.baujahr_gebaeude[0] < 1978 && aufnahme.saniert === false && aufnahme.einheiten && aufnahme.einheiten > 4) || (new Date().getFullYear() - aufnahme.baujahr_heizung[0] < 3) || (!ausweis.verbrauch_1 || !ausweis.verbrauch_2 || !ausweis.verbrauch_3) || (aufnahme.leerstand && aufnahme.leerstand > 30)) {
bestellenNichtMoeglich = true
} }
}
</script> </script>
<div <div
@@ -270,7 +285,7 @@
<button class="button">Speichern</button> <button class="button">Speichern</button>
<button class="button" data-cy="bestellen" on:click={bestellen}>kostenpflichtig bestellen</button> <button class="button cursor-pointer" data-cy="bestellen" on:click={bestellen} >Kostenpflichtig bestellen</button>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -0,0 +1,13 @@
<script lang="ts">
import { RechnungClient } from "#components/Ausweis/types.js";
import { Enums } from "@ibcornelsen/database/client";
export let rechnung: RechnungClient;
</script>
<h1>Bestellbestätigung</h1>
{#if rechnung.bezahlmethode === Enums.Bezahlmethoden.rechnung}
<p>Vielen Dank für Ihre Bestellung. Wir haben Ihnen soeben eine E-Mail zugeschickt. Eine Rechnung bekommen Sie nach Abschluss der Dienstleistung zugeschickt.</p>
<p>Sie haben Rechnungszahlung ausgewählt. Wir haben Ihnen in der E-Mail unsere Bankverbindung zur Überweisung des Betrages aufgeführt. Bitte denken Sie daran die Belegnummer wie aufgeführt anzugeben. Alle anderen Zahloptionen stehen Ihnen auch zur Verfügung.</p>
{/if}

View File

@@ -1,8 +1,10 @@
<script lang="ts"> <script lang="ts">
import { addNotification } from "@ibcornelsen/ui"; import { addNotification } from "#components/Notifications/shared.js";
import { CrossCircled } from "radix-svelte-icons"; import { CrossCircled } from "radix-svelte-icons";
import { fade } from "svelte/transition"; import { fade } from "svelte/transition";
import { api } from "astro-typesafe-api/client"; import { api } from "astro-typesafe-api/client";
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
import NotificationWrapper from "#components/Notifications/NotificationWrapper.svelte";
let passwort: string; let passwort: string;
let email: string; let email: string;
@@ -13,6 +15,16 @@
async function login(e: SubmitEvent) { async function login(e: SubmitEvent) {
e.preventDefault() e.preventDefault()
if (passwort.length < 8) {
addNotification({
message: "Passwort muss mindestens 6 Zeichen enthalten.",
dismissable: true,
timeout: 3000,
type: "error"
})
return;
}
try { try {
const { uid } = await api.user.PUT.fetch({ const { uid } = await api.user.PUT.fetch({
email, email,
@@ -92,7 +104,7 @@
<span class="font-semibold">Da ist wohl etwas schiefgelaufen. Diese Email Adresse ist bereits in Benutzung, haben sie vielleicht bereits ein Konto bei uns?</span> <span class="font-semibold">Da ist wohl etwas schiefgelaufen. Diese Email Adresse ist bereits in Benutzung, haben sie vielleicht bereits ein Konto bei uns?</span>
</div> </div>
{/if} {/if}
<button type="submit" class="btn btn-primary" <button type="submit" class="button"
>Registrieren</button >Registrieren</button
> >
<div class="flex-row justify-between" style="margin-top: 10px"> <div class="flex-row justify-between" style="margin-top: 10px">
@@ -102,4 +114,5 @@
<a class="link link-hover" href="/auth/passwort-vergessen{redirect ? `?redirect=${redirect}` : ""}">Passwort Vergessen?</a> <a class="link link-hover" href="/auth/passwort-vergessen{redirect ? `?redirect=${redirect}` : ""}">Passwort Vergessen?</a>
</div> </div>
</form> </form>
<NotificationWrapper></NotificationWrapper>
</div> </div>

View File

@@ -51,6 +51,7 @@
AufnahmeClient, AufnahmeClient,
} from "#components/Ausweis/types.js"; } from "#components/Ausweis/types.js";
import { Enums } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { onMount } from "svelte";
// TODO: Vom Server sollte ein volles Objekt kommen, dass alle Subobjekte enthält, weil es sonst zu Problemen führen kann // TODO: Vom Server sollte ein volles Objekt kommen, dass alle Subobjekte enthält, weil es sonst zu Problemen führen kann
// wenn aufnahme oder objekt nicht existiert... // wenn aufnahme oder objekt nicht existiert...
@@ -60,6 +61,27 @@
export let user: BenutzerClient = {} as BenutzerClient; export let user: BenutzerClient = {} as BenutzerClient;
export let bilder: UploadedGebaeudeBild[] = [] export let bilder: UploadedGebaeudeBild[] = []
if (Object.keys(ausweis).length === 0) {
const localStorageAusweis = localStorage.getItem("ausweis");
if (localStorageAusweis) {
ausweis = JSON.parse(localStorageAusweis)
}
}
if (Object.keys(aufnahme).length === 0) {
const localStorageAufnahme = localStorage.getItem("aufnahme");
if (localStorageAufnahme) {
aufnahme = JSON.parse(localStorageAufnahme)
}
}
if (Object.keys(objekt).length === 0) {
const localStorageObjekt = localStorage.getItem("objekt");
if (localStorageObjekt) {
objekt = JSON.parse(localStorageObjekt)
}
}
async function spaeterWeitermachen() { async function spaeterWeitermachen() {
// TODO FIX // TODO FIX
// const result = await ausweisSpeichern( // const result = await ausweisSpeichern(
@@ -144,6 +166,18 @@
let waitOverlayHidden = true; let waitOverlayHidden = true;
let speichernOverlayHidden = true; let speichernOverlayHidden = true;
$: {
if (ausweis.uid && objekt.uid && aufnahme.uid) {
localStorage.setItem(ausweis.uid, JSON.stringify(ausweis))
localStorage.setItem(objekt.uid, JSON.stringify(objekt))
localStorage.setItem(aufnahme.uid, JSON.stringify(aufnahme))
} else {
localStorage.setItem("ausweis", JSON.stringify(ausweis))
localStorage.setItem("aufnahme", JSON.stringify(aufnahme))
localStorage.setItem("objekt", JSON.stringify(objekt))
}
}
$: { $: {
if ( if (
aufnahme.saniert && aufnahme.saniert &&
@@ -205,7 +239,7 @@ lg:grid-cols-2 lg:gap-x-6
<form id="formInput-1" on:submit={ausweisAbschicken} name="ausweis" data-test="ausweis"> <form id="formInput-1" on:submit={ausweisAbschicken} name="ausweis" data-test="ausweis">
<div id="formular-box" class="formular-boxen ring-0"> <div id="formular-box" class="formular-boxen ring-0">
<!--<ButtonSpaeterHilfe {automatischAusfüllen} {spaeterWeitermachen} />--> <ButtonSpaeterHilfe {automatischAusfüllen} {spaeterWeitermachen} />
<!-- A Prüfung der Ausweisart --> <!-- A Prüfung der Ausweisart -->
@@ -302,7 +336,7 @@ lg:grid-cols-2 lg:gap-x-6
> >
</div> </div>
<ButtonWeiterHilfe {spaeterWeitermachen} <ButtonWeiterHilfe
bind:ausweis bind:ausweis
bind:bilder bind:bilder
bind:user bind:user
@@ -317,7 +351,7 @@ lg:grid-cols-2 lg:gap-x-6
</form> </form>
<RawNotificationWrapper> <RawNotificationWrapper class="fixed left-8 bottom-8 max-w-[400px] flex flex-col gap-4 z-50">
{#each Object.entries($notifications) as [uid, notification] (uid)} {#each Object.entries($notifications) as [uid, notification] (uid)}
<RawNotification notification={{ ...notification, uid }}> <RawNotification notification={{ ...notification, uid }}>
{@html notification.subtext} {@html notification.subtext}
@@ -416,7 +450,8 @@ lg:grid-cols-2 lg:gap-x-6
dismissable: true, dismissable: true,
onUserDismiss: () => { onUserDismiss: () => {
hidden.add(AuditType.HEIZUNG_JUENGER_DREI_JAHRE); hidden.add(AuditType.HEIZUNG_JUENGER_DREI_JAHRE);
objekt = objekt; aufnahme = aufnahme;
}, },
type: "warning", type: "warning",
}} }}
@@ -440,6 +475,7 @@ lg:grid-cols-2 lg:gap-x-6
onUserDismiss: () => { onUserDismiss: () => {
hidden.add(AuditType.ZEITRAUM_AKTUELL); hidden.add(AuditType.ZEITRAUM_AKTUELL);
objekt = objekt; objekt = objekt;
ausweis = ausweis
}, },
type: "warning", type: "warning",
}} }}
@@ -463,6 +499,7 @@ lg:grid-cols-2 lg:gap-x-6
onUserDismiss: () => { onUserDismiss: () => {
hidden.add(AuditType.KLIMA_FAKTOREN); hidden.add(AuditType.KLIMA_FAKTOREN);
objekt = objekt; objekt = objekt;
ausweis = ausweis;
}, },
type: "warning", type: "warning",
}} }}
@@ -486,7 +523,7 @@ lg:grid-cols-2 lg:gap-x-6
dismissable: true, dismissable: true,
onUserDismiss: () => { onUserDismiss: () => {
hidden.add(AuditType.WOHN_FLAECHE); hidden.add(AuditType.WOHN_FLAECHE);
objekt = objekt; aufnahme = aufnahme;
}, },
type: "warning", type: "warning",
}} }}
@@ -506,7 +543,7 @@ lg:grid-cols-2 lg:gap-x-6
dismissable: true, dismissable: true,
onUserDismiss: () => { onUserDismiss: () => {
hidden.add(AuditType.WARM_WASSER); hidden.add(AuditType.WARM_WASSER);
objekt = objekt; ausweis = ausweis;
}, },
type: "warning", type: "warning",
}} }}
@@ -522,11 +559,7 @@ lg:grid-cols-2 lg:gap-x-6
message: "Plausibilitätsprüfung", message: "Plausibilitätsprüfung",
timeout: 0, timeout: 0,
uid: "LEER_STAND", uid: "LEER_STAND",
dismissable: true, dismissable: false,
onUserDismiss: () => {
hidden.add(AuditType.LEER_STAND);
objekt = objekt;
},
type: "warning", type: "warning",
}} }}
> >
@@ -536,7 +569,8 @@ lg:grid-cols-2 lg:gap-x-6
</RawNotification> </RawNotification>
{/if} {/if}
{#if auditVerbrauchAbweichung(ausweis, aufnahme).length > 0} {@const abweichung = auditVerbrauchAbweichung(ausweis, aufnahme)}
{#if abweichung.length > 0}
<RawNotification <RawNotification
notification={{ notification={{
message: "Plausibilitätsprüfung", message: "Plausibilitätsprüfung",
@@ -546,17 +580,12 @@ lg:grid-cols-2 lg:gap-x-6
onUserDismiss: () => { onUserDismiss: () => {
hidden.add(AuditType.VERBRAUCH_ABWEICHUNG); hidden.add(AuditType.VERBRAUCH_ABWEICHUNG);
objekt = objekt; objekt = objekt;
ausweis = ausweis;
}, },
type: "warning", type: "warning",
}} }}
> >
Die Abweichung der Verbräuche zwischen Zeitraum {auditVerbrauchAbweichung( Die Abweichung der Verbräuche zwischen Zeitraum {abweichung[0]} und {abweichung[1]} beträgt mehr als 30% und sie haben keinen Leerstand angegeben.
ausweis,
aufnahme
)[0]} und {auditVerbrauchAbweichung(
ausweis,
aufnahme
)[1]} beträgt mehr als 30% und sie haben keinen Leerstand angegeben.
Sind sie sich sicher, dass das stimmt? Sind sie sich sicher, dass das stimmt?
</RawNotification> </RawNotification>
{/if} {/if}

View File

@@ -37,7 +37,7 @@ export const PUT = defineApiRoute({
}) })
), ),
output: z.object({ output: z.object({
checkout_url: z.string(), checkout_url: z.string().optional(),
uid: UUidWithPrefix, uid: UUidWithPrefix,
}), }),
headers: authorizationHeaders, headers: authorizationHeaders,
@@ -113,6 +113,10 @@ export const PUT = defineApiRoute({
}); });
} }
if (bezahlmethode === Enums.Bezahlmethoden.rechnung) {
return { uid: rechnung.uid }
}
// Wir erstellen eine Mollie Payment Referenz. // Wir erstellen eine Mollie Payment Referenz.
const payment = await mollieClient.payments.create({ const payment = await mollieClient.payments.create({
amount: { amount: {

View File

@@ -7,7 +7,7 @@ import { z } from "zod";
export const PUT = defineApiRoute({ export const PUT = defineApiRoute({
input: z.object({ input: z.object({
email: z.string().email(), email: z.string().email(),
passwort: z.string().min(6), passwort: z.string().min(8),
vorname: z.string(), vorname: z.string(),
name: z.string() name: z.string()
}), }),

View File

@@ -1,31 +1,54 @@
import { createCaller } from "#lib/caller";
import { APIRoute } from "astro";
import { validate } from "uuid";
export const get: APIRoute = async ({params, cookies}) => { import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
const { uid } = params; import { validateAccessTokenServer } from "#server/lib/validateAccessToken.js";
import { prisma } from "@ibcornelsen/database/server";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { fileURLToPath } from "bun";
import * as fs from "fs";
if (!uid) { export const GET = defineApiRoute({
return new Response("No uid provided", { status: 400 }); async fetch(input, context, transfer) {
const { uid } = context.params
const token = context.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value;
if (!token) {
throw new APIError({
code: "BAD_REQUEST",
message: "Invalid access token"
})
} }
if (!validate(uid)) { const valid = validateAccessTokenServer(context);
return new Response("Invalid uid", { status: 400 });
if (!valid) {
throw new APIError({
code: "BAD_REQUEST",
message: "Invalid access token"
})
} }
const caller = createCaller({ cookies }) const image = await prisma.gebaeudeBilder.findUnique({
where: {
const image = await caller.v1.bilder.getBase64({ uid }) uid
}
})
if (!image) { if (!image) {
return new Response("No image found", { status: 404 }); throw new APIError({
code: "NOT_FOUND",
message: "Image could not be found."
})
} }
const buffer = Buffer.from(image.base64, "base64"); const path = fileURLToPath(new URL(`../../../../../persistent/images/${image.uid}.webp`, import.meta.url))
const base64 = fs.readFileSync(path, "base64")
const buffer = Buffer.from(base64, "base64");
return new Response(buffer, { return new Response(buffer, {
headers: { headers: {
"Content-Type": "image/webp" "Content-Type": "image/webp"
} }
}); });
} },
})

View File

@@ -0,0 +1,59 @@
---
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import UserLayout from "#layouts/UserLayout.astro";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
import DashboardAusweisePruefenModule from "#modules/Dashboard/DashboardAusweisePruefenModule.svelte";
import { prisma } from "@ibcornelsen/database/server";
import { createCaller } from "src/astro-typesafe-api-caller";
const caller = createCaller(Astro)
let user: BenutzerClient;
try {
user = (await caller.user.self.GET.fetch(undefined, {
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
})) || {} as BenutzerClient;
} catch(e) {
return Astro.redirect("/auth/login")
}
const ausweise = await prisma.verbrauchsausweisWohnen.findMany({
where: {
benutzer: {
uid: user.uid
}
},
include: {
aufnahme: {
include: {
objekt: {
include: {
gebaeude_bilder: true,
}
},
events: true
}
}
}
})
function omit(key: string, obj: Record<string, any>) {
const { [key]: omitted, ...rest } = obj;
return rest;
}
const reformedAusweise = ausweise.map(ausweis => ({
ausweis: omit("aufnahme", ausweis) as VerbrauchsausweisWohnenClient,
aufnahme: omit("objekt", omit("events", ausweis.aufnahme)) as AufnahmeClient,
objekt: omit("gebaeude_bilder", ausweis.aufnahme.objekt) as ObjektClient,
bilder: ausweis.aufnahme.objekt.gebaeude_bilder as unknown as UploadedGebaeudeBild[],
events: ausweis.aufnahme.events
}))
---
<UserLayout title="Ausweise Prüfen" {user}>
<DashboardAusweisePruefenModule ausweise={reformedAusweise} client:load></DashboardAusweisePruefenModule>
</UserLayout>

View File

@@ -25,6 +25,6 @@ const gebaeudeArray = await caller.objekt.GET.fetch({ limit: 5 }, {
}); });
--- ---
<UserLayout title="Dashboard"> <UserLayout title="Dashboard" {user}>
<DashboardModule user={user} gebaeudeArray={gebaeudeArray} /> <DashboardModule user={user} gebaeudeArray={gebaeudeArray} />
</UserLayout> </UserLayout>

View File

@@ -76,5 +76,5 @@ if (uid) {
--- ---
<AusweisLayout title="Verbrauchsausweis erstellen"> <AusweisLayout title="Verbrauchsausweis erstellen">
<VerbrauchsausweisWohnenModule client:load {ausweis} {objekt} {aufnahme} {bilder} /> <VerbrauchsausweisWohnenModule client:only {ausweis} {objekt} {aufnahme} {bilder} />
</AusweisLayout> </AusweisLayout>

View File

@@ -88,6 +88,6 @@ if (!ausweis || !user) {
--- ---
<AusweisLayout title="Kundendaten Aufnehmen - IBCornelsen"> <AusweisLayout title="Kundendaten Aufnehmen - IBCornelsen">
<KundendatenModule {user} {ausweis} {objekt} {aufnahme} {ausweisart} selectedPaymentType={Enums.Bezahlmethoden.paypal} client:load></KundendatenModule> <KundendatenModule {user} {ausweis} {objekt} {aufnahme} {ausweisart} bezahlmethode={Enums.Bezahlmethoden.paypal} client:load></KundendatenModule>
</AusweisLayout> </AusweisLayout>

View File

@@ -1,15 +1,16 @@
--- ---
import { prisma } from "@ibcornelsen/database/server"; import { Enums, prisma } from "@ibcornelsen/database/server";
import Layout from "../../layouts/Layout.astro"; import Layout from "../../layouts/Layout.astro";
import { createCaller } from "../../astro-typesafe-api-caller.js"; import { createCaller } from "../../astro-typesafe-api-caller.js";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
import PaymentSuccessModule from "#modules/PaymentSuccessModule.svelte";
const uid = Astro.url.searchParams.get("uid");
const { uid } = Astro.params;
const caller = createCaller(Astro) const caller = createCaller(Astro)
const user = await caller.user.self.GET.fetch(undefined, { const user = await caller.user.self.GET.fetch(undefined, {
headers: { headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
@@ -23,7 +24,9 @@ if (!uid || !user) {
const rechnung = await prisma.rechnung.findUnique({ const rechnung = await prisma.rechnung.findUnique({
where: { where: {
uid: uid, uid: uid,
benutzer_id: user.id benutzer: {
uid: user.uid
}
} }
}) })
@@ -33,7 +36,7 @@ if (!rechnung) {
--- ---
<Layout title="Zahlung Erfolgreich - IBCornelsen"> <Layout title="Zahlung Erfolgreich - IBCornelsen">
Supa! Hat geklappt ne! <PaymentSuccessModule {rechnung}></PaymentSuccessModule>
{rechnung.uid}
</Layout> </Layout>