Bestrahlungsstärke (Teil 1)

Potenzialanalyse für Dachflächen-Photovoltaik

Im ersten Teil sollen Dachflächen auf ihr Potenzial für die Installation von PV-Anlagen untersucht werden. Als Bemessungsgrundlage dient dafür die erwartete Sonneneinstrahlung, welche sich aus der Neigung und Ausrichtung der Fachfläche ergibt.

Autor:in
Zugehörigkeit

Sören Sparmann

Universität Paderborn

Veröffentlichungsdatum

30. Mai 2025

Photovoltaikanlagen (PV-Anlagen) auf Dachflächen leisten einen bedeutenden Beitrag zum Klimaschutz, da sie erneuerbare Solarenergie nutzen, um Strom zu erzeugen. Dadurch wird der Bedarf an fossilen Brennstoffen wie Kohle, Öl und Gas reduziert, die bei der Verbrennung CO2 und andere Treibhausgase freisetzen, welche den Klimawandel beschleunigen.

Da Dachflächen häufig ungenutzt bleiben, bieten sie eine ideale Möglichkeit, um umweltfreundliche Energie zu gewinnen, ohne zusätzlichen Raum zu beanspruchen. Zudem tragen PV-Anlagen zur Dezentralisierung der Energieversorgung bei, was die Netzstabilität erhöht und Energieverluste minimiert.

Wie sieht es in deiner Nachbarschaft aus? Gibt es dort ungenutzte Dachflächen, die sich für PV-Anlagen eignen?

Foto „Photovoltaikanlage 2001“ (Ausschnitt) von erhard.renz unter der Lizenz CC BY 2.0 via Flickr

Foto „Photovoltaikanlage 2001“ (Ausschnitt) von erhard.renz unter der Lizenz CC BY 2.0 via Flickr

1 Daten einlesen

Um die Fragestellung beantworten zu können, wird eine Übersicht über alle Dachflächen in Ihrer Region benötigt.

Zunächst wird ein Standort festgelegt, für den die Dachflächen eingelesen werden sollen. Dazu wird eine Variable adresse mit der entsprechenden Adresse definiert.

from cdec import get_lat_lon_for

# Adresse eingeben (Gesamtschule Salzkotten)
adresse = 'Upsprunger Straße 65-67, 33154 Salzkotten'

# Breiten- und Längengrad bestimmen
latitude, longitude = get_lat_lon_for(adresse)

print(f'Breitengrad: {latitude}, Längengrad: {longitude}')
Breitengrad: 51.6616267, Längengrad: 8.6013146
Hinweis

Die Adresse muss im Bezirk Detmold liegen.

Mit Hilfe der Funktion load_roofs() kann nun einen Datensatz eingelesen werden, welcher die Umgebung um den angebgenen Standort abdeckt.

Die Daten stammen von dem Landesamt für Natur, Umwelt und Klima Nordrhein-Westfalen (LANUK).

from cdec import load_roofs

# Dachflächen für die angegebene Adresse  ermitteln
df = load_roofs(
    latitude=latitude,
    longitude=longitude
)

