changes
[python_utils.git] / cached / weather_data.py
index 78f7ade4b571a01436cf79876fc1b540d5ee52b3..94a01313375f5a6e6ecc5b485c873e9280c54db5 100644 (file)
@@ -3,6 +3,7 @@
 from dataclasses import dataclass
 import datetime
 import json
+import logging
 import os
 from typing import List
 import urllib.request
@@ -13,6 +14,8 @@ import datetime_utils
 import list_utils
 import persistent
 
+logger = logging.getLogger(__name__)
+
 cfg = config.add_commandline_args(
     f'Cached Weather Data List ({__file__})',
     'Arguments controlling cached weather data',
@@ -38,6 +41,7 @@ class WeatherData:
     date: datetime.date              # The date
     high: float                      # The predicted high in F
     low: float                       # The predicted low in F
+    precipitation_inchs: float       # Number of inches of precipitation / day
     conditions: List[str]            # Conditions per ~3h window
     most_common_condition: str       # The most common condition
     icon: str                        # An icon to represent it
@@ -73,6 +77,7 @@ class CachedWeatherData(persistent.Persistent):
         highs = {}
         lows = {}
         conditions = {}
+        precip = {}
         param = "id=5786882"   # Bellevue, WA
         key = "c0b160c49743622f62a9cd3cda0270b3"
         www = urllib.request.urlopen(
@@ -81,16 +86,29 @@ class CachedWeatherData(persistent.Persistent):
         response = www.read()
         www.close()
         parsed_json = json.loads(response)
+        logger.debug(parsed_json)
         dt = datetime.datetime.fromtimestamp(parsed_json["dt"]).date()
         dates.add(dt)
         condition = parsed_json["weather"][0]["main"]
         icon = icon_by_condition.get(condition, '?')
+        p = 0.0
+        if 'rain' in parsed_json:
+            if '3h' in parsed_json['rain']:
+                p += float(parsed_json['rain']['3h'])
+            elif '1h' in parsed_json['rain']:
+                p += float(parsed_json['rain']['1h'])
+        if 'snow' in parsed_json:
+            if '3h' in parsed_json['snow']:
+                p += float(parsed_json['snow']['3h'])
+            elif '1h' in parsed_json['snow']:
+                p += float(parsed_json['snow']['1h'])
         if dt == now.date() and now.hour > 18 and condition == 'Clear':
             icon = '🌙'
         self.weather_data[dt] = WeatherData(
             date = dt,
             high = float(parsed_json["main"]["temp_max"]),
             low = float(parsed_json["main"]["temp_min"]),
+            precipitation_inchs = p / 25.4,
             conditions = [condition],
             most_common_condition = condition,
             icon = icon,
@@ -102,6 +120,7 @@ class CachedWeatherData(persistent.Persistent):
         response = www.read()
         www.close()
         parsed_json = json.loads(response)
+        logger.debug(parsed_json)
         count = parsed_json["cnt"]
         for x in range(count):
             data = parsed_json["list"][x]
@@ -112,12 +131,27 @@ class CachedWeatherData(persistent.Persistent):
                 highs[dt] = None
                 lows[dt] = None
                 conditions[dt] = []
-            temp = data["main"]["temp"]
-            if highs[dt] is None or temp > highs[dt]:
-                highs[dt] = temp
-            if lows[dt] is None or temp < lows[dt]:
-                lows[dt] = temp
+            for temp in (
+                    data["main"]["temp"],
+                    data['main']['temp_min'],
+                    data['main']['temp_max'],
+            ):
+                if highs[dt] is None or temp > highs[dt]:
+                    highs[dt] = temp
+                if lows[dt] is None or temp < lows[dt]:
+                    lows[dt] = temp
             cond = data["weather"][0]["main"]
+            precip[dt] = 0.0
+            if 'rain' in parsed_json:
+                if '3h' in parsed_json['rain']:
+                    precip[dt] += float(parsed_json['rain']['3h'])
+                elif '1h' in parsed_json['rain']:
+                    precip[dt] += float(parsed_json['rain']['1h'])
+            if 'snow' in parsed_json:
+                if '3h' in parsed_json['snow']:
+                    precip[dt] += float(parsed_json['snow']['3h'])
+                elif '1h' in parsed_json['snow']:
+                    precip[dt] += float(parsed_json['snow']['1h'])
             conditions[dt].append(cond)
 
         today = datetime_utils.now_pacific().date()
@@ -138,6 +172,7 @@ class CachedWeatherData(persistent.Persistent):
                 date = dt,
                 high = highs[dt],
                 low = lows[dt],
+                precipitation_inchs = precip[dt] / 25.4,
                 conditions = conditions[dt],
                 most_common_condition = most_common_condition,
                 icon = icon