Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for ONVIF binary sensors."""
2 
3 from __future__ import annotations
4 
5 from datetime import date, datetime
6 from decimal import Decimal
7 
8 from homeassistant.components.sensor import RestoreSensor, SensorDeviceClass
9 from homeassistant.config_entries import ConfigEntry
10 from homeassistant.core import HomeAssistant, callback
11 from homeassistant.helpers import entity_registry as er
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 from homeassistant.helpers.typing import StateType
14 from homeassistant.util.enum import try_parse_enum
15 
16 from .const import DOMAIN
17 from .device import ONVIFDevice
18 from .entity import ONVIFBaseEntity
19 
20 
22  hass: HomeAssistant,
23  config_entry: ConfigEntry,
24  async_add_entities: AddEntitiesCallback,
25 ) -> None:
26  """Set up a ONVIF binary sensor."""
27  device: ONVIFDevice = hass.data[DOMAIN][config_entry.unique_id]
28 
29  entities = {
30  event.uid: ONVIFSensor(event.uid, device)
31  for event in device.events.get_platform("sensor")
32  }
33 
34  ent_reg = er.async_get(hass)
35  for entry in er.async_entries_for_config_entry(ent_reg, config_entry.entry_id):
36  if entry.domain == "sensor" and entry.unique_id not in entities:
37  entities[entry.unique_id] = ONVIFSensor(entry.unique_id, device, entry)
38 
39  async_add_entities(entities.values())
40  uids_by_platform = device.events.get_uids_by_platform("sensor")
41 
42  @callback
43  def async_check_entities() -> None:
44  """Check if we have added an entity for the event."""
45  nonlocal uids_by_platform
46  if not (missing := uids_by_platform.difference(entities)):
47  return
48  new_entities: dict[str, ONVIFSensor] = {
49  uid: ONVIFSensor(uid, device) for uid in missing
50  }
51  if new_entities:
52  entities.update(new_entities)
53  async_add_entities(new_entities.values())
54 
55  device.events.async_add_listener(async_check_entities)
56 
57 
59  """Representation of a ONVIF sensor event."""
60 
61  _attr_should_poll = False
62 
63  def __init__(
64  self, uid, device: ONVIFDevice, entry: er.RegistryEntry | None = None
65  ) -> None:
66  """Initialize the ONVIF binary sensor."""
67  self._attr_unique_id_attr_unique_id = uid
68  if entry is not None:
69  self._attr_device_class_attr_device_class = try_parse_enum(
70  SensorDeviceClass, entry.original_device_class
71  )
72  self._attr_entity_category_attr_entity_category = entry.entity_category
73  self._attr_name_attr_name = entry.name
74  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = entry.unit_of_measurement
75  else:
76  event = device.events.get_uid(uid)
77  assert event
78  self._attr_device_class_attr_device_class = try_parse_enum(
79  SensorDeviceClass, event.device_class
80  )
81  self._attr_entity_category_attr_entity_category = event.entity_category
82  self._attr_entity_registry_enabled_default_attr_entity_registry_enabled_default = event.entity_enabled
83  self._attr_name_attr_name = f"{device.name} {event.name}"
84  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = event.unit_of_measurement
85  self._attr_native_value_attr_native_value = event.value
86 
87  super().__init__(device)
88 
89  @property
90  def native_value(self) -> StateType | date | datetime | Decimal:
91  """Return the value reported by the sensor."""
92  assert self._attr_unique_id_attr_unique_id is not None
93  if (event := self.device.events.get_uid(self._attr_unique_id_attr_unique_id)) is not None:
94  return event.value
95  return self._attr_native_value_attr_native_value
96 
97  async def async_added_to_hass(self) -> None:
98  """Connect to dispatcher listening for entity data notifications."""
99  self.async_on_removeasync_on_remove(
100  self.device.events.async_add_listener(self.async_write_ha_stateasync_write_ha_state)
101  )
102  if (last_sensor_data := await self.async_get_last_sensor_dataasync_get_last_sensor_data()) is not None:
103  self._attr_native_value_attr_native_value = last_sensor_data.native_value
StateType|date|datetime|Decimal native_value(self)
Definition: sensor.py:90
None __init__(self, uid, ONVIFDevice device, er.RegistryEntry|None entry=None)
Definition: sensor.py:65
SensorExtraStoredData|None async_get_last_sensor_data(self)
Definition: __init__.py:934
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:25