Overrides + debugging modules / functions in logging.
[python_utils.git] / cached / weather_forecast.py
index ce4725d64a6c43699ab702b85d60d1f070366cf5..78556586204dff83ac51926795ad9beff682d4cb 100644 (file)
@@ -3,11 +3,13 @@
 from dataclasses import dataclass
 import datetime
 import logging
+import os
 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
@@ -26,7 +28,7 @@ cfg = config.add_commandline_args(
 cfg.add_argument(
     '--weather_forecast_cachefile',
     type=str,
-    default='/home/scott/.weather_forecast_cache',
+    default=f'{os.environ["HOME"]}/cache/.weather_forecast_cache',
     metavar='FILENAME',
     help='File in which to cache weather data'
 )
@@ -58,15 +60,23 @@ class CachedDetailedWeatherForecast(object):
         self.forecasts = {}
 
         # Ask the raspberry pi about the outside temperature.
-        www = urllib.request.urlopen(
-            "http://10.0.0.75/~pi/outside_temp"
-        )
-        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()
+        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()
 
         # Get a weather forecast for Bellevue.
         www = urllib.request.urlopen(
@@ -79,6 +89,7 @@ class CachedDetailedWeatherForecast(object):
         forecast = soup.find(id='detailed-forecast-body')
         parser = dp.DateParser()
 
+        said_temp = False
         last_dt = now
         dt = now
         for (day, txt) in zip(
@@ -100,8 +111,10 @@ class CachedDetailedWeatherForecast(object):
             sunrise = s['sunrise']
             sunset = s['sunset']
 
-            if dt.date == now.date:
-                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()}'
             blurb = text_utils.wrap_string(blurb, 80)
@@ -117,6 +130,7 @@ class CachedDetailedWeatherForecast(object):
                 )
 
     @classmethod
+    @overrides
     def load(cls):
         if persistent.was_file_written_within_n_seconds(
                 config.config['weather_forecast_cachefile'],
@@ -128,6 +142,7 @@ class CachedDetailedWeatherForecast(object):
                 return cls(weather_data)
         return None
 
+    @overrides
     def save(self):
         import pickle
         with open(config.config['weather_forecast_cachefile'], 'wb') as wf: