Sunray ist ein webbasiertes und Benutzerintuitives Projekt, welches
Interessierten ermöglicht die Sonnenbahn sowie die
Sonnenstrahlungsenergie abhängig von an einem bestimmten Ort zu
visualisieren. Es lässt sich hierbei ein Benutzerdefinierters
Zeitintervall auswählen. Die dafür benötigten Daten werden von der NASA
POWER API und der PVGIS API bereitgestellt.
Die Visualisierung wird durch die Open Source Library JSXGraph
realisiert. Das Projekt wird mittels eines Automatischen Deployments
unter
https://markov.htwsaar.de/sunray/ ausgeliefert, und ist
Browserunabhängig.
Das Projekt ist für alle Nutzer*innen gedacht, welche sich praktisch mit der Astronomie unserer Sonne auseinander setzen möchten. Durch die Nutzung von Open-Source Libraries und einer nutzerfreundlichen Oberfläche ist der benötigte Overhead gering, und die Antworten präzise und schnell. Die Kernidee ist eine leichtgewichtige, benutzerfreundliche Darstellung ohne lokale Installation. Die Sonnenposition wird berechnet und für die 2D-Darstellung auf eine Ebene projiziert (JSXGraph).
Die einzelnen Fachbegriffe aus der Himmelsmechanik können am Anfang schwer verständlich wirken, lassen sich aber mittels einer bildlichen Visualisierung gut erläutern.
Zenit, Azimut, Höhe Orientierung am Himmel Visualisierung der behandleten Winkel
Im folgenden notieren wir einige Definitionen, welche zum Verständnis des Projekts sowie der resultierenden Sonnenposition beitragen. Der Ausgangspunkt ist hierbei eine Ebene auf welcher sich der Betrachter befindet.
Der Azimutwinkel ist der Winkel zwischen “dem Nordpunkt und dem Schnittpunkt des Vertikalkreises durch das Gestirn” . In den beigelegten Zeichnungen wird der Azimut mit A bezeichnet.
Der Höhenwinkel ist der Winkel zwischen “dem Gestirn und der Horizontebene” . Man bezeichnet diesen Winkel als Höhe h. Am Horizont liegt dieser bei 0° und im Zenit bei 90°.
Der Zenitwinkel wird mit z notiert und beschreibt den Winkel
zwischen dem “Zenit und dem Gestirn. Es gilt demnach :
Hier möchten wir die an unsere Webanwendung gestellten Anforderungen auflisten. Diese lassen sich in funktionale, technische, sowie nicht-funktionale einordnen.
Funktionale Anforderungen beziehen sich auf praktische Erwartungen, welche unser Projekt erfüllen sollte, und beschreiben konkreten Funktionen welche die Anwendung bereitstellen muss. Wir unterscheiden zwischen den zentralen Elementen der Sonnenposition und der Sonnenstrahlungsenergie.
Die Sonnenposition soll auf Basis des ausgewählten Standortes innerhalb eines bestimmten Zeitintervalls visualisiert werden.
Die Sonnenenergie soll in einem bestimmten Zeitraum, unter Berücksichtigung von meteorologischen Daten (Bewölkung, Luftverschmutzung, etc.) prognostiziert und in einem geeigneten Datenformat wie einem Diagramm dargestellt werden.
Technische Anforderungen beziehen sich auf die Erwartungen gegenüber der
zugrunde liegenden Architektur der Anwendung. Es soll ein eine
webbasierte, benutzerfreundliche Anwendung ohne eine vorher benötigte
lokale Installation entwickelt werden.
Die für das Programm benötigten Daten sollen per API Anfragen
gesammelt, sowie durch ausschließlich Open-Source Bibliotheken (NASA
POWER, PVGIS, JSXGraph, etc.) verarbeitet und dargestellt werden.
Nicht-funktionale Anforderungen beziehen sich auf Erwartungen welche keine direkten Auswirkungen auf die praktische Nutzung der Anwendung haben. Dies beinhaltet etwa die Dokumentation der Software (wie diese), aber auch Aspekte wie ein automatisiertes Deployment und einen Wartbaren, modularen Aufbau des Projekts.
Im folgenden werden dem Leser die Architektur von SUNRAY sowie die im Entwicklungsprozess getroffenen Entscheidungen bezüglich des Designs nähergebracht.
Wir haben uns bewusst für eine strukturierte, sowie leicht wartbare Softwarearchitektur entschieden. Die unterschiedlichen Komponenten sind in einzelne Module unterteilt, welche wiederrum klare Aufgaben lösen. SUNRAY ist ein komplett Frontend basiertes Projekt.
Als nächstes werden dem Leser der Aufbau der zwei zentralen Module, der
sunposition und sunenergy visualisiert dargestellt. Diese sind die
zwei primären Bausteine des Projekts.
Dieses Modul ist für die Berechnung und Visualisierung der
Sonnenposition zuständig. Die Datei shared/locationService.js befasst
sich mit der Abfrage des benötigten Standortes. Um die für die
Visualisierung benötigten Koordinaten zu erhalten, werden in
src/sunposition/jpl.js der Azimut A und die Höhe h in
2D-Koordinaten überführt.
:
Zunächst werden die gegebenen Winkel, Azimut A und die Höhe
h, welche im Gradmaß vorliegen, mit der Funktion toRad() in
Bogenmaß überführt :
Anschließend wird zur Umrechnung auf das kartesische Koordinatensystem
der Azimutwinkel um convertCoordination() durchgeführt:
Wobei gilt:
Die Berechnung der karteischen Koordinaten x,y sieht wie folgt aus :
Hierbei ist s der Radius nach der Projektion auf die horizontale Ebene.
Dieses Modul ist für die Prognose und Darstellung der
Sonneneinstrahlungsenergie verantwortlich. Der Aufbau ist hier ebenfalls
strukturiert.
Wie auch in dem vorherigen Modul wird shared/locationService.js für
die API Abfrage benutzt.
Um Informationen über die genannte Sonnenenergie darzustellen zu können,
werden vorher in src/sunenergy/pvgisService.js stündliche, tägliche,
monatliche und jährliche Abfragen zusammengestellt. Diese werden dann
and die jeweilige API geschickt.
:
Die Sonnenenergie wird mit verschiednen API’s abgefragt. Für die monatliche und jährliche Einstrahlung wird die NASA POWER API benutzt, während für die Werte pro Stunde und Pro Tag die PVGIS API verwendet wird.
####### API-Workflow:
-
URL mit Parametern für Standort/Zeit bauen.
-
Antwort abrufen und parsen (JSON bei NASA POWER, CSV-Stream bei PVGIS).
-
Ungültige Werte filtern.
-
In Paare
$(\text{Index},\,\text{Wert})$ abbilden, ggf. gruppieren/mitteln.
Hier wird dem Leser visualisiert welche Funktionen bei den Abfragen der
Sonnenenergie benutzt werden, aus welchen Quellen diese stammen, sowie
welche Ergebnisse Sie liefern.
PVGIS liefert stündlich aufgelöste Globalstrahlung als
modell-/satellitengestützte Werte (keine lokalen Messungen) für
Tagesverläufe. NASA POWER stellt tägliche/monatliche Mittel bereit,
wodurch Monats- und Jahresübersichten ohne lange Daily Lade Requests
möglich sind.
Um Messwerte zu erhalten benutzen wir den Parameter ALLSKY_SFC_SW_DWN
unter realen Bewölkungsbedingungen (kein wolkenfreier Idealwert) auf
einer horizontalen Fläche an der Oberfläche. Es handelt sich um die
tatsächlich ankommende, kurzwellige Sonnenstrahlung, welche von oben
nach unten auf die Erdoberfläche trifft. Es handelt sich hierbei nicht
um die absorbierte Energie. Wir betrachten hierbei die Summe aus einer
direkter Strahlung (Sonnenstrahlen, die ohne Streuung am Boden ankommen)
sowie diffuser Strahlung (gestreute Strahlung durch Wolken/Atmosphäre).
Die verarbeiteten Daten sind satellitengestützt und keine lokalen
Sensormessungen.
getMonthlyRadiation(lat,lon,month,year)
Quelle: NASA POWER.
Zeitraum: ganzer Monat
Format : JSON
Einheit: kW h m2 d−−1.
Endpoint: temporal/daily/point.
Parameter: “ALLSKY_SFC_SW_DWN” :
Hierbei liefert uns eine Anfrage tägliche Daten für den laufenden Monat mit einer systembedingten Verzögerung. Die letzten Tage des aktuellen Monats (oft bis zu einer Woche) fehlen.
Das Ergebnis nach dem Filtern sieht wie folgt aus:
getYearlyRadiation(lat,lon)
Quelle: NASA POWER.
Zeitraum: [JAN–DEC](Mittel).
Format : JSON
Einheit: kW h m2 d−−1.
Endpoint temporal/climatology/point.
Parameter ALLSKY_SFC_SW_DWN.
Hierbei bekommen wir keine Daten für ein bestimmtes Jahr, sondern
Langzeit-Durchschnittswerte, welche auf den Jahren 1983 bis 2005
basieren.
Das Ergebnis sieht wie folgt aus :
getDailyRadiation(lat,lon,month,h_start,h_end)
Quelle: PVGIS.
Zeitraum: gewählter Monat, Stunden
Format : CSV.
Einheit: W m−2.
Endpoint : DRcalc : lokale Zeit, stündliche Globalstrahlung.
Hierbei bekommen wir die Werte für den gewählten Monat sowie die
spezifizierten Stunden des Tages.
Das Ergebnis sieht wie folgt aus :
wobei gilt :
Hier wird die konkrete Umsetzung des Sunray Projekts beschrieben. Das
SUNRAY Projekt wurde in JavaScript und html umgesetzt.
Im folgenden wird die Projektstruktur innerhalb des src/ Directories
veranschaulicht. Die Dateien sind nach ihren jeweiligen Zuständigkeiten
gegliedert :
tree src -L 1
src
├── App.vue
├── assets
├── components
├── index.html
├── main.js
├── router
├── shared
├── styles
├── sunenergy
├── sunposition
├── test
└── views
10 directories, 3 files
Wir haben uns in diesem Projekt für das Frontend-Framework Vue.js entschieden, da es sich besonders für die Entwicklung mehrerer ähnlicher Anwendungsseiten eignet.
Da das Projekt mehrere ähnlich aufgebaute Unterseiten (z.B. sunpath, sunenergy) enthält, ermöglicht die komponentenbasierte Architektur von Vue die Wiederverwendung von UI-Elementen und Funktionalitäten zwischen verschiedenen Seiten.
Vues reaktives System sorgt dafür, dass sich die UI automatisch aktualisiert, etwa bei Änderungen der Location oder beim Wechsel des Modus, ohne dass manuelles DOM-Management erforderlich ist.
Die Vue-Komponenten ermöglichen eine saubere Trennung der Features und erleichtern die Wartung der verschiedenen Funktionalitäten.
Vue lässt sich nahtlos mit bestehender JavaScript-Logik wie
circle.js
oder energyChart.js verbinden.
Diese Kombination macht Vue zur idealen Wahl für unser Projekt mit mehreren Seiten, die gemeinsame Funktionalität teilen.
Das Modul sunPosition berechnet und visualisiert die Sonnenposition.
Der Ablauf lässt sich in vier Schritte gliedern:
-
Eingaben
shared/locationService.jsliefert die Standortkoordinaten ($lat,lon$ ). Die Sonnenwinkel werden alsazi(Azimut in Grad, 0$^\circ$ = Nord, Uhrzeigersinn) undalt(Höhe in Grad) an das Modul übergeben. -
Parsen
Innerhalb vonsunposition/jpl.jswerden die Felder via
parseSunposition({azi, alt})geliefert. -
Berechnung (vgl. Formeln [eq:degToRad] - [eq:yCoordinate])
toRad(deg)rechnet Werte in Bogenmaß um :Der Azimut wird für das später zu visualisierende 2D Koordinatensystem gedreht : x nach Osten, y nach Norden.
Die Projektion auf den Einheitskreis wird mit
convertCoordination({azimuth, altitude})durchgeführt.Die Rückgabe der Funktion lautet:
{ x, y }.Warum diese Umrechnung auf 2D?
JSXGraph rendert ausschließlich in der Zeichenebene. Der behandelte Azimut$A$ und Höhe$h$ sind jedoch Winkel im Horizontsystem einer Kugel. Für die Darstellung wird das System daher auf den Einheitskreis projiziert. -
Visualisierung
sunposition/circle.jsnutzt JSXGraph, um die Punkte (x,y) auf dem Kreis darzustellen. Ausgehend von dem Betrachter werden hier auch konzentrische Kreise hinzugefügt.
Das Modul sunEnergy berechnet und visualisiert die
Sonneneinstrahlungsenergie. Der Ablauf kann in die folgenden Schritte
unterteilt werden:
-
Eingaben : Standortdaten werden durch
shared/locationService.jsgewährleistet, dazu noch das gewünschte Zeitintervall. -
Sonnenposition : Weiterverarbeitung der Ergebnisse aus dem Modul
sunposition/jpl.js(Azimut, Höhe). -
Energieberechnung :
sunenergy/pvgisService.jsnutzt die
bereitgestellten Informationen um die Sonneneinstrahlung zu bestimmen. -
Visualisierung :
sunenergy/energyChart.jsstellt die erhaltenen Ergebnisse als JSXGraph Diagramm dar.
Im folgenden werden grundlegende Informationen was die Nutzung von SUNRAY angeht, geklärt.
Die Zielgruppe dieses Projekts sind Mathematik und Astronomie
interessierte Studierende, es könnte ebenfalls für Solartechnik Planner
nutzvoll sein. Es liegen keine speziellen
Voraussetzungen außer einer Internetverbindung, sowie der Erlaubnis zur
Nutzung der Use my Location Funktion zur Bestimmung des Standortes
vor.
Die Anwendung kann unter https://markov.htwsaar.de/sunray/ erreicht werden. Diese läuft in allen gängigen Broswern, ebenfalls ausgestattet mit einer Version für mobile Endgeräte.
-
Anklicken eines der Felder im Home Menu, das trifft die Auswahl ob man an der Sonnenposition oder Sonneneinstrahlungsenergie interessiert ist.
-
Suche nach einem Standort oder die Option Use my Location nutzen.
-
Wähle das gewünschte Zeitintervall aus.
-
Bestätige mit Search. Das Ergebnis ist nun sichtbar.
Im Folgenden wird die Nutzung von SUNRAY mittels 3 Screenshots
dargestellt. Das Beispiel zeigt neben dem Home Menu die Berechnung der
Sonnenbahn sowie
der Sonneneinstrahlung für den Standort Karachi, Pakistan.
Zur Sicherstellung der Funktionsfähigkeit und Wartbarkeit von SUNRAY wurden verschiedene Maßnahmen zur Qualitätssicherung umgesetzt. Diese lassen sich in automatische Tests, Code-Qualität und Deployment-Strategie unterteilen.
Die Kernlogik der Anwendung wird durch Unit-Tests gesichert. Dazu zählen
besonders die Funktionen, welche eine hohe Auswirkung auf die
Projektlogik haben. Hierbei haben wir das Test-Framework Vitest
genutzt.
Wir haben die Code Qualität unseres Projekts durch das einhalten von
Prinzipien wie etwa dem Clean Code gesichert. Eines davon ist das Low
Coupling & High Cohesion Konzept, hier sind unsere Module wie etwa
sunposition und sunenergy strikt voneinander getrennt, innerhalb
hängen sie aber stark zusammen.
Für die Auslieferung von SUNRAY wurde ein Deployment Skript
eingesetzt. Über (autodeploy.sh) wird der aktuelle Branch Code Stand
nach einem erfolgreichen Commit und dem ausführen des Skripts
ausgeliefert. Dadurch können wir gewährleisten, dass ausschließlich
dazuauthorisierte Personen auf den markov Server veröffentlichen
können.
Hier evaluieren wir das Projektergebnis mit Blick auf unseren Lösungsansatz.
Die Anwendung erfüllt die funktionalen Anforderungen wie etwa der Einbindung von API Abfragen zum erstellen eines Sonnenverlaufs oder verbildlichung der Sonnenenergie.
Die implementierten Buttons auf der Webseite sind interaktiv, die
JSXGraph
Diagramme sind nutzerfreundlich gestaltet und die ganze Anwendung läuft
im Browser ohne Installation.
Nach Abschluss des Projekts SUNRAY erfolgt im Folgenden eine kurze Bewertung und Reflexion.
Es liegt ein einfacher Zugriff auf wertvolle und interessante Informationen da, welche passend visualisiert werden. Eine klare Modularität und Clean Code Prinzipien unterstützen zusätzlich das Projekt.
Eine 3D Simulation der Sonnenbahn konnte leider wegen fehlender Zeit nicht integriert werden.
In diesem Abschnitt wird ein Ausblick auf mögliche Weiterentwicklungen des Projekts SUNRAY gegeben. Dabei werden sowohl funktionale Erweiterungen als auch ein wissenschaftlich-schulischer Bezug betrachtet.
Eine sinnvolle Erweiterung wäre die Integration zusätzlicher Wetterdaten
(Temperatur, Bewölkung, Luftfeuchtigkeit) zur genaueren
Energiebestimmung.
Zudem wäre eine 3D Simulation der Sonne und dem von Ihr geworfenen
Schatten visuell ansprechend.
SUNRAY eignet sich als Demonstrationstool für den Geographieunterricht
in der Schule.
Zudem wäre es interessant einen Vergleich zu real gemessenen Sensordaten
aufzustellen, da somit die Genauigkeit des Modells bestimmt werden
könnte.




