Set state of entity with invalid state to unknown (#99452)
* Set state of entity with invalid state to unknown * Add test * Apply suggestions from code review Co-authored-by: Robert Resch <robert@resch.dev> * Update test_entity.py --------- Co-authored-by: Robert Resch <robert@resch.dev>pull/99741/head
parent
bdc39e1d52
commit
e5fd6961a8
|
@ -35,7 +35,11 @@ from homeassistant.const import (
|
|||
EntityCategory,
|
||||
)
|
||||
from homeassistant.core import CALLBACK_TYPE, Context, HomeAssistant, callback
|
||||
from homeassistant.exceptions import HomeAssistantError, NoEntitySpecifiedError
|
||||
from homeassistant.exceptions import (
|
||||
HomeAssistantError,
|
||||
InvalidStateError,
|
||||
NoEntitySpecifiedError,
|
||||
)
|
||||
from homeassistant.loader import bind_hass
|
||||
from homeassistant.util import dt as dt_util, ensure_unique_string, slugify
|
||||
|
||||
|
@ -848,7 +852,15 @@ class Entity(ABC):
|
|||
self._context = None
|
||||
self._context_set = None
|
||||
|
||||
hass.states.async_set(entity_id, state, attr, self.force_update, self._context)
|
||||
try:
|
||||
hass.states.async_set(
|
||||
entity_id, state, attr, self.force_update, self._context
|
||||
)
|
||||
except InvalidStateError:
|
||||
_LOGGER.exception("Failed to set state, fall back to %s", STATE_UNKNOWN)
|
||||
hass.states.async_set(
|
||||
entity_id, STATE_UNKNOWN, {}, self.force_update, self._context
|
||||
)
|
||||
|
||||
def schedule_update_ha_state(self, force_refresh: bool = False) -> None:
|
||||
"""Schedule an update ha state change task.
|
||||
|
|
|
@ -3,6 +3,7 @@ import asyncio
|
|||
from collections.abc import Iterable
|
||||
import dataclasses
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
import threading
|
||||
from typing import Any
|
||||
from unittest.mock import MagicMock, PropertyMock, patch
|
||||
|
@ -1477,3 +1478,30 @@ async def test_warn_no_platform(
|
|||
caplog.clear()
|
||||
ent.async_write_ha_state()
|
||||
assert error_message not in caplog.text
|
||||
|
||||
|
||||
async def test_invalid_state(
|
||||
hass: HomeAssistant, caplog: pytest.LogCaptureFixture
|
||||
) -> None:
|
||||
"""Test the entity helper catches InvalidState and sets state to unknown."""
|
||||
ent = entity.Entity()
|
||||
ent.entity_id = "test.test"
|
||||
ent.hass = hass
|
||||
|
||||
ent._attr_state = "x" * 255
|
||||
ent.async_write_ha_state()
|
||||
assert hass.states.get("test.test").state == "x" * 255
|
||||
|
||||
caplog.clear()
|
||||
ent._attr_state = "x" * 256
|
||||
ent.async_write_ha_state()
|
||||
assert hass.states.get("test.test").state == STATE_UNKNOWN
|
||||
assert (
|
||||
"homeassistant.helpers.entity",
|
||||
logging.ERROR,
|
||||
f"Failed to set state, fall back to {STATE_UNKNOWN}",
|
||||
) in caplog.record_tuples
|
||||
|
||||
ent._attr_state = "x" * 255
|
||||
ent.async_write_ha_state()
|
||||
assert hass.states.get("test.test").state == "x" * 255
|
||||
|
|
Loading…
Reference in New Issue