Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Xbox friends binary sensors."""
2 
3 from __future__ import annotations
4 
5 from functools import partial
6 
7 from homeassistant.components.sensor import SensorEntity
8 from homeassistant.config_entries import ConfigEntry
9 from homeassistant.core import HomeAssistant, callback
10 from homeassistant.helpers import entity_registry as er
11 from homeassistant.helpers.entity_platform import AddEntitiesCallback
12 
13 from .const import DOMAIN
14 from .coordinator import XboxUpdateCoordinator
15 from .entity import XboxBaseEntity
16 
17 SENSOR_ATTRIBUTES = ["status", "gamer_score", "account_tier", "gold_tenure"]
18 
19 
21  hass: HomeAssistant,
22  config_entry: ConfigEntry,
23  async_add_entities: AddEntitiesCallback,
24 ) -> None:
25  """Set up Xbox Live friends."""
26  coordinator: XboxUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id][
27  "coordinator"
28  ]
29 
30  update_friends = partial(async_update_friends, coordinator, {}, async_add_entities)
31 
32  unsub = coordinator.async_add_listener(update_friends)
33  hass.data[DOMAIN][config_entry.entry_id]["sensor_unsub"] = unsub
34  update_friends()
35 
36 
38  """Representation of a Xbox presence state."""
39 
40  @property
41  def native_value(self):
42  """Return the state of the requested attribute."""
43  if not self.coordinator.last_update_success:
44  return None
45 
46  return getattr(self.datadatadatadata, self.attributeattribute, None)
47 
48 
49 @callback
51  coordinator: XboxUpdateCoordinator,
52  current: dict[str, list[XboxSensorEntity]],
53  async_add_entities,
54 ) -> None:
55  """Update friends."""
56  new_ids = set(coordinator.data.presence)
57  current_ids = set(current)
58 
59  # Process new favorites, add them to Home Assistant
60  new_entities: list[XboxSensorEntity] = []
61  for xuid in new_ids - current_ids:
62  current[xuid] = [
63  XboxSensorEntity(coordinator, xuid, attribute)
64  for attribute in SENSOR_ATTRIBUTES
65  ]
66  new_entities = new_entities + current[xuid]
67 
68  async_add_entities(new_entities)
69 
70  # Process deleted favorites, remove them from Home Assistant
71  for xuid in current_ids - new_ids:
72  coordinator.hass.async_create_task(
73  async_remove_entities(xuid, coordinator, current)
74  )
75 
76 
78  xuid: str,
79  coordinator: XboxUpdateCoordinator,
80  current: dict[str, list[XboxSensorEntity]],
81 ) -> None:
82  """Remove friend sensors from Home Assistant."""
83  registry = er.async_get(coordinator.hass)
84  entities = current[xuid]
85  for entity in entities:
86  if entity.entity_id in registry.entities:
87  registry.async_remove(entity.entity_id)
88  del current[xuid]
None async_remove_entities(str xuid, XboxUpdateCoordinator coordinator, dict[str, list[XboxSensorEntity]] current)
Definition: sensor.py:81
None async_update_friends(XboxUpdateCoordinator coordinator, dict[str, list[XboxSensorEntity]] current, async_add_entities)
Definition: sensor.py:54
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:24