mirror of
https://github.com/CCOSTAN/Home-AssistantConfig.git
synced 2025-11-06 17:51:36 +00:00
70 lines
2.3 KiB
Python
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))
|