Use more homeassistant constants in NWS (#39690)

This commit is contained in:
MatthewFlamm 2020-09-05 15:11:15 -04:00 committed by GitHub
parent d2b1918e9c
commit 958c9c08d6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 58 additions and 39 deletions

View file

@ -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"

View file

@ -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")

View file

@ -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]}]

View file

@ -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