Skip to content

Commit 06bd1a2

Browse files
authored
Migrate Xbox to runtime_data (home-assistant#154652)
1 parent 37ea360 commit 06bd1a2

File tree

7 files changed

+37
-66
lines changed

7 files changed

+37
-66
lines changed

homeassistant/components/xbox/__init__.py

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,13 @@
88
from xbox.webapi.api.provider.smartglass.models import SmartglassConsoleList
99
from xbox.webapi.common.signed_session import SignedSession
1010

11-
from homeassistant.config_entries import ConfigEntry
1211
from homeassistant.const import Platform
1312
from homeassistant.core import HomeAssistant
1413
from homeassistant.helpers import config_entry_oauth2_flow, config_validation as cv
1514

1615
from . import api
1716
from .const import DOMAIN
18-
from .coordinator import XboxUpdateCoordinator
17+
from .coordinator import XboxConfigEntry, XboxUpdateCoordinator
1918

2019
_LOGGER = logging.getLogger(__name__)
2120

@@ -29,7 +28,7 @@
2928
]
3029

3130

32-
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
31+
async def async_setup_entry(hass: HomeAssistant, entry: XboxConfigEntry) -> bool:
3332
"""Set up xbox from a config entry."""
3433
implementation = (
3534
await config_entry_oauth2_flow.async_get_config_entry_implementation(
@@ -45,30 +44,20 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
4544
_LOGGER.debug(
4645
"Found %d consoles: %s",
4746
len(consoles.result),
48-
consoles.dict(),
47+
consoles.model_dump(),
4948
)
5049

5150
coordinator = XboxUpdateCoordinator(hass, entry, client, consoles)
5251
await coordinator.async_config_entry_first_refresh()
5352

54-
hass.data.setdefault(DOMAIN, {})[entry.entry_id] = {
55-
"client": XboxLiveClient(auth),
56-
"consoles": consoles,
57-
"coordinator": coordinator,
58-
}
53+
entry.runtime_data = coordinator
5954

6055
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
6156

6257
return True
6358

6459

65-
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
60+
async def async_unload_entry(hass: HomeAssistant, entry: XboxConfigEntry) -> bool:
6661
"""Unload a config entry."""
67-
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
68-
if unload_ok:
69-
# Unsub from coordinator updates
70-
hass.data[DOMAIN][entry.entry_id]["sensor_unsub"]()
71-
hass.data[DOMAIN][entry.entry_id]["binary_sensor_unsub"]()
72-
hass.data[DOMAIN].pop(entry.entry_id)
73-
74-
return unload_ok
62+
63+
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)

homeassistant/components/xbox/binary_sensor.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,28 @@
55
from functools import partial
66

77
from homeassistant.components.binary_sensor import BinarySensorEntity
8-
from homeassistant.config_entries import ConfigEntry
98
from homeassistant.core import HomeAssistant, callback
109
from homeassistant.helpers import entity_registry as er
1110
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
1211

13-
from .const import DOMAIN
14-
from .coordinator import XboxUpdateCoordinator
12+
from .coordinator import XboxConfigEntry, XboxUpdateCoordinator
1513
from .entity import XboxBaseEntity
1614

1715
PRESENCE_ATTRIBUTES = ["online", "in_party", "in_game", "in_multiplayer"]
1816

1917

2018
async def async_setup_entry(
2119
hass: HomeAssistant,
22-
entry: ConfigEntry,
20+
entry: XboxConfigEntry,
2321
async_add_entities: AddConfigEntryEntitiesCallback,
2422
) -> None:
2523
"""Set up Xbox Live friends."""
26-
coordinator: XboxUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
27-
"coordinator"
28-
]
24+
coordinator = entry.runtime_data
2925

3026
update_friends = partial(async_update_friends, coordinator, {}, async_add_entities)
3127

32-
unsub = coordinator.async_add_listener(update_friends)
33-
hass.data[DOMAIN][entry.entry_id]["binary_sensor_unsub"] = unsub
28+
entry.async_on_unload(coordinator.async_add_listener(update_friends))
29+
3430
update_friends()
3531

3632

homeassistant/components/xbox/coordinator.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828

2929
_LOGGER = logging.getLogger(__name__)
3030

31+
type XboxConfigEntry = ConfigEntry[XboxUpdateCoordinator]
32+
3133

3234
@dataclass
3335
class ConsoleData:

homeassistant/components/xbox/media_player.py

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@
55
import re
66
from typing import Any
77

8-
from xbox.webapi.api.client import XboxLiveClient
98
from xbox.webapi.api.provider.catalog.models import Image
109
from xbox.webapi.api.provider.smartglass.models import (
1110
PlaybackState,
1211
PowerState,
1312
SmartglassConsole,
14-
SmartglassConsoleList,
1513
VolumeDirection,
1614
)
1715

@@ -21,15 +19,14 @@
2119
MediaPlayerState,
2220
MediaType,
2321
)
24-
from homeassistant.config_entries import ConfigEntry
2522
from homeassistant.core import HomeAssistant
2623
from homeassistant.helpers.device_registry import DeviceInfo
2724
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
2825
from homeassistant.helpers.update_coordinator import CoordinatorEntity
2926

3027
from .browse_media import build_item_response
3128
from .const import DOMAIN
32-
from .coordinator import ConsoleData, XboxUpdateCoordinator
29+
from .coordinator import ConsoleData, XboxConfigEntry, XboxUpdateCoordinator
3330

3431
SUPPORT_XBOX = (
3532
MediaPlayerEntityFeature.TURN_ON
@@ -57,18 +54,18 @@
5754

5855
async def async_setup_entry(
5956
hass: HomeAssistant,
60-
entry: ConfigEntry,
57+
entry: XboxConfigEntry,
6158
async_add_entities: AddConfigEntryEntitiesCallback,
6259
) -> None:
6360
"""Set up Xbox media_player from a config entry."""
64-
client: XboxLiveClient = hass.data[DOMAIN][entry.entry_id]["client"]
65-
consoles: SmartglassConsoleList = hass.data[DOMAIN][entry.entry_id]["consoles"]
66-
coordinator: XboxUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
67-
"coordinator"
68-
]
61+
62+
coordinator = entry.runtime_data
6963

7064
async_add_entities(
71-
[XboxMediaPlayer(client, console, coordinator) for console in consoles.result]
65+
[
66+
XboxMediaPlayer(console, coordinator)
67+
for console in coordinator.consoles.result
68+
]
7269
)
7370

7471

