mirror of
https://github.com/home-assistant/core.git
synced 2025-07-28 07:37:34 +00:00
Add support for UV index attribute in template weather entity (#149015)
This commit is contained in:
parent
c08aa74496
commit
8c964e64db
@ -90,6 +90,7 @@ CONF_PRESSURE_TEMPLATE = "pressure_template"
|
|||||||
CONF_WIND_SPEED_TEMPLATE = "wind_speed_template"
|
CONF_WIND_SPEED_TEMPLATE = "wind_speed_template"
|
||||||
CONF_WIND_BEARING_TEMPLATE = "wind_bearing_template"
|
CONF_WIND_BEARING_TEMPLATE = "wind_bearing_template"
|
||||||
CONF_OZONE_TEMPLATE = "ozone_template"
|
CONF_OZONE_TEMPLATE = "ozone_template"
|
||||||
|
CONF_UV_INDEX_TEMPLATE = "uv_index_template"
|
||||||
CONF_VISIBILITY_TEMPLATE = "visibility_template"
|
CONF_VISIBILITY_TEMPLATE = "visibility_template"
|
||||||
CONF_FORECAST_DAILY_TEMPLATE = "forecast_daily_template"
|
CONF_FORECAST_DAILY_TEMPLATE = "forecast_daily_template"
|
||||||
CONF_FORECAST_HOURLY_TEMPLATE = "forecast_hourly_template"
|
CONF_FORECAST_HOURLY_TEMPLATE = "forecast_hourly_template"
|
||||||
@ -122,6 +123,7 @@ WEATHER_YAML_SCHEMA = vol.Schema(
|
|||||||
vol.Optional(CONF_PRESSURE_UNIT): vol.In(PressureConverter.VALID_UNITS),
|
vol.Optional(CONF_PRESSURE_UNIT): vol.In(PressureConverter.VALID_UNITS),
|
||||||
vol.Required(CONF_TEMPERATURE_TEMPLATE): cv.template,
|
vol.Required(CONF_TEMPERATURE_TEMPLATE): cv.template,
|
||||||
vol.Optional(CONF_TEMPERATURE_UNIT): vol.In(TemperatureConverter.VALID_UNITS),
|
vol.Optional(CONF_TEMPERATURE_UNIT): vol.In(TemperatureConverter.VALID_UNITS),
|
||||||
|
vol.Optional(CONF_UV_INDEX_TEMPLATE): cv.template,
|
||||||
vol.Optional(CONF_VISIBILITY_TEMPLATE): cv.template,
|
vol.Optional(CONF_VISIBILITY_TEMPLATE): cv.template,
|
||||||
vol.Optional(CONF_VISIBILITY_UNIT): vol.In(DistanceConverter.VALID_UNITS),
|
vol.Optional(CONF_VISIBILITY_UNIT): vol.In(DistanceConverter.VALID_UNITS),
|
||||||
vol.Optional(CONF_WIND_BEARING_TEMPLATE): cv.template,
|
vol.Optional(CONF_WIND_BEARING_TEMPLATE): cv.template,
|
||||||
@ -201,6 +203,7 @@ class StateWeatherEntity(TemplateEntity, WeatherEntity):
|
|||||||
self._wind_speed_template = config.get(CONF_WIND_SPEED_TEMPLATE)
|
self._wind_speed_template = config.get(CONF_WIND_SPEED_TEMPLATE)
|
||||||
self._wind_bearing_template = config.get(CONF_WIND_BEARING_TEMPLATE)
|
self._wind_bearing_template = config.get(CONF_WIND_BEARING_TEMPLATE)
|
||||||
self._ozone_template = config.get(CONF_OZONE_TEMPLATE)
|
self._ozone_template = config.get(CONF_OZONE_TEMPLATE)
|
||||||
|
self._uv_index_template = config.get(CONF_UV_INDEX_TEMPLATE)
|
||||||
self._visibility_template = config.get(CONF_VISIBILITY_TEMPLATE)
|
self._visibility_template = config.get(CONF_VISIBILITY_TEMPLATE)
|
||||||
self._forecast_daily_template = config.get(CONF_FORECAST_DAILY_TEMPLATE)
|
self._forecast_daily_template = config.get(CONF_FORECAST_DAILY_TEMPLATE)
|
||||||
self._forecast_hourly_template = config.get(CONF_FORECAST_HOURLY_TEMPLATE)
|
self._forecast_hourly_template = config.get(CONF_FORECAST_HOURLY_TEMPLATE)
|
||||||
@ -228,6 +231,7 @@ class StateWeatherEntity(TemplateEntity, WeatherEntity):
|
|||||||
self._wind_speed = None
|
self._wind_speed = None
|
||||||
self._wind_bearing = None
|
self._wind_bearing = None
|
||||||
self._ozone = None
|
self._ozone = None
|
||||||
|
self._uv_index = None
|
||||||
self._visibility = None
|
self._visibility = None
|
||||||
self._wind_gust_speed = None
|
self._wind_gust_speed = None
|
||||||
self._cloud_coverage = None
|
self._cloud_coverage = None
|
||||||
@ -275,6 +279,11 @@ class StateWeatherEntity(TemplateEntity, WeatherEntity):
|
|||||||
"""Return the ozone level."""
|
"""Return the ozone level."""
|
||||||
return self._ozone
|
return self._ozone
|
||||||
|
|
||||||
|
@property
|
||||||
|
def uv_index(self) -> float | None:
|
||||||
|
"""Return the UV index."""
|
||||||
|
return self._uv_index
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def native_visibility(self) -> float | None:
|
def native_visibility(self) -> float | None:
|
||||||
"""Return the visibility."""
|
"""Return the visibility."""
|
||||||
@ -369,6 +378,11 @@ class StateWeatherEntity(TemplateEntity, WeatherEntity):
|
|||||||
"_ozone",
|
"_ozone",
|
||||||
self._ozone_template,
|
self._ozone_template,
|
||||||
)
|
)
|
||||||
|
if self._uv_index_template:
|
||||||
|
self.add_template_attribute(
|
||||||
|
"_uv_index",
|
||||||
|
self._uv_index_template,
|
||||||
|
)
|
||||||
if self._visibility_template:
|
if self._visibility_template:
|
||||||
self.add_template_attribute(
|
self.add_template_attribute(
|
||||||
"_visibility",
|
"_visibility",
|
||||||
@ -480,6 +494,7 @@ class WeatherExtraStoredData(ExtraStoredData):
|
|||||||
last_ozone: float | None
|
last_ozone: float | None
|
||||||
last_pressure: float | None
|
last_pressure: float | None
|
||||||
last_temperature: float | None
|
last_temperature: float | None
|
||||||
|
last_uv_index: float | None
|
||||||
last_visibility: float | None
|
last_visibility: float | None
|
||||||
last_wind_bearing: float | str | None
|
last_wind_bearing: float | str | None
|
||||||
last_wind_gust_speed: float | None
|
last_wind_gust_speed: float | None
|
||||||
@ -501,6 +516,7 @@ class WeatherExtraStoredData(ExtraStoredData):
|
|||||||
last_ozone=restored["last_ozone"],
|
last_ozone=restored["last_ozone"],
|
||||||
last_pressure=restored["last_pressure"],
|
last_pressure=restored["last_pressure"],
|
||||||
last_temperature=restored["last_temperature"],
|
last_temperature=restored["last_temperature"],
|
||||||
|
last_uv_index=restored["last_uv_index"],
|
||||||
last_visibility=restored["last_visibility"],
|
last_visibility=restored["last_visibility"],
|
||||||
last_wind_bearing=restored["last_wind_bearing"],
|
last_wind_bearing=restored["last_wind_bearing"],
|
||||||
last_wind_gust_speed=restored["last_wind_gust_speed"],
|
last_wind_gust_speed=restored["last_wind_gust_speed"],
|
||||||
@ -553,6 +569,7 @@ class TriggerWeatherEntity(TriggerEntity, WeatherEntity, RestoreEntity):
|
|||||||
CONF_FORECAST_TWICE_DAILY_TEMPLATE,
|
CONF_FORECAST_TWICE_DAILY_TEMPLATE,
|
||||||
CONF_OZONE_TEMPLATE,
|
CONF_OZONE_TEMPLATE,
|
||||||
CONF_PRESSURE_TEMPLATE,
|
CONF_PRESSURE_TEMPLATE,
|
||||||
|
CONF_UV_INDEX_TEMPLATE,
|
||||||
CONF_VISIBILITY_TEMPLATE,
|
CONF_VISIBILITY_TEMPLATE,
|
||||||
CONF_WIND_BEARING_TEMPLATE,
|
CONF_WIND_BEARING_TEMPLATE,
|
||||||
CONF_WIND_GUST_SPEED_TEMPLATE,
|
CONF_WIND_GUST_SPEED_TEMPLATE,
|
||||||
@ -583,6 +600,7 @@ class TriggerWeatherEntity(TriggerEntity, WeatherEntity, RestoreEntity):
|
|||||||
self._rendered[CONF_OZONE_TEMPLATE] = weather_data.last_ozone
|
self._rendered[CONF_OZONE_TEMPLATE] = weather_data.last_ozone
|
||||||
self._rendered[CONF_PRESSURE_TEMPLATE] = weather_data.last_pressure
|
self._rendered[CONF_PRESSURE_TEMPLATE] = weather_data.last_pressure
|
||||||
self._rendered[CONF_TEMPERATURE_TEMPLATE] = weather_data.last_temperature
|
self._rendered[CONF_TEMPERATURE_TEMPLATE] = weather_data.last_temperature
|
||||||
|
self._rendered[CONF_UV_INDEX_TEMPLATE] = weather_data.last_uv_index
|
||||||
self._rendered[CONF_VISIBILITY_TEMPLATE] = weather_data.last_visibility
|
self._rendered[CONF_VISIBILITY_TEMPLATE] = weather_data.last_visibility
|
||||||
self._rendered[CONF_WIND_BEARING_TEMPLATE] = weather_data.last_wind_bearing
|
self._rendered[CONF_WIND_BEARING_TEMPLATE] = weather_data.last_wind_bearing
|
||||||
self._rendered[CONF_WIND_GUST_SPEED_TEMPLATE] = (
|
self._rendered[CONF_WIND_GUST_SPEED_TEMPLATE] = (
|
||||||
@ -630,6 +648,13 @@ class TriggerWeatherEntity(TriggerEntity, WeatherEntity, RestoreEntity):
|
|||||||
self._rendered.get(CONF_OZONE_TEMPLATE),
|
self._rendered.get(CONF_OZONE_TEMPLATE),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def uv_index(self) -> float | None:
|
||||||
|
"""Return the UV index."""
|
||||||
|
return vol.Any(vol.Coerce(float), None)(
|
||||||
|
self._rendered.get(CONF_UV_INDEX_TEMPLATE)
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def native_visibility(self) -> float | None:
|
def native_visibility(self) -> float | None:
|
||||||
"""Return the visibility."""
|
"""Return the visibility."""
|
||||||
@ -703,6 +728,7 @@ class TriggerWeatherEntity(TriggerEntity, WeatherEntity, RestoreEntity):
|
|||||||
last_ozone=self._rendered.get(CONF_OZONE_TEMPLATE),
|
last_ozone=self._rendered.get(CONF_OZONE_TEMPLATE),
|
||||||
last_pressure=self._rendered.get(CONF_PRESSURE_TEMPLATE),
|
last_pressure=self._rendered.get(CONF_PRESSURE_TEMPLATE),
|
||||||
last_temperature=self._rendered.get(CONF_TEMPERATURE_TEMPLATE),
|
last_temperature=self._rendered.get(CONF_TEMPERATURE_TEMPLATE),
|
||||||
|
last_uv_index=self._rendered.get(CONF_UV_INDEX_TEMPLATE),
|
||||||
last_visibility=self._rendered.get(CONF_VISIBILITY_TEMPLATE),
|
last_visibility=self._rendered.get(CONF_VISIBILITY_TEMPLATE),
|
||||||
last_wind_bearing=self._rendered.get(CONF_WIND_BEARING_TEMPLATE),
|
last_wind_bearing=self._rendered.get(CONF_WIND_BEARING_TEMPLATE),
|
||||||
last_wind_gust_speed=self._rendered.get(CONF_WIND_GUST_SPEED_TEMPLATE),
|
last_wind_gust_speed=self._rendered.get(CONF_WIND_GUST_SPEED_TEMPLATE),
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
'last_ozone': None,
|
'last_ozone': None,
|
||||||
'last_pressure': None,
|
'last_pressure': None,
|
||||||
'last_temperature': '15.0',
|
'last_temperature': '15.0',
|
||||||
|
'last_uv_index': None,
|
||||||
'last_visibility': None,
|
'last_visibility': None,
|
||||||
'last_wind_bearing': None,
|
'last_wind_bearing': None,
|
||||||
'last_wind_gust_speed': None,
|
'last_wind_gust_speed': None,
|
||||||
|
@ -15,6 +15,7 @@ from homeassistant.components.weather import (
|
|||||||
ATTR_WEATHER_OZONE,
|
ATTR_WEATHER_OZONE,
|
||||||
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,
|
||||||
@ -608,6 +609,7 @@ SAVED_EXTRA_DATA = {
|
|||||||
"last_ozone": None,
|
"last_ozone": None,
|
||||||
"last_pressure": None,
|
"last_pressure": None,
|
||||||
"last_temperature": 20,
|
"last_temperature": 20,
|
||||||
|
"last_uv_index": None,
|
||||||
"last_visibility": None,
|
"last_visibility": None,
|
||||||
"last_wind_bearing": None,
|
"last_wind_bearing": None,
|
||||||
"last_wind_gust_speed": None,
|
"last_wind_gust_speed": None,
|
||||||
@ -623,6 +625,7 @@ SAVED_EXTRA_DATA_WITH_FUTURE_KEY = {
|
|||||||
"last_ozone": None,
|
"last_ozone": None,
|
||||||
"last_pressure": None,
|
"last_pressure": None,
|
||||||
"last_temperature": 20,
|
"last_temperature": 20,
|
||||||
|
"last_uv_index": None,
|
||||||
"last_visibility": None,
|
"last_visibility": None,
|
||||||
"last_wind_bearing": None,
|
"last_wind_bearing": None,
|
||||||
"last_wind_gust_speed": None,
|
"last_wind_gust_speed": None,
|
||||||
@ -790,6 +793,7 @@ async def test_trigger_action(hass: HomeAssistant) -> None:
|
|||||||
"wind_speed_template": "{{ my_variable + 1 }}",
|
"wind_speed_template": "{{ my_variable + 1 }}",
|
||||||
"wind_bearing_template": "{{ my_variable + 1 }}",
|
"wind_bearing_template": "{{ my_variable + 1 }}",
|
||||||
"ozone_template": "{{ my_variable + 1 }}",
|
"ozone_template": "{{ my_variable + 1 }}",
|
||||||
|
"uv_index_template": "{{ my_variable + 1 }}",
|
||||||
"visibility_template": "{{ my_variable + 1 }}",
|
"visibility_template": "{{ my_variable + 1 }}",
|
||||||
"pressure_template": "{{ my_variable + 1 }}",
|
"pressure_template": "{{ my_variable + 1 }}",
|
||||||
"wind_gust_speed_template": "{{ my_variable + 1 }}",
|
"wind_gust_speed_template": "{{ my_variable + 1 }}",
|
||||||
@ -864,6 +868,7 @@ async def test_trigger_weather_services(
|
|||||||
assert state.attributes["wind_speed"] == 3.0
|
assert state.attributes["wind_speed"] == 3.0
|
||||||
assert state.attributes["wind_bearing"] == 3.0
|
assert state.attributes["wind_bearing"] == 3.0
|
||||||
assert state.attributes["ozone"] == 3.0
|
assert state.attributes["ozone"] == 3.0
|
||||||
|
assert state.attributes["uv_index"] == 3.0
|
||||||
assert state.attributes["visibility"] == 3.0
|
assert state.attributes["visibility"] == 3.0
|
||||||
assert state.attributes["pressure"] == 3.0
|
assert state.attributes["pressure"] == 3.0
|
||||||
assert state.attributes["wind_gust_speed"] == 3.0
|
assert state.attributes["wind_gust_speed"] == 3.0
|
||||||
@ -962,6 +967,7 @@ SAVED_EXTRA_DATA_MISSING_KEY = {
|
|||||||
"last_ozone": None,
|
"last_ozone": None,
|
||||||
"last_pressure": None,
|
"last_pressure": None,
|
||||||
"last_temperature": 20,
|
"last_temperature": 20,
|
||||||
|
"last_uv_index": None,
|
||||||
"last_visibility": None,
|
"last_visibility": None,
|
||||||
"last_wind_bearing": None,
|
"last_wind_bearing": None,
|
||||||
"last_wind_gust_speed": None,
|
"last_wind_gust_speed": None,
|
||||||
@ -1041,6 +1047,7 @@ async def test_new_style_template_state_text(hass: HomeAssistant) -> None:
|
|||||||
"wind_speed_template": "{{ states('sensor.windspeed') }}",
|
"wind_speed_template": "{{ states('sensor.windspeed') }}",
|
||||||
"wind_bearing_template": "{{ states('sensor.windbearing') }}",
|
"wind_bearing_template": "{{ states('sensor.windbearing') }}",
|
||||||
"ozone_template": "{{ states('sensor.ozone') }}",
|
"ozone_template": "{{ states('sensor.ozone') }}",
|
||||||
|
"uv_index_template": "{{ states('sensor.uv_index') }}",
|
||||||
"visibility_template": "{{ states('sensor.visibility') }}",
|
"visibility_template": "{{ states('sensor.visibility') }}",
|
||||||
"wind_gust_speed_template": "{{ states('sensor.wind_gust_speed') }}",
|
"wind_gust_speed_template": "{{ states('sensor.wind_gust_speed') }}",
|
||||||
"cloud_coverage_template": "{{ states('sensor.cloud_coverage') }}",
|
"cloud_coverage_template": "{{ states('sensor.cloud_coverage') }}",
|
||||||
@ -1063,6 +1070,7 @@ async def test_new_style_template_state_text(hass: HomeAssistant) -> None:
|
|||||||
("sensor.windspeed", ATTR_WEATHER_WIND_SPEED, 20),
|
("sensor.windspeed", ATTR_WEATHER_WIND_SPEED, 20),
|
||||||
("sensor.windbearing", ATTR_WEATHER_WIND_BEARING, 180),
|
("sensor.windbearing", ATTR_WEATHER_WIND_BEARING, 180),
|
||||||
("sensor.ozone", ATTR_WEATHER_OZONE, 25),
|
("sensor.ozone", ATTR_WEATHER_OZONE, 25),
|
||||||
|
("sensor.uv_index", ATTR_WEATHER_UV_INDEX, 3.7),
|
||||||
("sensor.visibility", ATTR_WEATHER_VISIBILITY, 4.6),
|
("sensor.visibility", ATTR_WEATHER_VISIBILITY, 4.6),
|
||||||
("sensor.wind_gust_speed", ATTR_WEATHER_WIND_GUST_SPEED, 30),
|
("sensor.wind_gust_speed", ATTR_WEATHER_WIND_GUST_SPEED, 30),
|
||||||
("sensor.cloud_coverage", ATTR_WEATHER_CLOUD_COVERAGE, 75),
|
("sensor.cloud_coverage", ATTR_WEATHER_CLOUD_COVERAGE, 75),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user