From 1d2b08c115f857fae6b328ff5337001f3a42002f Mon Sep 17 00:00:00 2001 From: Eskimue Date: Wed, 29 Apr 2026 14:12:54 +0200 Subject: [PATCH] Goldenes Tor der Ekliptik eingebaut in die Monatsvorhersage --- public/monatsvorhersage.php | 37 ++- public/py/__pycache__/api.cpython-314.pyc | Bin 209212 -> 282751 bytes public/py/api.py | 381 +++++++++++++++++++++- 3 files changed, 415 insertions(+), 3 deletions(-) diff --git a/public/monatsvorhersage.php b/public/monatsvorhersage.php index 67b37ba..68358ee 100644 --- a/public/monatsvorhersage.php +++ b/public/monatsvorhersage.php @@ -230,6 +230,7 @@ $goldenHandleEvents = []; $moonPlanetApproaches = []; $moonDeepSkyApproaches = []; $planetBrightStarApproaches = []; +$goldenGatePlanetEvents = []; $mercuryGoodVisibilityEvents = []; $planetParadeEvents = []; $planetConstellationChangeEvents = []; @@ -876,7 +877,7 @@ if (!function_exists('monthForecastBuildNarrativeText')) { $planetObservationEvents = $findEvents( $filteredEvents, - static fn (array $event): bool => in_array((string) ($event['type'] ?? ''), ['inner_planet_elongation', 'venus_peak_magnitude', 'outer_planet_event', 'planet_conjunction', 'planet_parade', 'mercury_good_visibility'], true), + static fn (array $event): bool => in_array((string) ($event['type'] ?? ''), ['inner_planet_elongation', 'venus_peak_magnitude', 'outer_planet_event', 'planet_conjunction', 'planet_parade', 'mercury_good_visibility', 'golden_gate_of_ecliptic'], true), 5 ); if ($planetObservationEvents !== []) { @@ -1662,6 +1663,26 @@ if (is_array($planetBrightStarDecoded) && ($planetBrightStarDecoded['ok'] ?? fal $planetBrightStarApproaches = is_array($planetBrightStarDecoded['approaches'] ?? null) ? $planetBrightStarDecoded['approaches'] : []; } +$goldenGateOutput = []; +$goldenGateExitCode = 0; +$goldenGateArgs = [ + $pythonScriptPath, + 'golden_gate_of_ecliptic_for_month', + (string) $chartLatitude, + (string) $chartLongitude, + (string) $chartElevation, + (string) $selectedYear, + (string) $selectedMonth, + $chartTimezone, +]; +$goldenGateCommand = $pythonExecutable . ' ' . implode(' ', array_map('escapeshellarg', $goldenGateArgs)) . ' 2>&1'; +exec($goldenGateCommand, $goldenGateOutput, $goldenGateExitCode); +$goldenGateRaw = trim(implode("\n", $goldenGateOutput)); +$goldenGateDecoded = json_decode($goldenGateRaw, true); +if (is_array($goldenGateDecoded) && ($goldenGateDecoded['ok'] ?? false)) { + $goldenGatePlanetEvents = is_array($goldenGateDecoded['events'] ?? null) ? $goldenGateDecoded['events'] : []; +} + $planetConjunctionOutput = []; $planetConjunctionExitCode = 0; $planetConjunctionArgs = [ @@ -2099,6 +2120,20 @@ foreach ($planetBrightStarApproaches as $approachEvent) { ]; } +foreach ($goldenGatePlanetEvents as $goldenGateEvent) { + if (!is_array($goldenGateEvent)) { + continue; + } + + $monthEventList[] = [ + 'event' => (string) ($goldenGateEvent['label'] ?? 'Planet im Goldenen Tor der Ekliptik'), + 'date' => (string) ($goldenGateEvent['local_date'] ?? ''), + 'time' => (string) ($goldenGateEvent['local_time'] ?? ''), + 'local_iso' => (string) ($goldenGateEvent['local_iso'] ?? ''), + 'type' => 'golden_gate_of_ecliptic', + ]; +} + foreach ($planetConjunctions as $conjunctionEvent) { if (!is_array($conjunctionEvent)) { continue; diff --git a/public/py/__pycache__/api.cpython-314.pyc b/public/py/__pycache__/api.cpython-314.pyc index 4b12884300755bc8fc3954271027b975952a1bc9..44f62a87aa0091c9dbeb2463665b097c85656cdc 100644 GIT binary patch delta 80471 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

T7YJECJZBxiVACf*_+uvKv#t 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 delta 30908 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%0DaEZjEiY=m8ZPS{CL?|SkNps_H~ z4cx}+kw5fT<2WppL=R9`Tuu?}Ng-RE$Q$Tp{z<3eK8*`bbu?2A+-^5^v=-recj{ny za)6o;`!b3)hwG|dK-O?GX&k6#x4($Qj4EwvfthxR5U_kqx`bxiXkT={g8WVNJmGe- zHEtZCkz%z#4i8{Hv>sUky?}wxNrM1faJ&owSO(@fFnu*+h!0*-=<CS_BSn0nMGC#I^& z3Gd?DaQ*m#w@thbkDlfF^8ChBwJ|CaSmZ^ta`Pj6mp`AlCpt}ygx}x6u<4-3!CmtV z09tM|d}}D>tRng={hu4_0*I{0QIq+@QL-^dos``de{SfCF!+G};P=@${90R91%uy_ zO2rTy{-yiQo=KODRy7}XWZZ34?Mdl2OUFyRewH#BY#FleP_@c>ftQ(v`S2@m^dm?4 zR4W|98m1PfUM#y={%xpQcF`UTc{N_?w`pe}bFHy<>c?7atwCMvwnm*;yO;48hj=Dsp zDKdPtT2^vFaSD<0LAFeg#STg5A(9S4oN2HQmdD4dliP0uxfatDQ7b(jAoL<<+7;R9@cJcV2Uib0z$0fY)i!H>2f|Nwy9Y|I-#@{XetGV7W4MgZ>#3 zi#EntkYbM_NJfx?AQb^lq=g&lbTa}B?g`ZG;xNAbnq3Ldh;Q%)Kk)$qJi0CLMgoDS zRs|kQ6L@k-;PDiJCl3VfRTsEPSm4G!F&#-;f&{%5!3PL%j|NO|Zoq0NQgEewccPj! zX$VwK24n|hfaz0M4)amK!UNK5H;csECF* zVMJxL{9>{?TRvB$T4nB3^(}c>q56%q7sKQJDXP^EFP>+kKUKqzMx^dsvEOub{2VBx zoRwiA+2zsS8VtsYXgX2}6KC+-A@F90;Qqgv+&4ol=RYy|6Z~s|5aiQ9ChK+Lk4P<| zC9N2o#>dZ$a#e|%F$t|OhGhl)JXRQ76ojj4Sa7`yoKCy=6m$Py1musnAio~|b;u7( zfbmoD)lp2fAdSc`n~c~@1d9Gk6joiB*V8h+l|R=twA@{k#Oz z;2!LD+Jvodl-}Q!laO`v_+oHDx&_lH*hx`PT9>C#D8)X5kxL3%Qh<_TS`>(9Xq&zGtrr0p{Gwv=;;`OI{#j)k-IbBW<> z)VV|x8-1>C3X4BCRgNiFE9A@N>gdP__$7`0;gB;?_Nh?a^4bbDxBXoID9Dz=*zj}V z4896ipb#@-Q}A&Ff>GzfRW|NiOe}nv-3LI{Bmh^j7S0Bqt2d5hrmvfsfhC-bir*N1 z+?=v8;&@aXU~wtXg^1{lrsEOj8(X)n-LiIT+D6kklaWn57i(g<=lUuv&vwpiWC`bD z$nBGRh)# tuple[float, float, float]: + ra_rad = math.radians(ra_hours * 15.0) + dec_rad = math.radians(dec_deg) + cos_dec = math.cos(dec_rad) + return ( + cos_dec * math.cos(ra_rad), + cos_dec * math.sin(ra_rad), + math.sin(dec_rad), + ) + + +def vector_dot(a: tuple[float, float, float], b: tuple[float, float, float]) -> float: + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + + +def vector_cross(a: tuple[float, float, float], b: tuple[float, float, float]) -> tuple[float, float, float]: + return ( + a[1] * b[2] - a[2] * b[1], + a[2] * b[0] - a[0] * b[2], + a[0] * b[1] - a[1] * b[0], + ) + + +def vector_scale(v: tuple[float, float, float], factor: float) -> tuple[float, float, float]: + return (v[0] * factor, v[1] * factor, v[2] * factor) + + +def vector_add(a: tuple[float, float, float], b: tuple[float, float, float]) -> tuple[float, float, float]: + return (a[0] + b[0], a[1] + b[1], a[2] + b[2]) + + +def vector_normalize(v: tuple[float, float, float]) -> tuple[float, float, float]: + length = math.sqrt(vector_dot(v, v)) + if length <= 0.0: + return (0.0, 0.0, 1.0) + return (v[0] / length, v[1] / length, v[2] / length) + + +def build_golden_gate_geometry() -> dict: + pleiades_vec = equatorial_unit_vector(GOLDEN_GATE_PLEIADES_RA_HOURS, GOLDEN_GATE_PLEIADES_DEC_DEG) + hyades_vec = equatorial_unit_vector(GOLDEN_GATE_HYADES_RA_HOURS, GOLDEN_GATE_HYADES_DEC_DEG) + center_vec = vector_normalize(vector_add(pleiades_vec, hyades_vec)) + north_vec = (0.0, 0.0, 1.0) + east_vec = vector_normalize(vector_cross(north_vec, center_vec)) + north_tangent_vec = vector_normalize(vector_cross(center_vec, east_vec)) + + def project(ra_hours: float, dec_deg: float) -> tuple[float, float]: + vec = equatorial_unit_vector(ra_hours, dec_deg) + return ( + math.degrees(math.asin(max(-1.0, min(1.0, vector_dot(vec, east_vec))))), + math.degrees(math.asin(max(-1.0, min(1.0, vector_dot(vec, north_tangent_vec))))), + ) + + pleiades_xy = project(GOLDEN_GATE_PLEIADES_RA_HOURS, GOLDEN_GATE_PLEIADES_DEC_DEG) + hyades_xy = project(GOLDEN_GATE_HYADES_RA_HOURS, GOLDEN_GATE_HYADES_DEC_DEG) + + return { + "center_vec": center_vec, + "east_vec": east_vec, + "north_vec": north_tangent_vec, + "pleiades_xy": pleiades_xy, + "hyades_xy": hyades_xy, + } + + +GOLDEN_GATE_GEOMETRY = build_golden_gate_geometry() + + +def golden_gate_planet_state( + body: astronomy.Body, + observer: astronomy.Observer, + dt_utc: datetime, +) -> dict: + time_value = dt_to_time(dt_utc) + body_eq = astronomy.Equator(body, time_value, observer, True, True) + planet_vec = equatorial_unit_vector(float(body_eq.ra), float(body_eq.dec)) + + x = math.degrees(math.asin(max(-1.0, min(1.0, vector_dot(planet_vec, GOLDEN_GATE_GEOMETRY["east_vec"]))))) + y = math.degrees(math.asin(max(-1.0, min(1.0, vector_dot(planet_vec, GOLDEN_GATE_GEOMETRY["north_vec"]))))) + + ax, ay = GOLDEN_GATE_GEOMETRY["pleiades_xy"] + bx, by = GOLDEN_GATE_GEOMETRY["hyades_xy"] + sx = bx - ax + sy = by - ay + seg_len_sq = sx * sx + sy * sy + if seg_len_sq <= 0.0: + return { + "inside": False, + "center_distance_deg": 999.0, + "offset_deg": 999.0, + "track_fraction": -1.0, + "entry_margin_deg": 999.0, + } + + px = x - ax + py = y - ay + track_fraction = (px * sx + py * sy) / seg_len_sq + closest_x = ax + track_fraction * sx + closest_y = ay + track_fraction * sy + offset_deg = math.hypot(x - closest_x, y - closest_y) + center_distance_deg = math.hypot(x, y) + seg_len_deg = math.sqrt(seg_len_sq) + before_start_deg = max(0.0, -track_fraction * seg_len_deg) + after_end_deg = max(0.0, (track_fraction - 1.0) * seg_len_deg) + along_excess_deg = max(before_start_deg, after_end_deg) + width_excess_deg = max(0.0, offset_deg - GOLDEN_GATE_HALF_WIDTH_DEG) + inside = 0.0 <= track_fraction <= 1.0 and offset_deg <= GOLDEN_GATE_HALF_WIDTH_DEG + entry_margin_deg = max(width_excess_deg, along_excess_deg) + if inside: + entry_margin_deg = -min( + GOLDEN_GATE_HALF_WIDTH_DEG - offset_deg, + track_fraction * seg_len_deg, + (1.0 - track_fraction) * seg_len_deg, + ) + + return { + "inside": inside, + "center_distance_deg": float(center_distance_deg), + "offset_deg": float(offset_deg), + "track_fraction": float(track_fraction), + "entry_margin_deg": float(entry_margin_deg), + } + + +def golden_gate_visibility_state( + body: astronomy.Body, + observer: astronomy.Observer, + dt_utc: datetime, +) -> dict: + planet_altitude_deg = body_altitude_deg(body, observer, dt_utc) + sun_altitude_deg = body_altitude_deg(astronomy.Body.Sun, observer, dt_utc) + solar_separation_deg = planet_pair_separation_deg(body, astronomy.Body.Sun, observer, dt_utc) + observable = ( + planet_altitude_deg >= GOLDEN_GATE_MIN_PLANET_ALTITUDE_DEG + and sun_altitude_deg <= GOLDEN_GATE_MAX_SUN_ALTITUDE_DEG + and solar_separation_deg >= GOLDEN_GATE_MIN_SOLAR_SEPARATION_DEG + ) + return { + "observable": bool(observable), + "planet_altitude_deg": float(planet_altitude_deg), + "sun_altitude_deg": float(sun_altitude_deg), + "solar_separation_deg": float(solar_separation_deg), + } + + +def refine_golden_gate_offset_minimum( + body: astronomy.Body, + observer: astronomy.Observer, + left_utc: datetime, + right_utc: datetime, +) -> tuple[datetime, dict]: + left = left_utc + right = right_utc + + for _ in range(32): + span = (right - left) / 3 + m1 = left + span + m2 = right - span + f1 = golden_gate_planet_state(body, observer, m1)["offset_deg"] + f2 = golden_gate_planet_state(body, observer, m2)["offset_deg"] + if f1 <= f2: + right = m2 + else: + left = m1 + + best = left + (right - left) / 2 + return best, golden_gate_planet_state(body, observer, best) + + +def refine_golden_gate_observable_minimum( + body: astronomy.Body, + observer: astronomy.Observer, + left_utc: datetime, + right_utc: datetime, +) -> tuple[datetime | None, dict | None, dict | None]: + step = timedelta(minutes=5) + current = left_utc + best_time: datetime | None = None + best_gate_state: dict | None = None + best_visibility_state: dict | None = None + + while current <= right_utc: + gate_state = golden_gate_planet_state(body, observer, current) + visibility_state = golden_gate_visibility_state(body, observer, current) + if bool(gate_state["inside"]) and bool(visibility_state["observable"]): + if best_gate_state is None or float(gate_state["offset_deg"]) < float(best_gate_state["offset_deg"]): + best_time = current + best_gate_state = gate_state + best_visibility_state = visibility_state + current += step + + if best_time is None or best_gate_state is None or best_visibility_state is None: + return None, None, None + + return best_time, best_gate_state, best_visibility_state + + def refine_minimum_separation( body: astronomy.Body, observer: astronomy.Observer, @@ -2989,6 +3205,162 @@ def action_planet_conjunctions_for_month(args: list[str]) -> dict: } +def action_golden_gate_of_ecliptic_for_month(args: list[str]) -> dict: + if len(args) != 6: + fail( + "Aktion golden_gate_of_ecliptic_for_month erwartet 6 Argumente: latitude longitude elevation year month timezone", + extra={"argv": args}, + ) + + latitude = parse_float(args[0], "Latitude") + longitude = parse_float(args[1], "Longitude") + elevation = parse_float(args[2], "Elevation") + + try: + year = int(args[3]) + month = int(args[4]) + except ValueError as exc: + fail("Jahr oder Monat sind ungueltig.", extra={"details": str(exc), "argv": args}) + + if month < 1 or month > 12: + fail("Monat muss zwischen 1 und 12 liegen.", extra={"month": month}) + + timezone_name = args[5] + try: + tz = ZoneInfo(timezone_name) + except Exception as exc: + fail("Zeitzone ist ungueltig oder auf dem Server nicht verfuegbar.", extra={"details": str(exc)}) + + observer = astronomy.Observer(latitude, longitude, elevation) + local_start = datetime(year, month, 1, 0, 0, 0, tzinfo=tz) + if month == 12: + local_end = datetime(year + 1, 1, 1, 0, 0, 0, tzinfo=tz) + else: + local_end = datetime(year, month + 1, 1, 0, 0, 0, tzinfo=tz) + + utc_start = local_start.astimezone(timezone.utc) + utc_end = local_end.astimezone(timezone.utc) + scan_step = timedelta(hours=1) + passages: list[dict] = [] + + for planet_label, planet_body, planet_key in GOLDEN_GATE_PLANETS: + samples: list[tuple[datetime, dict]] = [] + current = utc_start + while current <= utc_end: + samples.append((current, golden_gate_planet_state(planet_body, observer, current))) + current += scan_step + if samples[-1][0] < utc_end: + samples.append((utc_end, golden_gate_planet_state(planet_body, observer, utc_end))) + + segment_start: datetime | None = None + best_sample_time: datetime | None = None + best_sample_state: dict | None = None + + for sample_time, sample_state in samples: + if bool(sample_state["inside"]): + if segment_start is None: + segment_start = sample_time + best_sample_time = sample_time + best_sample_state = sample_state + elif best_sample_state is None or float(sample_state["offset_deg"]) < float(best_sample_state["offset_deg"]): + best_sample_time = sample_time + best_sample_state = sample_state + elif segment_start is not None: + segment_end = sample_time + refine_left = max(utc_start, segment_start - scan_step) + refine_right = min(utc_end, segment_end) + event_time_utc, event_state, visibility_state = refine_golden_gate_observable_minimum( + planet_body, + observer, + refine_left, + refine_right, + ) + if ( + event_time_utc is not None + and event_state is not None + and visibility_state is not None + ): + local_dt = event_time_utc.astimezone(tz) + if local_dt.year == year and local_dt.month == month: + passages.append({ + "planet_key": planet_key, + "planet_label": planet_label, + "label": f"{planet_label} im Goldenen Tor der Ekliptik", + "center_distance_deg": float(event_state["center_distance_deg"]), + "offset_deg": float(event_state["offset_deg"]), + "track_fraction": float(event_state["track_fraction"]), + "planet_altitude_deg": float(visibility_state["planet_altitude_deg"]), + "sun_altitude_deg": float(visibility_state["sun_altitude_deg"]), + "solar_separation_deg": float(visibility_state["solar_separation_deg"]), + "utc_iso": event_time_utc.isoformat().replace("+00:00", "Z"), + "local_iso": local_dt.isoformat(), + "local_date": local_dt.strftime("%d.%m.%Y"), + "local_time": local_dt.strftime("%H:%M"), + }) + segment_start = None + best_sample_time = None + best_sample_state = None + + if segment_start is not None: + refine_left = max(utc_start, segment_start - scan_step) + refine_right = utc_end + event_time_utc, event_state, visibility_state = refine_golden_gate_observable_minimum( + planet_body, + observer, + refine_left, + refine_right, + ) + if ( + event_time_utc is not None + and event_state is not None + and visibility_state is not None + ): + local_dt = event_time_utc.astimezone(tz) + if local_dt.year == year and local_dt.month == month: + passages.append({ + "planet_key": planet_key, + "planet_label": planet_label, + "label": f"{planet_label} im Goldenen Tor der Ekliptik", + "center_distance_deg": float(event_state["center_distance_deg"]), + "offset_deg": float(event_state["offset_deg"]), + "track_fraction": float(event_state["track_fraction"]), + "planet_altitude_deg": float(visibility_state["planet_altitude_deg"]), + "sun_altitude_deg": float(visibility_state["sun_altitude_deg"]), + "solar_separation_deg": float(visibility_state["solar_separation_deg"]), + "utc_iso": event_time_utc.isoformat().replace("+00:00", "Z"), + "local_iso": local_dt.isoformat(), + "local_date": local_dt.strftime("%d.%m.%Y"), + "local_time": local_dt.strftime("%H:%M"), + }) + + passages.sort(key=lambda item: item["local_iso"]) + + return { + "ok": True, + "action": "golden_gate_of_ecliptic_for_month", + "selected": { + "year": year, + "month": month, + "timezone": timezone_name, + }, + "gate": { + "pleiades": { + "ra_hours": GOLDEN_GATE_PLEIADES_RA_HOURS, + "dec_deg": GOLDEN_GATE_PLEIADES_DEC_DEG, + }, + "hyades": { + "ra_hours": GOLDEN_GATE_HYADES_RA_HOURS, + "dec_deg": GOLDEN_GATE_HYADES_DEC_DEG, + }, + "half_width_deg": GOLDEN_GATE_HALF_WIDTH_DEG, + "min_planet_altitude_deg": GOLDEN_GATE_MIN_PLANET_ALTITUDE_DEG, + "max_sun_altitude_deg": GOLDEN_GATE_MAX_SUN_ALTITUDE_DEG, + "min_solar_separation_deg": GOLDEN_GATE_MIN_SOLAR_SEPARATION_DEG, + }, + "events": passages, + } + + def eclipse_kind_label(kind: astronomy.EclipseKind) -> str: if kind == astronomy.EclipseKind.Penumbral: return "Halbschatten" @@ -5110,7 +5482,7 @@ def action_satellite_passes(args: list[str]) -> dict: def main() -> None: if len(sys.argv) < 2: - fail("Es wurde keine Aktion uebergeben.", extra={"available_actions": ["sun_moon_rise_set", "solar_longitude_to_datetime", "current_solar_longitude", "astronomical_conversions", "comet_brightnesses", "favorite_comet_events_for_month", "moon_star_occultations", "moon_phase_details", "satellite_passes", "planet_rise_set", "planet_ephemeris", "month_sky_context", "moon_phases_for_month", "golden_handle_for_month", "season_changes_for_month", "time_changes_for_month", "moon_planet_approaches", "moon_deep_sky_approaches_for_month", "planet_bright_star_approaches_for_month", "planet_conjunctions_for_month", "eclipses_for_month", "moon_apsides_for_month", "sun_apsides_for_month", "inner_planet_elongations_for_month", "venus_peak_magnitude_for_month", "outer_planet_events_for_month", "outer_planet_stations_for_month", "jupiter_moons_one_side_for_month", "mercury_good_visibility_for_month", "planet_parades_for_month", "planet_constellation_changes_for_month", "moon_star_occultations_for_month"]}) + fail("Es wurde keine Aktion uebergeben.", extra={"available_actions": ["sun_moon_rise_set", "solar_longitude_to_datetime", "current_solar_longitude", "astronomical_conversions", "comet_brightnesses", "favorite_comet_events_for_month", "moon_star_occultations", "moon_phase_details", "satellite_passes", "planet_rise_set", "planet_ephemeris", "month_sky_context", "moon_phases_for_month", "golden_handle_for_month", "season_changes_for_month", "time_changes_for_month", "moon_planet_approaches", "moon_deep_sky_approaches_for_month", "planet_bright_star_approaches_for_month", "golden_gate_of_ecliptic_for_month", "planet_conjunctions_for_month", "eclipses_for_month", "moon_apsides_for_month", "sun_apsides_for_month", "inner_planet_elongations_for_month", "venus_peak_magnitude_for_month", "outer_planet_events_for_month", "outer_planet_stations_for_month", "jupiter_moons_one_side_for_month", "mercury_good_visibility_for_month", "planet_parades_for_month", "planet_constellation_changes_for_month", "moon_star_occultations_for_month"]}) action = sys.argv[1] args = sys.argv[2:] @@ -5215,6 +5587,11 @@ def main() -> None: print(json.dumps(result, ensure_ascii=True)) return + if action == "golden_gate_of_ecliptic_for_month": + result = action_golden_gate_of_ecliptic_for_month(args) + print(json.dumps(result, ensure_ascii=True)) + return + if action == "planet_conjunctions_for_month": result = action_planet_conjunctions_for_month(args) print(json.dumps(result, ensure_ascii=True)) @@ -5285,7 +5662,7 @@ def main() -> None: print(json.dumps(result, ensure_ascii=True)) return - fail("Unbekannte Aktion.", extra={"action": action, "available_actions": ["sun_moon_rise_set", "solar_longitude_to_datetime", "current_solar_longitude", "astronomical_conversions", "comet_brightnesses", "favorite_comet_events_for_month", "moon_star_occultations", "moon_phase_details", "satellite_passes", "planet_rise_set", "planet_ephemeris", "planet_visibility_chart", "month_sky_context", "moon_phases_for_month", "golden_handle_for_month", "season_changes_for_month", "time_changes_for_month", "moon_planet_approaches", "moon_deep_sky_approaches_for_month", "planet_bright_star_approaches_for_month", "planet_conjunctions_for_month", "eclipses_for_month", "moon_apsides_for_month", "sun_apsides_for_month", "inner_planet_elongations_for_month", "venus_peak_magnitude_for_month", "outer_planet_events_for_month", "outer_planet_stations_for_month", "jupiter_moons_one_side_for_month", "mercury_good_visibility_for_month", "planet_parades_for_month", "planet_constellation_changes_for_month", "moon_star_occultations_for_month"]}) + fail("Unbekannte Aktion.", extra={"action": action, "available_actions": ["sun_moon_rise_set", "solar_longitude_to_datetime", "current_solar_longitude", "astronomical_conversions", "comet_brightnesses", "favorite_comet_events_for_month", "moon_star_occultations", "moon_phase_details", "satellite_passes", "planet_rise_set", "planet_ephemeris", "planet_visibility_chart", "month_sky_context", "moon_phases_for_month", "golden_handle_for_month", "season_changes_for_month", "time_changes_for_month", "moon_planet_approaches", "moon_deep_sky_approaches_for_month", "planet_bright_star_approaches_for_month", "golden_gate_of_ecliptic_for_month", "planet_conjunctions_for_month", "eclipses_for_month", "moon_apsides_for_month", "sun_apsides_for_month", "inner_planet_elongations_for_month", "venus_peak_magnitude_for_month", "outer_planet_events_for_month", "outer_planet_stations_for_month", "jupiter_moons_one_side_for_month", "mercury_good_visibility_for_month", "planet_parades_for_month", "planet_constellation_changes_for_month", "moon_star_occultations_for_month"]}) if __name__ == "__main__":