import datetime
import logging
import os
+from typing import Any
import urllib.request
import astral # type: ignore
from astral.sun import sun # type: ignore
from bs4 import BeautifulSoup # type: ignore
+from overrides import overrides
import pytz
import argparse_utils
import dateparse.dateparse_utils as dp
import persistent
import text_utils
+import smart_home.thermometers as temps
+
logger = logging.getLogger(__name__)
cfg.add_argument(
'--weather_forecast_cachefile',
type=str,
- default=f'{os.environ["HOME"]}/.weather_forecast_cache',
+ default=f'{os.environ["HOME"]}/cache/.weather_forecast_cache',
metavar='FILENAME',
help='File in which to cache weather data'
)
@persistent.persistent_autoloaded_singleton()
-class CachedDetailedWeatherForecast(object):
+class CachedDetailedWeatherForecast(persistent.Persistent):
def __init__(self, forecasts = None):
if forecasts is not None:
self.forecasts = forecasts
self.forecasts = {}
# Ask the raspberry pi about the outside temperature.
- www = urllib.request.urlopen(
- "http://10.0.0.75/~pi/outside_temp"
+ current_temp = temps.ThermometerRegistry().read_temperature(
+ 'house_outside', convert_to_fahrenheit=True
)
- current_temp = www.read().decode("utf-8")
- current_temp = float(current_temp)
- current_temp *= (9/5)
- current_temp += 32.0
- current_temp = round(current_temp)
- www.close()
# Get a weather forecast for Bellevue.
www = urllib.request.urlopen(
sunrise = s['sunrise']
sunset = s['sunset']
- if dt.date == now.date and not said_temp:
- blurb = f'{day.get_text()}: The current outside tempterature is {current_temp}. ' + txt.get_text()
+ if dt.date() == now.date() and not said_temp and current_temp is not None:
+ blurb = f'{day.get_text()}: The current outside tempterature is {current_temp}. '
+ blurb += txt.get_text()
said_temp = True
else:
blurb = f'{day.get_text()}: {txt.get_text()}'
)
@classmethod
- def load(cls):
+ @overrides
+ def load(cls) -> Any:
if persistent.was_file_written_within_n_seconds(
config.config['weather_forecast_cachefile'],
config.config['weather_forecast_stalest_acceptable'].total_seconds(),
return cls(weather_data)
return None
- def save(self):
+ @overrides
+ def save(self) -> bool:
import pickle
with open(config.config['weather_forecast_cachefile'], 'wb') as wf:
pickle.dump(
wf,
pickle.HIGHEST_PROTOCOL,
)
+ return True