Expose UV Index in Met.no (#124992)

UV Index now also appears in forecasts.
This commit is contained in:
Hans Kröner 2024-09-03 21:00:44 +02:00 committed by GitHub
parent 27032c1780
commit be8f14167f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 46 additions and 2 deletions

View File

@ -21,12 +21,14 @@ from homeassistant.components.weather import (
ATTR_FORECAST_NATIVE_WIND_SPEED, ATTR_FORECAST_NATIVE_WIND_SPEED,
ATTR_FORECAST_PRECIPITATION_PROBABILITY, ATTR_FORECAST_PRECIPITATION_PROBABILITY,
ATTR_FORECAST_TIME, ATTR_FORECAST_TIME,
ATTR_FORECAST_UV_INDEX,
ATTR_FORECAST_WIND_BEARING, ATTR_FORECAST_WIND_BEARING,
ATTR_WEATHER_CLOUD_COVERAGE, ATTR_WEATHER_CLOUD_COVERAGE,
ATTR_WEATHER_DEW_POINT, ATTR_WEATHER_DEW_POINT,
ATTR_WEATHER_HUMIDITY, ATTR_WEATHER_HUMIDITY,
ATTR_WEATHER_PRESSURE, ATTR_WEATHER_PRESSURE,
ATTR_WEATHER_TEMPERATURE, ATTR_WEATHER_TEMPERATURE,
ATTR_WEATHER_UV_INDEX,
ATTR_WEATHER_VISIBILITY, ATTR_WEATHER_VISIBILITY,
ATTR_WEATHER_WIND_BEARING, ATTR_WEATHER_WIND_BEARING,
ATTR_WEATHER_WIND_GUST_SPEED, ATTR_WEATHER_WIND_GUST_SPEED,
@ -190,6 +192,7 @@ FORECAST_MAP = {
ATTR_FORECAST_NATIVE_WIND_GUST_SPEED: "wind_gust", ATTR_FORECAST_NATIVE_WIND_GUST_SPEED: "wind_gust",
ATTR_FORECAST_CLOUD_COVERAGE: "cloudiness", ATTR_FORECAST_CLOUD_COVERAGE: "cloudiness",
ATTR_FORECAST_HUMIDITY: "humidity", ATTR_FORECAST_HUMIDITY: "humidity",
ATTR_FORECAST_UV_INDEX: "uv_index",
} }
ATTR_MAP = { ATTR_MAP = {
@ -202,4 +205,5 @@ ATTR_MAP = {
ATTR_WEATHER_WIND_GUST_SPEED: "wind_gust", ATTR_WEATHER_WIND_GUST_SPEED: "wind_gust",
ATTR_WEATHER_CLOUD_COVERAGE: "cloudiness", ATTR_WEATHER_CLOUD_COVERAGE: "cloudiness",
ATTR_WEATHER_DEW_POINT: "dew_point", ATTR_WEATHER_DEW_POINT: "dew_point",
ATTR_WEATHER_UV_INDEX: "uv_index",
} }

View File

@ -13,6 +13,7 @@ from homeassistant.components.weather import (
ATTR_WEATHER_HUMIDITY, ATTR_WEATHER_HUMIDITY,
ATTR_WEATHER_PRESSURE, ATTR_WEATHER_PRESSURE,
ATTR_WEATHER_TEMPERATURE, ATTR_WEATHER_TEMPERATURE,
ATTR_WEATHER_UV_INDEX,
ATTR_WEATHER_WIND_BEARING, ATTR_WEATHER_WIND_BEARING,
ATTR_WEATHER_WIND_GUST_SPEED, ATTR_WEATHER_WIND_GUST_SPEED,
ATTR_WEATHER_WIND_SPEED, ATTR_WEATHER_WIND_SPEED,
@ -208,6 +209,13 @@ class MetWeather(SingleCoordinatorWeatherEntity[MetDataUpdateCoordinator]):
ATTR_MAP[ATTR_WEATHER_DEW_POINT] ATTR_MAP[ATTR_WEATHER_DEW_POINT]
) )
@property
def uv_index(self) -> float | None:
"""Return the uv index."""
return self.coordinator.data.current_weather_data.get(
ATTR_MAP[ATTR_WEATHER_UV_INDEX]
)
def _forecast(self, hourly: bool) -> list[Forecast] | None: def _forecast(self, hourly: bool) -> list[Forecast] | None:
"""Return the forecast array.""" """Return the forecast array."""
if hourly: if hourly:

View File

@ -17,8 +17,9 @@ def mock_weather():
"pressure": 100, "pressure": 100,
"humidity": 50, "humidity": 50,
"wind_speed": 10, "wind_speed": 10,
"wind_bearing": "NE", "wind_bearing": 90,
"dew_point": 12.1, "dew_point": 12.1,
"uv_index": 1.1,
} }
mock_data.get_forecast.return_value = {} mock_data.get_forecast.return_value = {}
yield mock_data yield mock_data

View File

@ -2,10 +2,22 @@
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components.met import DOMAIN from homeassistant.components.met import DOMAIN
from homeassistant.components.weather import DOMAIN as WEATHER_DOMAIN from homeassistant.components.weather import (
ATTR_CONDITION_CLOUDY,
ATTR_WEATHER_DEW_POINT,
ATTR_WEATHER_HUMIDITY,
ATTR_WEATHER_PRESSURE,
ATTR_WEATHER_TEMPERATURE,
ATTR_WEATHER_UV_INDEX,
ATTR_WEATHER_WIND_BEARING,
ATTR_WEATHER_WIND_SPEED,
DOMAIN as WEATHER_DOMAIN,
)
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er from homeassistant.helpers import entity_registry as er
from . import init_integration
async def test_new_config_entry( async def test_new_config_entry(
hass: HomeAssistant, entity_registry: er.EntityRegistry, mock_weather hass: HomeAssistant, entity_registry: er.EntityRegistry, mock_weather
@ -36,6 +48,25 @@ async def test_legacy_config_entry(
assert len(er.async_entries_for_config_entry(entity_registry, entry.entry_id)) == 1 assert len(er.async_entries_for_config_entry(entity_registry, entry.entry_id)) == 1
async def test_weather(hass: HomeAssistant, mock_weather) -> None:
"""Test states of the weather."""
await init_integration(hass)
assert len(hass.states.async_entity_ids("weather")) == 1
entity_id = hass.states.async_entity_ids("weather")[0]
state = hass.states.get(entity_id)
assert state
assert state.state == ATTR_CONDITION_CLOUDY
assert state.attributes[ATTR_WEATHER_TEMPERATURE] == 15
assert state.attributes[ATTR_WEATHER_PRESSURE] == 100
assert state.attributes[ATTR_WEATHER_HUMIDITY] == 50
assert state.attributes[ATTR_WEATHER_WIND_SPEED] == 10
assert state.attributes[ATTR_WEATHER_WIND_BEARING] == 90
assert state.attributes[ATTR_WEATHER_DEW_POINT] == 12.1
assert state.attributes[ATTR_WEATHER_UV_INDEX] == 1.1
async def test_tracking_home(hass: HomeAssistant, mock_weather) -> None: async def test_tracking_home(hass: HomeAssistant, mock_weather) -> None:
"""Test we track home.""" """Test we track home."""
await hass.config_entries.flow.async_init("met", context={"source": "onboarding"}) await hass.config_entries.flow.async_init("met", context={"source": "onboarding"})