Compare commits

..

3 Commits

Author SHA1 Message Date
Michael Stangl 3276ec8d86 Vergleich mit Brennstoffkosten dazu 2026-06-14 09:34:15 +02:00
Michael Stangl 07d7a1191b Readme dazu 2026-06-14 09:34:02 +02:00
Michael Stangl 0748b63a58 Doku dazu 2026-06-14 09:13:30 +02:00
6 changed files with 466 additions and 7 deletions
+120
View File
@@ -0,0 +1,120 @@
# Auslegung Wärmerückgewinnung Milchkühlung
Kommandozeilen-Werkzeug zur Auslegung einer Wärmerückgewinnung aus der Milchkühlung: Aus der täglich zu kühlenden **Milchmenge** werden Wärmepumpe, PV-Anlage, Batterie und Natriumacetat-Latentspeicher dimensioniert inklusive Abhollogistik, versorgbarer Haushalte und Brennstoffkosten-Vergleich.
Alle Annahmen liegen in einer `config.json`, sodass sich Varianten ohne Codeänderung nachrechnen lassen.
## Konzept
```
Milchabwärme (37→4 °C) ──► Wärmepumpe (Strom aus PV) ──► Latentspeicher (Natriumacetat, 58 °C) ──► Abholung per LKW
```
Da Natriumacetat-Trihydrat erst bei 58 °C schmilzt, die Milchabwärme aber nur bei ~37 °C anfällt, hebt eine Wärmepumpe das Temperaturniveau an. Der Speicher kann unterkühlt und damit isolierungsfrei transportiert werden.
## Voraussetzungen
- Python 3.8+
- Keine externen Abhängigkeiten (nur Standardbibliothek)
## Dateien
| Datei | Zweck |
|---|---|
| `auslegung.py` | Berechnungsprogramm |
| `config.json` | Sämtliche Annahmen (kopieren für Varianten) |
## Verwendung
```bash
# Detailreport für 1000 L Milch/Tag
python auslegung.py 1000
# Kompakte Empfehlung (gerundete Größen + vorgeschlagener Abholzyklus)
python auslegung.py 1000 --suggest-size
# Variante mit eigener Config und Ergebnis-Export als JSON
python auslegung.py 1500 --config meine_variante.json --json ergebnis.json
```
| Argument | Beschreibung |
|---|---|
| `milch_l_tag` | (Pflicht) Milchmenge pro Tag in Litern |
| `--config PFAD` | Pfad zur JSON-Konfiguration (Standard: `config.json`) |
| `--json PFAD` | Ergebnis zusätzlich als JSON schreiben |
| `--suggest-size` | Kompakte Empfehlung statt Detailreport |
## Was berechnet wird
- **Milchkühllast** (kWh/Tag) aus Menge und Temperaturhub
- **Wärmepumpe**: Kälte-, Heiz- und elektrische Leistung, Strombedarf, in den Speicher gelieferte Wärme
- **PV-Anlage**: Leistung (kWp) und Dachfläche für die Jahresbilanz des WP-Strombedarfs
- **Netzbezug**: jährlicher Zukauf-Anteil durch die Wintermonate (Monatsbilanz)
- **Batterie**: nutzbare und Nennkapazität für den Tag-/Nacht-Ausgleich
- **Latentspeicher**: Masse, Volumen, LKW-Auslastung, Energieinhalt einer Ladung
- **Versorgte Haushalte**: Warmwasser (ganzjährig) und Winterfall (Heizung + WW)
- **Brennstoffkosten**: Wert der Wärme als Ersatzkosten für Gas, Heizöl, Pellets
## Konfiguration (`config.json`)
| Abschnitt | Wichtigste Parameter |
|---|---|
| `milch` | Ein-/Austrittstemperatur, Dichte, spez. Wärme |
| `waermepumpe` | `cop`, `laufzeit_h_pro_tag` |
| `pcm` | `modus` (`latent_only` / `latent_plus_hub`), Latentwärme, Dichte, c-Werte, Lade-/Entladetemperatur |
| `abholung` | `zyklus_tage`, LKW-Nutzlast und -Volumen |
| `pv` | spez. Jahresertrag, Fläche je kWp, Monatsprofil |
| `batterie` | Direkt-PV-Stunden, nutzbarer Anteil, Reservefaktor |
| `haushalt` | Personen, Warmwasser je Person, Winter-Heizbedarf |
| `brennstoffe` | Preis (ct/kWh) und Wirkungsgrad für Gas/Öl/Pellets |
### Wichtigste Stellschrauben
- `pcm.modus` `latent_only` (nur Phasenwechsel) oder `latent_plus_hub` (mit Überhitzung): bestimmt Energiedichte und Speichergröße.
- `abholung.zyklus_tage` Abholrhythmus, steuert die Speichergröße direkt.
- `waermepumpe.cop` bestimmt Strombedarf und damit PV-Größe.
- `haushalt.heizbedarf_winter_kWh_tag` stark gebäudeabhängig (saniert ~40, Altbau ~100, 0 = nur Warmwasser).
- `brennstoffe` Preise sind Stand Juni 2026 (DE) und jederzeit überschreibbar.
## Ausgabe
Der Detailreport schreibt einen formatierten Konsolentext mit allen Blöcken. Mit `--json` wird das vollständige Ergebnis zusätzlich als strukturiertes JSON gespeichert (alle Zwischengrößen, im Suggest-Modus zusätzlich der `vorschlag`-Block).
### Beispiel (gekürzt, 1000 L)
```
WAERMEPUMPE (COP 2.60, Laufzeit 18 h/Tag)
Strombedarf ................. 24.0 kWh/Tag
Waerme in den Speicher ...... 62.4 kWh/Tag
PV-ANLAGE
Leistung .................... 8.8 kWp
Dachflaeche ................. 44 m2
NETZBEZUG (durch Wintermonate)
Netzbezug ................... 1941 kWh/a = 22 %
VERSORGTE HAUSHALTE (2 Erw. + 2 Kinder)
-> Warmwasser ganzjaehrig ... 11.1 Haushalte
-> im Winter ................ 1.0 Haushalte
LATENTSPEICHER (Natriumacetat-Trihydrat, Modus: latent_plus_hub)
Energieinhalt voller LKW .... 2185 kWh
WERT DER WAERME BEIM KAEUFER
Gas | 11.6 ct/kWh | 253 EUR/LKW | 2635 EUR/Jahr
Pellets | 8.0 ct/kWh | 174 EUR/LKW | 1810 EUR/Jahr
```
## Modell-Annahmen & Vereinfachungen
- Milch wird thermisch als Wasser gerechnet.
- Der zurückkehrende Speicherbehälter wird als „warm" (nahe Schmelzpunkt) angenommen; sonst müsste die WP ihn zusätzlich aufheizen.
- Der Netzbezug ist eine **Monatsbilanz** und setzt einen Tag-/Nacht-Ausgleich per Batterie voraus. Ohne Batterie liegt der reale Zukauf höher (~5060 %).
- `--suggest-size` optimiert den Abholzyklus auf **Transportauslastung**, nicht auf die Verweildauer der Wärme im Speicher.
- Die Brennstoffkosten sind der **Brutto-Substitutionswert** der Wärme, kein erzielbarer Verkaufspreis (Transport, Strom, Abschreibung noch nicht abgezogen).
## Mögliche Erweiterungen
- Anbieterseite: Transportkosten, WP-Stromkosten und Speicher-Abschreibung → echte Marge bzw. Mindestverkaufspreis je kWh.
- Monatlich aufgelöste PV-Deckung als Diagramm.
+21 -6
View File
@@ -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."
}
+85
View File
@@ -0,0 +1,85 @@
# 1 Energiemengen & Thermodynamik
Grundlagen-Zusammenfassung zur Wärmerückgewinnung aus der Milchkühlung. Referenzfall durchgängig: **1000 L Milch/Tag**.
---
## 1.1 Wärmeinhalt der Milchkühlung
Milch fällt mit Eutertemperatur an und muss zur Haltbarmachung gekühlt werden. Die dabei entzogene Wärme ist die nutzbare Abwärme.
| Größe | Wert |
|---|---|
| Temperaturhub | 37 °C → 4 °C (ΔT = 33 K) |
| Stoffannahme | Milch ≈ Wasser (ρ = 1 kg/L, c = 4,186 kJ/kg·K) |
| Formel | Q = m · c · ΔT |
**Ergebnis:** Q = 1000 · 4,186 · 33 = 138.138 kJ ≈ **38,4 kWh/Tag**
Skalierung: 1500 L → ~57,5 kWh/Tag. Die Abwärme fällt **täglich ganzjährig** an (~14.000 kWh/a).
---
## 1.2 Reinigungs-/Desinfektionswasser
Das Leitungssystem (~100 m, mehrere Pumpvorgänge für ~8 Melkplätze) muss mit heißem Wasser desinfiziert werden.
| Größe | Wert |
|---|---|
| Menge | 200 L |
| Temperaturhub | 50 °C → 100 °C (ΔT = 50 K) |
| Q | 200 · 4,186 · 50 = 41.860 kJ ≈ **11,6 kWh** |
Weil der Tank durch die Milchabwärme bereits bei 50 °C startet, halbiert sich der Heizbedarf gegenüber Kaltwasser (10 °C → ~21 kWh). Die Milchabwärme deckt den Desinfektionsbedarf damit vollständig.
> Noch nicht enthalten: Rohrleitungsverluste (je nach Dämmung +1030 %). Dafür wären Rohrdurchmesser und Dämmung nötig.
---
## 1.3 PV-Panel-Kühlung / PVT-Ertrag
Mit rückseitigen Wassertaschen (PVT) lässt sich die Abwärme der Module nutzen.
**Energiebilanz Modul (Sommerspitze, ~1000 W/m² Einstrahlung):**
- ~1820 % Strom (~180200 W/m²)
- ~800 W/m² Wärme, davon über die Frontseite ein großer Teil verloren
- Unverglaster PVT, niedrige Vorlauftemperatur: **~400500 W/m² thermisch nutzbar**
**Monatlicher Wärmeertrag, 10 m², optimale Südneigung, Raum Augsburg:**
| Monat | kWh | Monat | kWh |
|---|---|---|---|
| Jan | 75 | Jul | 825 |
| Feb | 145 | Aug | 730 |
| Mär | 350 | Sep | 510 |
| Apr | 565 | Okt | 270 |
| Mai | 745 | Nov | 90 |
| Jun | 800 | Dez | 55 |
**Summe ≈ 5.160 kWh/a thermisch** (~516 kWh/m²·a, oberer realistischer Bereich bei ganzjähriger Abnahme) plus ~1.5001.800 kWh/a Strom.
> Vorbehalt: Werte gelten nur bei kaltem Kühlwasser. Steigt die Vorlauftemperatur oder fehlt der Abnehmer, brechen die Sommerwerte ein.
---
## 1.4 Natriumacetat als Latentwärmespeicher (PCM)
### Speichermechanismus
Im **festen** Zustand liegt Natriumacetat-Trihydrat (CH₃COONa·3H₂O) als geordnetes Kristallgitter mit eingebautem Kristallwasser vor. Beim Erwärmen auf ~58 °C bricht das Gitter auf das Salz „löst sich in seinem eigenen Kristallwasser". Die Energie geht in das Aufbrechen der Bindungen statt in Temperaturerhöhung → **latente Wärme**.
Der Schlüssel ist die **Unterkühlbarkeit**: Die Schmelze bleibt bis auf Raumtemperatur metastabil flüssig und hält die Energie nahezu verlustfrei. Erst ein Auslöser (Impfkristall, Erschütterung) startet die Kristallisation und gibt die Wärme schlagartig bei ~58 °C frei. Damit lässt sich der Speicher **isolierungsfrei lagern und transportieren**.
### Energiedichte
| Modus | Beitrag | Energiedichte |
|---|---|---|
| `latent_only` | Phasenwechsel 264 kJ/kg | **0,073 kWh/kg** (~0,095 kWh/L) |
| `latent_plus_hub` | + Überhitzung der Schmelze (z. B. auf 80 °C) | **0,091 kWh/kg** (~0,12 kWh/L) |
| + Unterkühlung Feststoff | bis ~40 °C nutzen | ~0,10 kWh/kg (~0,13 kWh/L) |
Stoffwerte: Dichte ~1,3 kg/L, c_flüssig ≈ 2,9 kJ/kg·K, c_fest ≈ 1,9 kJ/kg·K. Zum Vergleich Wasser (50 K Hub): nur ~0,058 kWh/L.
### Kritischer Punkt: Temperaturniveau
Natriumacetat schmilzt bei **58 °C**, die Milchabwärme fällt aber nur bei max. **37 °C** an. Eine 37-°C-Quelle kann einen 58-°C-Speicher **nicht direkt laden** → es braucht eine **Wärmepumpe** zur Temperaturanhebung (siehe Dokument 2).
+95
View File
@@ -0,0 +1,95 @@
# 2 Systemauslegung
Dimensionierung der Komponenten für den Referenzfall **1000 L Milch/Tag**. Konzept: Milchabwärme → Wärmepumpe (Strom aus PV) → Natriumacetat-Latentspeicher.
---
## 2.1 Wärmepumpe
Die WP entzieht der Milch die Wärme (Verdampfer ~0 °C) und gibt sie bei >58 °C an den Speicher ab (Kondensator ~63 °C). Die Verdichterarbeit landet **mit** im Speicher:
```
Q_Speicher = Q_Milch + W_elektrisch
COP = Q_Speicher / W_elektrisch
W_el = Q_Milch / (COP 1)
```
| COP | Strom/Tag | Wärme in Speicher/Tag |
|---|---|---|
| 2,5 | 25,6 kWh | 64,0 kWh |
| **2,6 (Referenz)** | **24,0 kWh** | **62,4 kWh** |
| 3,0 | 19,2 kWh | 57,6 kWh |
Leistungsauslegung (18 h/Tag Laufzeit): Kälteleistung ~2,1 kW, Heizleistung ~3,5 kW, el. Leistung ~1,3 kW.
> Wichtig: Durch die WP wird **mehr** gespeichert als die reine Milchabwärme (62,4 statt 38,4 kWh/Tag).
---
## 2.2 PV-Anlage
Auslegung auf **Jahresbilanz** des WP-Strombedarfs (Standort Süddeutschland, ~1.000 kWh/kWp·a, ~5 m²/kWp).
| Größe | Wert |
|---|---|
| Jahresstrombedarf WP | ~8.760 kWh/a |
| Leistung | **~8,8 kWp** |
| Dachfläche | **~44 m²** |
Bei einer typischen Stalldachfläche von mehreren hundert m² problemlos verfügbar.
---
## 2.3 Netzbezug durch die Wintermonate
Die WP läuft täglich, die PV liefert saisonal. Monatsbilanz (gerundet):
| | kWh/a |
|---|---|
| Jahresbedarf WP | 8.760 |
| Netzbezug (OktFeb) | ~1.940 |
| Sommerüberschuss (MärSep) | ~1.960 |
**Netzbezug ≈ 22 %** des Jahresbedarfs fällt komplett in die Monate Oktober bis Februar. Der Sommerüberschuss entspricht fast genau dem Winter-Zukauf (bilanziell ausgeglichen, zeitlich verschoben).
> Diese 22 % gelten **mit** Batterie (Tag-/Nacht-Ausgleich). **Ohne** Batterie eher 5060 %, da die WP rund um die Uhr läuft, die PV aber nur tagsüber.
---
## 2.4 Batteriespeicher
Aufgabe: nur **Tag-/Nacht-Versatz** überbrücken (kein saisonaler Ausgleich das ist mit Batterie unmöglich).
| Größe | Wert |
|---|---|
| WP-Last pro Tag | 24 kWh |
| zu überbrückende Nachtlast | ~1416 kWh |
| empfohlen nutzbar | ~1518 kWh |
| Nennkapazität (LFP) | **~20 kWh** |
| Autonomie | ~1 Tag |
Mehr Kapazität senkt den 22-%-Winteranteil **nicht** der kommt aus dem saisonalen PV-Mangel, nicht aus dem Tag-/Nacht-Versatz.
---
## 2.5 Latentwärmespeicher (Natriumacetat)
Speichergröße = Wärme je Abholzyklus ÷ Energiedichte. Beispiel 14-Tage-Zyklus, Modus `latent_plus_hub`:
| Größe | Wert |
|---|---|
| Energie je Zyklus | 62,4 · 14 ≈ **873 kWh** |
| Masse | ~9.600 kg |
| Volumen | ~7,4 m³ |
Skalierung linear mit Zyklusdauer und Milchmenge. Details zu LKW-Auslastung und Abholrhythmus siehe Dokument 3.
---
## 2.6 Saisonaler Grundkonflikt
Wärme**erzeugung** und Wärme**bedarf** laufen gegenläufig:
- Sommer: viel PV-Strom, viel Abwärme aber wenig Heizbedarf.
- Winter: hoher Heizbedarf aber wenig PV (22 % Netzbezug) und gleicher Abwärmeanfall.
Das ist die zentrale Schwäche des Konzepts und der Grund, warum im Winter nur wenige Haushalte beheizt werden können (Dokument 3).
@@ -0,0 +1,88 @@
# 3 Logistik, Haushalte & Wirtschaftlichkeit
Verwertung der gespeicherten Wärme: Transport, Reichweite bei Haushalten, Marktwert. Referenzfall **1000 L Milch/Tag**.
---
## 3.1 Transport im LKW
Grenze: Standard-Sattelauflieger.
| Größe | Wert |
|---|---|
| Nutzlast | ~24 t |
| Laderaum | ~90 m³ |
Natriumacetat (~1,3 kg/L): 24 t ≈ **18,5 m³** → passt locker ins Volumen. **Das Gewicht bindet**, nicht das Volumen (nur ~20 % Laderaum genutzt).
**Energieinhalt eines vollen LKW:**
- `latent_plus_hub`: 24 t · 0,091 ≈ **~2.185 kWh**
- `latent_only`: 24 t · 0,073 ≈ **~1.760 kWh**
**Abholrhythmus:** Aus 62,4 kWh/Tag füllt sich ein voller LKW (Hub-Modus) nach **~35 Tagen**. Optionen:
| Zyklus | Masse | Volumen | LKW-Auslastung |
|---|---|---|---|
| 7 Tage | 4,8 t | 3,7 m³ | 20 % |
| 14 Tage | 9,6 t | 7,4 m³ | 40 % |
| 21 Tage | 14,4 t | 11,1 m³ | 60 % |
| 28 Tage | 19,2 t | 14,7 m³ | 80 % |
| 35 Tage | 24,0 t | 18,4 m³ | 100 % |
Empfehlung: an die volle Ladung koppeln (~monatlich) statt halbleere Fahrten, oder kleineren Wechselbehälter für 2-Wochen-Takt.
---
## 3.2 Versorgbare Haushalte (Familie 2 Erw. + 2 Kinder)
**Warmwasserbedarf:** Erwachsener ~1,8 kWh/Tag, Kind ~1,0 kWh/Tag → Haushalt **~5,6 kWh/Tag** (~2.040 kWh/a).
**Winter-Heizbedarf:** ~60 kWh/Tag/Haushalt (gebäudeabhängig: saniert ~40, Altbau ~100).
| Anwendung | Bedarf/HH/Tag | Versorgbare Haushalte |
|---|---|---|
| Warmwasser (ganzjährig) | 5,6 kWh | **~11 Haushalte** |
| Winter (Heizung + WW) | ~65,6 kWh | **~1 Haushalt** |
Kernaussage: Aus 1000 L Milch lassen sich **~11 Familien mit Warmwasser** versorgen aber sobald die Raumheizung dazukommt, verschlingt schon **ein einziges Haus** fast die komplette Tagesproduktion. Eine LKW-Ladung deckt den Warmwasserbedarf einer Familie für gut ein Jahr.
Die Speicherwärme wird bei 58 °C abgegeben passend für Warmwasser (4560 °C) und Flächenheizung.
> Die Haushaltszahl hängt an der **Produktionsrate**, nicht am LKW-Modus.
---
## 3.3 Wert der Wärme beim Käufer (Ersatzkosten)
Was der Käufer für dieselbe Nutzwärme aus Brennstoffen zahlen würde (Preise Stand Juni 2026, Deutschland; Nutzwärmekosten = Brennstoffpreis ÷ Kesselwirkungsgrad).
| Brennstoff | Nutzwärme | EUR/LKW (~2.185 kWh) | EUR/Jahr (~22.800 kWh) |
|---|---|---|---|
| Gas (11 ct/kWh @ 95 %) | 11,6 ct/kWh | ~253 € | ~2.635 € |
| Heizöl (11,5 @ 90 %) | 12,8 ct/kWh | ~279 € | ~2.908 € |
| Pellets (7,0 @ 88 %) | 8,0 ct/kWh | ~174 € | ~1.810 € |
> Das ist der **Brutto-Substitutionswert**, nicht der erzielbare Verkaufspreis. Davon gehen Transport, WP-/PV-Strom (22 % Netzbezug) und Speicherinvestition ab. Pellets (~8 ct/kWh) sind der härteste Konkurrenzmaßstab.
---
## 3.4 Python-Werkzeug
Zur Nachrechnung beliebiger Varianten: `auslegung.py` + `config.json`.
```
python auslegung.py 1000 # Detailreport
python auslegung.py 1000 --suggest-size # gerundete Empfehlung + Abholzyklus
python auslegung.py 1500 --config variante.json --json ergebnis.json
```
**Berechnet:** Milchkühllast, Wärmepumpe (Kälte-/Heiz-/Stromleistung), PV (kWp + Fläche), Netzbezug, Batterie, Latentspeicher inkl. LKW-Abgleich und Energieinhalt, versorgte Haushalte (WW + Winter), Brennstoffkosten-Vergleich.
**Alle Annahmen** stehen in `config.json` (Milch, WP-COP, PCM-Modus/Stoffwerte, Abholzyklus, LKW-Grenzen, PV-Profil, Batterie, Haushalt, Brennstoffpreise). Variante = Datei kopieren, Werte ändern.
**Bewusste Modell-Vereinfachungen:**
- Zurückkehrender Behälter wird als „warm" (nahe Schmelzpunkt) angenommen, sonst müsste die WP ihn zusätzlich aufheizen.
- Netzbezug ist Monatsbilanz, setzt Tag-/Nacht-Ausgleich per Batterie voraus.
- `--suggest-size` optimiert auf Transportauslastung, nicht auf Speicher-Verweildauer.
**Mögliche nächste Schritte:** Anbieterseite (Transportkosten, WP-Stromkosten, Speicher-Abschreibung) → echte Marge / Mindestverkaufspreis je kWh.
+57 -1
View File
@@ -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)