45 lines
1.8 KiB
Python
45 lines
1.8 KiB
Python
import datetime
|
|
|
|
from gallery.sketch.weather.model import Cloudness, Precipitation, WeatherValue
|
|
from gallery.sketch.weather.util import build_weather_value
|
|
|
|
from .openweather import ForecastItem
|
|
|
|
|
|
class ForecastItemParser:
|
|
CLOUDNESS_MAP: dict[str, Cloudness] = {
|
|
"clear sky": Cloudness.CLEAR,
|
|
"few clouds": Cloudness.PARTLY_CLOUDY,
|
|
"scattered clouds": Cloudness.PARTLY_CLOUDY,
|
|
"broken clouds": Cloudness.CLOUDY,
|
|
"overcast clouds": Cloudness.MAINLY_CLOUDY,
|
|
"light rain": Cloudness.CLOUDY,
|
|
}
|
|
|
|
PRECIPITATION_MAP: dict[str, Precipitation] = {
|
|
"light rain": Precipitation.SMALL_RAIN,
|
|
"rain": Precipitation.RAIN,
|
|
"heavy rain": Precipitation.SHOWER,
|
|
}
|
|
|
|
def parse(self, item: ForecastItem) -> WeatherValue:
|
|
item_date = datetime.datetime.fromtimestamp(item.dt, datetime.UTC)
|
|
item_date = item_date.replace(tzinfo=datetime.timezone.utc).astimezone(tz=None).replace(tzinfo=None)
|
|
value = build_weather_value(item_date)
|
|
# TODO parse temperature interval flag
|
|
value.temperature = [round(item.main.temp)]
|
|
# value.temperature = [round(item.main.temp_max), round(item.main.temp_min)]
|
|
value.pressure = [round(item.main.pressure / 133.3 * 100)]
|
|
value.humidity = item.main.humidity
|
|
value.wind_speed = round(item.wind.speed)
|
|
value.wind_gust = round(item.wind.gust)
|
|
value.wind_direction = item.wind.deg
|
|
value.sky.cloudness = self.CLOUDNESS_MAP.get(item.weather[0].description, Cloudness.CLEAR)
|
|
value.sky.precipitation = self.PRECIPITATION_MAP.get(item.weather[0].description, Precipitation.NO)
|
|
if item.rain:
|
|
value.precipitation = round(item.rain.interval_3h, 1)
|
|
return value
|
|
|
|
|
|
FORECAST_ITEM_PARSER = ForecastItemParser()
|