diff --git a/cfg/config.json b/cfg/config.json index eb9fe4e..eff09d0 100644 --- a/cfg/config.json +++ b/cfg/config.json @@ -61,10 +61,25 @@ "_kommentar": "Warmwasser je Person/Tag. heizbedarf_winter = max. taeglicher Raumheizbedarf eines Haushalts im tiefsten Winter, stark gebaeudeabhaengig (Neubau/saniert ~40, Altbau ~100). Auf 0 setzen, wenn nur Warmwasser betrachtet werden soll." }, - "brennstoffe": { - "gas": {"preis_ct_pro_kWh": 11.0, "wirkungsgrad": 0.95}, - "oel": {"preis_ct_pro_kWh": 11.5, "wirkungsgrad": 0.90}, - "pellets": {"preis_ct_pro_kWh": 7.0, "wirkungsgrad": 0.88}, - "_kommentar": "Vergleichswert: was der Kaeufer fuer dieselbe Nutzwaerme aus fossilen/Holz-Brennstoffen zahlen wuerde. preis_ct_pro_kWh = Brennstoffpreis je kWh Brennstoffenergie (Stand Juni 2026, Deutschland: Gas ~11, Oel ~11.5 (=115 ct/L bei 10 kWh/L), Pellets ~7 (=350 EUR/t bei 5 kWh/kg)). wirkungsgrad = Kesselwirkungsgrad. Nutzwaermekosten = preis/wirkungsgrad." - } + "brennstoffe": [ + { + "name": "Gas", + "preis_ct_kWh": 11.0, + "wirkungsgrad": 0.95, + "_kommentar": "Erdgas Juni 2026, Brennwertkessel." + }, + { + "name": "Heizoel", + "preis_ct_kWh": 11.5, + "wirkungsgrad": 0.90, + "_kommentar": "Heizoel EL Juni 2026 (~115 ct/L bei 10 kWh/L), Brennwertkessel." + }, + { + "name": "Pellets", + "preis_ct_kWh": 7.0, + "wirkungsgrad": 0.88, + "_kommentar": "Holzpellets Juni 2026 (~350 EUR/t bei 5 kWh/kg), moderner Pelletskessel." + } + ], + "_kommentar_brennstoffe": "Vergleichswert: Nutzwaermekosten = preis_ct_kWh / wirkungsgrad. Reihenfolge bestimmt die Anzeigereihenfolge im Report." } diff --git a/lib/auslegung.py b/lib/auslegung.py index 2847a26..cf0b7ed 100644 --- a/lib/auslegung.py +++ b/lib/auslegung.py @@ -215,6 +215,32 @@ def haushalte(q_speicher_tag: float, cfg: dict) -> dict: } +def brennstoffkosten(e: dict, cfg: dict) -> dict: + """Vergleichswert der Waerme gegenueber fossilen Brennstoffen / Pellets. + + Nutzwaermekosten = Brennstoffpreis / Kesselwirkungsgrad. + Bewertet werden der Energieinhalt eines vollen LKW und die Jahresmenge. + """ + energie_lkw = e["speicher"]["voller_lkw_energie_kWh"] + energie_jahr = e["waermepumpe"]["speicher_kWh_tag"] * TAGE_PRO_JAHR + vergleich = [] + for b in cfg.get("brennstoffe", []): + nw_ct = b["preis_ct_kWh"] / b["wirkungsgrad"] + vergleich.append({ + "name": b["name"], + "preis_ct_kWh": b["preis_ct_kWh"], + "wirkungsgrad": b["wirkungsgrad"], + "nutzwaerme_ct_kWh": nw_ct, + "eur_pro_lkw": energie_lkw * nw_ct / 100.0, + "eur_pro_jahr": energie_jahr * nw_ct / 100.0, + }) + return { + "energie_lkw_kWh": energie_lkw, + "energie_jahr_kWh": energie_jahr, + "vergleich": vergleich, + } + + def rechne(milch_l_tag: float, cfg: dict) -> dict: q_milch = milch_kuehllast(milch_l_tag, cfg) wp = waermepumpe(q_milch, cfg) @@ -223,7 +249,7 @@ def rechne(milch_l_tag: float, cfg: dict) -> dict: netz = netzbezug(wp["strom_kWh_tag"], pv["kWp"], cfg) bat = batterie(wp["strom_kWh_tag"], cfg) hh = haushalte(wp["speicher_kWh_tag"], cfg) - return { + e = { "eingang": {"milch_l_tag": milch_l_tag}, "milch_kuehllast_kWh_tag": q_milch, "waermepumpe": wp, @@ -233,6 +259,9 @@ def rechne(milch_l_tag: float, cfg: dict) -> dict: "batterie": bat, "haushalte": hh, } + if "brennstoffe" in cfg: + e["brennstoffkosten"] = brennstoffkosten(e, cfg) + return e def runde_auf(wert: float, schritt: float) -> float: @@ -376,6 +405,17 @@ def report(e: dict, cfg: dict) -> str: L.append(f" passt in einen LKW .......... {passt:>8}") L.append(f" voller LKW voll nach ........ {sp['voller_lkw_tausch_tage']:8.1f} Tagen") L.append(f" Energieinhalt voller LKW .... {sp['voller_lkw_energie_kWh']:8.0f} kWh") + bk = e.get("brennstoffkosten") + if bk and bk["vergleich"]: + L.append("") + L.append("WERT DER WAERME BEIM KAEUFER (Ersatzkosten fossil/Holz)") + L.append(f" {'Brennstoff':<10} | {'ct/kWh':>7} | {'EUR/LKW':>9} | {'EUR/Jahr':>9}") + L.append(f" {'-'*10}-+-{'-'*7}-+-{'-'*9}-+-{'-'*9}") + for v in bk["vergleich"]: + L.append(f" {v['name']:<10} | {v['nutzwaerme_ct_kWh']:>7.1f} | " + f"{v['eur_pro_lkw']:>9.0f} | {v['eur_pro_jahr']:>9.0f}") + L.append(f" Bewertet: voller LKW ~{bk['energie_lkw_kWh']:.0f} kWh, " + f"Jahreserzeugung ~{bk['energie_jahr_kWh']:.0f} kWh") L.append("=" * 62) return "\n".join(L) @@ -475,6 +515,22 @@ def report_md(e: dict, cfg: dict, quelldateien: list[str] | None = None) -> str: L.append(f"| voller LKW nach | {sp['voller_lkw_tausch_tage']:.1f} Tagen |") L.append(f"| Energieinhalt voller LKW | {sp['voller_lkw_energie_kWh']:.0f} kWh |") + bk = e.get("brennstoffkosten") + if bk and bk["vergleich"]: + L.append("") + L.append("## Wert der Waerme beim Kaeufer (Ersatzkosten fossil/Holz)") + L.append("") + L.append(f"Bewertet: voller LKW ~{bk['energie_lkw_kWh']:.0f} kWh, " + f"Jahreserzeugung ~{bk['energie_jahr_kWh']:.0f} kWh") + L.append("") + L.append("| Brennstoff | ct/kWh (Nutzw.) | EUR/LKW | EUR/Jahr |") + L.append("|------------|-----------------|---------|----------|") + for v in bk["vergleich"]: + L.append(f"| {v['name']} | {v['nutzwaerme_ct_kWh']:.1f} | " + f"{v['eur_pro_lkw']:.0f} | {v['eur_pro_jahr']:.0f} |") + L.append("") + L.append("*ct/kWh = Brennstoffpreis รท Kesselwirkungsgrad*") + return "\n".join(L)