schalter --eh-da und --driver dazu

This commit is contained in:
Michael Stangl
2026-06-15 07:06:48 +02:00
parent 06ead41035
commit 3f59877aa9
3 changed files with 208 additions and 18 deletions
+26 -9
View File
@@ -126,9 +126,16 @@ def speicher(q_speicher_tag: float, cfg: dict, zyklus: float | None = None) -> d
bindend = "Gewicht" if masse_kg / nutzlast >= volumen_m3 / lkw_vol else "Volumen"
passt = True
# Wie oft muesste ein voller LKW (nach Gewicht) getauscht werden?
# Tage bis LKW voll (je Grenze, bindende = kleinerer Wert)
masse_pro_tag = q_speicher_tag / e_kg
voll_lkw_tage = nutzlast / masse_pro_tag if masse_pro_tag > 0 else float("inf")
volumen_pro_tag = masse_pro_tag / (p["dichte_kg_pro_L"] * 1000.0)
voll_vol_tage = lkw_vol / volumen_pro_tag if volumen_pro_tag > 0 else float("inf")
voll_bind_tage = min(voll_lkw_tage, voll_vol_tage)
# Empfehlung wenn bindende Auslastung < 90 %
auslastung_bind = max(masse_kg / nutzlast, volumen_m3 / lkw_vol)
empf_zyklus = math.ceil(0.90 * voll_bind_tage) if auslastung_bind < 0.90 else None
return {
"energiedichte_kWh_pro_kg": e_kg,
@@ -141,6 +148,7 @@ def speicher(q_speicher_tag: float, cfg: dict, zyklus: float | None = None) -> d
"passt_in_einen_lkw": passt,
"voller_lkw_tausch_tage": voll_lkw_tage,
"voller_lkw_energie_kWh": nutzlast * e_kg,
"empf_zyklus_tage": empf_zyklus,
}
@@ -280,11 +288,12 @@ def container_invest_total(sp: dict, cfg: dict) -> dict:
}
def anbieterkosten(e: dict, cfg: dict) -> dict:
def anbieterkosten(e: dict, cfg: dict, *, eh_da: bool = False, driver: bool = False) -> dict:
"""Jaehrliche Betriebskosten des Anbieters -> Gestehungskosten und Marge.
eh_da=True : PV und Kuehlung bereits vorhanden -> Kapitalkosten dafuer entfallen.
driver=True : Fahrer stellt der Landwirt selbst -> Fahreranteil wird abgezogen.
Abschreibung: linear ohne Kapitalzins (konservativ).
Strombedarf: Netzbezug zum Netzpreis, PV-Eigenanteil zu LCOE-Gestehungskosten.
"""
a = cfg["anbieter"]
inv = a["invest"]
@@ -297,7 +306,8 @@ def anbieterkosten(e: dict, cfg: dict) -> dict:
energie_jahr = wp["speicher_kWh_tag"] * TAGE_PRO_JAHR
fuhren_jahr = TAGE_PRO_JAHR / cfg["abholung"]["zyklus_tage"]
kosten_transport = fuhren_jahr * a["transport_eur_pro_fuhre"]
fahrer_abzug = a.get("fahrer_eur_pro_fuhre", 0.0) if driver else 0.0
kosten_transport = fuhren_jahr * (a["transport_eur_pro_fuhre"] - fahrer_abzug)
netz_eur = netz["netzbezug_kWh"] * a["netzstrompreis_ct_kWh"] / 100.0
pv_kwh = netz["jahresbedarf_kWh"] - netz["netzbezug_kWh"]
@@ -306,9 +316,9 @@ def anbieterkosten(e: dict, cfg: dict) -> dict:
kosten_wartung = a["wartung_eur_pro_jahr"]
kapital_pv = pv_data["kWp"] * inv["pv_eur_pro_kWp"] / inv["pv_nutzungsdauer_jahre"]
kapital_pv = 0.0 if eh_da else pv_data["kWp"] * inv["pv_eur_pro_kWp"] / inv["pv_nutzungsdauer_jahre"]
kapital_bat = bat["nominal_kWh"] * inv["batterie_eur_pro_kWh"] / inv["batterie_nutzungsdauer_jahre"]
kapital_wp = inv["waermepumpe_eur"] / inv["waermepumpe_nutzungsdauer_jahre"]
kapital_wp = 0.0 if eh_da else inv["waermepumpe_eur"] / inv["waermepumpe_nutzungsdauer_jahre"]
ci = container_invest_total(sp, cfg)
kapital_speicher = ci["gesamt_eur"] / inv["speicher_nutzungsdauer_jahre"]
kosten_kapital = kapital_pv + kapital_bat + kapital_wp + kapital_speicher
@@ -349,10 +359,13 @@ def anbieterkosten(e: dict, cfg: dict) -> dict:
"gestehungskosten_ct_kWh": gestehung_ct,
"container_invest": ci,
"marge": marge,
"eh_da": eh_da,
"driver": driver,
"fahrer_abzug_eur_pro_fuhre": fahrer_abzug,
}
def rechne(milch_l_tag: float, cfg: dict) -> dict:
def rechne(milch_l_tag: float, cfg: dict, *, eh_da: bool = False, driver: bool = False) -> dict:
q_milch = milch_kuehllast(milch_l_tag, cfg)
wp = waermepumpe(q_milch, cfg)
sp = speicher(wp["speicher_kWh_tag"], cfg)
@@ -373,7 +386,7 @@ def rechne(milch_l_tag: float, cfg: dict) -> dict:
if "brennstoffe" in cfg:
e["brennstoffkosten"] = brennstoffkosten(e, cfg)
if "anbieter" in cfg and "container_invest" in cfg:
e["anbieter"] = anbieterkosten(e, cfg)
e["anbieter"] = anbieterkosten(e, cfg, eh_da=eh_da, driver=driver)
return e
@@ -593,6 +606,10 @@ def main() -> None:
help="Ergebnis zusaetzlich als JSON in diese Datei schreiben")
ap.add_argument("--suggest-size", action="store_true",
help="Kompakte Empfehlung (gerundete Groessen + Abholzyklus) statt Detailreport")
ap.add_argument("--eh-da", action="store_true",
help="PV und Kuehlung bereits vorhanden: Kapitalkosten dafuer entfallen")
ap.add_argument("--driver", action="store_true",
help="Fahrer stellt der Landwirt selbst: Fahreranteil aus Transportkosten abziehen")
ap.add_argument("-v", "--verbose", action="store_true",
help="Ausgaben an der Konsole anzeigen")
args = ap.parse_args()
@@ -623,7 +640,7 @@ def main() -> None:
cfg = deep_merge(cfg, lade_config(f))
quelldateien.append(f.name)
ergebnis = rechne(args.milch_l_tag, cfg)
ergebnis = rechne(args.milch_l_tag, cfg, eh_da=args.eh_da, driver=args.driver)
if args.suggest_size:
text = vorschlag_report(ergebnis, cfg)