Files
Home-AssistantConfig/deps/forecastio/api.py
2016-10-11 16:42:06 +00:00

70 lines
2.3 KiB
Python

import requests
import threading
from forecastio.models import Forecast
def load_forecast(key, lat, lng, time=None, units="auto", lazy=False,
callback=None):
"""
This function builds the request url and loads some or all of the
needed json depending on lazy is True
inLat: The latitude of the forecast
inLong: The longitude of the forecast
time: A datetime.datetime object representing the desired time of
the forecast. If no timezone is present, the API assumes local
time at the provided latitude and longitude.
units: A string of the preferred units of measurement, "auto" id
default. also us,ca,uk,si is available
lazy: Defaults to false. The function will only request the json
data as it is needed. Results in more requests, but
probably a faster response time (I haven't checked)
"""
if time is None:
url = 'https://api.darksky.net/forecast/%s/%s,%s' \
'?units=%s' % (key, lat, lng, units,)
else:
url_time = time.replace(microsecond=0).isoformat() # API returns 400 for microseconds
url = 'https://api.darksky.net/forecast/%s/%s,%s,%s' \
'?units=%s' % (key, lat, lng, url_time,
units,)
if lazy is True:
baseURL = "%s&exclude=%s" % (url,
'minutely,currently,hourly,'
'daily,alerts,flags')
else:
baseURL = url
return manual(baseURL, callback=callback)
def manual(requestURL, callback=None):
"""
This function is used by load_forecast OR by users to manually
construct the URL for an API call.
"""
if callback is None:
return get_forecast(requestURL)
else:
thread = threading.Thread(target=load_async,
args=(requestURL, callback))
thread.start()
def get_forecast(requestURL):
forecastio_reponse = requests.get(requestURL)
forecastio_reponse.raise_for_status()
json = forecastio_reponse.json()
headers = forecastio_reponse.headers
return Forecast(json, forecastio_reponse, headers)
def load_async(url, callback):
callback(get_forecast(url))