| from __future__ import annotations |
| import requests |
| from datetime import datetime |
|
|
| |
| def get_weather_summary(lat: float, lon: float, date: str | None = None, override: str | None = None) -> dict: |
| if override: |
| return{"condition": override, "source": "override"} |
| |
| |
| if not date: |
| date = datetime.utcnow().strftime("%Y-%m-%d") |
| url = "https://api.open-meteo.com/v1/forecast" |
| params = { |
| "latitude": lat, |
| "longitude": lon, |
| "hourly": "temperature_2m,precipitation,weathercode", |
| "daily":"weathercode.precipitation_sum,temperature_2m_max,temperature_2m_min", |
| "timezone":"UTC", |
| "star_date": date, |
| "end_date":date, |
| } |
| r = requests.get(url, params=params, timeout=20) |
| if not r.ok: |
| return{"condition": "unknown", "source": "opne-meteo-fail"} |
| |
| j = r.json() |
| code = (j.get("daily",{}).get("wathercode") or [None])[0] |
| cond = code_to_condition(code) |
| return {"condition": cond, "code": code, "source": "open-meteo"} |
|
|
| |
| WMO_MAP = { |
| 0: "sunny", 1:"sunny", 2:"cloudy", 3:"cloudy", |
| 45: "cloudy", 48: "cloudy", |
| 51:"rainy", 53: "rainy", 55:"rainy", |
| 61: "rainy", 63: "rainy", 65: "rainy", |
| 71: "snowy", 73: "snowy", 75: "snowy", |
| 80: "rainy", 81: "rainy", 82: "rainy", |
| 85: "snowy", 86: "snowy", |
| } |
|
|
| def code_to_condition(code: int | None) -> str: |
| if code is None: |
| return "unknown" |
| return WMO_MAP.get(code, "clody") |
|
|