diff --git a/homeassistant/components/recorder/models.py b/homeassistant/components/recorder/models.py index 7a655c294347e8f89d3c7baa281b67e6793145d5..d1be17b83d50082161db0c094fdee5fb2d4e4608 100644 --- a/homeassistant/components/recorder/models.py +++ b/homeassistant/components/recorder/models.py @@ -131,6 +131,9 @@ class States(Base): # type: ignore _process_timestamp(self.last_changed), _process_timestamp(self.last_updated), context=context, + # Temp, because database can still store invalid entity IDs + # Remove with 1.0 or in 2020. + temp_invalid_id_bypass=True ) except ValueError: # When json.loads fails diff --git a/homeassistant/core.py b/homeassistant/core.py index 02b474e3cd25fdd98fa4e333c0df422e0ddfa1a8..aea37f74898725b6652ecb1bfacaa083dd22b677 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -663,11 +663,14 @@ class State: attributes: Optional[Dict] = None, last_changed: Optional[datetime.datetime] = None, last_updated: Optional[datetime.datetime] = None, - context: Optional[Context] = None) -> None: + context: Optional[Context] = None, + # Temp, because database can still store invalid entity IDs + # Remove with 1.0 or in 2020. + temp_invalid_id_bypass: Optional[bool] = False) -> None: """Initialize a new state.""" state = str(state) - if not valid_entity_id(entity_id): + if not valid_entity_id(entity_id) and not temp_invalid_id_bypass: raise InvalidEntityFormatError(( "Invalid entity id encountered: {}. " "Format should be <domain>.<object_id>").format(entity_id)) diff --git a/tests/components/recorder/test_models.py b/tests/components/recorder/test_models.py index 3d1beb3a642bdda75c40dca9fc8c7ecd05937cd2..b56a7632df33a45fc7505e645f2528c57d46dffc 100644 --- a/tests/components/recorder/test_models.py +++ b/tests/components/recorder/test_models.py @@ -142,3 +142,12 @@ class TestRecorderRuns(unittest.TestCase): assert sorted(run.entity_ids()) == ['sensor.humidity', 'sensor.lux'] assert run.entity_ids(in_run2) == ['sensor.humidity'] + + +def test_states_from_native_invalid_entity_id(): + """Test loading a state from an invalid entity ID.""" + event = States() + event.entity_id = "test.invalid__id" + event.attributes = "{}" + state = event.to_native() + assert state.entity_id == 'test.invalid__id'