Skip to content

Commit f73c2f3

Browse files
committed
style: Wording and better feature grouping
1 parent 0844a8d commit f73c2f3

3 files changed

Lines changed: 54 additions & 57 deletions

File tree

README.md

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
# ☀️ SolarBatterYield - PV-Analyse mit Speichervergleich
1+
# ☀️ SolarBatterYield - PV-Rechner mit Speichervergleich
22

33
https://solarbatteryield.streamlit.app/
44

5-
Eine interaktive Streamlit-App zur Simulation und Wirtschaftlichkeitsanalyse von Photovoltaik-Anlagen mit
6-
Batteriespeicher – optimiert für **Balkonkraftwerke** und kleine Aufdachanlagen.
5+
Open-Source-Tool zur Simulation von PV-Ertrag und Amortisation. Fokus auf Balkonkraftwerke, Speicher-Nachrüstung und
6+
realistische Lastprofile.
77

88
<p align="center">
99
<picture>
@@ -15,45 +15,44 @@ Batteriespeicher – optimiert für **Balkonkraftwerke** und kleine Aufdachanlag
1515

1616
## Features
1717

18-
- **PVGIS-Integration** – Stündliche PV-Ertragsdaten direkt von der EU-Datenbank (2005–2020)
19-
- **Standortsuche** – Koordinaten per Ortsname via OpenStreetMap Nominatim
20-
- **Flexible PV-Konfiguration** – Beliebig viele Module mit individueller Leistung, Ausrichtung und Neigung
21-
- **Wechselrichter-Limit** – 800 W Standard (Balkonkraftwerk), deaktivierbar für größere Anlagen
22-
- **Lastabhängiger Wechselrichter-Wirkungsgrad** – Realistische Effizienz basierend auf CEC-Daten von 3.000+
23-
Wechselrichtern:
24-
- Drei Voreinstellungen: Pessimistisch (P10), Median (P50), Optimistisch (P90)
25-
- Optional: Eigene Wirkungsgradkurve für Experten
26-
- **DC- und AC-gekoppelte Speicher** – Korrekte Simulation beider Anbindungsarten:
27-
- **DC-gekoppelt**: Batterie lädt direkt von den PV-Modulen, Wechselrichter-Limit gilt nur für die AC-Seite
28-
- **AC-gekoppelt**: Wechselrichter begrenzt den gesamten PV-Ertrag, eigener Wechselrichter für die Batterie möglich
29-
- **BDEW H0-Standardlastprofil** – Realistisches Lastprofil mit Unterscheidung nach:
30-
- Werktagen, Samstagen und Sonn-/Feiertagen
31-
- Jahreszeiten (Winter, Frühling, Sommer, Herbst)
32-
- Deutsche Feiertage werden automatisch berücksichtigt
33-
- **Erweiterter Verbrauchsmodus** – Eigene stündliche Lastprofile inklusive:
34-
- **Wochentag-Unterscheidung**: Unterschiedliche Profile für Werktage, Samstage und Sonn-/Feiertage
35-
- **Saisonale Skalierung**: Automatische Anpassung der Lastprofile je nach Jahreszeit
36-
- **Lastverschiebung** – Optionale Zusatzlast an ertragreichen Sonnentagen (z. B. Waschmaschine)
37-
- **Periodische Zusatzlast** – Regelmäßiger Verbrauch unabhängig vom Wetter (z. B. Warmwasser-Desinfektion)
38-
- **Experten-Verbrauchsmodus** - Upload von eigenen Smart-Meter-Daten (CSV) für präzise Ergebnisse
39-
- **Einspeisevergütung** – Berücksichtigung der Vergütung in allen Wirtschaftlichkeitsberechnungen
40-
- **Mehrere Speicher-Szenarien** – Vergleich von „Ohne Speicher" bis zu beliebig vielen Batterie-Optionen
41-
- **Langzeitvergleich PV vs. ETF** – Kumulierte Rendite über konfigurierbare Laufzeit
42-
- **Konfiguration teilen** – Alle Parameter als komprimierter URL-Parameter
18+
### ☀️ Photovoltaik & Hardware
19+
20+
* 🔌 Flexible PV-Konfiguration – Beliebig viele Module mit individueller Leistung, Ausrichtung und Neigung.
21+
* 📉 Realistische Wirkungsgrade – Simulation basierend auf CEC-Daten von 3.000+ Wechselrichtern
22+
(P10/P50/P90-Voreinstellungen oder eigene Kurven).
23+
* ⚡ DC- & AC-Kopplung – Korrekte Abbildung beider Systemwelten (z. B. Speicher vor oder nach dem Wechselrichter).
24+
* 🛑 Wechselrichter-Limit – Einstellbare Begrenzung (z. B. 800 W für BKW), für große Anlagen deaktivierbar.
25+
26+
### 🏠 Verbrauch & Lastprofile
27+
28+
* 📊 Dynamische Lastprofile – Unterscheidung nach Wochentagen, Jahreszeiten und Berücksichtigung deutscher Feiertage.
29+
* 🧺 Intelligente Lastverschiebung – Simulation von Zusatzverbrauch an Sonnentagen (z. B. Waschmaschine/Spülmaschine).
30+
* 🚿 Periodische Zusatzlasten – Abbildung von regelmäßigen Verbräuchen wie Warmwasser-Desinfektion
31+
(Legionellenschaltung).
32+
* 📂 Experten-Modus – CSV-Upload eigener Smart-Meter-Daten für maximale Präzision.
33+
34+
### 💰 Wirtschaftlichkeit & Analyse
35+
36+
* 🔋 Speicher-Vergleichsszenarien – Direkter Vergleich verschiedener Kapazitäten von "Ohne Speicher" bis hin zu mehreren
37+
Batterie-Optionen.
38+
* 📈 PV vs. ETF-Rendite – Langfristiger Vergleich der kumulierten Rendite inklusive optionaler Reinvestition der
39+
Ersparnis.
40+
* 🪙 Einspeisevergütung – Optionale Berücksichtigung aktueller Vergütungssätze in der Amortisationsrechnung.
41+
* 🔗 Konfiguration teilen – Alle Parameter können via Deep-Link geteilt werden.
4342

