From 958c9c08d61b0f3420319186b5bbf1d36dbdcb4d Mon Sep 17 00:00:00 2001 From: MatthewFlamm <39341281+MatthewFlamm@users.noreply.github.com> Date: Sat, 5 Sep 2020 15:11:15 -0400 Subject: [PATCH] Use more homeassistant constants in NWS (#39690) --- homeassistant/components/nws/const.py | 43 +++++++++++++++++-------- homeassistant/components/nws/weather.py | 10 +++--- tests/components/nws/const.py | 11 ++++--- tests/components/nws/test_weather.py | 33 ++++++++++--------- 4 files changed, 58 insertions(+), 39 deletions(-) diff --git a/homeassistant/components/nws/const.py b/homeassistant/components/nws/const.py index c8798134473..574ad6925ac 100644 --- a/homeassistant/components/nws/const.py +++ b/homeassistant/components/nws/const.py @@ -1,4 +1,20 @@ """Constants for National Weather Service Integration.""" +from homeassistant.components.weather import ( + ATTR_CONDITION_CLOUDY, + ATTR_CONDITION_EXCEPTIONAL, + ATTR_CONDITION_FOG, + ATTR_CONDITION_HAIL, + ATTR_CONDITION_LIGHTNING, + ATTR_CONDITION_LIGHTNING_RAINY, + ATTR_CONDITION_PARTLYCLOUDY, + ATTR_CONDITION_POURING, + ATTR_CONDITION_RAINY, + ATTR_CONDITION_SNOWY, + ATTR_CONDITION_SNOWY_RAINY, + ATTR_CONDITION_WINDY, + ATTR_CONDITION_WINDY_VARIANT, +) + DOMAIN = "nws" CONF_STATION = "station" @@ -6,11 +22,10 @@ CONF_STATION = "station" ATTRIBUTION = "Data from National Weather Service/NOAA" ATTR_FORECAST_DETAILED_DESCRIPTION = "detailed_description" -ATTR_FORECAST_PRECIP_PROB = "precipitation_probability" ATTR_FORECAST_DAYTIME = "daytime" CONDITION_CLASSES = { - "exceptional": [ + ATTR_CONDITION_EXCEPTIONAL: [ "Tornado", "Hurricane conditions", "Tropical storm conditions", @@ -20,37 +35,37 @@ CONDITION_CLASSES = { "Hot", "Cold", ], - "snowy": ["Snow", "Sleet", "Blizzard"], - "snowy-rainy": [ + ATTR_CONDITION_SNOWY: ["Snow", "Sleet", "Blizzard"], + ATTR_CONDITION_SNOWY_RAINY: [ "Rain/snow", "Rain/sleet", "Freezing rain/snow", "Freezing rain", "Rain/freezing rain", ], - "hail": [], - "lightning-rainy": [ + ATTR_CONDITION_HAIL: [], + ATTR_CONDITION_LIGHTNING_RAINY: [ "Thunderstorm (high cloud cover)", "Thunderstorm (medium cloud cover)", "Thunderstorm (low cloud cover)", ], - "lightning": [], - "pouring": [], - "rainy": [ + ATTR_CONDITION_LIGHTNING: [], + ATTR_CONDITION_POURING: [], + ATTR_CONDITION_RAINY: [ "Rain", "Rain showers (high cloud cover)", "Rain showers (low cloud cover)", ], - "windy-variant": ["Mostly cloudy and windy", "Overcast and windy"], - "windy": [ + ATTR_CONDITION_WINDY_VARIANT: ["Mostly cloudy and windy", "Overcast and windy"], + ATTR_CONDITION_WINDY: [ "Fair/clear and windy", "A few clouds and windy", "Partly cloudy and windy", ], - "fog": ["Fog/mist"], + ATTR_CONDITION_FOG: ["Fog/mist"], "clear": ["Fair/clear"], # sunny and clear-night - "cloudy": ["Mostly cloudy", "Overcast"], - "partlycloudy": ["A few clouds", "Partly cloudy"], + ATTR_CONDITION_CLOUDY: ["Mostly cloudy", "Overcast"], + ATTR_CONDITION_PARTLYCLOUDY: ["A few clouds", "Partly cloudy"], } DAYNIGHT = "daynight" diff --git a/homeassistant/components/nws/weather.py b/homeassistant/components/nws/weather.py index f7890190490..3c641447e84 100644 --- a/homeassistant/components/nws/weather.py +++ b/homeassistant/components/nws/weather.py @@ -3,7 +3,10 @@ from datetime import timedelta import logging from homeassistant.components.weather import ( + ATTR_CONDITION_CLEAR_NIGHT, + ATTR_CONDITION_SUNNY, ATTR_FORECAST_CONDITION, + ATTR_FORECAST_PRECIPITATION_PROBABILITY, ATTR_FORECAST_TEMP, ATTR_FORECAST_TIME, ATTR_FORECAST_WIND_BEARING, @@ -33,7 +36,6 @@ from . import base_unique_id from .const import ( ATTR_FORECAST_DAYTIME, ATTR_FORECAST_DETAILED_DESCRIPTION, - ATTR_FORECAST_PRECIP_PROB, ATTRIBUTION, CONDITION_CLASSES, COORDINATOR_FORECAST, @@ -75,9 +77,9 @@ def convert_condition(time, weather): if cond == "clear": if time == "day": - return "sunny", max(prec_probs) + return ATTR_CONDITION_SUNNY, max(prec_probs) if time == "night": - return "clear-night", max(prec_probs) + return ATTR_CONDITION_CLEAR_NIGHT, max(prec_probs) return cond, max(prec_probs) @@ -267,7 +269,7 @@ class NWSWeather(WeatherEntity): else: cond, precip = None, None data[ATTR_FORECAST_CONDITION] = cond - data[ATTR_FORECAST_PRECIP_PROB] = precip + data[ATTR_FORECAST_PRECIPITATION_PROBABILITY] = precip data[ATTR_FORECAST_WIND_BEARING] = forecast_entry.get("windBearing") wind_speed = forecast_entry.get("windSpeedAvg") diff --git a/tests/components/nws/const.py b/tests/components/nws/const.py index 8b23f9cc850..ae2f826294f 100644 --- a/tests/components/nws/const.py +++ b/tests/components/nws/const.py @@ -1,8 +1,9 @@ """Helpers for interacting with pynws.""" from homeassistant.components.nws.const import CONF_STATION -from homeassistant.components.nws.weather import ATTR_FORECAST_PRECIP_PROB from homeassistant.components.weather import ( + ATTR_CONDITION_LIGHTNING_RAINY, ATTR_FORECAST_CONDITION, + ATTR_FORECAST_PRECIPITATION_PROBABILITY, ATTR_FORECAST_TEMP, ATTR_FORECAST_TIME, ATTR_FORECAST_WIND_BEARING, @@ -101,23 +102,23 @@ DEFAULT_FORECAST = [ ] EXPECTED_FORECAST_IMPERIAL = { - ATTR_FORECAST_CONDITION: "lightning-rainy", + ATTR_FORECAST_CONDITION: ATTR_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, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 90, } EXPECTED_FORECAST_METRIC = { - ATTR_FORECAST_CONDITION: "lightning-rainy", + ATTR_FORECAST_CONDITION: ATTR_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, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 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 06053302ec7..2604c6f39ac 100644 --- a/tests/components/nws/test_weather.py +++ b/tests/components/nws/test_weather.py @@ -5,7 +5,8 @@ import aiohttp import pytest from homeassistant.components import nws -from homeassistant.components.weather import ATTR_FORECAST +from homeassistant.components.weather import ATTR_CONDITION_SUNNY, ATTR_FORECAST +from homeassistant.const import STATE_UNAVAILABLE, STATE_UNKNOWN from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util from homeassistant.util.unit_system import IMPERIAL_SYSTEM, METRIC_SYSTEM @@ -46,7 +47,7 @@ async def test_imperial_metric( state = hass.states.get("weather.abc_hourly") assert state - assert state.state == "sunny" + assert state.state == ATTR_CONDITION_SUNNY data = state.attributes for key, value in result_observation.items(): @@ -59,7 +60,7 @@ async def test_imperial_metric( state = hass.states.get("weather.abc_daynight") assert state - assert state.state == "sunny" + assert state.state == ATTR_CONDITION_SUNNY data = state.attributes for key, value in result_observation.items(): @@ -85,7 +86,7 @@ async def test_none_values(hass, mock_simple_nws): await hass.async_block_till_done() state = hass.states.get("weather.abc_daynight") - assert state.state == "unknown" + assert state.state == STATE_UNKNOWN data = state.attributes for key in EXPECTED_OBSERVATION_IMPERIAL: assert data.get(key) is None @@ -111,7 +112,7 @@ async def test_none(hass, mock_simple_nws): state = hass.states.get("weather.abc_daynight") assert state - assert state.state == "unknown" + assert state.state == STATE_UNKNOWN data = state.attributes for key in EXPECTED_OBSERVATION_IMPERIAL: @@ -198,11 +199,11 @@ async def test_error_observation(hass, mock_simple_nws): state = hass.states.get("weather.abc_daynight") assert state - assert state.state == "unavailable" + assert state.state == STATE_UNAVAILABLE state = hass.states.get("weather.abc_hourly") assert state - assert state.state == "unavailable" + assert state.state == STATE_UNAVAILABLE # second update happens faster and succeeds instance.update_observation.side_effect = None @@ -213,7 +214,7 @@ async def test_error_observation(hass, mock_simple_nws): state = hass.states.get("weather.abc_daynight") assert state - assert state.state == "sunny" + assert state.state == ATTR_CONDITION_SUNNY state = hass.states.get("weather.abc_hourly") assert state @@ -229,11 +230,11 @@ async def test_error_observation(hass, mock_simple_nws): state = hass.states.get("weather.abc_daynight") assert state - assert state.state == "sunny" + assert state.state == ATTR_CONDITION_SUNNY state = hass.states.get("weather.abc_hourly") assert state - assert state.state == "sunny" + assert state.state == ATTR_CONDITION_SUNNY # after 20 minutes data caching expires, data is no longer shown increment_time(timedelta(minutes=10)) @@ -241,11 +242,11 @@ async def test_error_observation(hass, mock_simple_nws): state = hass.states.get("weather.abc_daynight") assert state - assert state.state == "unavailable" + assert state.state == STATE_UNAVAILABLE state = hass.states.get("weather.abc_hourly") assert state - assert state.state == "unavailable" + assert state.state == STATE_UNAVAILABLE async def test_error_forecast(hass, mock_simple_nws): @@ -265,7 +266,7 @@ async def test_error_forecast(hass, mock_simple_nws): state = hass.states.get("weather.abc_daynight") assert state - assert state.state == "unavailable" + assert state.state == STATE_UNAVAILABLE instance.update_forecast.side_effect = None @@ -276,7 +277,7 @@ async def test_error_forecast(hass, mock_simple_nws): state = hass.states.get("weather.abc_daynight") assert state - assert state.state == "sunny" + assert state.state == ATTR_CONDITION_SUNNY async def test_error_forecast_hourly(hass, mock_simple_nws): @@ -294,7 +295,7 @@ async def test_error_forecast_hourly(hass, mock_simple_nws): state = hass.states.get("weather.abc_hourly") assert state - assert state.state == "unavailable" + assert state.state == STATE_UNAVAILABLE instance.update_forecast_hourly.assert_called_once() @@ -307,4 +308,4 @@ async def test_error_forecast_hourly(hass, mock_simple_nws): state = hass.states.get("weather.abc_hourly") assert state - assert state.state == "sunny" + assert state.state == ATTR_CONDITION_SUNNY