Fix weather templates using new style configuration (#136677)

This commit is contained in:
Petro31 2025-04-02 06:38:48 -04:00 committed by GitHub
parent 8432b6a790
commit 36857b4b20
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 109 additions and 12 deletions

View File

@ -135,6 +135,33 @@ WEATHER_SCHEMA = vol.Schema(
PLATFORM_SCHEMA = WEATHER_PLATFORM_SCHEMA.extend(WEATHER_SCHEMA.schema)
@callback
def _async_create_template_tracking_entities(
async_add_entities: AddEntitiesCallback,
hass: HomeAssistant,
definitions: list[dict],
unique_id_prefix: str | None,
) -> None:
"""Create the weather entities."""
entities = []
for entity_conf in definitions:
unique_id = entity_conf.get(CONF_UNIQUE_ID)
if unique_id and unique_id_prefix:
unique_id = f"{unique_id_prefix}-{unique_id}"
entities.append(
WeatherTemplate(
hass,
entity_conf,
unique_id,
)
)
async_add_entities(entities)
async def async_setup_platform(
hass: HomeAssistant,
config: ConfigType,
@ -142,16 +169,9 @@ async def async_setup_platform(
discovery_info: DiscoveryInfoType | None = None,
) -> None:
"""Set up the Template weather."""
if discovery_info and "coordinator" in discovery_info:
async_add_entities(
TriggerWeatherEntity(hass, discovery_info["coordinator"], config)
for config in discovery_info["entities"]
)
return
if discovery_info is None:
config = rewrite_common_legacy_to_modern_conf(hass, config)
unique_id = config.get(CONF_UNIQUE_ID)
async_add_entities(
[
WeatherTemplate(
@ -161,6 +181,21 @@ async def async_setup_platform(
)
]
)
return
if "coordinator" in discovery_info:
async_add_entities(
TriggerWeatherEntity(hass, discovery_info["coordinator"], config)
for config in discovery_info["entities"]
)
return
_async_create_template_tracking_entities(
async_add_entities,
hass,
discovery_info["entities"],
discovery_info["unique_id"],
)
class WeatherTemplate(TemplateEntity, WeatherEntity):

View File

@ -928,3 +928,65 @@ async def test_trigger_entity_restore_state_fail(
state = hass.states.get("weather.test")
assert state.state == STATE_UNKNOWN
assert state.attributes.get("temperature") is None
async def test_new_style_template_state_text(hass: HomeAssistant) -> None:
"""Test the state text of a template."""
assert await async_setup_component(
hass,
"weather",
{
"weather": [
{"weather": {"platform": "demo"}},
]
},
)
assert await async_setup_component(
hass,
"template",
{
"template": {
"weather": {
"name": "test",
"attribution_template": "{{ states('sensor.attribution') }}",
"condition_template": "sunny",
"temperature_template": "{{ states('sensor.temperature') | float }}",
"humidity_template": "{{ states('sensor.humidity') | int }}",
"pressure_template": "{{ states('sensor.pressure') }}",
"wind_speed_template": "{{ states('sensor.windspeed') }}",
"wind_bearing_template": "{{ states('sensor.windbearing') }}",
"ozone_template": "{{ states('sensor.ozone') }}",
"visibility_template": "{{ states('sensor.visibility') }}",
"wind_gust_speed_template": "{{ states('sensor.wind_gust_speed') }}",
"cloud_coverage_template": "{{ states('sensor.cloud_coverage') }}",
"dew_point_template": "{{ states('sensor.dew_point') }}",
"apparent_temperature_template": "{{ states('sensor.apparent_temperature') }}",
},
},
},
)
for attr, v_attr, value in (
(
"sensor.attribution",
ATTR_ATTRIBUTION,
"The custom attribution",
),
("sensor.temperature", ATTR_WEATHER_TEMPERATURE, 22.3),
("sensor.humidity", ATTR_WEATHER_HUMIDITY, 60),
("sensor.pressure", ATTR_WEATHER_PRESSURE, 1000),
("sensor.windspeed", ATTR_WEATHER_WIND_SPEED, 20),
("sensor.windbearing", ATTR_WEATHER_WIND_BEARING, 180),
("sensor.ozone", ATTR_WEATHER_OZONE, 25),
("sensor.visibility", ATTR_WEATHER_VISIBILITY, 4.6),
("sensor.wind_gust_speed", ATTR_WEATHER_WIND_GUST_SPEED, 30),
("sensor.cloud_coverage", ATTR_WEATHER_CLOUD_COVERAGE, 75),
("sensor.dew_point", ATTR_WEATHER_DEW_POINT, 2.2),
("sensor.apparent_temperature", ATTR_WEATHER_APPARENT_TEMPERATURE, 25),
):
hass.states.async_set(attr, value)
await hass.async_block_till_done()
state = hass.states.get("weather.test")
assert state is not None
assert state.state == "sunny"
assert state.attributes.get(v_attr) == value