4443
## Bedienung
4544

4645
Die Konfiguration erfolgt über die **Seitenleiste** in sieben aufklappbaren Abschnitten:
4746

48-
| Abschnitt | Inhalt |
49-
|--------------------------------|--------------------------------------------------------------------------------|
50-
| 📍 **Standort** | Ort suchen oder Koordinaten manuell eingeben |
51-
| 💡 **Verbrauch** | Jahresverbrauch, Lastprofil, Lastverschiebung, periodische Zusatzlast |
52-
| ☀️ **PV-Module** | Module (Leistung, Ausrichtung, Neigung), Systemkosten |
53-
|**PV-Konfiguration** | PVGIS-Datenjahr, Systemverluste, WR-Wirkungsgrad, Wechselrichter-Limit |
54-
| 🔋 **Speicher-Optionen** | Ausbaustufen (Kapazität, Aufpreis) |
55-
| 🪫 **Speicher-Konfiguration** | DC/AC-Kopplung, Batterie-WR, Lade-/Entladeverluste, SoC-Grenzen |
56-
| 💰 **Preise & Vergleich** | Strompreis, Preissteigerung, Einspeisevergütung, ETF-Rendite, Analyse-Horizont |
47+
| Abschnitt | Inhalt |
48+
|-------------------------------|--------------------------------------------------------------------------------|
49+
| 📍 **Standort** | Ort suchen oder Koordinaten manuell eingeben |
50+
| 💡 **Verbrauch** | Jahresverbrauch, Lastprofil, Lastverschiebung, periodische Zusatzlast |
51+
| ☀️ **PV-Module** | Module (Leistung, Ausrichtung, Neigung), Systemkosten |
52+
|**PV-Konfiguration** | PVGIS-Datenjahr, Systemverluste, WR-Wirkungsgrad, Wechselrichter-Limit |
53+
| 🔋 **Speicher-Optionen** | Ausbaustufen (Kapazität, Aufpreis) |
54+
| 🪫 **Speicher-Konfiguration** | DC/AC-Kopplung, Batterie-WR, Lade-/Entladeverluste, SoC-Grenzen |
55+
| 💰 **Preise & Vergleich** | Strompreis, Preissteigerung, Einspeisevergütung, ETF-Rendite, Analyse-Horizont |
5756

5857
Die Abschnitte **PV-Module** und **Speicher-Optionen** enthalten die häufig angepassten Einstellungen,
5958
während **PV-Konfiguration** und **Speicher-Konfiguration** die technischen Details bündeln.

