1 """Support for Android IP Webcam sensors."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
8 from pydroid_ipcam
import PyDroidIPCam
13 SensorEntityDescription,
21 from .coordinator
import AndroidIPCamConfigEntry, AndroidIPCamDataUpdateCoordinator
22 from .entity
import AndroidIPCamBaseEntity
25 @dataclass(frozen=True, kw_only=True)
27 """Entity description class for Android IP Webcam sensors."""
29 value_fn: Callable[[PyDroidIPCam], StateType]
30 unit_fn: Callable[[PyDroidIPCam], str |
None] =
lambda _:
None
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"),
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"),
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"),
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"),
70 translation_key=
"light",
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"),
78 translation_key=
"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"),
86 translation_key=
"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"),
94 translation_key=
"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"),
102 translation_key=
"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"),
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"),
121 config_entry: AndroidIPCamConfigEntry,
122 async_add_entities: AddEntitiesCallback,
124 """Set up the IP Webcam sensors from config entry."""
126 coordinator = config_entry.runtime_data
129 for sensor
in SENSOR_TYPES
132 *coordinator.cam.enabled_sensors,
138 IPWebcamSensor(coordinator, description)
for description
in sensor_types
143 """Representation of a IP Webcam sensor."""
145 entity_description: AndroidIPWebcamSensorEntityDescription
149 coordinator: AndroidIPCamDataUpdateCoordinator,
150 description: AndroidIPWebcamSensorEntityDescription,
152 """Initialize the sensor."""
153 self.
_attr_unique_id_attr_unique_id = f
"{coordinator.config_entry.entry_id}-{description.key}"
159 """Return native value of sensor."""
164 """Return native unit of measurement of sensor."""
StateType native_value(self)
str|None native_unit_of_measurement(self)
None __init__(self, AndroidIPCamDataUpdateCoordinator coordinator, AndroidIPWebcamSensorEntityDescription description)
None async_setup_entry(HomeAssistant hass, AndroidIPCamConfigEntry config_entry, AddEntitiesCallback async_add_entities)