Home Assistant Unofficial Reference 2024.12.1
entity.py
Go to the documentation of this file.
1 """Entity for the SleepIQ integration."""
2 
3 from abc import abstractmethod
4 
5 from asyncsleepiq import SleepIQBed, SleepIQSleeper
6 
7 from homeassistant.core import callback
8 from homeassistant.helpers import device_registry as dr
9 from homeassistant.helpers.device_registry import DeviceInfo
10 from homeassistant.helpers.entity import Entity
11 from homeassistant.helpers.update_coordinator import CoordinatorEntity
12 
13 from .const import ENTITY_TYPES, ICON_OCCUPIED
14 from .coordinator import SleepIQDataUpdateCoordinator, SleepIQPauseUpdateCoordinator
15 
16 type _DataCoordinatorType = SleepIQDataUpdateCoordinator | SleepIQPauseUpdateCoordinator
17 
18 
19 def device_from_bed(bed: SleepIQBed) -> DeviceInfo:
20  """Create a device given a bed."""
21  return DeviceInfo(
22  connections={(dr.CONNECTION_NETWORK_MAC, bed.mac_addr)},
23  manufacturer="SleepNumber",
24  name=bed.name,
25  model=bed.model,
26  )
27 
28 
29 def sleeper_for_side(bed: SleepIQBed, side: str) -> SleepIQSleeper:
30  """Find the sleeper for a side or the first sleeper."""
31  for sleeper in bed.sleepers:
32  if sleeper.side == side:
33  return sleeper
34  return bed.sleepers[0]
35 
36 
38  """Implementation of a SleepIQ entity."""
39 
40  def __init__(self, bed: SleepIQBed) -> None:
41  """Initialize the SleepIQ entity."""
42  self.bedbed = bed
43  self._attr_device_info_attr_device_info = device_from_bed(bed)
44 
45 
46 class SleepIQBedEntity[_SleepIQCoordinatorT: _DataCoordinatorType](
47  CoordinatorEntity[_SleepIQCoordinatorT]
48 ):
49  """Implementation of a SleepIQ sensor."""
50 
51  _attr_icon = ICON_OCCUPIED
52 
53  def __init__(
54  self,
55  coordinator: _SleepIQCoordinatorT,
56  bed: SleepIQBed,
57  ) -> None:
58  """Initialize the SleepIQ sensor entity."""
59  super().__init__(coordinator)
60  self.bed = bed
61  self._attr_device_info = device_from_bed(bed)
62  self._async_update_attrs()
63 
64  @callback
65  def _handle_coordinator_update(self) -> None:
66  """Handle updated data from the coordinator."""
67  self._async_update_attrs()
69 
70  @callback
71  @abstractmethod
72  def _async_update_attrs(self) -> None:
73  """Update sensor attributes."""
74 
75 
76 class SleepIQSleeperEntity[_SleepIQCoordinatorT: _DataCoordinatorType](
77  SleepIQBedEntity[_SleepIQCoordinatorT]
78 ):
79  """Implementation of a SleepIQ sensor."""
80 
81  _attr_icon = ICON_OCCUPIED
82 
83  def __init__(
84  self,
85  coordinator: _SleepIQCoordinatorT,
86  bed: SleepIQBed,
87  sleeper: SleepIQSleeper,
88  name: str,
89  ) -> None:
90  """Initialize the SleepIQ sensor entity."""
91  self.sleeper = sleeper
92  super().__init__(coordinator, bed)
93 
94  self._attr_name = f"SleepNumber {bed.name} {sleeper.name} {ENTITY_TYPES[name]}"
95  self._attr_unique_id = f"{sleeper.sleeper_id}_{name}"
SleepIQSleeper sleeper_for_side(SleepIQBed bed, str side)
Definition: entity.py:29
None __init__(self, _SleepIQCoordinatorT coordinator, SleepIQBed bed)
Definition: entity.py:57
DeviceInfo device_from_bed(SleepIQBed bed)
Definition: entity.py:19