Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for sensors."""
2 
3 from __future__ import annotations
4 
5 from typing import Final
6 
7 from aiocomelit import ComelitSerialBridgeObject, ComelitVedoZoneObject
8 from aiocomelit.const import ALARM_ZONES, BRIDGE, OTHER, AlarmZoneState
9 
11  SensorDeviceClass,
12  SensorEntity,
13  SensorEntityDescription,
14 )
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.const import CONF_TYPE, UnitOfPower
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.typing import StateType
20 from homeassistant.helpers.update_coordinator import CoordinatorEntity
21 
22 from .const import DOMAIN
23 from .coordinator import ComelitSerialBridge, ComelitVedoSystem
24 
25 SENSOR_BRIDGE_TYPES: Final = (
27  key="power",
28  native_unit_of_measurement=UnitOfPower.WATT,
29  device_class=SensorDeviceClass.POWER,
30  ),
31 )
32 
33 SENSOR_VEDO_TYPES: Final = (
35  key="human_status",
36  translation_key="zone_status",
37  name=None,
38  device_class=SensorDeviceClass.ENUM,
39  options=[zone_state.value for zone_state in AlarmZoneState],
40  ),
41 )
42 
43 
45  hass: HomeAssistant,
46  config_entry: ConfigEntry,
47  async_add_entities: AddEntitiesCallback,
48 ) -> None:
49  """Set up Comelit sensors."""
50 
51  if config_entry.data.get(CONF_TYPE, BRIDGE) == BRIDGE:
52  await async_setup_bridge_entry(hass, config_entry, async_add_entities)
53  else:
54  await async_setup_vedo_entry(hass, config_entry, async_add_entities)
55 
56 
58  hass: HomeAssistant,
59  config_entry: ConfigEntry,
60  async_add_entities: AddEntitiesCallback,
61 ) -> None:
62  """Set up Comelit Bridge sensors."""
63 
64  coordinator: ComelitSerialBridge = hass.data[DOMAIN][config_entry.entry_id]
65 
66  entities: list[ComelitBridgeSensorEntity] = []
67  for device in coordinator.data[OTHER].values():
68  entities.extend(
70  coordinator, device, config_entry.entry_id, sensor_desc
71  )
72  for sensor_desc in SENSOR_BRIDGE_TYPES
73  )
74  async_add_entities(entities)
75 
76 
78  hass: HomeAssistant,
79  config_entry: ConfigEntry,
80  async_add_entities: AddEntitiesCallback,
81 ) -> None:
82  """Set up Comelit VEDO sensors."""
83 
84  coordinator: ComelitVedoSystem = hass.data[DOMAIN][config_entry.entry_id]
85 
86  entities: list[ComelitVedoSensorEntity] = []
87  for device in coordinator.data[ALARM_ZONES].values():
88  entities.extend(
90  coordinator, device, config_entry.entry_id, sensor_desc
91  )
92  for sensor_desc in SENSOR_VEDO_TYPES
93  )
94  async_add_entities(entities)
95 
96 
97 class ComelitBridgeSensorEntity(CoordinatorEntity[ComelitSerialBridge], SensorEntity):
98  """Sensor device."""
99 
100  _attr_has_entity_name = True
101  _attr_name = None
102 
103  def __init__(
104  self,
105  coordinator: ComelitSerialBridge,
106  device: ComelitSerialBridgeObject,
107  config_entry_entry_id: str,
108  description: SensorEntityDescription,
109  ) -> None:
110  """Init sensor entity."""
111  self._api_api = coordinator.api
112  self._device_device_device = device
113  super().__init__(coordinator)
114  # Use config_entry.entry_id as base for unique_id
115  # because no serial number or mac is available
116  self._attr_unique_id_attr_unique_id = f"{config_entry_entry_id}-{device.index}"
117  self._attr_device_info_attr_device_info = coordinator.platform_device_info(device, device.type)
118 
119  self.entity_descriptionentity_description = description
120 
121  @property
122  def native_value(self) -> StateType:
123  """Sensor value."""
124  return getattr(
125  self.coordinator.data[OTHER][self._device_device_device.index],
126  self.entity_descriptionentity_description.key,
127  )
128 
129 
130 class ComelitVedoSensorEntity(CoordinatorEntity[ComelitVedoSystem], SensorEntity):
131  """Sensor device."""
132 
133  _attr_has_entity_name = True
134 
135  def __init__(
136  self,
137  coordinator: ComelitVedoSystem,
138  zone: ComelitVedoZoneObject,
139  config_entry_entry_id: str,
140  description: SensorEntityDescription,
141  ) -> None:
142  """Init sensor entity."""
143  self._api_api = coordinator.api
144  self._zone_zone = zone
145  super().__init__(coordinator)
146  # Use config_entry.entry_id as base for unique_id
147  # because no serial number or mac is available
148  self._attr_unique_id_attr_unique_id = f"{config_entry_entry_id}-{zone.index}"
149  self._attr_device_info_attr_device_info = coordinator.platform_device_info(zone, "zone")
150 
151  self.entity_descriptionentity_description = description
152 
153  @property
154  def _zone_object(self) -> ComelitVedoZoneObject:
155  """Zone object."""
156  return self.coordinator.data[ALARM_ZONES][self._zone_zone.index]
157 
158  @property
159  def available(self) -> bool:
160  """Sensor availability."""
161  return self._zone_object_zone_object.human_status != AlarmZoneState.UNAVAILABLE
162 
163  @property
164  def native_value(self) -> StateType:
165  """Sensor value."""
166  if (status := self._zone_object_zone_object.human_status) == AlarmZoneState.UNKNOWN:
167  return None
168 
169  return status.value
None __init__(self, ComelitSerialBridge coordinator, ComelitSerialBridgeObject device, str config_entry_entry_id, SensorEntityDescription description)
Definition: sensor.py:109
None __init__(self, ComelitVedoSystem coordinator, ComelitVedoZoneObject zone, str config_entry_entry_id, SensorEntityDescription description)
Definition: sensor.py:141
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:48
None async_setup_vedo_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:81
None async_setup_bridge_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:61