# Daten anzeigen
df
geb_id richtung neigung dachtyp himmel_kat geometry
id
0 Geb64596ln0403_c 269 15 geneigt West MULTIPOLYGON (((472254.000 5723718.000, 472254...
1 Geb77493ln0403_c -1 0 flach Flach MULTIPOLYGON (((472548.000 5723151.500, 472546...
2 Geb67252ln0403_c 263 44 geneigt West MULTIPOLYGON (((472177.500 5723508.000, 472177...
3 Geb68143ln0403_c 175 51 geneigt Süd MULTIPOLYGON (((472206.000 5723548.000, 472207...
4 Geb73711ln0403_c 82 21 geneigt Ost MULTIPOLYGON (((472698.500 5723757.500, 472698...
... ... ... ... ... ... ...
2552 Geb62779ln0403_c 176 50 geneigt Süd MULTIPOLYGON (((472358.906 5723561.578, 472359...
2553 Geb63299ln0403_c 246 34 geneigt West MULTIPOLYGON (((472215.000 5723774.500, 472214...
2554 Geb76249ln0403_c 178 26 geneigt Süd MULTIPOLYGON (((472931.500 5723834.000, 472931...
2555 Geb70353ln0403_c 82 36 geneigt Ost MULTIPOLYGON (((472099.000 5723372.500, 472099...
2556 Geb58712ln0403_c 265 33 geneigt West MULTIPOLYGON (((472263.000 5723281.000, 472263...

2557 rows × 6 columns

Aufgabe 1

  • Was könnten die Spalten richtung, neigung und himmel_kat bedeuten?
  • Stelle für jede der Spalten eine Vermutung auf! (1 – 2 Sätze)

(5 Minuten)

Richtung:
Die Richtung einer Dachfläche wird in Grad angegeben und orientiert sich an den Himmelsrichtungen. Eine Dachfläche, die nach Norden zeigt, hat eine Richtung von 0 Grad, während eine Fläche, die nach Süden ausgerichtet ist, mit 180 Grad angegeben wird.

Neigung:
Die Neigung einer Dachfläche, ebenfalls in Grad angegeben, beschreibt den Winkel der Dachschräge. Eine Neigung von 0 Grad steht für eine vollständig horizontale Fläche, wie bei einem Flachdach.

Himmel Kat.:
Die Variable himmel_kat gibt die Himmelsrichtung als kategorische Angabe wieder. Beispielsweise steht die Kategorie Flach für ein Flachdach.

2 Daten explorieren

Mit der Methode explore() können die Dachflächen auf einer Karte dargestellt werden.

Hinweis

Die Form (Geometrie) einer Dachfläche ergibt sich dabei aus der Spalte geometry. Diese enthält für jede Dachfläche eine Liste mit den entsprechenden Eckpunkten.

df.explore()
Make this Notebook Trusted to load map: File -> Trust Notebook

Mit Hilfe der Methode loc (locate) kann ein einzelner Eintrag aus dem Datensatz ausgewählt (selektiert) werden. Dazu muss nur die Identifikationsnummer id des entsprechenden Eintrags angeben werden. Diese kann aus der ersten Spalte des Datensatzes oder aus der Kartendarstellung abgelesen werden.

Codefragment 1
# Selektiere das Dach mit der ID 270
dach = df.loc[270]
dach
geb_id                                         Geb62092ln0403_c
richtung                                                    148
neigung                                                      31
dachtyp                                                 geneigt
himmel_kat                                                  Süd
geometry      MULTIPOLYGON (((472325.5 5723153, 472326.5 572...
Name: 270, dtype: object

Aufgabe 2

  1. Ändere oben die Variable adresse zu einem Ort ihrer Wahl (z.B. ihrem Wohnort oder Schule).
  2. Führe anschließend die nachfolgenden Zellen erneut aus.
  3. Wähle auf der Karte eine beliebige Dachfläche aus (z.B. ihr Wohnort oder Schule) und notiere die dazugehörige ID ìd.
  4. Selektiere die Dachfläche mit Hilfe der Methode loc (siehe nächste Zelle). Verwende dazu die ID.

(5 Minuten)

2.1 Neigung und Ausrichtung der Dachfläche

Mit Hilfe der folgenden Schreibweise kann die Neigung und Ausrichtung der Dachfläche bestimmt werden. Diese beiden Werte werden später noch wichtig sein, für die Berechnung der Bestrahlungsstärke!

# Neigungswinkel der Dachfläche
surface_tilt = dach['neigung']
surface_tilt
31
# Ausrichtung der Dachfläche (Azimutwinkel, -1 = Flachdach)
surface_azimuth = dach['richtung']
surface_azimuth
148

2.2 Größe der Dachfläche

In gleicher Weise kann auf die Form (geometry) der Dachfläche zugegriffen werden.

geometry = dach['geometry']
geometry

Mit dem Attribut .area kann zudem der Flächeninhalt der Form ermittelt werden. Die Größe der Dachfläche ist ein weiterer wichtiger Faktor für die Eignung einer Dachfläche (in Quadratmeter) für die Nutzung von Photovoltaik.

# Berechnung des Flächeninhalts in Quadratmetern
surface_area = geometry.area
surface_area
69.45965846481954
# Berechnung des Flächeninhalts (qm) aller Dachflächen
df['flaecheninhalt'] = df['geometry'].area
df
geb_id richtung neigung dachtyp himmel_kat geometry flaecheninhalt
id
0 Geb64596ln0403_c 269 15 geneigt West MULTIPOLYGON (((472254.000 5723718.000, 472254... 7.411919
1 Geb77493ln0403_c -1 0 flach Flach MULTIPOLYGON (((472548.000 5723151.500, 472546... 7.500000
2 Geb67252ln0403_c 263 44 geneigt West MULTIPOLYGON (((472177.500 5723508.000, 472177... 36.716183
3 Geb68143ln0403_c 175 51 geneigt Süd MULTIPOLYGON (((472206.000 5723548.000, 472207... 12.497905
4 Geb73711ln0403_c 82 21 geneigt Ost MULTIPOLYGON (((472698.500 5723757.500, 472698... 36.641219
... ... ... ... ... ... ... ...
2552 Geb62779ln0403_c 176 50 geneigt Süd MULTIPOLYGON (((472358.906 5723561.578, 472359... 12.903848
2553 Geb63299ln0403_c 246 34 geneigt West MULTIPOLYGON (((472215.000 5723774.500, 472214... 32.292786
2554 Geb76249ln0403_c 178 26 geneigt Süd MULTIPOLYGON (((472931.500 5723834.000, 472931... 11.989565
2555 Geb70353ln0403_c 82 36 geneigt Ost MULTIPOLYGON (((472099.000 5723372.500, 472099... 88.135948
2556 Geb58712ln0403_c 265 33 geneigt West MULTIPOLYGON (((472263.000 5723281.000, 472263... 60.672663

2557 rows × 7 columns

3 Bestrahlungsstärke

Die Eignung einer Dachfläche für den Einsatz von Photovoltaik hängt unter anderem von der Ausrichtung und Neigung der Dachfläche ab. Auch der Standort und die zur Verfügung stehende Fläche spielen eine Rolle.

Je besser die Dachfläche zur Sonne ausgerichtet ist, desto höher ist die Sonneneinstrahlung und damit die potenziell nutzbare Energie!

Um das Potenzial der Dachflächen für den Einsatz von Photovoltaik zu ermitteln, wird daher zunächst die Bestrahlungsstärke (engl. irradiance) über einen festgelegten Zeitraum (z.B. ein Jahr) berechnet. Die Bestrahlungsstärke ist ein Maß für die Intensität der Sonneneinstrahlung, die auf die Dachfläche trifft.

Zur Berechnung der Bestrahlungsstärke sind folgende Schritte erforderlich:

  1. Genaue Position und Zeitzone bestimmen (Lokalisierung)
  2. Untersuchungszeitraum festlegen
  3. Stand der Sonne berechnen
  4. Trübung der Atmosphäre ermitteln (Bewölkung)
  5. Bestrahlungsstärke berechnen

Glücklicherweise gibt es eine Programmierbibliothek pvlib, die einen Großteil der Berechnungen übernimmt.

# Bibliothek für den Umgang mit Photovoltaik
import pvlib

3.1 Lokalisierung

Zur Lokalisierung wird neben Längen- und Breitengrad auch die entsprechende Zeitzone benötigt.

from pytz import timezone

# Zeitzone festlegen
tz = timezone('Europe/Berlin')
tz
<DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>

Nun kann eine genaue Lokalisierung vorgenommen werden. Diese wird für die Berechnung des Sonnenstandes und der Bestrahlungsstärke benötigt.

from pvlib.location import Location

# Lokalisierung
location = Location(
    name=adresse,
    latitude=latitude,
    longitude=longitude,
    tz=tz,
)

location
Location: 
  name: Upsprunger Straße 65-67, 33154 Salzkotten
  latitude: 51.6616267
  longitude: 8.6013146
  altitude: 222.0
  tz: Europe/Berlin

3.2 Zeitraum festlegen

Als letztes muss der Zeitraum festgelegt werden, für den die Bestrahlungstärke berechnet werden soll.

Die Frequenz wird auf eine Stunde festgelet 1h, sodass die Bestrahlungsstärke stundenweise berechnet wird.

import pandas as pd

# Startzeitpunkt
start = '2024-06-01'

# Endzeitpunkt
end = '2024-06-02'

# Frequenz (stuendlich)
freq = '1h'

# Zeitraum festlegen
date_range = pd.date_range(
    start=start,
    end=end,
    freq=freq,         
    tz=tz,
    inclusive='left'
)

# Zeitpunkte ausgeben
date_range
DatetimeIndex(['2024-06-01 00:00:00+02:00', '2024-06-01 01:00:00+02:00',
               '2024-06-01 02:00:00+02:00', '2024-06-01 03:00:00+02:00',
               '2024-06-01 04:00:00+02:00', '2024-06-01 05:00:00+02:00',
               '2024-06-01 06:00:00+02:00', '2024-06-01 07:00:00+02:00',
               '2024-06-01 08:00:00+02:00', '2024-06-01 09:00:00+02:00',
               '2024-06-01 10:00:00+02:00', '2024-06-01 11:00:00+02:00',
               '2024-06-01 12:00:00+02:00', '2024-06-01 13:00:00+02:00',
               '2024-06-01 14:00:00+02:00', '2024-06-01 15:00:00+02:00',
               '2024-06-01 16:00:00+02:00', '2024-06-01 17:00:00+02:00',
               '2024-06-01 18:00:00+02:00', '2024-06-01 19:00:00+02:00',
               '2024-06-01 20:00:00+02:00', '2024-06-01 21:00:00+02:00',
               '2024-06-01 22:00:00+02:00', '2024-06-01 23:00:00+02:00'],
              dtype='datetime64[ns, Europe/Berlin]', freq='h')

Aufgabe 3

  • Ändere den Startzeitpunkt auf Heute und den Endzeitpunkt auf Morgen
  • Führe anschließend die Zelle erneut aus

(5 Minuten)

Folgende Zeilen müssen entsprechend angepasst werden:

# Startzeitpunkt
start = '2024-06-01'

# Endzeitpunkt
end = '2024-06-02'

3.3 Stand der Sonne

Elevation (Höhenwinkel): Die Elevation gibt den vertikalen Winkel an, unter dem die Sonne am Himmel steht. Ein Höhenwinkel von 0° bedeutet, dass die Sonne direkt über einem Punkt am Horizont steht, während ein Höhenwinkel von 90° darauf hinweist, dass die Sonne im Zenit steht. Ein negativer Höhenwinkel zeigt an, dass die Sonne unterhalb des Horizonts ist.

Azimuth (Azimutwinkel): Der Azimuthwinkel gibt die horizontale Richtung der Sonne an, gemessen im Uhrzeigersinn von Norden aus. Ein Azimut von 0° entspricht dem Norden, 90° dem Osten, 180° dem Süden und 270° dem Westen. Der Azimuthwinkel gibt also an, in welche Himmelsrichtung die Sonne zu einem bestimmten Zeitpunkt zeigt.

# Sonnenstand für den gegebenen Standort ermitteln
solar_position = location.get_solarposition(date_range)
solar_position
apparent_zenith zenith apparent_elevation elevation azimuth equation_of_time
2024-06-01 00:00:00+02:00 104.024246 104.024246 -14.024246 -14.024246 340.120688 2.174048
2024-06-01 01:00:00+02:00 106.075224 106.075224 -16.075224 -16.075224 354.352129 2.167611
2024-06-01 02:00:00+02:00 105.813555 105.813555 -15.813555 -15.813555 8.799992 2.161163
2024-06-01 03:00:00+02:00 103.265049 103.265049 -13.265049 -13.265049 22.910796 2.154702
2024-06-01 04:00:00+02:00 98.666027 98.666027 -8.666027 -8.666027 36.266856 2.148229
2024-06-01 05:00:00+02:00 92.380098 92.380098 -2.380098 -2.380098 48.717685 2.141744
2024-06-01 06:00:00+02:00 84.652842 84.804803 5.347158 5.195197 60.371779 2.135247
2024-06-01 07:00:00+02:00 76.251170 76.316202 13.748830 13.683798 71.527543 2.128738
2024-06-01 08:00:00+02:00 67.220090 67.258739 22.779910 22.741261 82.628833 2.122218
2024-06-01 09:00:00+02:00 57.944534 57.970618 32.055466 32.029382 94.284827 2.115685
2024-06-01 10:00:00+02:00 48.824358 48.843080 41.175642 41.156920 107.368543 2.109141
2024-06-01 11:00:00+02:00 40.417793 40.431753 49.582207 49.568247 123.179339 2.102585
2024-06-01 12:00:00+02:00 33.632141 33.643048 56.367859 56.356952 143.433505 2.096017
2024-06-01 13:00:00+02:00 29.850045 29.859454 60.149955 60.140546 169.018551 2.089437
2024-06-01 14:00:00+02:00 30.329474 30.339066 59.670526 59.660934 196.897959 2.082846
2024-06-01 15:00:00+02:00 34.883230 34.894661 55.116770 55.105339 221.419249 2.076243
2024-06-01 16:00:00+02:00 42.114043 42.128860 47.885957 47.871140 240.579977 2.069628
2024-06-01 17:00:00+02:00 50.729567 50.749589 39.270433 39.250411 255.672888 2.063002
2024-06-01 18:00:00+02:00 59.915398 59.943569 30.084602 30.056431 268.360810 2.056364
2024-06-01 19:00:00+02:00 69.160701 69.203237 20.839299 20.796763 279.838405 2.049714
2024-06-01 20:00:00+02:00 78.080902 78.155598 11.919098 11.844402 290.909352 2.043052
2024-06-01 21:00:00+02:00 86.265142 86.464622 3.734858 3.535378 302.141135 2.036379
2024-06-01 22:00:00+02:00 93.780164 93.780164 -3.780164 -3.780164 313.945942 2.029695
2024-06-01 23:00:00+02:00 99.719774 99.719774 -9.719774 -9.719774 326.585077 2.022999

Höhenwinkel

import plotly.express as px

# Liniendiagramm des Höhenwinkels
fig = px.line(solar_position, y='elevation', title='Höhenwinkel der Sonne im Verlauf eines Tages')

fig.update_xaxes(title="Uhrzeit")
fig.update_yaxes(title="Höhenwinkel")

fig.show()

Aufgabe 4

  • Um wie viel Uhr ist die Sonne heute circa aufgegangen?
  • Um wie viel Uhr wird die die Sonne heute circa untergehen?

(5 Minuten)

Azimutwinkel

Nun wird der Azimuthwinkel, also die Himmelsrichtung aus welcher die Sonne scheint, betrachtet.

px.line(solar_position, y='azimuth')
Hinweis

“Im Osten geht die Sonne auf, im Süden nimmt sie ihren Lauf, im Westen wird sie untergehen, im Norden ist sie nie zu sehen.”

3.4 Sonneneinstrahlung bei klarem Himmel

Neben der Ausrichtung und Neigung der Dachfläche spielt auch das Wetter eine Rolle für die Intensität der Sonneneinstrahlung. Bei starker Bewölkung ist die Sonneneinstrahlung geringer.

Im Rahmen der Analyse wird der Einfachheit halber davon ausgegangen, dass der Himmel klar ist und die Atmosphäre somit nicht durch Wolken getrübt ist (clear sky).

Mit Hilfe der Methode get_clearsky() lässt sich die Sonneneinstrahlung am gegebenen Standort ermitteln. Es werden drei Arten der Sonneneinstrahlung unterschieden: GHI, DNI & DHI (siehe unten).

clear_sky = location.get_clearsky(date_range)
clear_sky
ghi dni dhi
2024-06-01 00:00:00+02:00 0.000000 0.000000 0.000000
2024-06-01 01:00:00+02:00 0.000000 0.000000 0.000000
2024-06-01 02:00:00+02:00 0.000000 0.000000 0.000000
2024-06-01 03:00:00+02:00 0.000000 0.000000 0.000000
2024-06-01 04:00:00+02:00 0.000000 0.000000 0.000000
2024-06-01 05:00:00+02:00 0.000000 0.000000 0.000000
2024-06-01 06:00:00+02:00 18.478127 53.506730 13.491830
2024-06-01 07:00:00+02:00 130.619109 305.097841 58.107708
2024-06-01 08:00:00+02:00 283.208479 497.069734 90.746895
2024-06-01 09:00:00+02:00 440.051377 615.717040 113.265725
2024-06-01 10:00:00+02:00 583.088350 689.114402 129.396424
2024-06-01 11:00:00+02:00 699.826767 734.288776 140.785551
2024-06-01 12:00:00+02:00 781.095813 760.285563 148.073938
2024-06-01 13:00:00+02:00 820.791391 771.686463 151.483769
2024-06-01 14:00:00+02:00 815.991836 770.348749 151.076177
2024-06-01 15:00:00+02:00 767.058685 756.062443 146.846069
2024-06-01 16:00:00+02:00 677.622214 726.479015 138.711724
2024-06-01 17:00:00+02:00 554.461633 676.273049 126.393337
2024-06-01 18:00:00+02:00 407.415550 595.098422 109.105680
2024-06-01 19:00:00+02:00 249.832452 463.702002 84.871356
2024-06-01 20:00:00+02:00 101.808589 253.381581 49.477604
2024-06-01 21:00:00+02:00 7.208651 19.765934 5.921109
2024-06-01 22:00:00+02:00 0.000000 0.000000 0.000000
2024-06-01 23:00:00+02:00 0.000000 0.000000 0.000000

Direct Normal Irradiance (DNI)

Die Direktnormalstrahlung (DNI) ist die Menge der Sonnenstrahlung, die pro Flächeneinheit auf eine senkrecht zur Sonne stehende Fläche auftrifft.

Global Horizontal Irradiance (GHI)

Die globale horizontale Einstrahlung (GHI) ist die Gesamtstrahlung, die von einer horizontalen Fläche auf der Erde absorbiert wird.

Diffuse Horizontal Irradiance (DHI)

Die diffuse horizontale Einstrahlung (DHI) ist die terrestrische Einstrahlung, die von einer flachen Oberfläche gestreut oder diffus von der Atmosphäre zurückgestrahlt wird. DHI ist der Teil der globalen horizontalen Einstrahlung, der nicht von der direkten Sonnenstrahlung stammt.

# Sonneneinstrahlung in Liniendiagramm anzeigen
px.line(clear_sky)

3.5 Bestrahlungsstärke berechnen

Zunächst wird die Neigung tilt und die Ausrichtung azimuth der Dachfläche festgelegt.

# Neigung
surface_tilt = 20
# Ausrichtung (Süd-Süd-Ost)
surface_azimuth = 160

Nun kann die Bestrahlungsstärke für die Dachfläche mit Hilfe der Funktion get_total_irradiance berechnet werden.

from pvlib.irradiance import get_total_irradiance

# Bestrahlungsstärke (irradiance) berechnen
irradiance = get_total_irradiance(
    surface_tilt=surface_tilt,
    surface_azimuth=surface_azimuth,
    dni=clear_sky['dni'],
    ghi=clear_sky['ghi'],
    dhi=clear_sky['dhi'],
    solar_zenith=solar_position['zenith'],
    solar_azimuth=solar_position['azimuth']
)

# Ausgabe (Watt pro Quadratmeter
irradiance
poa_global poa_direct poa_diffuse poa_sky_diffuse poa_ground_diffuse
2024-06-01 00:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000
2024-06-01 01:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000
2024-06-01 02:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000
2024-06-01 03:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000
2024-06-01 04:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000
2024-06-01 05:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000
2024-06-01 06:00:00+02:00 14.728850 1.504552 13.224298 13.085002 0.139296
2024-06-01 07:00:00+02:00 127.865252 70.525044 57.340208 56.355546 0.984662
2024-06-01 08:00:00+02:00 304.989665 214.844178 90.145486 88.010541 2.134945
2024-06-01 09:00:00+02:00 493.447482 380.279844 113.167638 109.850345 3.317293
2024-06-01 10:00:00+02:00 663.765796 533.875585 129.890211 125.494644 4.395566
2024-06-01 11:00:00+02:00 797.418402 655.602465 141.815937 136.540347 5.275590
2024-06-01 12:00:00+02:00 882.350461 732.853268 149.497193 143.608963 5.888230
2024-06-01 13:00:00+02:00 911.768201 758.664754 153.103447 146.915975 6.187472
2024-06-01 14:00:00+02:00 883.856283 731.184319 152.671964 146.520673 6.151291
2024-06-01 15:00:00+02:00 801.698222 653.497692 148.200530 142.418118 5.782412
2024-06-01 16:00:00+02:00 673.208722 533.571466 139.637256 134.529053 5.108202
2024-06-01 17:00:00+02:00 511.137221 384.375343 126.761878 122.582112 4.179766
2024-06-01 18:00:00+02:00 333.476149 224.589138 108.887011 105.815741 3.071271
2024-06-01 19:00:00+02:00 165.137163 80.941649 84.195514 82.312171 1.883343
2024-06-01 20:00:00+02:00 48.753148 0.000000 48.753148 47.985672 0.767476
2024-06-01 21:00:00+02:00 5.796908 0.000000 5.796908 5.742566 0.054342
2024-06-01 22:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000
2024-06-01 23:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000

Alle Angaben sind in W/m2 (Watt pro Quadratmeter).

Für die weitere Analyse ist primär die globale Bestrahlungsstärke (poa_global) von Bedeutung. Diese setzt sich aus der direkten und indirekten Sonneneinstrahlung zusammen.

poa_global=poa_direct+poa_diffuse

poa_diffuse=poa_sky_diffuse+poa_ground_diffuse

# Liniendiagramm (mit eingeschlossener Fläche) der globalen Bestrahlungsstärke
fig = px.area(irradiance, y='poa_global', title="Globale Bestrahlungsstärke im Verlauf eines Tages")

fig.update_xaxes(title="Uhrzeit")
fig.update_yaxes(title="Globale Bestrahlungsstärke<br>[W/m<sup>2</sup>]")

fig.show()

Tagesleistung

Wichtig

Zur Erinnerung: Die Bestrahlungsstärke gibt nur die Intensität der Sonneneinstrahlung an und ist nicht von der Größe der Dachfläche abhängig. Sie wird daher in der Einheit W/m2 angegeben.

Die Summe der Stundenwerte ergibt die Bestrahlungsenergie pro Quadratmeter (Wh/m2) energy_per_area an dem entsprechenden Tag.

# Summe der Stundenwerte (in Wattstunden pro Quadratmeter)
energy_per_area = irradiance['poa_global'].sum()
energy_per_area

Um die Strahlungsenergie zu bestimmen, die im Laufe eines Tages auf die Dachfläche auftrifft, muss das Ergbnis nun nur noch mit der Größe der Dachfläche multipliziert werden.

# Größe der Dachfläche in Quadratmeter (Beispiel)
surface_area = 10

# Berechnung der Strahlungsenergie (Wattstunden)
total_energy = energy_per_area * surface_area

# Ausgabe (auf zwei Nachkommastellen gerundet)
print('Tagesleistung:', total_energy.round(2), 'Wh')

Die Strahlungsenergie hat die Einheit Wh (Wattstunden).

Beispiel: Mit 1600 Wh kann eine Mikrowelle mit einem Stromverbrauch von 800 Watt 2 Stunden betrieben werden.

Um die Energie in Kilowattstunden anzugeben, muss der Wert einfach durch 1000 geteilt werden.

# W in kW umrechnen
total_energy = total_energy / 1000

# Ausgabe
print('Tagesleistung:', total_energy.round(2), 'kW')
Tagesleistung: 76.19 kW
Hinweis

Hierbei handelt es sich um die potenziell nutzbare Sonnenenergie, die auf die PV-Anlage trifft. Nur ein Teil davon kann tatsächlich in Strom umgewandelt werden. Zudem kann in der Regel aufgrund der Dachform nicht die gesamte Fläche mit PV-Anlagen versehen werden.

Aufgabe 5

  • Bestimme die optimale Ausrichtung und Neigung einer Dachfläche für den Einsatz von PV unter den oben definierten Bedigungen.
  • Verändere dazu die Schieberegler für die Parameter surface_tilt und surface_area.
  • Ziel ist es, den Wert für die Bestrahlungsenergie zu maximieren.

(5 Minuten)

Hinweis

Um mit der folgenden Abbildung interagieren zu können, muss das Notebook in einer Jupyter Umgebung ausgeführt werden!

from cdec import interactive_irradiance

interactive_irradiance(clear_sky, solar_position)

Optimale Neigung und Ausrichtung der Dachfläche:

Parameter Optimale Belegung
Neigung 18,50 Grad
Ausrichtung 180 Grad
Bestrahlungsenergie 7.655 kWh/qm

Jahresleistung

Nun soll die Bestrahlungsstärke über einen Zeitraum von einem Jahr hinweg betrachtet werden.

Aufgabe 6

  • Kopiere den folgeden Programmcode in die dafür vorgesehene Zelle.
  • Vervollständige den Programmcode so, dass die Bestrahlungsstärke im Laufe eines Jahres berechnet wird:
    • Ändere den Wert der Variablen surface_tilt und surface_azimuth entsprechend den Werten für das von Ihnen ausgewählten Daches (siehe ).
    • Ändere den Start- und Endzeitpunkt so, dass die Zeitspanne genau ein Jahr beträgt.

(15 Minuten)

Größe Einheit Variable Berechnung
Bestrahlungsstärke Watt pro Quadratmeter [W/m2] irradiance
Bestrahlungsenergie pro Quadratmeter Wattstunden pro Quadratmeter [Wh/m2] total_irradiance irradiance.sum()
Bestrahlungsenergie Wattstunden [Wh] total_energy total_irradiance * surface_area
# Neigung der Dachfläche eingeben
surface_tilt =
# Ausrichtung der Dachfläche eingeben
surface_azimuth =

# Funktion zu Berechnung der Bestrahlungsstärke über ein Jahr
def get_annual_irradiance(surface_tilt, surface_azimuth):
    
    # Startzeitpunkt eingeben
    start = 
    # Endzeitpunkt eingeben
    end = 
                        
    # Zeitraum festlegen
    date_range = pd.date_range(
        start=start,
        end=end,
        freq='1h',
        tz=tz,
        inclusive='left'
    )
    
    # Stand der Sonne bestimmen
    solar_position = location.get_solarposition(date_range)
    
    # Klarer Himmel
    clear_sky = location.get_clearsky(date_range)
    
    # Bestrahlungsstärke berechnen
    irradiance = get_total_irradiance(
        surface_tilt=surface_tilt,
        surface_azimuth=surface_azimuth,
        dni=clear_sky['dni'],
        ghi=clear_sky['ghi'],
        dhi=clear_sky['dhi'],
        solar_zenith=solar_position['zenith'],
        solar_azimuth=solar_position['azimuth']
    )

    irradiance = irradiance['poa_global']

    return irradiance

irradiance = get_annual_irradiance(surface_tilt, surface_azimuth)

irradiance
# Hier Code einfügen
# Neigung der Dachfläche eingeben
surface_tilt = dach['neigung']
# Ausrichtung der Dachfläche eingeben
surface_azimuth = dach['richtung']

# Funktion zu Berechnung der Bestrahlungsstärke über ein Jahr
def calculate_irradiance_over_one_year(surface_tilt, surface_azimuth):
    
    # Startzeitpunkt eingeben
    start = '2024-01-01'
    # Endzeitpunkt eingeben
    end = '2025-01-01'
                        
    # Zeitraum festlegen
    date_range = pd.date_range(
        start=start,
        end=end,
        freq='1h',
        tz=tz,
        inclusive='left'
    )
    
    # Stand der Sonne bestimmen
    solar_position = location.get_solarposition(date_range)
    
    # Klarer Himmel
    clear_sky = location.get_clearsky(date_range)
    
    # Bestrahlungsstärke berechnen
    irradiance = get_total_irradiance(
        surface_tilt=surface_tilt,
        surface_azimuth=surface_azimuth,
        dni=clear_sky['dni'],
        ghi=clear_sky['ghi'],
        dhi=clear_sky['dhi'],
        solar_zenith=solar_position['zenith'],
        solar_azimuth=solar_position['azimuth']
    )

    irradiance = irradiance['poa_global']

    return irradiance

irradiance = calculate_irradiance_over_one_year(surface_tilt, surface_azimuth)

irradiance
2024-01-01 00:00:00+01:00    0.0
2024-01-01 01:00:00+01:00    0.0
2024-01-01 02:00:00+01:00    0.0
2024-01-01 03:00:00+01:00    0.0
2024-01-01 04:00:00+01:00    0.0
                            ... 
2024-12-31 19:00:00+01:00    0.0
2024-12-31 20:00:00+01:00    0.0
2024-12-31 21:00:00+01:00    0.0
2024-12-31 22:00:00+01:00    0.0
2024-12-31 23:00:00+01:00    0.0
Freq: h, Name: poa_global, Length: 8784, dtype: float64

4 Jahresverlauf

Nun kann die Veränderung der Bestrahlungsstärke im Verlauf eines Jahres betrachtet werden.

# Tagesleistung im Verlauf des Jahres bestimmen
daily = irradiance.resample('1D').sum()

# Liniendiagramm des Jahresverlauf
fig = px.line(daily, title="Bestrahlungsstärke im Verlauf eines Jahres")

fig.update_xaxes(title="Zeitpunkt")
fig.update_yaxes(title="Bestrahlungsstärke<br>[W/m<sup>2</sup>]")

fig.show()

5 Dachlächenpotenzial berechnen

Mit Hilfe der zuvor erstellten Funktion kann nun die Bestrahlungsenergie aller Dachflächen über den Zeitraum eines Jahres bestimmt werden.

# Fortschrittsbalken
from tqdm.auto import tqdm
tqdm.pandas()

# Funktion zur Berechnung der Bestrahlungsenergie pro Quadratmeter pro Jahr für ein Dach
def calculate_total_energy_per_square_metre(dach):
    # Ermittel Neigung und Ausrichtung der Dachfläche
    surface_tilt = dach['neigung']
    surface_azimuth = dach['richtung']

    # Jährliche Bestrahlungsstärke
    irradiance = calculate_irradiance_over_one_year(surface_tilt, surface_azimuth)

    total_energy_per_square_metre = irradiance.sum()

    # Rückgabe der Strahlungsenergie pro Quadratmeter
    return total_energy_per_square_metre

# Wende die Funktion auf alle Dächer aus den Datensatz an
total_energy_per_square_metre = df.progress_apply(calculate_total_energy_per_square_metre, axis=1)

# Füge das Resultat in die Spalte irradiance ein
df['total_energy_per_square_metre'] = total_energy_per_square_metre

# Berechne die Bestrahlungsenergie
df['total_energy'] = df['total_energy_per_square_metre'] * df['flaecheninhalt']

df

Nun kann die Dachflächen wieder auf einer Karte angezeigt werden. Die Einfärbung der Dachflächen ergibt sich nun aus dem Wert der Strahlungsenergie pro Quadratmeter.

df.explore(column='total_energy_per_square_metre', style_kwds=dict(weight=0))
Make this Notebook Trusted to load map: File -> Trust Notebook

6 Eignung bestimmen

Eine geneigte Dachfläche ist dann für den Einsatz von PV geeignet wenn

  • die Strahlungsenergie pro Quadratmeter pro Jahr mindestens 1500 kW beträgt und
  • die Dachfläche mindestens 20 Quadratmeter groß ist.

Bei Flachdächern wird angenommen, dass bei einer Aufständerung nach Süden 40 Prozent der Fläche genutzt werden kann. Flachdächer müssen daher mindestens eine Größe von 50 Quadratmeter aufweisen, um als geeignet eingestuft zu werden.

Aufgabe 7

  • Filtere die Daten ensprechend der oben genannten Kriterien.
  • Berücksichtige dabei auch die Flachdächer!
  • Der Datensatz df soll anschließend nurnoch die geeigneten Dachflächen enthalten.

(15 Minuten)

Tip

Wie im ersten Arbeitsblatt (Luftqualität) können die Daten mit folgender Notation gefiltert werden:

cond = df['Spaltenname'] >= Wert
df = df[cond]
cond = df['flaecheninhalt'] >= 20  
df = df[cond]  
cond = df['output'] >= 1500  
df = df[cond]
# Hier Code einfügen

7 Zwischenstand speichern

An dieser Stelle wird das Zwischenergebnis gespeichert, um dieses im nächsten Arbeitsblatt (Object Detection) wiederverwenden zu können.

df.to_file('data/solarkataster.json')

8 Zusammenfassung – Bestrahlungsstärke

In diesem Notebook hast du gelernt, wie du:

  • die Potenziale von Dachflächen für Photovoltaik (PV) anhand der erwarteten Sonneneinstrahlung analysierst,
  • die Bedeutung von Neigung und Ausrichtung einer Dachfläche für die Berechnung der Bestrahlungsstärke verstehst,
  • mit geeigneten Tools (z. B. pvlib) die Globalstrahlung berechnest,
  • die gewonnenen Ergebnisse visualisierst, um potenzielle Flächen zu identifizieren,
  • die Rolle von PV-Anlagen für Klimaschutz und Energieversorgung einordnest,
  • Fragen für die praktische Anwendung reflektierst, z. B. „Welche Dächer in der Nachbarschaft wären geeignet?“.

Wiederverwendung

Zitat

Mit BibTeX zitieren:
@online{sparmann2025,
  author = {Sparmann, Sören},
  title = {Bestrahlungsstärke (Teil 1)},
  date = {2025-05-30},
  url = {https://climate-data-entrepreneurial-club.netlify.app/modul_2/submodules/03_photovoltaik/01_bestrahlungsstaerke.html},
  langid = {de}
}
Bitte zitieren Sie diese Arbeit als:
Sparmann, Sören. 2025. “Bestrahlungsstärke (Teil 1).” May 30, 2025. https://climate-data-entrepreneurial-club.netlify.app/modul_2/submodules/03_photovoltaik/01_bestrahlungsstaerke.html.
close all nutshells