diff --git a/homeassistant/core.py b/homeassistant/core.py index e7f4f8758f8..31bb281aeaa 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -32,7 +32,7 @@ from homeassistant.const import ( EVENT_SERVICE_REMOVED, __version__) from homeassistant import loader from homeassistant.exceptions import ( - HomeAssistantError, InvalidEntityFormatError) + HomeAssistantError, InvalidEntityFormatError, InvalidStateError) from homeassistant.util.async import ( run_coroutine_threadsafe, run_callback_threadsafe, fire_coroutine_threadsafe) @@ -65,6 +65,11 @@ def valid_entity_id(entity_id: str) -> bool: return ENTITY_ID_PATTERN.match(entity_id) is not None +def valid_state(state: str) -> bool: + """Test if an state is valid.""" + return len(state) < 256 + + def callback(func: Callable[..., None]) -> Callable[..., None]: """Annotation to mark method as safe to call from within the event loop.""" # pylint: disable=protected-access @@ -520,13 +525,20 @@ class State(object): def __init__(self, entity_id, state, attributes=None, last_changed=None, last_updated=None): """Initialize a new state.""" + state = str(state) + if not valid_entity_id(entity_id): raise InvalidEntityFormatError(( "Invalid entity id encountered: {}. " "Format should be .").format(entity_id)) + if not valid_state(state): + raise InvalidStateError(( + "Invalid state encountered for entity id: {}. " + "State max length is 255 characters.").format(entity_id)) + self.entity_id = entity_id.lower() - self.state = str(state) + self.state = state self.attributes = MappingProxyType(attributes or {}) self.last_updated = last_updated or dt_util.utcnow() self.last_changed = last_changed or self.last_updated diff --git a/homeassistant/exceptions.py b/homeassistant/exceptions.py index 2889d83af5c..cb8a3c87820 100644 --- a/homeassistant/exceptions.py +++ b/homeassistant/exceptions.py @@ -32,3 +32,9 @@ class PlatformNotReady(HomeAssistantError): """Error to indicate that platform is not ready.""" pass + + +class InvalidStateError(HomeAssistantError): + """When an invalid state is encountered.""" + + pass diff --git a/tests/test_core.py b/tests/test_core.py index b7d049cb747..c3fea749f5d 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -12,7 +12,8 @@ import pytz import pytest import homeassistant.core as ha -from homeassistant.exceptions import InvalidEntityFormatError +from homeassistant.exceptions import (InvalidEntityFormatError, + InvalidStateError) from homeassistant.util.async import run_coroutine_threadsafe import homeassistant.util.dt as dt_util from homeassistant.util.unit_system import (METRIC_SYSTEM) @@ -421,6 +422,10 @@ class TestState(unittest.TestCase): InvalidEntityFormatError, ha.State, 'invalid_entity_format', 'test_state') + self.assertRaises( + InvalidStateError, ha.State, + 'domain.long_state', 't' * 256) + def test_domain(self): """Test domain.""" state = ha.State('some_domain.hello', 'world')