remove old owm_forecasts pyowm wrapper
This commit is contained in:
parent
ed37862bdf
commit
b32a709967
@ -1,128 +0,0 @@
|
|||||||
import logging
|
|
||||||
from datetime import datetime
|
|
||||||
from datetime import timedelta
|
|
||||||
|
|
||||||
import arrow
|
|
||||||
from dateutil import tz
|
|
||||||
from pyowm import OWM
|
|
||||||
from pyowm.utils.config import get_default_config
|
|
||||||
|
|
||||||
from inkycal.custom.functions import get_system_tz
|
|
||||||
|
|
||||||
## Configure logger instance for local logging
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
logger.setLevel(logging.DEBUG)
|
|
||||||
|
|
||||||
|
|
||||||
def is_timestamp_within_range(timestamp, start_time, end_time):
|
|
||||||
# Check if the timestamp is within the range
|
|
||||||
return start_time <= timestamp <= end_time
|
|
||||||
|
|
||||||
|
|
||||||
def get_owm_data(city_id: int, token: str, temp_units: str, wind_units: str, language: str = "en"):
|
|
||||||
config_dict = get_default_config()
|
|
||||||
config_dict["language"] = language
|
|
||||||
|
|
||||||
tz_zone = tz.gettz(get_system_tz())
|
|
||||||
|
|
||||||
owm = OWM(token, config_dict)
|
|
||||||
|
|
||||||
mgr = owm.weather_manager()
|
|
||||||
|
|
||||||
current_observation = mgr.weather_at_id(id=city_id)
|
|
||||||
current_weather = current_observation.weather
|
|
||||||
hourly_forecasts = mgr.forecast_at_id(id=city_id, interval="3h")
|
|
||||||
|
|
||||||
# Forecasts are provided for every 3rd full hour
|
|
||||||
# - find out how many hours there are until the next 3rd full hour
|
|
||||||
now = arrow.utcnow()
|
|
||||||
if (now.hour % 3) != 0:
|
|
||||||
hour_gap = 3 - (now.hour % 3)
|
|
||||||
else:
|
|
||||||
hour_gap = 3
|
|
||||||
|
|
||||||
# Create timings for hourly forcasts
|
|
||||||
steps = [i * 3 for i in range(40)]
|
|
||||||
forecast_timings = [now.shift(hours=+hour_gap + step).floor("hour") for step in steps]
|
|
||||||
|
|
||||||
# Create forecast objects for given timings
|
|
||||||
forecasts = [hourly_forecasts.get_weather_at(forecast_time.datetime) for forecast_time in forecast_timings]
|
|
||||||
|
|
||||||
# Add forecast-data to fc_data list of dictionaries
|
|
||||||
hourly_data_dict = []
|
|
||||||
for forecast in forecasts:
|
|
||||||
temp = forecast.temperature(unit=temp_units)["temp"]
|
|
||||||
min_temp = forecast.temperature(unit=temp_units)["temp_min"]
|
|
||||||
max_temp = forecast.temperature(unit=temp_units)["temp_max"]
|
|
||||||
wind = forecast.wind(unit=wind_units)["speed"]
|
|
||||||
wind_gust = forecast.wind(unit=wind_units)["gust"]
|
|
||||||
# combined precipitation (snow + rain)
|
|
||||||
precip_mm = 0.0
|
|
||||||
if "3h" in forecast.rain.keys():
|
|
||||||
precip_mm = +forecast.rain["3h"]
|
|
||||||
if "3h" in forecast.snow.keys():
|
|
||||||
precip_mm = +forecast.snow["3h"]
|
|
||||||
|
|
||||||
icon = forecast.weather_icon_name
|
|
||||||
hourly_data_dict.append(
|
|
||||||
{
|
|
||||||
"temp": temp,
|
|
||||||
"min_temp": min_temp,
|
|
||||||
"max_temp": max_temp,
|
|
||||||
"precip_3h_mm": precip_mm,
|
|
||||||
"wind": wind,
|
|
||||||
"wind_gust": wind_gust,
|
|
||||||
"icon": icon,
|
|
||||||
"datetime": forecast_timings[forecasts.index(forecast)].datetime.astimezone(tz=tz_zone),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
return (current_weather, hourly_data_dict)
|
|
||||||
|
|
||||||
|
|
||||||
def get_forecast_for_day(days_from_today: int, hourly_forecasts: list) -> dict:
|
|
||||||
"""Get temperature range, rain and most frequent icon code for forecast
|
|
||||||
days_from_today should be int from 0-4: e.g. 2 -> 2 days from today
|
|
||||||
"""
|
|
||||||
# Calculate the start and end times for the specified number of days from now
|
|
||||||
current_time = datetime.now()
|
|
||||||
tz_zone = tz.gettz(get_system_tz())
|
|
||||||
start_time = (
|
|
||||||
(current_time + timedelta(days=days_from_today))
|
|
||||||
.replace(hour=0, minute=0, second=0, microsecond=0)
|
|
||||||
.astimezone(tz=tz_zone)
|
|
||||||
)
|
|
||||||
end_time = (start_time + timedelta(days=1)).astimezone(tz=tz_zone)
|
|
||||||
|
|
||||||
# Get all the forecasts for that day's time range
|
|
||||||
forecasts = [
|
|
||||||
f
|
|
||||||
for f in hourly_forecasts
|
|
||||||
if is_timestamp_within_range(timestamp=f["datetime"], start_time=start_time, end_time=end_time)
|
|
||||||
]
|
|
||||||
|
|
||||||
# if all the forecasts are from the next day, at least use the first one in the list to be able to return something
|
|
||||||
if forecasts == []:
|
|
||||||
forecasts.append(hourly_forecasts[0])
|
|
||||||
|
|
||||||
# Get rain and temperatures for that day
|
|
||||||
temps = [f["temp"] for f in forecasts]
|
|
||||||
rain = sum([f["precip_3h_mm"] for f in forecasts])
|
|
||||||
|
|
||||||
# Get all weather icon codes for this day
|
|
||||||
icons = [f["icon"] for f in forecasts]
|
|
||||||
day_icons = [icon for icon in icons if "d" in icon]
|
|
||||||
|
|
||||||
# Use the day icons if possible
|
|
||||||
icon = max(set(day_icons), key=icons.count) if len(day_icons) > 0 else max(set(icons), key=icons.count)
|
|
||||||
|
|
||||||
# Return a dict with that day's data
|
|
||||||
day_data = {
|
|
||||||
"datetime": start_time.timestamp(),
|
|
||||||
"icon": icon,
|
|
||||||
"temp_min": min(temps),
|
|
||||||
"temp_max": max(temps),
|
|
||||||
"precip_mm": rain,
|
|
||||||
}
|
|
||||||
|
|
||||||
return day_data
|
|
Loading…
Reference in New Issue
Block a user