diff --git a/homeassistant/components/person/__init__.py b/homeassistant/components/person/__init__.py index c1373ce1df9..fe6925b4847 100644 --- a/homeassistant/components/person/__init__.py +++ b/homeassistant/components/person/__init__.py @@ -56,6 +56,7 @@ _LOGGER = logging.getLogger(__name__) ATTR_SOURCE = "source" ATTR_USER_ID = "user_id" +ATTR_DEVICE_TRACKERS = "device_trackers" CONF_DEVICE_TRACKERS = "device_trackers" CONF_USER_ID = "user_id" @@ -446,6 +447,7 @@ class Person(collection.CollectionEntity, RestoreEntity): data[ATTR_SOURCE] = self._source if (user_id := self._config.get(CONF_USER_ID)) is not None: data[ATTR_USER_ID] = user_id + data[ATTR_DEVICE_TRACKERS] = self.device_trackers return data @property diff --git a/homeassistant/components/person/recorder.py b/homeassistant/components/person/recorder.py new file mode 100644 index 00000000000..7c0fdf52258 --- /dev/null +++ b/homeassistant/components/person/recorder.py @@ -0,0 +1,12 @@ +"""Integration platform for recorder.""" +from __future__ import annotations + +from homeassistant.core import HomeAssistant, callback + +from . import ATTR_DEVICE_TRACKERS + + +@callback +def exclude_attributes(hass: HomeAssistant) -> set[str]: + """Exclude large and chatty update attributes from being recorded.""" + return {ATTR_DEVICE_TRACKERS} diff --git a/homeassistant/components/person/strings.json b/homeassistant/components/person/strings.json index 8ee8c3a56a2..8a8915541d8 100644 --- a/homeassistant/components/person/strings.json +++ b/homeassistant/components/person/strings.json @@ -6,6 +6,23 @@ "state": { "home": "[%key:common::state::home%]", "not_home": "[%key:common::state::not_home%]" + }, + "state_attributes": { + "device_trackers": { + "name": "Device trackers" + }, + "gps_accuracy": { + "name": "[%key:component::device_tracker::entity_component::_::state_attributes::gps_accuracy::name%]" + }, + "latitude": { + "name": "[%key:component::device_tracker::entity_component::_::state_attributes::latitude::name%]" + }, + "longitude": { + "name": "[%key:component::device_tracker::entity_component::_::state_attributes::longitude::name%]" + }, + "source": { + "name": "Source" + } } } } diff --git a/tests/components/person/test_init.py b/tests/components/person/test_init.py index d22de580c2a..433c9529e78 100644 --- a/tests/components/person/test_init.py +++ b/tests/components/person/test_init.py @@ -7,7 +7,12 @@ import pytest from homeassistant.components import person from homeassistant.components.device_tracker import ATTR_SOURCE_TYPE, SourceType -from homeassistant.components.person import ATTR_SOURCE, ATTR_USER_ID, DOMAIN +from homeassistant.components.person import ( + ATTR_DEVICE_TRACKERS, + ATTR_SOURCE, + ATTR_USER_ID, + DOMAIN, +) from homeassistant.const import ( ATTR_ENTITY_PICTURE, ATTR_GPS_ACCURACY, @@ -165,6 +170,7 @@ async def test_setup_tracker(hass: HomeAssistant, hass_admin_user: MockUser) -> assert state.attributes.get(ATTR_LONGITUDE) is None assert state.attributes.get(ATTR_SOURCE) == DEVICE_TRACKER assert state.attributes.get(ATTR_USER_ID) == user_id + assert state.attributes.get(ATTR_DEVICE_TRACKERS) == [DEVICE_TRACKER] hass.states.async_set( DEVICE_TRACKER, @@ -181,6 +187,7 @@ async def test_setup_tracker(hass: HomeAssistant, hass_admin_user: MockUser) -> assert state.attributes.get(ATTR_GPS_ACCURACY) == 10 assert state.attributes.get(ATTR_SOURCE) == DEVICE_TRACKER assert state.attributes.get(ATTR_USER_ID) == user_id + assert state.attributes.get(ATTR_DEVICE_TRACKERS) == [DEVICE_TRACKER] async def test_setup_two_trackers( @@ -220,6 +227,10 @@ async def test_setup_two_trackers( assert state.attributes.get(ATTR_GPS_ACCURACY) is None assert state.attributes.get(ATTR_SOURCE) == DEVICE_TRACKER assert state.attributes.get(ATTR_USER_ID) == user_id + assert state.attributes.get(ATTR_DEVICE_TRACKERS) == [ + DEVICE_TRACKER, + DEVICE_TRACKER_2, + ] hass.states.async_set( DEVICE_TRACKER_2, @@ -245,6 +256,10 @@ async def test_setup_two_trackers( assert state.attributes.get(ATTR_GPS_ACCURACY) == 12 assert state.attributes.get(ATTR_SOURCE) == DEVICE_TRACKER_2 assert state.attributes.get(ATTR_USER_ID) == user_id + assert state.attributes.get(ATTR_DEVICE_TRACKERS) == [ + DEVICE_TRACKER, + DEVICE_TRACKER_2, + ] hass.states.async_set(DEVICE_TRACKER_2, "zone1", {ATTR_SOURCE_TYPE: SourceType.GPS}) await hass.async_block_till_done() diff --git a/tests/components/person/test_recorder.py b/tests/components/person/test_recorder.py new file mode 100644 index 00000000000..879db2ec11f --- /dev/null +++ b/tests/components/person/test_recorder.py @@ -0,0 +1,45 @@ +"""The tests for update recorder.""" +from __future__ import annotations + +from datetime import timedelta + +from homeassistant.components.person import ATTR_DEVICE_TRACKERS, DOMAIN +from homeassistant.components.recorder import Recorder +from homeassistant.components.recorder.history import get_significant_states +from homeassistant.core import HomeAssistant +from homeassistant.setup import async_setup_component +from homeassistant.util import dt as dt_util + +from tests.common import async_fire_time_changed +from tests.components.recorder.common import async_wait_recording_done + + +async def test_exclude_attributes( + recorder_mock: Recorder, + hass: HomeAssistant, + enable_custom_integrations: None, +) -> None: + """Test update attributes to be excluded.""" + now = dt_util.utcnow() + config = { + DOMAIN: { + "id": "1234", + "name": "test person", + "user_id": "test_user_id", + "device_trackers": ["device_tracker.test"], + } + } + assert await async_setup_component(hass, DOMAIN, config) + + await hass.async_block_till_done() + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(minutes=5)) + await hass.async_block_till_done() + await async_wait_recording_done(hass) + + states = await hass.async_add_executor_job( + get_significant_states, hass, now, None, hass.states.async_entity_ids() + ) + assert len(states) >= 1 + for entity_states in states.values(): + for state in entity_states: + assert ATTR_DEVICE_TRACKERS not in state.attributes