Fix int vs float template sensor issue (#164339)

This commit is contained in:
Petro31 authored and GitHub committed 2026-02-27 22:06:37 +01:00
1 parent 2b4f46a739
commit 5fadcb01e9
2 files changed
+51 -4

No files matched your search

@@ -257,6 +257,9 @@ class AbstractTemplateSensor(AbstractTemplateEntity, RestoreSensor):
) -> StateType | date | datetime | Decimal | None:
"""Validate the state."""
if self._numeric_state_expected:
if not isinstance(result, bool) and isinstance(result, (int, float)):
return result
return template_validators.number(self, CONF_STATE)(result)
if result is None or self.device_class not in (
+48 -4
View File
@@ -684,7 +684,7 @@ async def test_sun_renders_once_per_sensor(hass: HomeAssistant) -> None:
def _record_async_render(self, *args, **kwargs):
"""Catch async_render."""
async_render_calls.append(self.template)
return "75"
return 75
later = dt_util.utcnow()
@@ -692,7 +692,7 @@ async def test_sun_renders_once_per_sensor(hass: HomeAssistant) -> None:
hass.states.async_set("sun.sun", {"elevation": 50, "next_rising": later})
await hass.async_block_till_done()
assert hass.states.get("sensor.solar_angle").state == "75.0"
assert hass.states.get("sensor.solar_angle").state == "75"
assert hass.states.get("sensor.sunrise").state == "75"
assert len(async_render_calls) == 2
@@ -1524,7 +1524,7 @@ async def test_last_reset(hass: HomeAssistant, expected: str) -> None:
state = hass.states.get(TEST_SENSOR.entity_id)
assert state is not None
assert state.state == "0.0"
assert state.state == "0"
assert state.attributes["state_class"] == "total"
assert state.attributes["last_reset"] == expected
@@ -1553,7 +1553,7 @@ async def test_invalid_last_reset(
state = hass.states.get(TEST_SENSOR.entity_id)
assert state is not None
assert state.state == "0.0"
assert state.state == "0"
assert state.attributes.get("last_reset") is None
err = "Received invalid sensor last_reset: not a datetime for entity"
@@ -1993,3 +1993,47 @@ async def test_numeric_sensor_recovers_from_exception(hass: HomeAssistant) -> No
):
await async_trigger(hass, TEST_STATE_SENSOR, set_state)
assert hass.states.get(TEST_SENSOR.entity_id).state == expected_state
@pytest.mark.parametrize(
("count", "config"),
[
(
1,
{
"device_class": "temperature",
"state_class": "measurement",
"unit_of_measurement": "°C",
},
)
],
)
@pytest.mark.parametrize(
"style", [ConfigurationStyle.MODERN, ConfigurationStyle.TRIGGER]
)
@pytest.mark.parametrize(
("state_template", "expected_state"),
[
("{{ '1.0' }}", "1.0"),
("{{ '1' }}", "1"),
("{{ 1.0 }}", "1.0"),
("{{ 1 }}", "1"),
("{{ '0.0' }}", "0.0"),
("{{ '0' }}", "0"),
("{{ 0.0 }}", "0.0"),
("{{ 0 }}", "0"),
("{{ '10021452' }}", "10021452"),
("{{ 10021452 }}", "10021452"),
("{{ '1002.1452' }}", "1002.1452"),
("{{ 1002.1452 }}", "1002.1452"),
("{{ True }}", STATE_UNKNOWN),
("{{ False }}", STATE_UNKNOWN),
],
)
@pytest.mark.usefixtures("setup_state_sensor")
async def test_numeric_sensor_int_float(
hass: HomeAssistant, expected_state: str
) -> None:
"""Test sensor properly stores int or float for state."""
await async_trigger(hass, TEST_STATE_SENSOR, "anything")
assert hass.states.get(TEST_SENSOR.entity_id).state == expected_state