Use more homeassistant constants in NWS (#39690)
This commit is contained in:
parent
d2b1918e9c
commit
958c9c08d6
4 changed files with 58 additions and 39 deletions
|
@ -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"
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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]}]
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue