Home Assistant Unofficial Reference 2024.12.1
entity.py
Go to the documentation of this file.
1 """Support for HDMI CEC."""
2 
3 from __future__ import annotations
4 
5 from homeassistant.helpers.entity import Entity
6 
7 from .const import DOMAIN, EVENT_HDMI_CEC_UNAVAILABLE
8 
9 ATTR_PHYSICAL_ADDRESS = "physical_address"
10 ATTR_TYPE = "type"
11 ATTR_TYPE_ID = "type_id"
12 ATTR_VENDOR_NAME = "vendor_name"
13 ATTR_VENDOR_ID = "vendor_id"
14 
15 ICON_UNKNOWN = "mdi:help"
16 ICON_AUDIO = "mdi:speaker"
17 ICON_PLAYER = "mdi:play"
18 ICON_TUNER = "mdi:radio"
19 ICON_RECORDER = "mdi:microphone"
20 ICON_TV = "mdi:television"
21 ICONS_BY_TYPE = {
22  0: ICON_TV,
23  1: ICON_RECORDER,
24  3: ICON_TUNER,
25  4: ICON_PLAYER,
26  5: ICON_AUDIO,
27 }
28 
29 
31  """Representation of a HDMI CEC device entity."""
32 
33  _attr_should_poll = False
34 
35  def __init__(self, device, logical) -> None:
36  """Initialize the device."""
37  self._device_device = device
38  self._logical_address_logical_address = logical
39  self.entity_identity_identity_id = f"{DOMAIN}.{self._logical_address}"
40  self._set_attr_name_set_attr_name()
41  self._attr_icon_attr_icon = ICONS_BY_TYPE.get(self._device_device.type, ICON_UNKNOWN)
42 
43  def _set_attr_name(self):
44  """Set name."""
45  if (
46  self._device_device.osd_name is not None
47  and self.vendor_namevendor_name is not None
48  and self.vendor_namevendor_name != "Unknown"
49  ):
50  self._attr_name_attr_name = f"{self.vendor_name} {self._device.osd_name}"
51  elif self._device_device.osd_name is None:
52  self._attr_name_attr_name = f"{self._device.type_name} {self._logical_address}"
53  else:
54  self._attr_name_attr_name = f"{self._device.type_name} {self._logical_address} ({self._device.osd_name})"
55 
56  def _hdmi_cec_unavailable(self, callback_event):
57  self._attr_available_attr_available = False
58  self.schedule_update_ha_stateschedule_update_ha_state(False)
59 
60  async def async_added_to_hass(self):
61  """Register HDMI callbacks after initialization."""
62  self._device_device.set_update_callback(self._update_update)
63  self.hasshass.bus.async_listen(
64  EVENT_HDMI_CEC_UNAVAILABLE, self._hdmi_cec_unavailable_hdmi_cec_unavailable
65  )
66 
67  def _update(self, device=None):
68  """Device status changed, schedule an update."""
69  self._attr_available_attr_available = True
70  self.schedule_update_ha_stateschedule_update_ha_state(True)
71 
72  @property
73  def vendor_id(self):
74  """Return the ID of the device's vendor."""
75  return self._device_device.vendor_id
76 
77  @property
78  def vendor_name(self):
79  """Return the name of the device's vendor."""
80  return self._device_device.vendor
81 
82  @property
83  def physical_address(self):
84  """Return the physical address of device in HDMI network."""
85  return str(self._device_device.physical_address)
86 
87  @property
88  def type(self):
89  """Return a string representation of the device's type."""
90  return self._device_device.type_name
91 
92  @property
93  def type_id(self):
94  """Return the type ID of device."""
95  return self._device_device.type
96 
97  @property
99  """Return the state attributes."""
100  state_attr = {}
101  if self.vendor_idvendor_id is not None:
102  state_attr[ATTR_VENDOR_ID] = self.vendor_idvendor_id
103  state_attr[ATTR_VENDOR_NAME] = self.vendor_namevendor_name
104  if self.type_idtype_id is not None:
105  state_attr[ATTR_TYPE_ID] = self.type_idtype_id
106  state_attr[ATTR_TYPE] = self.typetype
107  if self.physical_addressphysical_address is not None:
108  state_attr[ATTR_PHYSICAL_ADDRESS] = self.physical_addressphysical_address
109  return state_attr
def _hdmi_cec_unavailable(self, callback_event)
Definition: entity.py:56
None __init__(self, device, logical)
Definition: entity.py:35
None schedule_update_ha_state(self, bool force_refresh=False)
Definition: entity.py:1244