@@ -77,14 +74,13 @@ class XboxMediaPlayer(CoordinatorEntity[XboxUpdateCoordinator], MediaPlayerEntit
7774

7875
def __init__(
7976
self,
80-
client: XboxLiveClient,
8177
console: SmartglassConsole,
8278
coordinator: XboxUpdateCoordinator,
8379
) -> None:
8480
"""Initialize the Xbox Media Player."""
8581
super().__init__(coordinator)
86-
self.client: XboxLiveClient = client
87-
self._console: SmartglassConsole = console
82+
self.client = coordinator.client
83+
self._console = console
8884

8985
@property
9086
def name(self):

homeassistant/components/xbox/media_source.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
from .browse_media import _find_media_image
2626
from .const import DOMAIN
27+
from .coordinator import XboxConfigEntry
2728

2829
MIME_TYPE_MAP = {
2930
"gameclips": "video/mp4",
@@ -38,8 +39,8 @@
3839

3940
async def async_get_media_source(hass: HomeAssistant):
4041
"""Set up Xbox media source."""
41-
entry = hass.config_entries.async_entries(DOMAIN)[0]
42-
client = hass.data[DOMAIN][entry.entry_id]["client"]
42+
entry: XboxConfigEntry = hass.config_entries.async_entries(DOMAIN)[0]
43+
client = entry.runtime_data.client
4344
return XboxSource(hass, client)
4445

4546

homeassistant/components/xbox/remote.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,10 @@
77
import re
88
from typing import Any
99

10-
from xbox.webapi.api.client import XboxLiveClient
1110
from xbox.webapi.api.provider.smartglass.models import (
1211
InputKeyType,
1312
PowerState,
1413
SmartglassConsole,
15-
SmartglassConsoleList,
1614
)
1715

1816
from homeassistant.components.remote import (
@@ -21,30 +19,25 @@
2119
DEFAULT_DELAY_SECS,
2220
RemoteEntity,
2321
)
24-
from homeassistant.config_entries import ConfigEntry
2522
from homeassistant.core import HomeAssistant
2623
from homeassistant.helpers.device_registry import DeviceInfo
2724
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
2825
from homeassistant.helpers.update_coordinator import CoordinatorEntity
2926

3027
from .const import DOMAIN
31-
from .coordinator import ConsoleData, XboxUpdateCoordinator
28+
from .coordinator import ConsoleData, XboxConfigEntry, XboxUpdateCoordinator
3229

3330

3431
async def async_setup_entry(
3532
hass: HomeAssistant,
36-
entry: ConfigEntry,
33+
entry: XboxConfigEntry,
3734
async_add_entities: AddConfigEntryEntitiesCallback,
3835
) -> None:
3936
"""Set up Xbox media_player from a config entry."""
40-
client: XboxLiveClient = hass.data[DOMAIN][entry.entry_id]["client"]
41-
consoles: SmartglassConsoleList = hass.data[DOMAIN][entry.entry_id]["consoles"]
42-
coordinator: XboxUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
43-
"coordinator"
44-
]
37+
coordinator = entry.runtime_data
4538

4639
async_add_entities(
47-
[XboxRemote(client, console, coordinator) for console in consoles.result]
40+
[XboxRemote(console, coordinator) for console in coordinator.consoles.result]
4841
)
4942

5043

@@ -53,14 +46,13 @@ class XboxRemote(CoordinatorEntity[XboxUpdateCoordinator], RemoteEntity):
5346

5447
def __init__(
5548
self,
56-
client: XboxLiveClient,
5749
console: SmartglassConsole,
5850
coordinator: XboxUpdateCoordinator,
5951
) -> None:
6052
"""Initialize the Xbox Media Player."""
6153
super().__init__(coordinator)
62-
self.client: XboxLiveClient = client
63-
self._console: SmartglassConsole = console
54+
self.client = coordinator.client
55+
self._console = console
6456

6557
@property
6658
def name(self):

homeassistant/components/xbox/sensor.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,27 @@
55
from functools import partial
66

77
from homeassistant.components.sensor import SensorEntity
8-
from homeassistant.config_entries import ConfigEntry
98
from homeassistant.core import HomeAssistant, callback
109
from homeassistant.helpers import entity_registry as er
1110
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
1211

13-
from .const import DOMAIN
14-
from .coordinator import XboxUpdateCoordinator
12+
from .coordinator import XboxConfigEntry, XboxUpdateCoordinator
1513
from .entity import XboxBaseEntity
1614

1715
SENSOR_ATTRIBUTES = ["status", "gamer_score", "account_tier", "gold_tenure"]
1816

1917

2018
async def async_setup_entry(
2119
hass: HomeAssistant,
22-
config_entry: ConfigEntry,
20+
config_entry: XboxConfigEntry,
2321
async_add_entities: AddConfigEntryEntitiesCallback,
2422
) -> None:
2523
"""Set up Xbox Live friends."""
26-
coordinator: XboxUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id][
27-
"coordinator"
28-
]
24+
coordinator = config_entry.runtime_data
2925

3026
update_friends = partial(async_update_friends, coordinator, {}, async_add_entities)
3127

32-
unsub = coordinator.async_add_listener(update_friends)
33-
hass.data[DOMAIN][config_entry.entry_id]["sensor_unsub"] = unsub
28+
config_entry.async_on_unload(coordinator.async_add_listener(update_friends))
3429
update_friends()
3530

3631

0 commit comments

Comments
 (0)