63 lines
1.6 KiB
Python
63 lines
1.6 KiB
Python
"""
|
|
Collector for Bright Sky (Weather) API.
|
|
"""
|
|
|
|
import logging
|
|
from datetime import datetime, timedelta, timezone
|
|
|
|
import polars as pl
|
|
|
|
from utils import request_utils
|
|
from utils.config_loader import settings
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def fetch_weather(lat: float = None, lon: float = None) -> pl.DataFrame:
|
|
"""
|
|
Fetches historical weather data from Bright Sky API.
|
|
Filters for the specific columns defined in the Bronze schema.
|
|
|
|
Returns:
|
|
A Polars DataFrame containing filtered raw weather parameters.
|
|
"""
|
|
lat = lat or settings.brightsky.lat
|
|
lon = lon or settings.brightsky.lon
|
|
url = settings.brightsky.base_url
|
|
|
|
current_utc = datetime.now(timezone.utc)
|
|
payload = {
|
|
"date": (current_utc - timedelta(hours=72)).isoformat(),
|
|
"last_date": current_utc.isoformat(),
|
|
"lat": lat,
|
|
"lon": lon,
|
|
"units": "dwd",
|
|
"tz": "Etc/UTC",
|
|
}
|
|
|
|
schema_cols = [
|
|
"timestamp",
|
|
"temperature",
|
|
"wind_speed",
|
|
"solar",
|
|
"sunshine",
|
|
"cloud_cover",
|
|
"precipitation",
|
|
]
|
|
|
|
try:
|
|
data = request_utils.make_requests(url, params=payload)
|
|
weather_list = data.get("weather", [])
|
|
|
|
if not weather_list:
|
|
logger.warning("No weather data returned from API.")
|
|
return pl.DataFrame()
|
|
|
|
df = pl.DataFrame(weather_list)
|
|
|
|
available_cols = [c for c in schema_cols if c in df.columns]
|
|
return df.select(available_cols)
|
|
|
|
except Exception as e:
|
|
logger.error(f"Failed to fetch weather data: {e}")
|
|
return pl.DataFrame()
|