1 """Component providing number entities for UniFi Protect."""
3 from __future__
import annotations
5 from collections.abc
import Sequence
6 from dataclasses
import dataclass
7 from datetime
import timedelta
9 from uiprotect.data
import (
14 ProtectAdoptableDeviceModel,
22 from .data
import ProtectData, ProtectDeviceType, UFPConfigEntry
26 ProtectEntityDescription,
27 ProtectSetableKeysMixin,
29 async_all_device_entities,
33 @dataclass(frozen=True, kw_only=True)
35 ProtectSetableKeysMixin[T], NumberEntityDescription
37 """Describes UniFi Protect Number entity."""
45 return int(obj.light_device_settings.pir_duration.total_seconds())
49 await obj.set_duration(
timedelta(seconds=value))
53 return int(obj.auto_close_time.total_seconds())
57 await obj.set_auto_close_time(
timedelta(seconds=value))
61 return int(obj.chime_duration_seconds)
64 CAMERA_NUMBERS: tuple[ProtectNumberEntityDescription, ...] = (
67 name=
"Wide dynamic range",
68 icon=
"mdi:state-machine",
69 entity_category=EntityCategory.CONFIG,
73 ufp_required_field=
"feature_flags.has_wdr",
74 ufp_value=
"isp_settings.wdr",
75 ufp_set_method=
"set_wdr_level",
76 ufp_perm=PermRequired.WRITE,
80 name=
"Microphone level",
81 icon=
"mdi:microphone",
82 entity_category=EntityCategory.CONFIG,
83 native_unit_of_measurement=PERCENTAGE,
87 ufp_required_field=
"has_mic",
88 ufp_value=
"mic_volume",
89 ufp_enabled=
"feature_flags.has_mic",
90 ufp_set_method=
"set_mic_volume",
91 ufp_perm=PermRequired.WRITE,
96 icon=
"mdi:magnify-plus-outline",
97 entity_category=EntityCategory.CONFIG,
98 native_unit_of_measurement=PERCENTAGE,
102 ufp_required_field=
"feature_flags.can_optical_zoom",
103 ufp_value=
"isp_settings.zoom_position",
104 ufp_set_method=
"set_camera_zoom",
105 ufp_perm=PermRequired.WRITE,
108 key=
"chime_duration",
109 name=
"Chime duration",
111 entity_category=EntityCategory.CONFIG,
112 native_unit_of_measurement=UnitOfTime.SECONDS,
116 ufp_required_field=
"feature_flags.has_chime",
117 ufp_enabled=
"is_digital_chime",
118 ufp_value_fn=_get_chime_duration,
119 ufp_set_method=
"set_chime_duration",
120 ufp_perm=PermRequired.WRITE,
124 name=
"Infrared custom lux trigger",
125 icon=
"mdi:white-balance-sunny",
126 entity_category=EntityCategory.CONFIG,
130 ufp_required_field=
"feature_flags.has_led_ir",
131 ufp_value=
"icr_lux_display",
132 ufp_set_method=
"set_icr_custom_lux",
133 ufp_enabled=
"is_ir_led_slider_enabled",
134 ufp_perm=PermRequired.WRITE,
138 LIGHT_NUMBERS: tuple[ProtectNumberEntityDescription, ...] = (
141 name=
"Motion sensitivity",
143 entity_category=EntityCategory.CONFIG,
144 native_unit_of_measurement=PERCENTAGE,
148 ufp_required_field=
None,
149 ufp_value=
"light_device_settings.pir_sensitivity",
150 ufp_set_method=
"set_sensitivity",
151 ufp_perm=PermRequired.WRITE,
153 ProtectNumberEntityDescription[Light](
155 name=
"Auto-shutoff duration",
156 icon=
"mdi:camera-timer",
157 entity_category=EntityCategory.CONFIG,
158 native_unit_of_measurement=UnitOfTime.SECONDS,
162 ufp_required_field=
None,
163 ufp_value_fn=_get_pir_duration,
164 ufp_set_method_fn=_set_pir_duration,
165 ufp_perm=PermRequired.WRITE,
169 SENSE_NUMBERS: tuple[ProtectNumberEntityDescription, ...] = (
172 name=
"Motion sensitivity",
174 entity_category=EntityCategory.CONFIG,
175 native_unit_of_measurement=PERCENTAGE,
179 ufp_required_field=
None,
180 ufp_value=
"motion_settings.sensitivity",
181 ufp_set_method=
"set_motion_sensitivity",
182 ufp_perm=PermRequired.WRITE,
186 DOORLOCK_NUMBERS: tuple[ProtectNumberEntityDescription, ...] = (
187 ProtectNumberEntityDescription[Doorlock](
188 key=
"auto_lock_time",
189 name=
"Auto-lock timeout",
191 entity_category=EntityCategory.CONFIG,
192 native_unit_of_measurement=UnitOfTime.SECONDS,
196 ufp_required_field=
None,
197 ufp_value_fn=_get_auto_close,
198 ufp_set_method_fn=_set_auto_close,
199 ufp_perm=PermRequired.WRITE,
203 CHIME_NUMBERS: tuple[ProtectNumberEntityDescription, ...] = (
208 entity_category=EntityCategory.CONFIG,
209 native_unit_of_measurement=PERCENTAGE,
214 ufp_set_method=
"set_volume",
215 ufp_perm=PermRequired.WRITE,
218 _MODEL_DESCRIPTIONS: dict[ModelType, Sequence[ProtectEntityDescription]] = {
219 ModelType.CAMERA: CAMERA_NUMBERS,
220 ModelType.LIGHT: LIGHT_NUMBERS,
221 ModelType.SENSOR: SENSE_NUMBERS,
222 ModelType.DOORLOCK: DOORLOCK_NUMBERS,
223 ModelType.CHIME: CHIME_NUMBERS,
229 entry: UFPConfigEntry,
230 async_add_entities: AddEntitiesCallback,
232 """Set up number entities for UniFi Protect integration."""
233 data = entry.runtime_data
236 def _add_new_device(device: ProtectAdoptableDeviceModel) ->
None:
241 model_descriptions=_MODEL_DESCRIPTIONS,
246 data.async_subscribe_adopt(_add_new_device)
251 model_descriptions=_MODEL_DESCRIPTIONS,
257 """A UniFi Protect Number Entity."""
259 device: Camera | Light
260 entity_description: ProtectNumberEntityDescription
261 _state_attrs = (
"_attr_available",
"_attr_native_value")
266 device: Camera | Light,
267 description: ProtectNumberEntityDescription,
269 """Initialize the Number Entities."""
270 super().
__init__(data, device, description)
None async_set_native_value(self, float value)
None _async_update_device_from_protect(self, ProtectDeviceType device)
None __init__(self, ProtectData data, Camera|Light device, ProtectNumberEntityDescription description)
list[BaseProtectEntity] async_all_device_entities(ProtectData data, type[BaseProtectEntity] klass, dict[ModelType, Sequence[ProtectEntityDescription]]|None model_descriptions=None, Sequence[ProtectEntityDescription]|None all_descs=None, list[ProtectEntityDescription]|None unadopted_descs=None, ProtectAdoptableDeviceModel|None ufp_device=None)
int _get_chime_duration(Camera obj)
None _set_pir_duration(Light obj, float value)
None _set_auto_close(Doorlock obj, float value)
None async_setup_entry(HomeAssistant hass, UFPConfigEntry entry, AddEntitiesCallback async_add_entities)
int _get_auto_close(Doorlock obj)
int _get_pir_duration(Light obj)