Auto-update: Thu Nov 14 14:13:58 PST 2024
This commit is contained in:
parent
940cba17e4
commit
a7c52fec65
1 changed files with 51 additions and 48 deletions
|
@ -583,7 +583,6 @@ async def update_dn_weather(date_time: dt_datetime, force_refresh: bool = False,
|
||||||
try:
|
try:
|
||||||
if lat and lon:
|
if lat and lon:
|
||||||
place = await GEO.code((lat, lon))
|
place = await GEO.code((lat, lon))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
l.debug(f"Updating weather for {date_time}")
|
l.debug(f"Updating weather for {date_time}")
|
||||||
places = await gis.fetch_locations(date_time)
|
places = await gis.fetch_locations(date_time)
|
||||||
|
@ -591,27 +590,29 @@ async def update_dn_weather(date_time: dt_datetime, force_refresh: bool = False,
|
||||||
lat = place.latitude
|
lat = place.latitude
|
||||||
lon = place.longitude
|
lon = place.longitude
|
||||||
|
|
||||||
l.debug(f"lat: {lat}, lon: {lon}, place: {place}")
|
# Get local timezone for the coordinates
|
||||||
|
local_tz = await GEO.timezone(lat, lon)
|
||||||
|
if not local_tz:
|
||||||
|
raise ValueError("Could not determine timezone for coordinates")
|
||||||
|
|
||||||
|
l.debug(f"lat: {lat}, lon: {lon}, place: {place}, timezone: {local_tz}")
|
||||||
|
|
||||||
city = GEO.find_override_location(lat, lon)
|
city = GEO.find_override_location(lat, lon)
|
||||||
if city:
|
if city:
|
||||||
l.info(f"Using override location: {city}")
|
l.info(f"Using override location: {city}")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if place.city and place.city != "":
|
if place.city and place.city != "":
|
||||||
city = place.city
|
city = place.city
|
||||||
l.info(f"City in data: {city}")
|
l.info(f"City in data: {city}")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
location = await GEO.code((lat, lon))
|
location = await GEO.code((lat, lon))
|
||||||
l.debug(f"location: {location}")
|
l.debug(f"location: {location}")
|
||||||
city = location.name
|
city = location.name
|
||||||
city = city if city else location.city
|
city = city if city else location.city
|
||||||
city = city if city else location.house_number + ' ' + location.road
|
city = city if city else location.house_number + ' ' + location.road
|
||||||
|
|
||||||
l.debug(f"City geocoded: {city}")
|
l.debug(f"City geocoded: {city}")
|
||||||
|
|
||||||
# Assemble journal path
|
absolute_path, relative_path = assemble_journal_path(date_time, filename="Weather", extension=".md", no_timestamp=True)
|
||||||
absolute_path, relative_path = assemble_journal_path(date_time, filename="Weather", extension=".md", no_timestamp = True)
|
|
||||||
l.debug(f"Journal path: absolute_path={absolute_path}, relative_path={relative_path}")
|
l.debug(f"Journal path: absolute_path={absolute_path}, relative_path={relative_path}")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -622,12 +623,10 @@ async def update_dn_weather(date_time: dt_datetime, force_refresh: bool = False,
|
||||||
DailyWeather = day.get('DailyWeather')
|
DailyWeather = day.get('DailyWeather')
|
||||||
HourlyWeather = day.get('HourlyWeather')
|
HourlyWeather = day.get('HourlyWeather')
|
||||||
if DailyWeather:
|
if DailyWeather:
|
||||||
# l.debug(f"Day: {DailyWeather}")
|
|
||||||
icon = DailyWeather.get('icon')
|
icon = DailyWeather.get('icon')
|
||||||
l.debug(f"Icon: {icon}")
|
l.debug(f"Icon: {icon}")
|
||||||
|
|
||||||
weather_icon, admonition = get_icon_and_admonition(icon) if icon else (":LiSunMoon:", "ad-weather")
|
weather_icon, admonition = get_icon_and_admonition(icon) if icon else (":LiSunMoon:", "ad-weather")
|
||||||
|
|
||||||
temp = DailyWeather.get('feelslike')
|
temp = DailyWeather.get('feelslike')
|
||||||
|
|
||||||
if DailyWeather.get('tempmax', 0) > 85:
|
if DailyWeather.get('tempmax', 0) > 85:
|
||||||
|
@ -636,6 +635,7 @@ async def update_dn_weather(date_time: dt_datetime, force_refresh: bool = False,
|
||||||
tempicon = ":LiThermometerSnowflake:"
|
tempicon = ":LiThermometerSnowflake:"
|
||||||
else:
|
else:
|
||||||
tempicon = ":LiThermometerSun:"
|
tempicon = ":LiThermometerSun:"
|
||||||
|
|
||||||
wind_direction = convert_degrees_to_cardinal(DailyWeather.get("winddir"))
|
wind_direction = convert_degrees_to_cardinal(DailyWeather.get("winddir"))
|
||||||
wind_str = f":LiWind: {DailyWeather.get('windspeed')}mph {wind_direction}"
|
wind_str = f":LiWind: {DailyWeather.get('windspeed')}mph {wind_direction}"
|
||||||
gust = DailyWeather.get('windgust', 0)
|
gust = DailyWeather.get('windgust', 0)
|
||||||
|
@ -646,20 +646,21 @@ async def update_dn_weather(date_time: dt_datetime, force_refresh: bool = False,
|
||||||
uvindex = DailyWeather.get('uvindex', 0)
|
uvindex = DailyWeather.get('uvindex', 0)
|
||||||
uvwarn = f" - :LiRadiation: Caution! UVI today is {uvindex}! :LiRadiation:\n" if (uvindex and uvindex > 8) else ""
|
uvwarn = f" - :LiRadiation: Caution! UVI today is {uvindex}! :LiRadiation:\n" if (uvindex and uvindex > 8) else ""
|
||||||
|
|
||||||
sunrise = DailyWeather.get('sunrise')
|
# Convert sunrise/sunset times to local timezone
|
||||||
sunset = DailyWeather.get('sunset')
|
sunrise = DailyWeather.get('sunrise').astimezone(local_tz)
|
||||||
srise_str = sunrise.time().strftime("%H:%M")
|
sunset = DailyWeather.get('sunset').astimezone(local_tz)
|
||||||
sset_str = sunset.time().strftime("%H:%M")
|
srise_str = sunrise.strftime("%H:%M")
|
||||||
|
sset_str = sunset.strftime("%H:%M")
|
||||||
|
|
||||||
|
date_str = date_time.astimezone(local_tz).strftime("%Y-%m-%d")
|
||||||
date_str = date_time.strftime("%Y-%m-%d")
|
now = dt_datetime.now(local_tz).strftime("%Y-%m-%d %H:%M:%S")
|
||||||
now = dt_datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
||||||
|
|
||||||
detailed_forecast = (
|
detailed_forecast = (
|
||||||
f"---\n"
|
f"---\n"
|
||||||
f"date: {date_str}\n"
|
f"date: {date_str}\n"
|
||||||
f"latitude: {lat}\n"
|
f"latitude: {lat}\n"
|
||||||
f"longitude: {lon}\n"
|
f"longitude: {lon}\n"
|
||||||
|
f"timezone: {local_tz}\n"
|
||||||
f"tags:\n"
|
f"tags:\n"
|
||||||
f" - weather\n"
|
f" - weather\n"
|
||||||
f"updated: {now}\n"
|
f"updated: {now}\n"
|
||||||
|
@ -680,14 +681,13 @@ async def update_dn_weather(date_time: dt_datetime, force_refresh: bool = False,
|
||||||
times, condition_symbols, temps, winds = [], [], [], []
|
times, condition_symbols, temps, winds = [], [], [], []
|
||||||
|
|
||||||
for hour in HourlyWeather:
|
for hour in HourlyWeather:
|
||||||
if hour.get('datetime').strftime("%H:%M:%S") in HOURLY_COLUMNS_MAPPING.values():
|
# Convert hourly datetime to local timezone before checking/formatting
|
||||||
|
local_hour = hour.get('datetime').astimezone(local_tz)
|
||||||
times.append(format_hourly_time(hour))
|
if local_hour.strftime("%H:%M:%S") in HOURLY_COLUMNS_MAPPING.values():
|
||||||
|
# Pass localized datetime to formatting functions
|
||||||
|
times.append(format_hourly_time(local_hour))
|
||||||
condition_symbols.append(format_hourly_icon(hour, sunrise, sunset))
|
condition_symbols.append(format_hourly_icon(hour, sunrise, sunset))
|
||||||
|
|
||||||
temps.append(format_hourly_temperature(hour))
|
temps.append(format_hourly_temperature(hour))
|
||||||
|
|
||||||
winds.append(format_hourly_wind(hour))
|
winds.append(format_hourly_wind(hour))
|
||||||
|
|
||||||
detailed_forecast += assemble_hourly_data_table(times, condition_symbols, temps, winds)
|
detailed_forecast += assemble_hourly_data_table(times, condition_symbols, temps, winds)
|
||||||
|
@ -699,7 +699,6 @@ async def update_dn_weather(date_time: dt_datetime, force_refresh: bool = False,
|
||||||
note_file.write(detailed_forecast)
|
note_file.write(detailed_forecast)
|
||||||
|
|
||||||
l.debug(f"Operation complete.")
|
l.debug(f"Operation complete.")
|
||||||
|
|
||||||
return narrative
|
return narrative
|
||||||
else:
|
else:
|
||||||
l.error(f"Failed to get DailyWeather from day: {day}")
|
l.error(f"Failed to get DailyWeather from day: {day}")
|
||||||
|
@ -728,16 +727,16 @@ async def update_dn_weather(date_time: dt_datetime, force_refresh: bool = False,
|
||||||
raise HTTPException(status_code=500, detail=f"Error in update_dn_weather: {str(e)}")
|
raise HTTPException(status_code=500, detail=f"Error in update_dn_weather: {str(e)}")
|
||||||
|
|
||||||
|
|
||||||
def format_hourly_time(hour):
|
def format_hourly_time(hour_datetime):
|
||||||
try:
|
try:
|
||||||
hour_12 = convert_to_12_hour_format(hour.get("datetime"))
|
# Assumes hour_datetime is already in local timezone from the calling function
|
||||||
|
hour_12 = convert_to_12_hour_format(hour_datetime)
|
||||||
return hour_12
|
return hour_12
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
l.error(f"Error in format_hourly_time: {str(e)}")
|
l.error(f"Error in format_hourly_time: {str(e)}")
|
||||||
l.error(traceback.format_exc())
|
l.error(traceback.format_exc())
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|
||||||
def format_hourly_icon(hour, sunrise, sunset):
|
def format_hourly_icon(hour, sunrise, sunset):
|
||||||
try:
|
try:
|
||||||
icon_str = hour.get('icon', '')
|
icon_str = hour.get('icon', '')
|
||||||
|
@ -753,9 +752,13 @@ def format_hourly_icon(hour, sunrise, sunset):
|
||||||
precip_type = hour.get('preciptype', [''])
|
precip_type = hour.get('preciptype', [''])
|
||||||
sp_str = f"{str(precip)}mm"
|
sp_str = f"{str(precip)}mm"
|
||||||
|
|
||||||
if abs(hour.get('datetime') - sunrise) < timedelta(minutes=60):
|
# Use the already-converted datetime from the calling function
|
||||||
|
hour_datetime = hour.get('datetime') # This should already be in local timezone
|
||||||
|
|
||||||
|
# Sunrise and sunset should already be in local timezone from calling function
|
||||||
|
if abs(hour_datetime - sunrise) < timedelta(minutes=60):
|
||||||
icon = ":LiSunrise:"
|
icon = ":LiSunrise:"
|
||||||
elif abs(hour.get('datetime') - sunset) < timedelta(minutes=60):
|
elif abs(hour_datetime - sunset) < timedelta(minutes=60):
|
||||||
icon = ":LiSunset:"
|
icon = ":LiSunset:"
|
||||||
elif "thunder" in hour.get('icon'):
|
elif "thunder" in hour.get('icon'):
|
||||||
icon += ":LiZap:"
|
icon += ":LiZap:"
|
||||||
|
|
Loading…
Reference in a new issue