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 = None
- try:
- www = urllib.request.urlopen(
- "http://10.0.0.75/~pi/outside_temp",
- timeout=2,
- )
- 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)
- except Exception:
- logger.warning('Timed out reading 10.0.0.75/~pi/outside_temp?!')
- current_temp = None
- finally:
- if www is not None:
- www.close()
+ current_temp = temps.ThermometerRegistry().read_temperature(
+ 'house_outside', convert_to_fahrenheit=True
+ )
# Get a weather forecast for Bellevue.
www = urllib.request.urlopen(
)
@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