diff --git a/main.py b/main.py index ad465aa..7233928 100644 --- a/main.py +++ b/main.py @@ -42,19 +42,6 @@ def format_datetime(dt): return f"{format_date(dt)} {format_time(dt)}" -def pollen_desc(index): - if index < 2.5: - return f"{index} l" - elif index < 4.9: - return f"{index} l-m" - elif index < 7.3: - return f"{index} m" - elif index < 9.7: - return f"{index} m-h" - else: - return f"{index} h" - - def relative_day_to_date(rel_dt): dt = datetime.now() day = timedelta(days=1) @@ -69,6 +56,24 @@ def relative_day_to_date(rel_dt): return passthrough +def build_daily_data(date, pollen_periods, weather_periods): + daily_data = {} + if date in pollen_periods: + daily_data["pollen"] = pollen_periods[date]["index"] + if date in weather_periods: + weather_data = weather_periods[date] + daily_data.update({ + "low": weather_data["low"], + "high": weather_data["high"], + "desc": weather_data["desc"], + "humidity": weather_data["humidity"], + "sunrise": weather_data["sunrise"], + "sunset": weather_data["sunset"], + "pressure": weather_data["pressure"], + }) + return daily_data + + def fallback_handler(func): @functools.wraps(func) async def wrapper(*args, **kwargs): @@ -106,10 +111,11 @@ async def fetch_pollen(zipcode): ), "periods": [ { - "index": pollen_desc(d["Index"]), + "index": int(d["Index"] / 12. * 100), "period": relative_day_to_date(d["Type"]), } for d in data["Location"]["periods"] + if d["Type"].lower().strip() in ["today", "tomorrow"] ], } ] @@ -122,7 +128,7 @@ async def fetch_weather(lat, lon, weather_api_key): response = await client.get(url) response.raise_for_status() data = response.json() - current, periods = data["current"], data["daily"][:3] + current, periods = data["current"], data["daily"][:2] return [ { "forecast_date": format_datetime(datetime.fromtimestamp(current["dt"])), @@ -163,8 +169,49 @@ async def read_root(token: str): fetch_weather(CONFIG["lat"], CONFIG["lon"], CONFIG["weather_api_key"]), ) - return { + pollen_periods = {p["period"]: p for p in pollen[0]["periods"]} if pollen and pollen[0]["periods"] else {} + weather_periods = {p["period"]: p for p in weather[0]["periods"]} if weather and weather[0]["periods"] else {} + + # Add current weather data as a "current" period + if weather and weather[0]: + data = weather[0] + weather_periods["current"] = { + "period": "current", + "temp": data["current_temp"], + "feels_like": data["current_feels_like"], + "humidity": data["current_humidity"], + "pressure": data["current_pressure"], + "desc": data["current_desc"], + "sunrise": data["sunrise"], + "sunset": data["sunset"] + } + + today_date = format_date(datetime.now()) + tomorrow_date = format_date(datetime.now() + timedelta(days=1)) + + result = { "fetched_at": format_datetime(datetime.now()), - "pollen": pollen, - "weather": weather, + "current": {}, + "today": {}, + "tomorrow": {}, } + + if "current" in weather_periods: + weather_data = weather_periods["current"] + result["current"] = { + "temp": weather_data["temp"], + "feels_like": weather_data["feels_like"], + "desc": weather_data["desc"], + "humidity": weather_data["humidity"], + "pressure": weather_data["pressure"] + } + + today_data = build_daily_data(today_date, pollen_periods, weather_periods) + if today_data: + result["today"] = today_data + + tomorrow_data = build_daily_data(tomorrow_date, pollen_periods, weather_periods) + if tomorrow_data: + result["tomorrow"] = tomorrow_data + + return result