diff --git a/homeassistant/components/nws/manifest.json b/homeassistant/components/nws/manifest.json index 85867b32bde..5bb4cb46ee0 100644 --- a/homeassistant/components/nws/manifest.json +++ b/homeassistant/components/nws/manifest.json @@ -4,5 +4,5 @@ "documentation": "https://www.home-assistant.io/integrations/nws", "dependencies": [], "codeowners": ["@MatthewFlamm"], - "requirements": ["pynws==0.8.1"] + "requirements": ["pynws==0.10.1"] } diff --git a/homeassistant/components/nws/weather.py b/homeassistant/components/nws/weather.py index c22700f1cf8..a0ce1449479 100644 --- a/homeassistant/components/nws/weather.py +++ b/homeassistant/components/nws/weather.py @@ -177,7 +177,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= websession = async_get_clientsession(hass) # ID request as being from HA, pynws prepends the api_key in addition api_key_ha = f"{api_key} homeassistant" - nws = SimpleNWS(latitude, longitude, api_key_ha, mode, websession) + nws = SimpleNWS(latitude, longitude, api_key_ha, websession) _LOGGER.debug("Setting up station: %s", station) try: @@ -226,15 +226,24 @@ class NWSWeather(WeatherEntity): ) else: self.observation = self.nws.observation + _LOGGER.debug("Observation: %s", self.observation) _LOGGER.debug("Updating forecast") try: - await self.nws.update_forecast() + if self.mode == "daynight": + await self.nws.update_forecast() + else: + await self.nws.update_forecast_hourly() except ERRORS as status: _LOGGER.error( "Error updating forecast from station %s: %s", self.nws.station, status ) return - self._forecast = self.nws.forecast + if self.mode == "daynight": + self._forecast = self.nws.forecast + else: + self._forecast = self.nws.forecast_hourly + _LOGGER.debug("Forecast: %s", self._forecast) + _LOGGER.debug("Finished updating") @property def attribution(self): diff --git a/requirements_all.txt b/requirements_all.txt index d0bc384d14b..4e832647850 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1399,7 +1399,7 @@ pynuki==1.3.3 pynut2==2.1.2 # homeassistant.components.nws -pynws==0.8.1 +pynws==0.10.1 # homeassistant.components.nx584 pynx584==0.4 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 4b508bc2833..e7deeea91e3 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -481,7 +481,7 @@ pymodbus==1.5.2 pymonoprice==0.3 # homeassistant.components.nws -pynws==0.8.1 +pynws==0.10.1 # homeassistant.components.nx584 pynx584==0.4 diff --git a/tests/components/nws/__init__.py b/tests/components/nws/__init__.py new file mode 100644 index 00000000000..bc3424f71c8 --- /dev/null +++ b/tests/components/nws/__init__.py @@ -0,0 +1 @@ +"""Tests for NWS.""" diff --git a/tests/components/nws/const.py b/tests/components/nws/const.py new file mode 100644 index 00000000000..2a9bf060b73 --- /dev/null +++ b/tests/components/nws/const.py @@ -0,0 +1,114 @@ +"""Helpers for interacting with pynws.""" +from homeassistant.components.nws.weather import ATTR_FORECAST_PRECIP_PROB +from homeassistant.components.weather import ( + ATTR_FORECAST_CONDITION, + ATTR_FORECAST_TEMP, + ATTR_FORECAST_TIME, + ATTR_FORECAST_WIND_BEARING, + ATTR_FORECAST_WIND_SPEED, + ATTR_WEATHER_HUMIDITY, + ATTR_WEATHER_PRESSURE, + ATTR_WEATHER_TEMPERATURE, + ATTR_WEATHER_VISIBILITY, + ATTR_WEATHER_WIND_BEARING, + ATTR_WEATHER_WIND_SPEED, +) +from homeassistant.const import ( + LENGTH_KILOMETERS, + LENGTH_METERS, + LENGTH_MILES, + PRESSURE_HPA, + PRESSURE_INHG, + PRESSURE_PA, + TEMP_CELSIUS, + TEMP_FAHRENHEIT, +) +from homeassistant.util.distance import convert as convert_distance +from homeassistant.util.pressure import convert as convert_pressure +from homeassistant.util.temperature import convert as convert_temperature + +DEFAULT_STATIONS = ["ABC", "XYZ"] + +DEFAULT_OBSERVATION = { + "temperature": 10, + "seaLevelPressure": 100000, + "relativeHumidity": 10, + "windSpeed": 10, + "windDirection": 180, + "visibility": 10000, + "textDescription": "A long description", + "station": "ABC", + "timestamp": "2019-08-12T23:53:00+00:00", + "iconTime": "day", + "iconWeather": (("Fair/clear", None),), +} + +EXPECTED_OBSERVATION_IMPERIAL = { + ATTR_WEATHER_TEMPERATURE: round( + convert_temperature(10, TEMP_CELSIUS, TEMP_FAHRENHEIT) + ), + ATTR_WEATHER_WIND_BEARING: 180, + ATTR_WEATHER_WIND_SPEED: round( + convert_distance(10, LENGTH_METERS, LENGTH_MILES) * 3600 + ), + ATTR_WEATHER_PRESSURE: round( + convert_pressure(100000, PRESSURE_PA, PRESSURE_INHG), 2 + ), + ATTR_WEATHER_VISIBILITY: round( + convert_distance(10000, LENGTH_METERS, LENGTH_MILES) + ), + ATTR_WEATHER_HUMIDITY: 10, +} + +EXPECTED_OBSERVATION_METRIC = { + ATTR_WEATHER_TEMPERATURE: 10, + ATTR_WEATHER_WIND_BEARING: 180, + ATTR_WEATHER_WIND_SPEED: round( + convert_distance(10, LENGTH_METERS, LENGTH_KILOMETERS) * 3600 + ), + ATTR_WEATHER_PRESSURE: round(convert_pressure(100000, PRESSURE_PA, PRESSURE_HPA)), + ATTR_WEATHER_VISIBILITY: round( + convert_distance(10000, LENGTH_METERS, LENGTH_KILOMETERS) + ), + ATTR_WEATHER_HUMIDITY: 10, +} + +NONE_OBSERVATION = {key: None for key in DEFAULT_OBSERVATION} + +DEFAULT_FORECAST = [ + { + "number": 1, + "name": "Tonight", + "startTime": "2019-08-12T20:00:00-04:00", + "isDaytime": False, + "temperature": 10, + "windSpeedAvg": 10, + "windBearing": 180, + "detailedForecast": "A detailed forecast.", + "timestamp": "2019-08-12T23:53:00+00:00", + "iconTime": "night", + "iconWeather": (("lightning-rainy", 40), ("lightning-rainy", 90)), + }, +] + +EXPECTED_FORECAST_IMPERIAL = { + ATTR_FORECAST_CONDITION: "lightning-rainy", + ATTR_FORECAST_TIME: "2019-08-12T20:00:00-04:00", + ATTR_FORECAST_TEMP: 10, + ATTR_FORECAST_WIND_SPEED: 10, + ATTR_FORECAST_WIND_BEARING: 180, + ATTR_FORECAST_PRECIP_PROB: 90, +} + +EXPECTED_FORECAST_METRIC = { + ATTR_FORECAST_CONDITION: "lightning-rainy", + ATTR_FORECAST_TIME: "2019-08-12T20:00:00-04:00", + ATTR_FORECAST_TEMP: round(convert_temperature(10, TEMP_FAHRENHEIT, TEMP_CELSIUS)), + ATTR_FORECAST_WIND_SPEED: round( + convert_distance(10, LENGTH_MILES, LENGTH_KILOMETERS) + ), + ATTR_FORECAST_WIND_BEARING: 180, + ATTR_FORECAST_PRECIP_PROB: 90, +} + +NONE_FORECAST = [{key: None for key in DEFAULT_FORECAST[0]}] diff --git a/tests/components/nws/test_weather.py b/tests/components/nws/test_weather.py index adda88a789d..f2b390a2235 100644 --- a/tests/components/nws/test_weather.py +++ b/tests/components/nws/test_weather.py @@ -1,87 +1,25 @@ """Tests for the NWS weather component.""" -from homeassistant.components.nws.weather import ATTR_FORECAST_PRECIP_PROB -from homeassistant.components.weather import ( - ATTR_FORECAST, - ATTR_FORECAST_CONDITION, - ATTR_FORECAST_TEMP, - ATTR_FORECAST_TIME, - ATTR_FORECAST_WIND_BEARING, - ATTR_FORECAST_WIND_SPEED, - ATTR_WEATHER_HUMIDITY, - ATTR_WEATHER_PRESSURE, - ATTR_WEATHER_TEMPERATURE, - ATTR_WEATHER_VISIBILITY, - ATTR_WEATHER_WIND_BEARING, - ATTR_WEATHER_WIND_SPEED, -) -from homeassistant.const import ( - LENGTH_KILOMETERS, - LENGTH_METERS, - LENGTH_MILES, - PRESSURE_HPA, - PRESSURE_INHG, - PRESSURE_PA, - TEMP_CELSIUS, - TEMP_FAHRENHEIT, -) +from unittest.mock import patch + +import aiohttp +import pytest + +from homeassistant.components.weather import ATTR_FORECAST from homeassistant.setup import async_setup_component -from homeassistant.util.distance import convert as convert_distance -from homeassistant.util.pressure import convert as convert_pressure -from homeassistant.util.temperature import convert as convert_temperature from homeassistant.util.unit_system import IMPERIAL_SYSTEM, METRIC_SYSTEM -from tests.common import assert_setup_component, load_fixture - -EXP_OBS_IMP = { - ATTR_WEATHER_TEMPERATURE: round( - convert_temperature(26.7, TEMP_CELSIUS, TEMP_FAHRENHEIT) - ), - ATTR_WEATHER_WIND_BEARING: 190, - ATTR_WEATHER_WIND_SPEED: round( - convert_distance(2.6, LENGTH_METERS, LENGTH_MILES) * 3600 - ), - ATTR_WEATHER_PRESSURE: round( - convert_pressure(101040, PRESSURE_PA, PRESSURE_INHG), 2 - ), - ATTR_WEATHER_VISIBILITY: round( - convert_distance(16090, LENGTH_METERS, LENGTH_MILES) - ), - ATTR_WEATHER_HUMIDITY: 64, -} - -EXP_OBS_METR = { - ATTR_WEATHER_TEMPERATURE: round(26.7), - ATTR_WEATHER_WIND_BEARING: 190, - ATTR_WEATHER_WIND_SPEED: round( - convert_distance(2.6, LENGTH_METERS, LENGTH_KILOMETERS) * 3600 - ), - ATTR_WEATHER_PRESSURE: round(convert_pressure(101040, PRESSURE_PA, PRESSURE_HPA)), - ATTR_WEATHER_VISIBILITY: round( - convert_distance(16090, LENGTH_METERS, LENGTH_KILOMETERS) - ), - ATTR_WEATHER_HUMIDITY: 64, -} - -EXP_FORE_IMP = { - ATTR_FORECAST_CONDITION: "lightning-rainy", - ATTR_FORECAST_TIME: "2019-08-12T20:00:00-04:00", - ATTR_FORECAST_TEMP: 70, - ATTR_FORECAST_WIND_SPEED: 10, - ATTR_FORECAST_WIND_BEARING: 180, - ATTR_FORECAST_PRECIP_PROB: 90, -} - -EXP_FORE_METR = { - ATTR_FORECAST_CONDITION: "lightning-rainy", - ATTR_FORECAST_TIME: "2019-08-12T20:00:00-04:00", - ATTR_FORECAST_TEMP: round(convert_temperature(70, TEMP_FAHRENHEIT, TEMP_CELSIUS)), - ATTR_FORECAST_WIND_SPEED: round( - convert_distance(10, LENGTH_MILES, LENGTH_KILOMETERS) - ), - ATTR_FORECAST_WIND_BEARING: 180, - ATTR_FORECAST_PRECIP_PROB: 90, -} +from .const import ( + DEFAULT_FORECAST, + DEFAULT_OBSERVATION, + EXPECTED_FORECAST_IMPERIAL, + EXPECTED_FORECAST_METRIC, + EXPECTED_OBSERVATION_IMPERIAL, + EXPECTED_OBSERVATION_METRIC, + NONE_FORECAST, + NONE_OBSERVATION, +) +from tests.common import mock_coro MINIMAL_CONFIG = { "weather": { @@ -92,169 +30,168 @@ MINIMAL_CONFIG = { } } -INVALID_CONFIG = { - "weather": {"platform": "nws", "api_key": "x@example.com", "latitude": 40.0} +HOURLY_CONFIG = { + "weather": { + "platform": "nws", + "api_key": "x@example.com", + "latitude": 40.0, + "longitude": -85.0, + "mode": "hourly", + } } -STAURL = "https://api.weather.gov/points/{},{}/stations" -OBSURL = "https://api.weather.gov/stations/{}/observations/" -FORCURL = "https://api.weather.gov/points/{},{}/forecast" +@pytest.mark.parametrize( + "units,result_observation,result_forecast", + [ + (IMPERIAL_SYSTEM, EXPECTED_OBSERVATION_IMPERIAL, EXPECTED_FORECAST_IMPERIAL), + (METRIC_SYSTEM, EXPECTED_OBSERVATION_METRIC, EXPECTED_FORECAST_METRIC), + ], +) +async def test_imperial_metric(hass, units, result_observation, result_forecast): + """Test with imperial and metric units.""" + hass.config.units = units + with patch("homeassistant.components.nws.weather.SimpleNWS") as mock_nws: + instance = mock_nws.return_value + instance.station = "ABC" + instance.set_station.return_value = mock_coro() + instance.update_observation.return_value = mock_coro() + instance.update_forecast.return_value = mock_coro() + instance.observation = DEFAULT_OBSERVATION + instance.forecast = DEFAULT_FORECAST -async def test_imperial(hass, aioclient_mock): - """Test with imperial units.""" - aioclient_mock.get( - STAURL.format(40.0, -85.0), text=load_fixture("nws-weather-sta-valid.json") - ) - aioclient_mock.get( - OBSURL.format("KMIE"), text=load_fixture("nws-weather-obs-valid.json") - ) - aioclient_mock.get( - FORCURL.format(40.0, -85.0), text=load_fixture("nws-weather-fore-valid.json") - ) - - hass.config.units = IMPERIAL_SYSTEM - - with assert_setup_component(1, "weather"): await async_setup_component(hass, "weather", MINIMAL_CONFIG) - state = hass.states.get("weather.kmie") + state = hass.states.get("weather.abc") assert state assert state.state == "sunny" data = state.attributes - for key, value in EXP_OBS_IMP.items(): + for key, value in result_observation.items(): assert data.get(key) == value - assert state.attributes.get("friendly_name") == "KMIE" + forecast = data.get(ATTR_FORECAST) - for key, value in EXP_FORE_IMP.items(): + for key, value in result_forecast.items(): assert forecast[0].get(key) == value -async def test_metric(hass, aioclient_mock): - """Test with metric units.""" - aioclient_mock.get( - STAURL.format(40.0, -85.0), text=load_fixture("nws-weather-sta-valid.json") - ) - aioclient_mock.get( - OBSURL.format("KMIE"), text=load_fixture("nws-weather-obs-valid.json") - ) - aioclient_mock.get( - FORCURL.format(40.0, -85.0), text=load_fixture("nws-weather-fore-valid.json") - ) +async def test_hourly(hass): + """Test with hourly option.""" + hass.config.units = IMPERIAL_SYSTEM - hass.config.units = METRIC_SYSTEM + with patch("homeassistant.components.nws.weather.SimpleNWS") as mock_nws: + instance = mock_nws.return_value + instance.station = "ABC" + instance.set_station.return_value = mock_coro() + instance.update_observation.return_value = mock_coro() + instance.update_forecast_hourly.return_value = mock_coro() + instance.observation = DEFAULT_OBSERVATION + instance.forecast_hourly = DEFAULT_FORECAST - with assert_setup_component(1, "weather"): - await async_setup_component(hass, "weather", MINIMAL_CONFIG) + await async_setup_component(hass, "weather", HOURLY_CONFIG) - state = hass.states.get("weather.kmie") + state = hass.states.get("weather.abc") assert state assert state.state == "sunny" data = state.attributes - for key, value in EXP_OBS_METR.items(): + for key, value in EXPECTED_OBSERVATION_IMPERIAL.items(): assert data.get(key) == value - assert state.attributes.get("friendly_name") == "KMIE" + forecast = data.get(ATTR_FORECAST) - for key, value in EXP_FORE_METR.items(): + for key, value in EXPECTED_FORECAST_IMPERIAL.items(): assert forecast[0].get(key) == value -async def test_none(hass, aioclient_mock): - """Test with imperial units.""" - aioclient_mock.get( - STAURL.format(40.0, -85.0), text=load_fixture("nws-weather-sta-valid.json") - ) - aioclient_mock.get( - OBSURL.format("KMIE"), text=load_fixture("nws-weather-obs-null.json") - ) - aioclient_mock.get( - FORCURL.format(40.0, -85.0), text=load_fixture("nws-weather-fore-null.json") - ) - - hass.config.units = IMPERIAL_SYSTEM - - with assert_setup_component(1, "weather"): +async def test_none_values(hass): + """Test with none values in observation and forecast dicts.""" + with patch("homeassistant.components.nws.weather.SimpleNWS") as mock_nws: + instance = mock_nws.return_value + instance.station = "ABC" + instance.set_station.return_value = mock_coro() + instance.update_observation.return_value = mock_coro() + instance.update_forecast.return_value = mock_coro() + instance.observation = NONE_OBSERVATION + instance.forecast = NONE_FORECAST await async_setup_component(hass, "weather", MINIMAL_CONFIG) - state = hass.states.get("weather.kmie") + state = hass.states.get("weather.abc") assert state assert state.state == "unknown" data = state.attributes - for key in EXP_OBS_IMP: + for key in EXPECTED_OBSERVATION_IMPERIAL: assert data.get(key) is None - assert state.attributes.get("friendly_name") == "KMIE" + forecast = data.get(ATTR_FORECAST) - for key in EXP_FORE_IMP: + for key in EXPECTED_FORECAST_IMPERIAL: assert forecast[0].get(key) is None -async def test_fail_obs(hass, aioclient_mock): - """Test failing observation/forecast update.""" - aioclient_mock.get( - STAURL.format(40.0, -85.0), text=load_fixture("nws-weather-sta-valid.json") - ) - aioclient_mock.get( - OBSURL.format("KMIE"), - text=load_fixture("nws-weather-obs-valid.json"), - status=400, - ) - aioclient_mock.get( - FORCURL.format(40.0, -85.0), - text=load_fixture("nws-weather-fore-valid.json"), - status=400, - ) - - hass.config.units = IMPERIAL_SYSTEM - - with assert_setup_component(1, "weather"): +async def test_none(hass): + """Test with None as observation and forecast.""" + with patch("homeassistant.components.nws.weather.SimpleNWS") as mock_nws: + instance = mock_nws.return_value + instance.station = "ABC" + instance.set_station.return_value = mock_coro() + instance.update_observation.return_value = mock_coro() + instance.update_forecast.return_value = mock_coro() + instance.observation = None + instance.forecast = None await async_setup_component(hass, "weather", MINIMAL_CONFIG) - state = hass.states.get("weather.kmie") + state = hass.states.get("weather.abc") assert state + assert state.state == "unknown" + + data = state.attributes + for key in EXPECTED_OBSERVATION_IMPERIAL: + assert data.get(key) is None + + forecast = data.get(ATTR_FORECAST) + assert forecast is None -async def test_fail_stn(hass, aioclient_mock): - """Test failing station update.""" - aioclient_mock.get( - STAURL.format(40.0, -85.0), - text=load_fixture("nws-weather-sta-valid.json"), - status=400, - ) - aioclient_mock.get( - OBSURL.format("KMIE"), text=load_fixture("nws-weather-obs-valid.json") - ) - aioclient_mock.get( - FORCURL.format(40.0, -85.0), text=load_fixture("nws-weather-fore-valid.json") - ) - - hass.config.units = IMPERIAL_SYSTEM - - with assert_setup_component(1, "weather"): +async def test_error_station(hass): + """Test error in setting station.""" + with patch("homeassistant.components.nws.weather.SimpleNWS") as mock_nws: + instance = mock_nws.return_value + instance.station = "ABC" + instance.set_station.side_effect = aiohttp.ClientError + instance.update_observation.return_value = mock_coro() + instance.update_forecast.return_value = mock_coro() + instance.observation = None + instance.forecast = None await async_setup_component(hass, "weather", MINIMAL_CONFIG) - state = hass.states.get("weather.kmie") - assert state is None + state = hass.states.get("weather.abc") + assert state is None -async def test_invalid_config(hass, aioclient_mock): - """Test invalid config..""" - aioclient_mock.get( - STAURL.format(40.0, -85.0), text=load_fixture("nws-weather-sta-valid.json") - ) - aioclient_mock.get( - OBSURL.format("KMIE"), text=load_fixture("nws-weather-obs-valid.json") - ) - aioclient_mock.get( - FORCURL.format(40.0, -85.0), text=load_fixture("nws-weather-fore-valid.json") - ) +async def test_error_observation(hass, caplog): + """Test error during update observation.""" + with patch("homeassistant.components.nws.weather.SimpleNWS") as mock_nws: + instance = mock_nws.return_value + instance.station = "ABC" + instance.set_station.return_value = mock_coro() + instance.update_observation.side_effect = aiohttp.ClientError + instance.update_forecast.return_value = mock_coro() + instance.observation = None + instance.forecast = None + await async_setup_component(hass, "weather", MINIMAL_CONFIG) - hass.config.units = IMPERIAL_SYSTEM + assert "Error updating observation from station ABC" in caplog.text - with assert_setup_component(0, "weather"): - await async_setup_component(hass, "weather", INVALID_CONFIG) - state = hass.states.get("weather.kmie") - assert state is None +async def test_error_forecast(hass, caplog): + """Test error during update forecast.""" + with patch("homeassistant.components.nws.weather.SimpleNWS") as mock_nws: + instance = mock_nws.return_value + instance.station = "ABC" + instance.set_station.return_value = mock_coro() + instance.update_observation.return_value = mock_coro() + instance.update_forecast.side_effect = aiohttp.ClientError + instance.observation = None + instance.forecast = None + await async_setup_component(hass, "weather", MINIMAL_CONFIG) + assert "Error updating forecast from station ABC" in caplog.text diff --git a/tests/fixtures/nws-weather-fore-null.json b/tests/fixtures/nws-weather-fore-null.json deleted file mode 100644 index 6085bcdada9..00000000000 --- a/tests/fixtures/nws-weather-fore-null.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "@context": [ - "https://raw.githubusercontent.com/geojson/geojson-ld/master/contexts/geojson-base.jsonld", - { - "wx": "https://api.weather.gov/ontology#", - "geo": "http://www.opengis.net/ont/geosparql#", - "unit": "http://codes.wmo.int/common/unit/", - "@vocab": "https://api.weather.gov/ontology#" - } - ], - "type": "Feature", - "geometry": { - "type": "GeometryCollection", - "geometries": [ - { - "type": "Point", - "coordinates": [ - -85.014692800000006, - 39.993574700000003 - ] - }, - { - "type": "Polygon", - "coordinates": [ - [ - [ - -85.027968599999994, - 40.005368300000001 - ], - [ - -85.0300814, - 39.983399599999998 - ], - [ - -85.001420100000004, - 39.981779299999999 - ], - [ - -84.999301200000005, - 40.0037479 - ], - [ - -85.027968599999994, - 40.005368300000001 - ] - ] - ] - } - ] - }, - "properties": { - "updated": "2019-08-12T23:17:40+00:00", - "units": "us", - "forecastGenerator": "BaselineForecastGenerator", - "generatedAt": "2019-08-13T00:33:19+00:00", - "updateTime": "2019-08-12T23:17:40+00:00", - "validTimes": "2019-08-12T17:00:00+00:00/P8DT6H", - "elevation": { - "value": 366.06479999999999, - "unitCode": "unit:m" - }, - "periods": [ - { - "number": null, - "name": null, - "startTime": null, - "endTime": null, - "isDaytime": null, - "temperature": null, - "temperatureUnit": null, - "temperatureTrend": null, - "windSpeed": null, - "windDirection": null, - "icon": null, - "shortForecast": null, - "detailedForecast": null - } - ] - } -} diff --git a/tests/fixtures/nws-weather-fore-valid.json b/tests/fixtures/nws-weather-fore-valid.json deleted file mode 100644 index b3f4f4ccea8..00000000000 --- a/tests/fixtures/nws-weather-fore-valid.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "@context": [ - "https://raw.githubusercontent.com/geojson/geojson-ld/master/contexts/geojson-base.jsonld", - { - "wx": "https://api.weather.gov/ontology#", - "geo": "http://www.opengis.net/ont/geosparql#", - "unit": "http://codes.wmo.int/common/unit/", - "@vocab": "https://api.weather.gov/ontology#" - } - ], - "type": "Feature", - "geometry": { - "type": "GeometryCollection", - "geometries": [ - { - "type": "Point", - "coordinates": [ - -85.014692800000006, - 39.993574700000003 - ] - }, - { - "type": "Polygon", - "coordinates": [ - [ - [ - -85.027968599999994, - 40.005368300000001 - ], - [ - -85.0300814, - 39.983399599999998 - ], - [ - -85.001420100000004, - 39.981779299999999 - ], - [ - -84.999301200000005, - 40.0037479 - ], - [ - -85.027968599999994, - 40.005368300000001 - ] - ] - ] - } - ] - }, - "properties": { - "updated": "2019-08-12T23:17:40+00:00", - "units": "us", - "forecastGenerator": "BaselineForecastGenerator", - "generatedAt": "2019-08-13T00:33:19+00:00", - "updateTime": "2019-08-12T23:17:40+00:00", - "validTimes": "2019-08-12T17:00:00+00:00/P8DT6H", - "elevation": { - "value": 366.06479999999999, - "unitCode": "unit:m" - }, - "periods": [ - { - "number": 1, - "name": "Tonight", - "startTime": "2019-08-12T20:00:00-04:00", - "endTime": "2019-08-13T06:00:00-04:00", - "isDaytime": false, - "temperature": 70, - "temperatureUnit": "F", - "temperatureTrend": null, - "windSpeed": "7 to 13 mph", - "windDirection": "S", - "icon": "https://api.weather.gov/icons/land/night/tsra,40/tsra,90?size=medium", - "shortForecast": "Showers And Thunderstorms", - "detailedForecast": "A detailed forecast." - } - ] - } -} diff --git a/tests/fixtures/nws-weather-obs-null.json b/tests/fixtures/nws-weather-obs-null.json deleted file mode 100644 index 36ae66283e5..00000000000 --- a/tests/fixtures/nws-weather-obs-null.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "@context": [ - "https://raw.githubusercontent.com/geojson/geojson-ld/master/contexts/geojson-base.jsonld", - { - "wx": "https://api.weather.gov/ontology#", - "s": "https://schema.org/", - "geo": "http://www.opengis.net/ont/geosparql#", - "unit": "http://codes.wmo.int/common/unit/", - "@vocab": "https://api.weather.gov/ontology#", - "geometry": { - "@id": "s:GeoCoordinates", - "@type": "geo:wktLiteral" - }, - "city": "s:addressLocality", - "state": "s:addressRegion", - "distance": { - "@id": "s:Distance", - "@type": "s:QuantitativeValue" - }, - "bearing": { - "@type": "s:QuantitativeValue" - }, - "value": { - "@id": "s:value" - }, - "unitCode": { - "@id": "s:unitCode", - "@type": "@id" - }, - "forecastOffice": { - "@type": "@id" - }, - "forecastGridData": { - "@type": "@id" - }, - "publicZone": { - "@type": "@id" - }, - "county": { - "@type": "@id" - } - } - ], - "type": "FeatureCollection", - "features": [ - { - "id": "https://api.weather.gov/stations/KMIE/observations/2019-08-12T23:53:00+00:00", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -85.400000000000006, - 40.25 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KMIE/observations/2019-08-12T23:53:00+00:00", - "@type": "wx:ObservationStation", - "elevation": { - "value": 286, - "unitCode": "unit:m" - }, - "station": "https://api.weather.gov/stations/KMIE", - "timestamp": "2019-08-12T23:53:00+00:00", - "rawMessage": null, - "textDescription": "Clear", - "icon": null, - "presentWeather": [], - "temperature": { - "value": null, - "unitCode": "unit:degC", - "qualityControl": "qc:V" - }, - "dewpoint": { - "value": null, - "unitCode": "unit:degC", - "qualityControl": "qc:V" - }, - "windDirection": { - "value": null, - "unitCode": "unit:degree_(angle)", - "qualityControl": "qc:V" - }, - "windSpeed": { - "value": null, - "unitCode": "unit:m_s-1", - "qualityControl": "qc:V" - }, - "windGust": { - "value": null, - "unitCode": "unit:m_s-1", - "qualityControl": "qc:Z" - }, - "barometricPressure": { - "value": null, - "unitCode": "unit:Pa", - "qualityControl": "qc:V" - }, - "seaLevelPressure": { - "value": null, - "unitCode": "unit:Pa", - "qualityControl": "qc:V" - }, - "visibility": { - "value": null, - "unitCode": "unit:m", - "qualityControl": "qc:C" - }, - "maxTemperatureLast24Hours": { - "value": null, - "unitCode": "unit:degC", - "qualityControl": null - }, - "minTemperatureLast24Hours": { - "value": null, - "unitCode": "unit:degC", - "qualityControl": null - }, - "precipitationLastHour": { - "value": null, - "unitCode": "unit:m", - "qualityControl": "qc:Z" - }, - "precipitationLast3Hours": { - "value": null, - "unitCode": "unit:m", - "qualityControl": "qc:Z" - }, - "precipitationLast6Hours": { - "value": 0, - "unitCode": "unit:m", - "qualityControl": "qc:C" - }, - "relativeHumidity": { - "value": null, - "unitCode": "unit:percent", - "qualityControl": "qc:C" - }, - "windChill": { - "value": null, - "unitCode": "unit:degC", - "qualityControl": "qc:V" - }, - "heatIndex": { - "value": null, - "unitCode": "unit:degC", - "qualityControl": "qc:V" - }, - "cloudLayers": [ - { - "base": { - "value": null, - "unitCode": "unit:m" - }, - "amount": "CLR" - } - ] - } - } - ] -} diff --git a/tests/fixtures/nws-weather-obs-valid.json b/tests/fixtures/nws-weather-obs-valid.json deleted file mode 100644 index a6d307fc9b1..00000000000 --- a/tests/fixtures/nws-weather-obs-valid.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "@context": [ - "https://raw.githubusercontent.com/geojson/geojson-ld/master/contexts/geojson-base.jsonld", - { - "wx": "https://api.weather.gov/ontology#", - "s": "https://schema.org/", - "geo": "http://www.opengis.net/ont/geosparql#", - "unit": "http://codes.wmo.int/common/unit/", - "@vocab": "https://api.weather.gov/ontology#", - "geometry": { - "@id": "s:GeoCoordinates", - "@type": "geo:wktLiteral" - }, - "city": "s:addressLocality", - "state": "s:addressRegion", - "distance": { - "@id": "s:Distance", - "@type": "s:QuantitativeValue" - }, - "bearing": { - "@type": "s:QuantitativeValue" - }, - "value": { - "@id": "s:value" - }, - "unitCode": { - "@id": "s:unitCode", - "@type": "@id" - }, - "forecastOffice": { - "@type": "@id" - }, - "forecastGridData": { - "@type": "@id" - }, - "publicZone": { - "@type": "@id" - }, - "county": { - "@type": "@id" - } - } - ], - "type": "FeatureCollection", - "features": [ - { - "id": "https://api.weather.gov/stations/KMIE/observations/2019-08-12T23:53:00+00:00", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -85.400000000000006, - 40.25 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KMIE/observations/2019-08-12T23:53:00+00:00", - "@type": "wx:ObservationStation", - "elevation": { - "value": 286, - "unitCode": "unit:m" - }, - "station": "https://api.weather.gov/stations/KMIE", - "timestamp": "2019-08-12T23:53:00+00:00", - "rawMessage": "KMIE 122353Z 19005KT 10SM CLR 27/19 A2987 RMK AO2 SLP104 60000 T02670194 10272 20250 58002", - "textDescription": "Clear", - "icon": "https://api.weather.gov/icons/land/day/skc?size=medium", - "presentWeather": [], - "temperature": { - "value": 26.700000000000045, - "unitCode": "unit:degC", - "qualityControl": "qc:V" - }, - "dewpoint": { - "value": 19.400000000000034, - "unitCode": "unit:degC", - "qualityControl": "qc:V" - }, - "windDirection": { - "value": 190, - "unitCode": "unit:degree_(angle)", - "qualityControl": "qc:V" - }, - "windSpeed": { - "value": 2.6000000000000001, - "unitCode": "unit:m_s-1", - "qualityControl": "qc:V" - }, - "windGust": { - "value": null, - "unitCode": "unit:m_s-1", - "qualityControl": "qc:Z" - }, - "barometricPressure": { - "value": 101150, - "unitCode": "unit:Pa", - "qualityControl": "qc:V" - }, - "seaLevelPressure": { - "value": 101040, - "unitCode": "unit:Pa", - "qualityControl": "qc:V" - }, - "visibility": { - "value": 16090, - "unitCode": "unit:m", - "qualityControl": "qc:C" - }, - "maxTemperatureLast24Hours": { - "value": null, - "unitCode": "unit:degC", - "qualityControl": null - }, - "minTemperatureLast24Hours": { - "value": null, - "unitCode": "unit:degC", - "qualityControl": null - }, - "precipitationLastHour": { - "value": null, - "unitCode": "unit:m", - "qualityControl": "qc:Z" - }, - "precipitationLast3Hours": { - "value": null, - "unitCode": "unit:m", - "qualityControl": "qc:Z" - }, - "precipitationLast6Hours": { - "value": 0, - "unitCode": "unit:m", - "qualityControl": "qc:C" - }, - "relativeHumidity": { - "value": 64.292485914891955, - "unitCode": "unit:percent", - "qualityControl": "qc:C" - }, - "windChill": { - "value": null, - "unitCode": "unit:degC", - "qualityControl": "qc:V" - }, - "heatIndex": { - "value": 27.981288713580284, - "unitCode": "unit:degC", - "qualityControl": "qc:V" - }, - "cloudLayers": [ - { - "base": { - "value": null, - "unitCode": "unit:m" - }, - "amount": "CLR" - } - ] - } - } - ] -} \ No newline at end of file diff --git a/tests/fixtures/nws-weather-sta-valid.json b/tests/fixtures/nws-weather-sta-valid.json deleted file mode 100644 index b4fe086366c..00000000000 --- a/tests/fixtures/nws-weather-sta-valid.json +++ /dev/null @@ -1,996 +0,0 @@ -{ - "@context": [ - "https://raw.githubusercontent.com/geojson/geojson-ld/master/contexts/geojson-base.jsonld", - { - "wx": "https://api.weather.gov/ontology#", - "s": "https://schema.org/", - "geo": "http://www.opengis.net/ont/geosparql#", - "unit": "http://codes.wmo.int/common/unit/", - "@vocab": "https://api.weather.gov/ontology#", - "geometry": { - "@id": "s:GeoCoordinates", - "@type": "geo:wktLiteral" - }, - "city": "s:addressLocality", - "state": "s:addressRegion", - "distance": { - "@id": "s:Distance", - "@type": "s:QuantitativeValue" - }, - "bearing": { - "@type": "s:QuantitativeValue" - }, - "value": { - "@id": "s:value" - }, - "unitCode": { - "@id": "s:unitCode", - "@type": "@id" - }, - "forecastOffice": { - "@type": "@id" - }, - "forecastGridData": { - "@type": "@id" - }, - "publicZone": { - "@type": "@id" - }, - "county": { - "@type": "@id" - }, - "observationStations": { - "@container": "@list", - "@type": "@id" - } - } - ], - "type": "FeatureCollection", - "features": [ - { - "id": "https://api.weather.gov/stations/KMIE", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -85.393609999999995, - 40.234169999999999 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KMIE", - "@type": "wx:ObservationStation", - "elevation": { - "value": 284.988, - "unitCode": "unit:m" - }, - "stationIdentifier": "KMIE", - "name": "Muncie, Delaware County-Johnson Field", - "timeZone": "America/Indiana/Indianapolis" - } - }, - { - "id": "https://api.weather.gov/stations/KVES", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -84.531899899999999, - 40.2044 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KVES", - "@type": "wx:ObservationStation", - "elevation": { - "value": 306.93360000000001, - "unitCode": "unit:m" - }, - "stationIdentifier": "KVES", - "name": "Versailles Darke County Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KAID", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -85.609769999999997, - 40.106119999999997 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KAID", - "@type": "wx:ObservationStation", - "elevation": { - "value": 276.14879999999999, - "unitCode": "unit:m" - }, - "stationIdentifier": "KAID", - "name": "Anderson Municipal Airport", - "timeZone": "America/Indiana/Indianapolis" - } - }, - { - "id": "https://api.weather.gov/stations/KDAY", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -84.218609999999998, - 39.906109999999998 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KDAY", - "@type": "wx:ObservationStation", - "elevation": { - "value": 306.93360000000001, - "unitCode": "unit:m" - }, - "stationIdentifier": "KDAY", - "name": "Dayton, Cox Dayton International Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KGEZ", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -85.799819999999997, - 39.585459999999998 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KGEZ", - "@type": "wx:ObservationStation", - "elevation": { - "value": 244.1448, - "unitCode": "unit:m" - }, - "stationIdentifier": "KGEZ", - "name": "Shelbyville Municipal Airport", - "timeZone": "America/Indiana/Indianapolis" - } - }, - { - "id": "https://api.weather.gov/stations/KMGY", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -84.224720000000005, - 39.588889999999999 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KMGY", - "@type": "wx:ObservationStation", - "elevation": { - "value": 291.9984, - "unitCode": "unit:m" - }, - "stationIdentifier": "KMGY", - "name": "Dayton, Dayton-Wright Brothers Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KHAO", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -84.520610000000005, - 39.36121 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KHAO", - "@type": "wx:ObservationStation", - "elevation": { - "value": 185.0136, - "unitCode": "unit:m" - }, - "stationIdentifier": "KHAO", - "name": "Butler County Regional Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KFFO", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -84.049999999999997, - 39.833329900000003 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KFFO", - "@type": "wx:ObservationStation", - "elevation": { - "value": 250.85040000000001, - "unitCode": "unit:m" - }, - "stationIdentifier": "KFFO", - "name": "Dayton / Wright-Patterson Air Force Base", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KCVG", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -84.672290000000004, - 39.044559999999997 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KCVG", - "@type": "wx:ObservationStation", - "elevation": { - "value": 262.12799999999999, - "unitCode": "unit:m" - }, - "stationIdentifier": "KCVG", - "name": "Cincinnati/Northern Kentucky International Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KEDJ", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -83.819199999999995, - 40.372300000000003 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KEDJ", - "@type": "wx:ObservationStation", - "elevation": { - "value": 341.98560000000003, - "unitCode": "unit:m" - }, - "stationIdentifier": "KEDJ", - "name": "Bellefontaine Regional Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KFWA", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -85.206370000000007, - 40.97251 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KFWA", - "@type": "wx:ObservationStation", - "elevation": { - "value": 242.9256, - "unitCode": "unit:m" - }, - "stationIdentifier": "KFWA", - "name": "Fort Wayne International Airport", - "timeZone": "America/Indiana/Indianapolis" - } - }, - { - "id": "https://api.weather.gov/stations/KBAK", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -85.900000000000006, - 39.266669999999998 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KBAK", - "@type": "wx:ObservationStation", - "elevation": { - "value": 199.94880000000001, - "unitCode": "unit:m" - }, - "stationIdentifier": "KBAK", - "name": "Columbus / Bakalar", - "timeZone": "America/Indiana/Indianapolis" - } - }, - { - "id": "https://api.weather.gov/stations/KEYE", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -86.295829999999995, - 39.825000000000003 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KEYE", - "@type": "wx:ObservationStation", - "elevation": { - "value": 249.93600000000001, - "unitCode": "unit:m" - }, - "stationIdentifier": "KEYE", - "name": "Indianapolis, Eagle Creek Airpark", - "timeZone": "America/Indiana/Indianapolis" - } - }, - { - "id": "https://api.weather.gov/stations/KLUK", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -84.41583, - 39.105829999999997 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KLUK", - "@type": "wx:ObservationStation", - "elevation": { - "value": 146.9136, - "unitCode": "unit:m" - }, - "stationIdentifier": "KLUK", - "name": "Cincinnati, Cincinnati Municipal Airport Lunken Field", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KIND", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -86.281599999999997, - 39.725180000000002 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KIND", - "@type": "wx:ObservationStation", - "elevation": { - "value": 240.792, - "unitCode": "unit:m" - }, - "stationIdentifier": "KIND", - "name": "Indianapolis International Airport", - "timeZone": "America/Indiana/Indianapolis" - } - }, - { - "id": "https://api.weather.gov/stations/KAOH", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -84.021389999999997, - 40.708060000000003 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KAOH", - "@type": "wx:ObservationStation", - "elevation": { - "value": 296.87520000000001, - "unitCode": "unit:m" - }, - "stationIdentifier": "KAOH", - "name": "Lima, Lima Allen County Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KI69", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -84.2102, - 39.078400000000002 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KI69", - "@type": "wx:ObservationStation", - "elevation": { - "value": 256.94640000000004, - "unitCode": "unit:m" - }, - "stationIdentifier": "KI69", - "name": "Batavia Clermont County Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KILN", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -83.779169899999999, - 39.428330000000003 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KILN", - "@type": "wx:ObservationStation", - "elevation": { - "value": 327.96480000000003, - "unitCode": "unit:m" - }, - "stationIdentifier": "KILN", - "name": "Wilmington, Airborne Airpark Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KMRT", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -83.351600000000005, - 40.224699999999999 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KMRT", - "@type": "wx:ObservationStation", - "elevation": { - "value": 311.20080000000002, - "unitCode": "unit:m" - }, - "stationIdentifier": "KMRT", - "name": "Marysville Union County Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KTZR", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -83.137219999999999, - 39.900829999999999 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KTZR", - "@type": "wx:ObservationStation", - "elevation": { - "value": 276.14879999999999, - "unitCode": "unit:m" - }, - "stationIdentifier": "KTZR", - "name": "Columbus, Bolton Field Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KFDY", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -83.668610000000001, - 41.01361 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KFDY", - "@type": "wx:ObservationStation", - "elevation": { - "value": 248.10720000000001, - "unitCode": "unit:m" - }, - "stationIdentifier": "KFDY", - "name": "Findlay, Findlay Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KDLZ", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -83.114800000000002, - 40.279699999999998 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KDLZ", - "@type": "wx:ObservationStation", - "elevation": { - "value": 288.036, - "unitCode": "unit:m" - }, - "stationIdentifier": "KDLZ", - "name": "Delaware Municipal Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KOSU", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -83.0780599, - 40.078060000000001 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KOSU", - "@type": "wx:ObservationStation", - "elevation": { - "value": 274.92959999999999, - "unitCode": "unit:m" - }, - "stationIdentifier": "KOSU", - "name": "Columbus, Ohio State University Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KLCK", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -82.933329999999998, - 39.816670000000002 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KLCK", - "@type": "wx:ObservationStation", - "elevation": { - "value": 227.07600000000002, - "unitCode": "unit:m" - }, - "stationIdentifier": "KLCK", - "name": "Rickenbacker Air National Guard Base", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KMNN", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -83.068330000000003, - 40.616669999999999 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KMNN", - "@type": "wx:ObservationStation", - "elevation": { - "value": 302.97120000000001, - "unitCode": "unit:m" - }, - "stationIdentifier": "KMNN", - "name": "Marion, Marion Municipal Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KCMH", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -82.876390000000001, - 39.994999999999997 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KCMH", - "@type": "wx:ObservationStation", - "elevation": { - "value": 248.10720000000001, - "unitCode": "unit:m" - }, - "stationIdentifier": "KCMH", - "name": "Columbus - John Glenn Columbus International Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KFGX", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -83.743399999999994, - 38.541800000000002 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KFGX", - "@type": "wx:ObservationStation", - "elevation": { - "value": 277.9776, - "unitCode": "unit:m" - }, - "stationIdentifier": "KFGX", - "name": "Flemingsburg Fleming-Mason Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KFFT", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -84.903329999999997, - 38.184719999999999 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KFFT", - "@type": "wx:ObservationStation", - "elevation": { - "value": 245.0592, - "unitCode": "unit:m" - }, - "stationIdentifier": "KFFT", - "name": "Frankfort, Capital City Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KLHQ", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -82.663330000000002, - 39.757219900000003 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KLHQ", - "@type": "wx:ObservationStation", - "elevation": { - "value": 263.95679999999999, - "unitCode": "unit:m" - }, - "stationIdentifier": "KLHQ", - "name": "Lancaster, Fairfield County Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KLOU", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -85.663610000000006, - 38.227780000000003 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KLOU", - "@type": "wx:ObservationStation", - "elevation": { - "value": 166.11600000000001, - "unitCode": "unit:m" - }, - "stationIdentifier": "KLOU", - "name": "Louisville, Bowman Field Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KSDF", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -85.72972, - 38.177219999999998 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KSDF", - "@type": "wx:ObservationStation", - "elevation": { - "value": 150.876, - "unitCode": "unit:m" - }, - "stationIdentifier": "KSDF", - "name": "Louisville, Standiford Field", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KVTA", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -82.462500000000006, - 40.022779999999997 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KVTA", - "@type": "wx:ObservationStation", - "elevation": { - "value": 269.13839999999999, - "unitCode": "unit:m" - }, - "stationIdentifier": "KVTA", - "name": "Newark, Newark Heath Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KLEX", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -84.6114599, - 38.033900000000003 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KLEX", - "@type": "wx:ObservationStation", - "elevation": { - "value": 291.084, - "unitCode": "unit:m" - }, - "stationIdentifier": "KLEX", - "name": "Lexington Blue Grass Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KMFD", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -82.517780000000002, - 40.820279900000003 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KMFD", - "@type": "wx:ObservationStation", - "elevation": { - "value": 395.02080000000001, - "unitCode": "unit:m" - }, - "stationIdentifier": "KMFD", - "name": "Mansfield - Mansfield Lahm Regional Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KZZV", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -81.892219999999995, - 39.94444 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KZZV", - "@type": "wx:ObservationStation", - "elevation": { - "value": 274.01519999999999, - "unitCode": "unit:m" - }, - "stationIdentifier": "KZZV", - "name": "Zanesville, Zanesville Municipal Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KHTS", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -82.555000000000007, - 38.365000000000002 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KHTS", - "@type": "wx:ObservationStation", - "elevation": { - "value": 252.06960000000001, - "unitCode": "unit:m" - }, - "stationIdentifier": "KHTS", - "name": "Huntington, Tri-State Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KBJJ", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -81.886669999999995, - 40.873060000000002 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KBJJ", - "@type": "wx:ObservationStation", - "elevation": { - "value": 345.94800000000004, - "unitCode": "unit:m" - }, - "stationIdentifier": "KBJJ", - "name": "Wooster, Wayne County Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KPHD", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -81.423609999999996, - 40.471939900000002 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KPHD", - "@type": "wx:ObservationStation", - "elevation": { - "value": 271.88159999999999, - "unitCode": "unit:m" - }, - "stationIdentifier": "KPHD", - "name": "New Philadelphia, Harry Clever Field", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KPKB", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -81.439170000000004, - 39.344999999999999 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KPKB", - "@type": "wx:ObservationStation", - "elevation": { - "value": 262.12799999999999, - "unitCode": "unit:m" - }, - "stationIdentifier": "KPKB", - "name": "Parkersburg, Mid-Ohio Valley Regional Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KCAK", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -81.443430000000006, - 40.918109999999999 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KCAK", - "@type": "wx:ObservationStation", - "elevation": { - "value": 369.11279999999999, - "unitCode": "unit:m" - }, - "stationIdentifier": "KCAK", - "name": "Akron Canton Regional Airport", - "timeZone": "America/New_York" - } - }, - { - "id": "https://api.weather.gov/stations/KCRW", - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -81.591390000000004, - 38.379440000000002 - ] - }, - "properties": { - "@id": "https://api.weather.gov/stations/KCRW", - "@type": "wx:ObservationStation", - "elevation": { - "value": 299.00880000000001, - "unitCode": "unit:m" - }, - "stationIdentifier": "KCRW", - "name": "Charleston, Yeager Airport", - "timeZone": "America/New_York" - } - } - ], - "observationStations": [ - "https://api.weather.gov/stations/KMIE", - "https://api.weather.gov/stations/KVES", - "https://api.weather.gov/stations/KAID", - "https://api.weather.gov/stations/KDAY", - "https://api.weather.gov/stations/KGEZ", - "https://api.weather.gov/stations/KMGY", - "https://api.weather.gov/stations/KHAO", - "https://api.weather.gov/stations/KFFO", - "https://api.weather.gov/stations/KCVG", - "https://api.weather.gov/stations/KEDJ", - "https://api.weather.gov/stations/KFWA", - "https://api.weather.gov/stations/KBAK", - "https://api.weather.gov/stations/KEYE", - "https://api.weather.gov/stations/KLUK", - "https://api.weather.gov/stations/KIND", - "https://api.weather.gov/stations/KAOH", - "https://api.weather.gov/stations/KI69", - "https://api.weather.gov/stations/KILN", - "https://api.weather.gov/stations/KMRT", - "https://api.weather.gov/stations/KTZR", - "https://api.weather.gov/stations/KFDY", - "https://api.weather.gov/stations/KDLZ", - "https://api.weather.gov/stations/KOSU", - "https://api.weather.gov/stations/KLCK", - "https://api.weather.gov/stations/KMNN", - "https://api.weather.gov/stations/KCMH", - "https://api.weather.gov/stations/KFGX", - "https://api.weather.gov/stations/KFFT", - "https://api.weather.gov/stations/KLHQ", - "https://api.weather.gov/stations/KLOU", - "https://api.weather.gov/stations/KSDF", - "https://api.weather.gov/stations/KVTA", - "https://api.weather.gov/stations/KLEX", - "https://api.weather.gov/stations/KMFD", - "https://api.weather.gov/stations/KZZV", - "https://api.weather.gov/stations/KHTS", - "https://api.weather.gov/stations/KBJJ", - "https://api.weather.gov/stations/KPHD", - "https://api.weather.gov/stations/KPKB", - "https://api.weather.gov/stations/KCAK", - "https://api.weather.gov/stations/KCRW" - ] -} \ No newline at end of file