Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Android IP Webcam sensors."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 
8 from pydroid_ipcam import PyDroidIPCam
9 
11  SensorDeviceClass,
12  SensorEntity,
13  SensorEntityDescription,
14  SensorStateClass,
15 )
16 from homeassistant.const import EntityCategory
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.typing import StateType
20 
21 from .coordinator import AndroidIPCamConfigEntry, AndroidIPCamDataUpdateCoordinator
22 from .entity import AndroidIPCamBaseEntity
23 
24 
25 @dataclass(frozen=True, kw_only=True)
27  """Entity description class for Android IP Webcam sensors."""
28 
29  value_fn: Callable[[PyDroidIPCam], StateType]
30  unit_fn: Callable[[PyDroidIPCam], str | None] = lambda _: None
31 
32 
33 SENSOR_TYPES: tuple[AndroidIPWebcamSensorEntityDescription, ...] = (
35  key="audio_connections",
36  translation_key="audio_connections",
37  name="Audio connections",
38  state_class=SensorStateClass.TOTAL,
39  entity_category=EntityCategory.DIAGNOSTIC,
40  value_fn=lambda ipcam: ipcam.status_data.get("audio_connections"),
41  ),
43  key="battery_level",
44  name="Battery level",
45  device_class=SensorDeviceClass.BATTERY,
46  state_class=SensorStateClass.MEASUREMENT,
47  entity_category=EntityCategory.DIAGNOSTIC,
48  value_fn=lambda ipcam: ipcam.get_sensor_value("battery_level"),
49  unit_fn=lambda ipcam: ipcam.get_sensor_unit("battery_level"),
50  ),
52  key="battery_temp",
53  translation_key="battery_temperature",
54  name="Battery temperature",
55  state_class=SensorStateClass.MEASUREMENT,
56  entity_category=EntityCategory.DIAGNOSTIC,
57  value_fn=lambda ipcam: ipcam.get_sensor_value("battery_temp"),
58  unit_fn=lambda ipcam: ipcam.get_sensor_unit("battery_temp"),
59  ),
61  key="battery_voltage",
62  name="Battery voltage",
63  state_class=SensorStateClass.MEASUREMENT,
64  entity_category=EntityCategory.DIAGNOSTIC,
65  value_fn=lambda ipcam: ipcam.get_sensor_value("battery_voltage"),
66  unit_fn=lambda ipcam: ipcam.get_sensor_unit("battery_voltage"),
67  ),
69  key="light",
70  translation_key="light",
71  name="Light level",
72  state_class=SensorStateClass.MEASUREMENT,
73  value_fn=lambda ipcam: ipcam.get_sensor_value("light"),
74  unit_fn=lambda ipcam: ipcam.get_sensor_unit("light"),
75  ),
77  key="motion",
78  translation_key="motion",
79  name="Motion",
80  state_class=SensorStateClass.MEASUREMENT,
81  value_fn=lambda ipcam: ipcam.get_sensor_value("motion"),
82  unit_fn=lambda ipcam: ipcam.get_sensor_unit("motion"),
83  ),
85  key="pressure",
86  translation_key="pressure",
87  name="Pressure",
88  state_class=SensorStateClass.MEASUREMENT,
89  value_fn=lambda ipcam: ipcam.get_sensor_value("pressure"),
90  unit_fn=lambda ipcam: ipcam.get_sensor_unit("pressure"),
91  ),
93  key="proximity",
94  translation_key="proximity",
95  name="Proximity",
96  state_class=SensorStateClass.MEASUREMENT,
97  value_fn=lambda ipcam: ipcam.get_sensor_value("proximity"),
98  unit_fn=lambda ipcam: ipcam.get_sensor_unit("proximity"),
99  ),
101  key="sound",
102  translation_key="sound",
103  name="Sound",
104  state_class=SensorStateClass.MEASUREMENT,
105  value_fn=lambda ipcam: ipcam.get_sensor_value("sound"),
106  unit_fn=lambda ipcam: ipcam.get_sensor_unit("sound"),
107  ),
109  key="video_connections",
110  translation_key="video_connections",
111  name="Video connections",
112  state_class=SensorStateClass.TOTAL,
113  entity_category=EntityCategory.DIAGNOSTIC,
114  value_fn=lambda ipcam: ipcam.status_data.get("video_connections"),
115  ),
116 )
117 
118 
120  hass: HomeAssistant,
121  config_entry: AndroidIPCamConfigEntry,
122  async_add_entities: AddEntitiesCallback,
123 ) -> None:
124  """Set up the IP Webcam sensors from config entry."""
125 
126  coordinator = config_entry.runtime_data
127  sensor_types = [
128  sensor
129  for sensor in SENSOR_TYPES
130  if sensor.key
131  in [
132  *coordinator.cam.enabled_sensors,
133  "audio_connections",
134  "video_connections",
135  ]
136  ]
138  IPWebcamSensor(coordinator, description) for description in sensor_types
139  )
140 
141 
143  """Representation of a IP Webcam sensor."""
144 
145  entity_description: AndroidIPWebcamSensorEntityDescription
146 
147  def __init__(
148  self,
149  coordinator: AndroidIPCamDataUpdateCoordinator,
150  description: AndroidIPWebcamSensorEntityDescription,
151  ) -> None:
152  """Initialize the sensor."""
153  self._attr_unique_id_attr_unique_id = f"{coordinator.config_entry.entry_id}-{description.key}"
154  self.entity_descriptionentity_description = description
155  super().__init__(coordinator)
156 
157  @property
158  def native_value(self) -> StateType:
159  """Return native value of sensor."""
160  return self.entity_descriptionentity_description.value_fn(self.camcamcam)
161 
162  @property
163  def native_unit_of_measurement(self) -> str | None:
164  """Return native unit of measurement of sensor."""
165  return self.entity_descriptionentity_description.unit_fn(self.camcamcam)
None __init__(self, AndroidIPCamDataUpdateCoordinator coordinator, AndroidIPWebcamSensorEntityDescription description)
Definition: sensor.py:151
None async_setup_entry(HomeAssistant hass, AndroidIPCamConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:123