src/solarbatteryield/report/landing.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ def render_landing_page(missing: list[str]) -> None:
1818
Args:
1919
missing: List of missing configuration items with descriptions
2020
"""
21-
st.title("☀️ SolarBatterYield - PV-Analyse mit Speichervergleich")
21+
st.title("☀️ SolarBatterYield - PV-Rechner mit Speichervergleich")
2222
st.markdown(
23-
"Interaktive App zur Simulation und Wirtschaftlichkeitsanalyse von "
24-
"Photovoltaik-Anlagen mit Batteriespeicher – optimiert für **Balkonkraftwerke**."
23+
"Open-Source-Simulation von PV-Ertrag und Amortisation für Balkonkraftwerke. "
24+
"Berechne die ideale Speicher-Nachrüstung und optimiere deinen Eigenverbrauch."
2525
)
2626
missing_list = "\n".join(f"- {m}" for m in missing)
2727
st.info(
@@ -41,4 +41,3 @@ def render_landing_page(missing: list[str]) -> None:
4141
)
4242

4343
render_data_attribution()
44-

src/solarbatteryield/streamlit_app.py

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import streamlit as st
99

1010
# Configure page first (must be first Streamlit command)
11-
st.set_page_config(page_title="SolarBatterYield - PV-Analyse mit Speichervergleich", page_icon="☀️", layout="wide")
11+
st.set_page_config(page_title="SolarBatterYield - PV-Rechner mit Speichervergleich", page_icon="☀️", layout="wide")
1212

1313
from solarbatteryield.api import get_pvgis_hourly, PVGISError, APIError
1414
from solarbatteryield.models import (
@@ -26,19 +26,19 @@ def main():
2626
"""Main application entry point."""
2727
# Initialize session state
2828
init_session_state()
29-
29+
3030
# Render sidebar configuration
3131
render_sidebar()
32-
32+
3333
# Read configuration from session state
3434
config = get_config()
35-
35+
3636
# Validate required configuration
3737
is_valid, missing = config.is_valid()
3838
if not is_valid:
3939
render_landing_page(missing)
4040
st.stop()
41-
41+
4242
# Fetch PV data and run simulation
4343
try:
4444
pv_total, pv_gen_total = fetch_pv_data(config)
@@ -54,10 +54,10 @@ def main():
5454
except ValueError as exc:
5555
st.error(f"⚠️ Konfigurationsfehler: {exc}")
5656
st.stop()
57-
57+
5858
# Run simulations for all scenarios
5959
results = run_simulations(config, pv_total, pv_gen_total)
60-
60+
6161
# Render report
6262
render_report(config, results)
6363

@@ -67,7 +67,7 @@ def get_config() -> SimulationConfig:
6767
inverter_limit_enabled = sv("cfg_inverter_limit_enabled")
6868
flex_enabled = sv("cfg_flex_enabled")
6969
periodic_enabled = sv("cfg_periodic_enabled")
70-
70+
7171
# Build PV modules list
7272
modules = [
7373
PVModule(
@@ -79,7 +79,7 @@ def get_config() -> SimulationConfig:
7979
)
8080
for m in st.session_state.modules
8181
]
82-
82+
8383
# Build storage options list
8484
storage_options = [
8585
StorageOption(
@@ -90,20 +90,20 @@ def get_config() -> SimulationConfig:
9090
)
9191
for s in st.session_state.storages
9292
]
93-
93+
9494
# Get day-type profiles if enabled
9595
use_day_types = st.session_state.get("cfg_use_day_types", False)
9696
profile_saturday = None
9797
profile_sunday = None
9898
if use_day_types and sv("cfg_profile_mode") == "Erweitert":
9999
profile_saturday = st.session_state.get("_profile_saturday")
100100
profile_sunday = st.session_state.get("_profile_sunday")
101-
101+
102102
# Get yearly profile for expert mode
103103
yearly_profile = None
104104
if sv("cfg_profile_mode") == "Experte":
105105
yearly_profile = st.session_state.get("_yearly_profile")
106-
106+
107107
return SimulationConfig(
108108
location=LocationConfig(
109109
lat=sv("cfg_lat"),
@@ -175,7 +175,7 @@ def fetch_pv_data(config: SimulationConfig) -> tuple[np.ndarray, float]:
175175
return pv_total, pv_gen_total
176176

177177

178-
def run_simulations(config: SimulationConfig, pv_total: np.ndarray,
178+
def run_simulations(config: SimulationConfig, pv_total: np.ndarray,
179179
pv_gen_total: float) -> AnalysisResult:
180180
"""Run simulations for all storage scenarios."""
181181
# Build scenario list: base (no storage) + each storage option sorted by capacity
@@ -192,10 +192,10 @@ def run_simulations(config: SimulationConfig, pv_total: np.ndarray,
192192
sim_params = config.to_simulation_input()
193193

194194
results = AnalysisResult(pv_generation_total=pv_gen_total)
195-
195+
196196
for name, cap, cost in scenarios:
197197
sim_result = simulate(pv_total, cap, sim_params)
198-
198+
199199
results.scenarios.append(ScenarioResult(
200200
name=name,
201201
storage_capacity=cap,
@@ -208,4 +208,3 @@ def run_simulations(config: SimulationConfig, pv_total: np.ndarray,
208208

209209
if __name__ == "__main__":
210210
main()
211-

0 commit comments

Comments
 (0)