From 0d8d466003ccbc5aa93c2bf396e710afb2772dc9 Mon Sep 17 00:00:00 2001 From: Manu <4445816+tr4nt0r@users.noreply.github.com> Date: Fri, 12 Dec 2025 14:04:25 +0100 Subject: [PATCH] Increase Xbox update interval to 15 seconds and refactor title data handling (#158780) --- homeassistant/components/xbox/coordinator.py | 16 ++++++++++++---- tests/components/xbox/test_image.py | 4 ++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/xbox/coordinator.py b/homeassistant/components/xbox/coordinator.py index 7666fee3620..9e72ee6dd74 100644 --- a/homeassistant/components/xbox/coordinator.py +++ b/homeassistant/components/xbox/coordinator.py @@ -81,10 +81,11 @@ class XboxUpdateCoordinator(DataUpdateCoordinator[XboxData]): _LOGGER, config_entry=config_entry, name=DOMAIN, - update_interval=timedelta(seconds=10), + update_interval=timedelta(seconds=15), ) self.data = XboxData() self.current_friends: set[str] = set() + self.title_data: dict[str, Title] = {} async def _async_setup(self) -> None: """Set up coordinator.""" @@ -217,7 +218,6 @@ class XboxUpdateCoordinator(DataUpdateCoordinator[XboxData]): ) # retrieve title details - title_data: dict[str, Title] = {} for person in presence_data.values(): if presence_detail := next( ( @@ -227,6 +227,12 @@ class XboxUpdateCoordinator(DataUpdateCoordinator[XboxData]): ), None, ): + if ( + person.xuid in self.title_data + and presence_detail.title_id + == self.title_data[person.xuid].title_id + ): + continue try: title = await self.client.titlehub.get_title_info( presence_detail.title_id @@ -250,7 +256,9 @@ class XboxUpdateCoordinator(DataUpdateCoordinator[XboxData]): translation_domain=DOMAIN, translation_key="request_exception", ) from e - title_data[person.xuid] = title.titles[0] + self.title_data[person.xuid] = title.titles[0] + else: + self.title_data.pop(person.xuid, None) person.last_seen_date_time_utc = self.last_seen_timestamp(person) if ( self.current_friends - (new_friends := set(presence_data)) @@ -259,7 +267,7 @@ class XboxUpdateCoordinator(DataUpdateCoordinator[XboxData]): self.remove_stale_devices(new_friends) self.current_friends = new_friends - return XboxData(new_console_data, presence_data, title_data) + return XboxData(new_console_data, presence_data, self.title_data) def last_seen_timestamp(self, person: Person) -> datetime | None: """Returns the most recent of two timestamps.""" diff --git a/tests/components/xbox/test_image.py b/tests/components/xbox/test_image.py index 96fc978f1d0..7e04192636f 100644 --- a/tests/components/xbox/test_image.py +++ b/tests/components/xbox/test_image.py @@ -115,12 +115,12 @@ async def test_load_image_from_url( "rgWHJigthrlsHCxEOMG9UGNdojCYasYt6MJHBjmxmtuAHJeo.sOkUiPmg4JHXvOS82c3UOrvdJTDaCKwCwHPJ0t0Plha8oHFC1i_o-&format=png" ).respond(status_code=HTTPStatus.OK, content_type="image/png", content=b"Test2") - freezer.tick(timedelta(seconds=10)) + freezer.tick(timedelta(seconds=15)) async_fire_time_changed(hass) await hass.async_block_till_done() assert (state := hass.states.get("image.gsr_ae_gamerpic")) - assert state.state == "2025-06-16T00:00:10+00:00" + assert state.state == "2025-06-16T00:00:15+00:00" access_token = state.attributes["access_token"] assert (