V 1.7.0 feat: Sonnenauf-/untergang und Mondphase berechnet

Die Header-Zeile zeigte bisher feste Platzhalter ("06:45", "18:30",
"abnehmend 50%"). Jetzt werden die Werte tatsaechlich gerechnet, ohne
neue Abhaengigkeit:

- utils/astro.js: getSunTimes() nach dem NOAA-Sonnenstandsalgorithmus
  inkl. Hoehenkorrektur, getMoonPhase() nach gekuerzten Meeus-Reihen.
- Standort steht als Konstante STATION in App.jsx und speist sowohl
  Anzeige als auch Berechnung; Koordinaten auf die echten Stationswerte
  korrigiert (48° 52′ 27″ N, 9° 35′ 46″ E, 547 m NN).

Geprueft gegen unabhaengige Referenzimplementierungen: Sonnenzeiten
<= 50 s Abweichung gegen den vollstaendigen NOAA-Algorithmus, Neu- und
Vollmondzeitpunkte <= 39 min gegen Meeus Kap. 49.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-28 18:37:45 +02:00
parent 8aa528ff5b
commit a5f36e8f92
3 changed files with 245 additions and 7 deletions
+31 -6
View File
@@ -1,7 +1,28 @@
import { useState, useEffect, useRef } from 'react'
import WeatherDashboard from './components/WeatherDashboard'
import { getSunTimes, getMoonPhase, formatTime, formatMoonPhase } from './utils/astro'
import './App.css'
// Grad/Minuten/Sekunden in Dezimalgrad
const dms = (deg, min, sec) => deg + min / 60 + sec / 3600
// Dezimalgrad zurueck nach Grad/Minuten/Sekunden fuer die Anzeige
function formatDms(value) {
let deg = Math.floor(value)
let min = Math.floor((value - deg) * 60)
let sec = Math.round(((value - deg) * 60 - min) * 60)
if (sec === 60) { sec = 0; min += 1 } // Rundungsuebertrag
if (min === 60) { min = 0; deg += 1 }
return `${deg}° ${min} ${sec}`
}
// Standort der Wetterstation — Basis fuer Header-Anzeige und Astro-Berechnung
const STATION = {
lat: dms(48, 52, 27), // noerdliche Breite
lon: dms(9, 35, 46), // oestliche Laenge
elevation: 547, // Meter ueber NN
}
// API-Basis-URL: in Dev direkt auf Backend, in Prod ueber Nginx-Proxy
const API_BASE = import.meta.env.DEV ? 'http://localhost:8000' : '/api'
@@ -193,11 +214,13 @@ function App() {
minute: '2-digit'
})
// TODO: Sonnenauf-/untergang und Mondphase berechnen
// Aktuell Platzhalter - benoetigt Bibliothek wie 'suncalc'
const sunrise = "06:45"
const sunset = "18:30"
const moonPhase = "abnehmend 50%"
// Sonnenauf-/untergang fuer heute am Stationsstandort
const sunTimes = getSunTimes(now, STATION.lat, STATION.lon, STATION.elevation)
const sunrise = formatTime(sunTimes.sunrise)
const sunset = formatTime(sunTimes.sunset)
// Mondphase zum aktuellen Zeitpunkt
const moonPhase = formatMoonPhase(getMoonPhase(now))
return (
<div className="app">
@@ -205,7 +228,9 @@ function App() {
<h1>Aktuelle Wetterdaten</h1>
<div className="header-datetime">{dateStr} - {timeStr} Uhr</div>
<div className="header-spacer"></div>
<div className="header-coordinates">48.6 N - 9.6 E - 574 m NN</div>
<div className="header-coordinates">
{formatDms(STATION.lat)} N - {formatDms(STATION.lon)} E - {STATION.elevation} m NN
</div>
<div className="header-astro">
Sonnen-Aufgang: {sunrise} - Untergang: {sunset} &nbsp;&nbsp; Mond-Phase: {moonPhase}
</div>