aprsd/aprsd/weather.py

67 lines
1.8 KiB
Python

import abc
import json
import logging
import requests
LOG = logging.getLogger("APRSD")
DEFAULT_PROVIDER = "us-gov"
PROVIDER_MAPPING = {
"us-gov": "aprsd.weather.USWeatherGov",
}
class APRSDWeather(metaclass=abc.ABCMeta):
confg = None
def __init__(self, config):
self.config = config
@abc.abstractmethod
def forecast_raw(self, lat, lon):
"""Get a raw forecast json for latitude, longitude.
The format of the json response is entirely
depentent on the service itself.
"""
pass
@abc.abstractmethod
def forecast_short(self, lat, lon):
"""Get a short form forecast for latitude, longitude."""
pass
class USWeatherGov(APRSDWeather):
def forecast_raw(self, lat, lon):
LOG.debug("Fetch station at {}, {}".format(lat, lon))
try:
url2 = (
"https://forecast.weather.gov/MapClick.php?lat=%s"
"&lon=%s&FcstType=json" % (lat, lon)
)
LOG.debug("Fetching weather '{}'".format(url2))
response = requests.get(url2)
except Exception as e:
LOG.error(e)
raise Exception("Failed to get weather")
else:
response.raise_for_status()
return json.loads(response.text)
def forecast_short(self, lat, lon):
"""Return a short string for the forecast."""
wx_data = self.forecast_raw(lat, lon)
reply = (
"{}F({}F/{}F) {}. {}, {}.".format(
wx_data["currentobservation"]["Temp"],
wx_data["data"]["temperature"][0],
wx_data["data"]["temperature"][1],
wx_data["data"]["weather"][0],
wx_data["time"]["startPeriodName"][1],
wx_data["data"]["weather"][1],
)
).rstrip()
return reply