diff --git a/requirements_test.txt b/requirements_test.txt index 620fe6c68a2..5ec8619b37f 100644 --- a/requirements_test.txt +++ b/requirements_test.txt @@ -7,3 +7,4 @@ pytest-timeout>=1.0.0 pytest-capturelog>=0.7 betamax==0.7.0 pydocstyle>=1.0.0 +httpretty==0.8.14 diff --git a/tests/components/test_forecast.py b/tests/components/test_forecast.py new file mode 100644 index 00000000000..519884b7b5f --- /dev/null +++ b/tests/components/test_forecast.py @@ -0,0 +1,77 @@ +"""The tests for the forecast.io platform.""" +import json +import re +import os +import unittest +from unittest.mock import MagicMock, patch + +import forecastio +import httpretty +import pytest +from requests.exceptions import HTTPError + +from homeassistant.components.sensor import forecast +from homeassistant import core as ha + + +class TestForecastSetup(unittest.TestCase): + """Test the forecast.io platform.""" + + def setUp(self): + """Initialize values for this testcase class.""" + self.hass = ha.HomeAssistant() + self.key = 'foo' + self.config = { + 'api_key': 'foo', + 'monitored_conditions': ['summary', 'icon'] + } + self.lat = 37.8267 + self.lon = -122.423 + self.hass.config.latitude = self.lat + self.hass.config.longitude = self.lon + + def test_setup_no_latitude(self): + """Test that the component is not loaded without required config.""" + self.hass.config.latitude = None + self.assertFalse(forecast.setup_platform(self.hass, {}, MagicMock())) + + @patch('forecastio.api.get_forecast') + def test_setup_bad_api_key(self, mock_get_forecast): + """Test for handling a bad API key.""" + # The forecast API wrapper that we use raises an HTTP error + # when you try to use a bad (or no) API key. + url = 'https://api.forecast.io/forecast/{}/{},{}?units=auto'.format( + self.key, str(self.lat), str(self.lon) + ) + msg = '400 Client Error: Bad Request for url: {}'.format(url) + mock_get_forecast.side_effect = HTTPError(msg,) + + with pytest.raises(HTTPError): + forecast.setup_platform(self.hass, self.config, MagicMock()) + + @httpretty.activate + @patch('forecastio.api.get_forecast', wraps=forecastio.api.get_forecast) + def test_setup(self, mock_get_forecast): + """Test for successfully setting up the forecast.io platform.""" + def load_fixture_from_json(): + cwd = os.path.dirname(__file__) + fixture_path = os.path.join(cwd, '..', 'fixtures', 'forecast.json') + with open(fixture_path) as file: + content = json.load(file) + return json.dumps(content) + + # Mock out any calls to the actual API and + # return the fixture json instead + uri = 'api.forecast.io\/forecast\/(\w+)\/(-?\d+\.?\d*),(-?\d+\.?\d*)' + httpretty.register_uri( + httpretty.GET, + re.compile(uri), + body=load_fixture_from_json(), + ) + # The following will raise an error if the regex for the mock was + # incorrect and we actually try to go out to the internet. + httpretty.HTTPretty.allow_net_connect = False + + forecast.setup_platform(self.hass, self.config, MagicMock()) + self.assertTrue(mock_get_forecast.called) + self.assertEqual(mock_get_forecast.call_count, 2) diff --git a/tests/fixtures/forecast.json b/tests/fixtures/forecast.json new file mode 100644 index 00000000000..01c66cae078 --- /dev/null +++ b/tests/fixtures/forecast.json @@ -0,0 +1,1462 @@ +{ + "alerts": [ + { + "description": "...BEACH HAZARDS STATEMENT REMAINS IN EFFECT UNTIL 9 PM PDT THIS\nEVENING...\n* HAZARDS...STRONG RIP CURRENTS AND LARGE SHORE BREAK.\n* TIMING...THROUGH THIS EVENING.\n* LOCATION...COASTLINE FROM SONOMA COUNTY SOUTH THROUGH MONTEREY\nCOUNTY. IN PARTICULAR SOUTHWEST FACING BEACHES...INCLUDING BUT\nNOT LIMITED TO...STINSON BEACH...SANTA CRUZ BOARDWALK BEACH\nAND TWIN LAKES BEACH.\n* POTENTIAL IMPACTS...STRONG RIP CURRENTS CAN PULL EVEN THE\nSTRONGEST SWIMMERS AWAY FROM SHORE. LARGE SHORE BREAK CAN\nRESULT IN SERIOUS NECK AND BACK INJURIES.\n", + "expires": 1464926400, + "time": 1464904560, + "title": "Beach Hazards Statement for San Francisco, CA", + "uri": "http://alerts.weather.gov/cap/wwacapget.php?x=CA1256018894B0.BeachHazardsStatement.125601952900CA.MTRCFWMTR.aba33b94542100e878a14a443e621995" + } + ], + "currently": { + "apparentTemperature": 68.1, + "cloudCover": 0.18, + "dewPoint": 53.23, + "humidity": 0.59, + "icon": "clear-day", + "nearestStormBearing": 115, + "nearestStormDistance": 325, + "ozone": 322.71, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.8, + "summary": "Clear", + "temperature": 68.1, + "time": 1464914163, + "visibility": 9.02, + "windBearing": 271, + "windSpeed": 9.38 + }, + "daily": { + "data": [ + { + "apparentTemperatureMax": 68.56, + "apparentTemperatureMaxTime": 1464915600, + "apparentTemperatureMin": 52.94, + "apparentTemperatureMinTime": 1464872400, + "cloudCover": 0.23, + "dewPoint": 51.98, + "humidity": 0.77, + "icon": "partly-cloudy-day", + "moonPhase": 0.91, + "ozone": 326.1, + "precipIntensity": 0, + "precipIntensityMax": 0, + "precipProbability": 0, + "pressure": 1014.84, + "summary": "Partly cloudy in the morning.", + "sunriseTime": 1464871812, + "sunsetTime": 1464924498, + "temperatureMax": 68.56, + "temperatureMaxTime": 1464915600, + "temperatureMin": 52.94, + "temperatureMinTime": 1464872400, + "time": 1464850800, + "visibility": 7.8, + "windBearing": 268, + "windSpeed": 5.59 + }, + { + "apparentTemperatureMax": 75.82, + "apparentTemperatureMaxTime": 1464991200, + "apparentTemperatureMin": 53.45, + "apparentTemperatureMinTime": 1464958800, + "cloudCover": 0.41, + "dewPoint": 53.58, + "humidity": 0.71, + "icon": "partly-cloudy-day", + "moonPhase": 0.95, + "ozone": 319.98, + "precipIntensity": 0, + "precipIntensityMax": 0, + "precipProbability": 0, + "pressure": 1015.2, + "summary": "Partly cloudy throughout the day.", + "sunriseTime": 1464958194, + "sunsetTime": 1465010936, + "temperatureMax": 75.82, + "temperatureMaxTime": 1464991200, + "temperatureMin": 53.45, + "temperatureMinTime": 1464958800, + "time": 1464937200, + "visibility": 9.24, + "windBearing": 274, + "windSpeed": 5.92 + }, + { + "apparentTemperatureMax": 72.18, + "apparentTemperatureMaxTime": 1465081200, + "apparentTemperatureMin": 53.06, + "apparentTemperatureMinTime": 1465038000, + "cloudCover": 0.74, + "dewPoint": 54.14, + "humidity": 0.78, + "icon": "partly-cloudy-day", + "moonPhase": 0.98, + "ozone": 324.21, + "precipIntensity": 0, + "precipIntensityMax": 0, + "precipProbability": 0, + "pressure": 1013.17, + "summary": "Mostly cloudy throughout the day.", + "sunriseTime": 1465044577, + "sunsetTime": 1465097372, + "temperatureMax": 72.18, + "temperatureMaxTime": 1465081200, + "temperatureMin": 53.06, + "temperatureMinTime": 1465038000, + "time": 1465023600, + "visibility": 7.94, + "windBearing": 255, + "windSpeed": 5.5 + }, + { + "apparentTemperatureMax": 71.76, + "apparentTemperatureMaxTime": 1465171200, + "apparentTemperatureMin": 52.37, + "apparentTemperatureMinTime": 1465131600, + "cloudCover": 0.5, + "dewPoint": 53.42, + "humidity": 0.8, + "icon": "fog", + "moonPhase": 0.03, + "ozone": 325.96, + "precipIntensity": 0.0006, + "precipIntensityMax": 0.0016, + "precipIntensityMaxTime": 1465135200, + "precipProbability": 0.04, + "precipType": "rain", + "pressure": 1011.43, + "summary": "Foggy in the morning.", + "sunriseTime": 1465130962, + "sunsetTime": 1465183808, + "temperatureMax": 71.76, + "temperatureMaxTime": 1465171200, + "temperatureMin": 52.37, + "temperatureMinTime": 1465131600, + "time": 1465110000, + "visibility": 6.86, + "windBearing": 252, + "windSpeed": 7.29 + }, + { + "apparentTemperatureMax": 69.01, + "apparentTemperatureMaxTime": 1465246800, + "apparentTemperatureMin": 54.75, + "apparentTemperatureMinTime": 1465214400, + "cloudCover": 0.09, + "dewPoint": 52.16, + "humidity": 0.74, + "icon": "partly-cloudy-night", + "moonPhase": 0.07, + "ozone": 305.72, + "precipIntensity": 0, + "precipIntensityMax": 0, + "precipProbability": 0, + "pressure": 1006.94, + "summary": "Partly cloudy starting in the evening.", + "sunriseTime": 1465217348, + "sunsetTime": 1465270242, + "temperatureMax": 69.01, + "temperatureMaxTime": 1465246800, + "temperatureMin": 54.75, + "temperatureMinTime": 1465214400, + "time": 1465196400, + "windBearing": 222, + "windSpeed": 5.86 + }, + { + "apparentTemperatureMax": 67.78, + "apparentTemperatureMaxTime": 1465333200, + "apparentTemperatureMin": 55.38, + "apparentTemperatureMinTime": 1465300800, + "cloudCover": 0.34, + "dewPoint": 51.41, + "humidity": 0.73, + "icon": "partly-cloudy-day", + "moonPhase": 0.1, + "ozone": 304.57, + "precipIntensity": 0, + "precipIntensityMax": 0, + "precipProbability": 0, + "pressure": 1007.88, + "summary": "Partly cloudy throughout the day.", + "sunriseTime": 1465303737, + "sunsetTime": 1465356676, + "temperatureMax": 67.78, + "temperatureMaxTime": 1465333200, + "temperatureMin": 55.38, + "temperatureMinTime": 1465300800, + "time": 1465282800, + "windBearing": 224, + "windSpeed": 6.75 + }, + { + "apparentTemperatureMax": 68.94, + "apparentTemperatureMaxTime": 1465416000, + "apparentTemperatureMin": 55.11, + "apparentTemperatureMinTime": 1465452000, + "cloudCover": 0.45, + "dewPoint": 47.11, + "humidity": 0.63, + "icon": "partly-cloudy-day", + "moonPhase": 0.13, + "ozone": 329.52, + "precipIntensity": 0, + "precipIntensityMax": 0, + "precipProbability": 0, + "pressure": 1010.78, + "summary": "Mostly cloudy until afternoon.", + "sunriseTime": 1465390127, + "sunsetTime": 1465443107, + "temperatureMax": 68.94, + "temperatureMaxTime": 1465416000, + "temperatureMin": 55.11, + "temperatureMinTime": 1465452000, + "time": 1465369200, + "windBearing": 263, + "windSpeed": 9.55 + }, + { + "apparentTemperatureMax": 65.67, + "apparentTemperatureMaxTime": 1465506000, + "apparentTemperatureMin": 54, + "apparentTemperatureMinTime": 1465470000, + "cloudCover": 0, + "dewPoint": 44.72, + "humidity": 0.61, + "icon": "clear-day", + "moonPhase": 0.17, + "ozone": 355.02, + "precipIntensity": 0, + "precipIntensityMax": 0, + "precipProbability": 0, + "pressure": 1010.11, + "summary": "Clear throughout the day.", + "sunriseTime": 1465476519, + "sunsetTime": 1465529538, + "temperatureMax": 65.67, + "temperatureMaxTime": 1465506000, + "temperatureMin": 54, + "temperatureMinTime": 1465470000, + "time": 1465455600, + "windBearing": 288, + "windSpeed": 12.21 + } + ], + "icon": "clear-day", + "summary": "No precipitation throughout the week, with temperatures falling to 66°F on Thursday." + }, + "flags": { + "darksky-stations": [ + "KMUX", + "KDAX" + ], + "isd-stations": [ + "724943-99999", + "745039-99999", + "745065-99999", + "994016-99999", + "998479-99999" + ], + "lamp-stations": [ + "KAPC", + "KCCR", + "KHWD", + "KLVK", + "KNUQ", + "KOAK", + "KPAO", + "KSFO", + "KSQL" + ], + "madis-stations": [ + "AU915", + "C5988", + "C6328", + "C8158", + "C9629", + "D5422", + "D8533", + "E0426", + "E6067", + "E9227", + "FTPC1", + "GGBC1", + "OKXC1", + "PPXC1", + "PXOC1", + "SFOC1" + ], + "sources": [ + "darksky", + "lamp", + "gfs", + "cmc", + "nam", + "rap", + "rtma", + "sref", + "fnmoc", + "isd", + "nwspa", + "madis", + "nearest-precip" + ], + "units": "us" + }, + "hourly": { + "data": [ + { + "apparentTemperature": 67.42, + "cloudCover": 0.19, + "dewPoint": 52.31, + "humidity": 0.58, + "icon": "clear-day", + "ozone": 322.76, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.88, + "summary": "Clear", + "temperature": 67.42, + "time": 1464912000, + "visibility": 9, + "windBearing": 269, + "windSpeed": 8.38 + }, + { + "apparentTemperature": 68.56, + "cloudCover": 0.18, + "dewPoint": 53.84, + "humidity": 0.59, + "icon": "clear-day", + "ozone": 322.68, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.76, + "summary": "Clear", + "temperature": 68.56, + "time": 1464915600, + "visibility": 9.03, + "windBearing": 272, + "windSpeed": 10.05 + }, + { + "apparentTemperature": 67.39, + "cloudCover": 0.15, + "dewPoint": 54.53, + "humidity": 0.63, + "icon": "clear-day", + "ozone": 322.66, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.75, + "summary": "Clear", + "temperature": 67.39, + "time": 1464919200, + "visibility": 9.31, + "windBearing": 274, + "windSpeed": 9.2 + }, + { + "apparentTemperature": 65.48, + "cloudCover": 0.13, + "dewPoint": 53.73, + "humidity": 0.66, + "icon": "clear-day", + "ozone": 322.72, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.86, + "summary": "Clear", + "temperature": 65.48, + "time": 1464922800, + "visibility": 9.41, + "windBearing": 276, + "windSpeed": 8.41 + }, + { + "apparentTemperature": 63.37, + "cloudCover": 0.15, + "dewPoint": 53.05, + "humidity": 0.69, + "icon": "clear-night", + "ozone": 322.89, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.18, + "summary": "Clear", + "temperature": 63.37, + "time": 1464926400, + "visibility": 9.64, + "windBearing": 277, + "windSpeed": 6.64 + }, + { + "apparentTemperature": 61.63, + "cloudCover": 0.18, + "dewPoint": 52.33, + "humidity": 0.72, + "icon": "clear-night", + "ozone": 323.15, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.62, + "summary": "Clear", + "temperature": 61.63, + "time": 1464930000, + "visibility": 9.65, + "windBearing": 280, + "windSpeed": 5.84 + }, + { + "apparentTemperature": 59.39, + "cloudCover": 0.2, + "dewPoint": 51.07, + "humidity": 0.74, + "icon": "clear-night", + "ozone": 323.5, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.9, + "summary": "Clear", + "temperature": 59.39, + "time": 1464933600, + "visibility": 9.62, + "windBearing": 281, + "windSpeed": 5.43 + }, + { + "apparentTemperature": 58.44, + "cloudCover": 0.2, + "dewPoint": 50.88, + "humidity": 0.76, + "icon": "clear-night", + "ozone": 323.99, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.87, + "summary": "Clear", + "temperature": 58.44, + "time": 1464937200, + "visibility": 9.5, + "windBearing": 279, + "windSpeed": 4.98 + }, + { + "apparentTemperature": 57.85, + "cloudCover": 0.2, + "dewPoint": 51.05, + "humidity": 0.78, + "icon": "clear-night", + "ozone": 324.56, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.69, + "summary": "Clear", + "temperature": 57.85, + "time": 1464940800, + "visibility": 9.11, + "windBearing": 278, + "windSpeed": 5.02 + }, + { + "apparentTemperature": 57.28, + "cloudCover": 0.22, + "dewPoint": 51.09, + "humidity": 0.8, + "icon": "clear-night", + "ozone": 325.1, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.52, + "summary": "Clear", + "temperature": 57.28, + "time": 1464944400, + "visibility": 9.05, + "windBearing": 278, + "windSpeed": 5.14 + }, + { + "apparentTemperature": 56.24, + "cloudCover": 0.27, + "dewPoint": 50.63, + "humidity": 0.81, + "icon": "partly-cloudy-night", + "ozone": 325.68, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.37, + "summary": "Partly Cloudy", + "temperature": 56.24, + "time": 1464948000, + "visibility": 8.85, + "windBearing": 278, + "windSpeed": 4.82 + }, + { + "apparentTemperature": 54.93, + "cloudCover": 0.34, + "dewPoint": 49.82, + "humidity": 0.83, + "icon": "partly-cloudy-night", + "ozone": 326.22, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.25, + "summary": "Partly Cloudy", + "temperature": 54.93, + "time": 1464951600, + "visibility": 8.56, + "windBearing": 278, + "windSpeed": 4.45 + }, + { + "apparentTemperature": 54.06, + "cloudCover": 0.4, + "dewPoint": 49.16, + "humidity": 0.83, + "icon": "partly-cloudy-night", + "ozone": 326.31, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.22, + "summary": "Partly Cloudy", + "temperature": 54.06, + "time": 1464955200, + "visibility": 8.12, + "windBearing": 280, + "windSpeed": 4.13 + }, + { + "apparentTemperature": 53.45, + "cloudCover": 0.45, + "dewPoint": 48.47, + "humidity": 0.83, + "icon": "partly-cloudy-day", + "ozone": 325.68, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.4, + "summary": "Partly Cloudy", + "temperature": 53.45, + "time": 1464958800, + "visibility": 7.76, + "windBearing": 280, + "windSpeed": 3.86 + }, + { + "apparentTemperature": 56.05, + "cloudCover": 0.5, + "dewPoint": 50.07, + "humidity": 0.8, + "icon": "partly-cloudy-day", + "ozone": 324.6, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.68, + "summary": "Partly Cloudy", + "temperature": 56.05, + "time": 1464962400, + "visibility": 7.77, + "windBearing": 279, + "windSpeed": 3.61 + }, + { + "apparentTemperature": 59.38, + "cloudCover": 0.52, + "dewPoint": 51.39, + "humidity": 0.75, + "icon": "partly-cloudy-day", + "ozone": 323.51, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.9, + "summary": "Partly Cloudy", + "temperature": 59.38, + "time": 1464966000, + "visibility": 8.18, + "windBearing": 275, + "windSpeed": 4 + }, + { + "apparentTemperature": 62.67, + "cloudCover": 0.51, + "dewPoint": 52.44, + "humidity": 0.69, + "icon": "partly-cloudy-day", + "ozone": 322.57, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.97, + "summary": "Partly Cloudy", + "temperature": 62.67, + "time": 1464969600, + "visibility": 8.4, + "windBearing": 272, + "windSpeed": 4.22 + }, + { + "apparentTemperature": 65.51, + "cloudCover": 0.49, + "dewPoint": 52.62, + "humidity": 0.63, + "icon": "partly-cloudy-day", + "ozone": 321.61, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.96, + "summary": "Partly Cloudy", + "temperature": 65.51, + "time": 1464973200, + "visibility": 8.72, + "windBearing": 271, + "windSpeed": 4.65 + }, + { + "apparentTemperature": 66.98, + "cloudCover": 0.46, + "dewPoint": 53.53, + "humidity": 0.62, + "icon": "partly-cloudy-day", + "ozone": 320.6, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.9, + "summary": "Partly Cloudy", + "temperature": 66.98, + "time": 1464976800, + "visibility": 8.81, + "windBearing": 271, + "windSpeed": 4.93 + }, + { + "apparentTemperature": 69.34, + "cloudCover": 0.4, + "dewPoint": 55.04, + "humidity": 0.6, + "icon": "partly-cloudy-day", + "ozone": 319.39, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.8, + "summary": "Partly Cloudy", + "temperature": 69.34, + "time": 1464980400, + "visibility": 9.05, + "windBearing": 271, + "windSpeed": 5.7 + }, + { + "apparentTemperature": 71.92, + "cloudCover": 0.34, + "dewPoint": 56.61, + "humidity": 0.59, + "icon": "partly-cloudy-day", + "ozone": 318.12, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.65, + "summary": "Partly Cloudy", + "temperature": 71.92, + "time": 1464984000, + "visibility": 9.49, + "windBearing": 272, + "windSpeed": 6.7 + }, + { + "apparentTemperature": 74.45, + "cloudCover": 0.3, + "dewPoint": 58.29, + "humidity": 0.57, + "icon": "partly-cloudy-day", + "ozone": 317.16, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.43, + "summary": "Partly Cloudy", + "temperature": 74.45, + "time": 1464987600, + "visibility": 9.9, + "windBearing": 273, + "windSpeed": 7.6 + }, + { + "apparentTemperature": 75.82, + "cloudCover": 0.3, + "dewPoint": 59.26, + "humidity": 0.57, + "icon": "partly-cloudy-day", + "ozone": 316.77, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1015.09, + "summary": "Partly Cloudy", + "temperature": 75.82, + "time": 1464991200, + "visibility": 10, + "windBearing": 273, + "windSpeed": 8.58 + }, + { + "apparentTemperature": 74.92, + "cloudCover": 0.32, + "dewPoint": 58.55, + "humidity": 0.57, + "icon": "partly-cloudy-day", + "ozone": 316.68, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.71, + "summary": "Partly Cloudy", + "temperature": 74.92, + "time": 1464994800, + "visibility": 10, + "windBearing": 274, + "windSpeed": 9.12 + }, + { + "apparentTemperature": 73.33, + "cloudCover": 0.36, + "dewPoint": 57.88, + "humidity": 0.58, + "icon": "partly-cloudy-day", + "ozone": 316.48, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.4, + "summary": "Partly Cloudy", + "temperature": 73.33, + "time": 1464998400, + "visibility": 10, + "windBearing": 274, + "windSpeed": 9.21 + }, + { + "apparentTemperature": 70.53, + "cloudCover": 0.41, + "dewPoint": 56.98, + "humidity": 0.62, + "icon": "partly-cloudy-day", + "ozone": 316.04, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.22, + "summary": "Partly Cloudy", + "temperature": 70.53, + "time": 1465002000, + "visibility": 10, + "windBearing": 274, + "windSpeed": 8.77 + }, + { + "apparentTemperature": 67.03, + "cloudCover": 0.49, + "dewPoint": 55.91, + "humidity": 0.68, + "icon": "partly-cloudy-day", + "ozone": 315.48, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.11, + "summary": "Partly Cloudy", + "temperature": 67.03, + "time": 1465005600, + "visibility": 10, + "windBearing": 273, + "windSpeed": 7.84 + }, + { + "apparentTemperature": 63.9, + "cloudCover": 0.56, + "dewPoint": 54.93, + "humidity": 0.73, + "icon": "partly-cloudy-day", + "ozone": 314.77, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.1, + "summary": "Partly Cloudy", + "temperature": 63.9, + "time": 1465009200, + "visibility": 10, + "windBearing": 271, + "windSpeed": 7.12 + }, + { + "apparentTemperature": 61.49, + "cloudCover": 0.58, + "dewPoint": 54.23, + "humidity": 0.77, + "icon": "partly-cloudy-night", + "ozone": 313.81, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.29, + "summary": "Partly Cloudy", + "temperature": 61.49, + "time": 1465012800, + "visibility": 10, + "windBearing": 269, + "windSpeed": 6.5 + }, + { + "apparentTemperature": 59.39, + "cloudCover": 0.58, + "dewPoint": 53.62, + "humidity": 0.81, + "icon": "partly-cloudy-night", + "ozone": 312.7, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.54, + "summary": "Partly Cloudy", + "temperature": 59.39, + "time": 1465016400, + "visibility": 10, + "windBearing": 266, + "windSpeed": 5.92 + }, + { + "apparentTemperature": 58.02, + "cloudCover": 0.59, + "dewPoint": 53.35, + "humidity": 0.84, + "icon": "partly-cloudy-night", + "ozone": 311.6, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.63, + "summary": "Partly Cloudy", + "temperature": 58.02, + "time": 1465020000, + "visibility": 10, + "windBearing": 263, + "windSpeed": 5.46 + }, + { + "apparentTemperature": 57.06, + "cloudCover": 0.61, + "dewPoint": 53.07, + "humidity": 0.87, + "icon": "partly-cloudy-night", + "ozone": 310.41, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.43, + "summary": "Mostly Cloudy", + "temperature": 57.06, + "time": 1465023600, + "visibility": 9.01, + "windBearing": 259, + "windSpeed": 5.18 + }, + { + "apparentTemperature": 56.12, + "cloudCover": 0.63, + "dewPoint": 52.56, + "humidity": 0.88, + "icon": "partly-cloudy-night", + "ozone": 309.24, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1014.09, + "summary": "Mostly Cloudy", + "temperature": 56.12, + "time": 1465027200, + "visibility": 7.64, + "windBearing": 256, + "windSpeed": 5.01 + }, + { + "apparentTemperature": 55.14, + "cloudCover": 0.67, + "dewPoint": 51.94, + "humidity": 0.89, + "icon": "partly-cloudy-night", + "ozone": 308.58, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1013.74, + "summary": "Mostly Cloudy", + "temperature": 55.14, + "time": 1465030800, + "visibility": 6.64, + "windBearing": 253, + "windSpeed": 4.84 + }, + { + "apparentTemperature": 54.01, + "cloudCover": 0.72, + "dewPoint": 51.21, + "humidity": 0.9, + "icon": "partly-cloudy-night", + "ozone": 308.59, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1013.39, + "summary": "Mostly Cloudy", + "temperature": 54.01, + "time": 1465034400, + "visibility": 6.4, + "windBearing": 254, + "windSpeed": 4.64 + }, + { + "apparentTemperature": 53.06, + "cloudCover": 0.77, + "dewPoint": 50.57, + "humidity": 0.91, + "icon": "partly-cloudy-night", + "ozone": 309.11, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1013.05, + "summary": "Mostly Cloudy", + "temperature": 53.06, + "time": 1465038000, + "visibility": 6.53, + "windBearing": 256, + "windSpeed": 4.45 + }, + { + "apparentTemperature": 53.73, + "cloudCover": 0.83, + "dewPoint": 51.2, + "humidity": 0.91, + "icon": "partly-cloudy-night", + "ozone": 310.15, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1012.84, + "summary": "Mostly Cloudy", + "temperature": 53.73, + "time": 1465041600, + "visibility": 6.58, + "windBearing": 255, + "windSpeed": 4.23 + }, + { + "apparentTemperature": 54.88, + "cloudCover": 0.89, + "dewPoint": 51.88, + "humidity": 0.9, + "icon": "partly-cloudy-day", + "ozone": 312.09, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1012.85, + "summary": "Mostly Cloudy", + "temperature": 54.88, + "time": 1465045200, + "visibility": 6.28, + "windBearing": 250, + "windSpeed": 3.81 + }, + { + "apparentTemperature": 56.24, + "cloudCover": 0.96, + "dewPoint": 52.42, + "humidity": 0.87, + "icon": "cloudy", + "ozone": 314.55, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1013, + "summary": "Overcast", + "temperature": 56.24, + "time": 1465048800, + "visibility": 5.92, + "windBearing": 241, + "windSpeed": 3.23 + }, + { + "apparentTemperature": 57.62, + "cloudCover": 1, + "dewPoint": 52.73, + "humidity": 0.84, + "icon": "cloudy", + "ozone": 316.51, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1013.16, + "summary": "Overcast", + "temperature": 57.62, + "time": 1465052400, + "visibility": 5.89, + "windBearing": 236, + "windSpeed": 3.11 + }, + { + "apparentTemperature": 59.22, + "cloudCover": 1, + "dewPoint": 52.86, + "humidity": 0.79, + "icon": "cloudy", + "ozone": 317.32, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1013.31, + "summary": "Overcast", + "temperature": 59.22, + "time": 1465056000, + "visibility": 6.54, + "windBearing": 241, + "windSpeed": 3.59 + }, + { + "apparentTemperature": 61.29, + "cloudCover": 0.99, + "dewPoint": 53.12, + "humidity": 0.75, + "icon": "cloudy", + "ozone": 317.63, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1013.46, + "summary": "Overcast", + "temperature": 61.29, + "time": 1465059600, + "visibility": 7.52, + "windBearing": 250, + "windSpeed": 4.42 + }, + { + "apparentTemperature": 63.6, + "cloudCover": 0.97, + "dewPoint": 53.81, + "humidity": 0.7, + "icon": "cloudy", + "ozone": 318.31, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1013.54, + "summary": "Overcast", + "temperature": 63.6, + "time": 1465063200, + "visibility": 8.26, + "windBearing": 256, + "windSpeed": 5.05 + }, + { + "apparentTemperature": 65.59, + "cloudCover": 0.95, + "dewPoint": 54.62, + "humidity": 0.68, + "icon": "cloudy", + "ozone": 319.55, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1013.54, + "summary": "Overcast", + "temperature": 65.59, + "time": 1465066800, + "visibility": 8.42, + "windBearing": 257, + "windSpeed": 5.53 + }, + { + "apparentTemperature": 67.6, + "cloudCover": 0.91, + "dewPoint": 55.73, + "humidity": 0.66, + "icon": "partly-cloudy-day", + "ozone": 321.16, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1013.48, + "summary": "Mostly Cloudy", + "temperature": 67.6, + "time": 1465070400, + "visibility": 8.32, + "windBearing": 257, + "windSpeed": 5.95 + }, + { + "apparentTemperature": 69.48, + "cloudCover": 0.87, + "dewPoint": 56.92, + "humidity": 0.64, + "icon": "partly-cloudy-day", + "ozone": 323.49, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1013.34, + "summary": "Mostly Cloudy", + "temperature": 69.48, + "time": 1465074000, + "visibility": 8.36, + "windBearing": 257, + "windSpeed": 6.37 + }, + { + "apparentTemperature": 71.07, + "cloudCover": 0.85, + "dewPoint": 57.94, + "humidity": 0.63, + "icon": "partly-cloudy-day", + "ozone": 326.97, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1013.09, + "summary": "Mostly Cloudy", + "temperature": 71.07, + "time": 1465077600, + "visibility": 8.75, + "windBearing": 258, + "windSpeed": 6.88 + }, + { + "apparentTemperature": 72.18, + "cloudCover": 0.82, + "dewPoint": 58.77, + "humidity": 0.63, + "icon": "partly-cloudy-day", + "ozone": 331.17, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1012.79, + "summary": "Mostly Cloudy", + "temperature": 72.18, + "time": 1465081200, + "visibility": 9.28, + "windBearing": 260, + "windSpeed": 7.5 + }, + { + "apparentTemperature": 71.38, + "cloudCover": 0.75, + "dewPoint": 58.47, + "humidity": 0.64, + "icon": "partly-cloudy-day", + "ozone": 335.24, + "precipIntensity": 0, + "precipProbability": 0, + "pressure": 1012.58, + "summary": "Mostly Cloudy", + "temperature": 71.38, + "time": 1465084800, + "visibility": 9.67, + "windBearing": 260, + "windSpeed": 7.75 + } + ], + "icon": "partly-cloudy-day", + "summary": "Partly cloudy starting tonight." + }, + "latitude": 37.8267, + "longitude": -122.423, + "minutely": { + "data": [ + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464914160 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464914220 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464914280 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464914340 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464914400 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464914460 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464914520 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464914580 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464914640 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464914700 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464914760 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464914820 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464914880 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464914940 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915000 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915060 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915120 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915180 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915240 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915300 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915360 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915420 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915480 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915540 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915600 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915660 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915720 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915780 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915840 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915900 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464915960 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916020 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916080 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916140 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916200 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916260 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916320 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916380 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916440 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916500 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916560 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916620 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916680 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916740 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916800 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916860 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916920 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464916980 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464917040 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464917100 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464917160 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464917220 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464917280 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464917340 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464917400 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464917460 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464917520 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464917580 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464917640 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464917700 + }, + { + "precipIntensity": 0, + "precipProbability": 0, + "time": 1464917760 + } + ], + "icon": "clear-day", + "summary": "Clear for the hour." + }, + "offset": -7, + "timezone": "America/Los_Angeles" +}