Version 1.1.1: Regen via /weather/rain-daily, days relativ zu heute

- Regenberechnung nutzt neuen API-Endpunkt statt kumulativem Rohzähler
- days-Parameter relativ zu heute: funktioniert korrekt auch bei
  Aufruf mitten im Monat (z.B. 5.6. → zeigt trotzdem Mai komplett)
- Erster Tag des Folgemonats weiterhin im Chart sichtbar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
rxf
2026-06-01 21:54:24 +02:00
parent db8feb317e
commit f4fa3df73a
2 changed files with 14 additions and 27 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
[project] [project]
name = "weather2oag" name = "weather2oag"
version = "1.1.0" version = "1.1.1"
description = "Monatlicher Wetterbericht der Sternwarte Welzheim" description = "Monatlicher Wetterbericht der Sternwarte Welzheim"
requires-python = ">=3.12" requires-python = ">=3.12"
+13 -26
View File
@@ -4,7 +4,7 @@
import os import os
import smtplib import smtplib
import tempfile import tempfile
from collections import defaultdict
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from email.mime.image import MIMEImage from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEMultipart
@@ -85,32 +85,19 @@ def _data_temp_hourly(start: datetime, end: datetime):
def _data_rain_daily(start: datetime, end: datetime): def _data_rain_daily(start: datetime, end: datetime):
# +1 Tag extra damit der Abschlusswert des letzten Tages (kum. Zähler) enthalten ist today = datetime.now(timezone.utc).replace(hour=0, minute=0, second=0, microsecond=0)
data = fetch("/weather/range", { days = min((today - start).days + 2, 365)
"start": start.isoformat(), data = fetch("/weather/rain-daily", {"days": days})
"end": (end + timedelta(days=1)).isoformat(), pairs = []
"limit": 50000,
})
by_day: dict[str, list[float]] = defaultdict(list)
for d in data: for d in data:
if d.get("rain") is not None: day_dt = parse_dt(d["date"]).replace(hour=0, minute=0, second=0, microsecond=0)
by_day[parse_dt(d["datetime"]).strftime("%Y-%m-%d")].append(d["rain"]) if start <= day_dt < end:
pairs.append((day_dt, round(d["total_rain"], 1)))
dates, rain = [], [] pairs.sort()
for day_key in sorted(by_day): if not pairs:
day_dt = datetime.fromisoformat(day_key).replace(tzinfo=timezone.utc) return [], []
if day_dt >= end: dates, rain = zip(*pairs)
break return list(dates), list(rain)
vals = list(by_day[day_key])
next_key = (day_dt + timedelta(days=1)).strftime("%Y-%m-%d")
if next_key in by_day:
vals.append(by_day[next_key][0])
daily = max(vals) - min(vals)
if daily < 0:
daily = max(vals)
dates.append(day_dt)
rain.append(round(daily, 1))
return dates, rain
def create_combined_chart(start: datetime, end: datetime, label: str) -> bytes: def create_combined_chart(start: datetime, end: datetime, label: str) -> bytes: