Methodology & Assumptions
Brand glossary (translation conventions)
To keep the English and German versions consistent, the following terms are translated as follows:
| German | English |
|---|---|
| Ertrag / Jahresertrag | Yield / annual yield |
| Verschattung | Shading |
| Lastprofil | Load profile |
| Eigenverbrauch / Eigenverbrauchsquote | Self-consumption / self-consumption share |
| Wirtschaftlichkeit | Economics / payback |
| Year-1-Ersparnis | Year-1 savings |
| Amortisationsdauer | Payback period |
| Sonnenstand | Solar position |
| Sonnenbahn-Hülle | Sun-path envelope |
| Sky-View-Factor | Sky-view factor (no translation, term-of-art) |
| Diffus-Fraktion | Diffuse fraction |
| Modul-Neigung / Tilt | Tilt |
| Modul-Azimut | Panel azimuth |
| Wechselrichter | Inverter |
| Wechselrichter-Clipping | Inverter clipping |
| Wärmepumpe | Heat pump |
| Saisonfaktor | Seasonal factor |
| Anwesenheit (presence pattern) | Presence / occupancy pattern |
| Anti-Hype | Anti-hype (untranslated, brand term) |
| ehrlich rechnen / nicht schöngerechnet | honest math / not glossed-over |
Section index (mirrors the German version)
- Solar Position — NOAA Solar Position Algorithm (Fourier-reduced form). Source:
solar_math_service.dart. - Sun-Path Envelope — Annual min/max elevation per azimuth bin. Source:
sun_path_envelope_service.dart. - Shading Loss (direct + diffuse) — Sky-View-Factor + sun-path integration weighted by
sin(α)·max(0, cos(AoI)). Source:shading_service.dart. - Load Profile — BDEW H25 + deltas — Reference profile scaled by country defaults, additive deltas for presence, devices, large consumers. Heat-pump season factor
s(m) = max(0.25, 1.0 + 0.85·cos(2π·(m−1)/12)). Source:load_profile_service.dart. - Self-Consumption Heuristic (score-based) — Linear score from 0.35 plus category deltas, clamped to [0.25, 0.85]. Source:
self_consumption_service.dart. - Hourly Self-Consumption Overlay —
min(PV, Load)aggregation over 12 monthly profiles × 24 hours with Jensen-bias correction factor 0.85. Same source as §5. - Economics — Year-1 Savings & Payback — Cashflow-based, no inflation modeling (deliberately conservative). Geometric-series payback solution with module degradation. Source:
economics_service.dart. - PV Hourly Estimation — Clear-sky shape scaled to monthly kWh from the solar provider, with NOCT-like cell temperature and 0.4 %/K efficiency derate. Source:
pv_hourly_estimator.dart. - DC/AC Clipping (Inverter Limit) — Hard cap on hourly output + heuristic minute-spike loss for high DC/AC ratios. Source:
yield_provider.dart(function_sumAndCap). - Solar Data Routing — Region-based provider selection: PVWatts v8 (NA), PVGIS v5_3 (EU/AF/AS/AU/SA), NASA POWER (fallback). Source:
solar_data_router.dart. - Yield Orchestration (End-to-End Data Flow) — Deterministic pipeline tying §1–§10 into a
YieldComputationfor the Results screen. Multi-array weighted aggregation. Source: same as §9. - Telemetry & Privacy — Local-only, no network telemetry.
- Known Limits & Backlog — Country-specific load profiles, storage simulation, electricity-price inflation, etc.
- Data Invalidation Rules (Wizard State) — When are captured data invalidated (location drift, panel re-orientation, etc.).
- FAQ — Recurring Reviewer Questions — Why no winter consumption bump, why 18 % system loss, etc.
Notation & symbols
Identical to the German version (§Notation & Symbole in constraints.md). Greek letters used in formulas: φ (latitude), δ (declination), H (hour angle), z (zenith), α (elevation), γ (azimuth), β (tilt), γ_p (panel azimuth). Operators: · (multiplication), − (minus), Δ (difference/step), Σ (sum). Formula boxes use the same (N.k) numbering as the German version, so cross-references between the two languages work directly.
Country defaults
Identical to §0.5 in constraints.md. The country defaults table (DE, AT, CH, NL, BE, FR, IT, ES, PL, CZ — with electricity price, feed-in tariff, CO₂ factor, diffuse fraction, balcony plant defaults, household kWh per household type) is language-neutral and lives in assets/defaults/country_defaults.json.
Reproducibility
All models under lib/data/ are pure Dart, deterministic, no IO. Fixtures under code/horisol/assets/fixtures/shading/ (synthetic) and data/jrc_testdata_1000wp_180_90/ (PVGIS reference, untracked) enable regression checks via:
dart run code/horisol/tool/shading_lab.dart <fixture.json>
Tests: 293 tests passing (as of 2026-05-23). The architecture boundary test (test/architecture/no_flutter_imports_test.dart) prevents Flutter/plugin imports in the pure domain layer.
One-sentence summary
HoriSol calculates conservatively, documents every assumption, weighs inputs by location, and explicitly names where the model simplifies. If you want a pretty number, you are in the wrong place — if you want an honest number, you have one here.