1 """Support for Amcrest IP camera sensors."""
3 from __future__
import annotations
5 from datetime
import timedelta
7 from typing
import TYPE_CHECKING
9 from amcrest
import AmcrestError
18 from .const
import DATA_AMCREST, DEVICES, SENSOR_SCAN_INTERVAL_SECS, SERVICE_UPDATE
19 from .helpers
import log_update_error, service_signal
22 from .
import AmcrestDevice
24 _LOGGER = logging.getLogger(__name__)
26 SCAN_INTERVAL =
timedelta(seconds=SENSOR_SCAN_INTERVAL_SECS)
28 SENSOR_PTZ_PRESET =
"ptz_preset"
29 SENSOR_SDCARD =
"sdcard"
31 SENSOR_TYPES: tuple[SensorEntityDescription, ...] = (
33 key=SENSOR_PTZ_PRESET,
35 icon=
"mdi:camera-iris",
40 native_unit_of_measurement=PERCENTAGE,
45 SENSOR_KEYS: list[str] = [desc.key
for desc
in SENSOR_TYPES]
51 async_add_entities: AddEntitiesCallback,
52 discovery_info: DiscoveryInfoType |
None =
None,
54 """Set up a sensor for an Amcrest IP Camera."""
55 if discovery_info
is None:
58 name = discovery_info[CONF_NAME]
59 device = hass.data[DATA_AMCREST][DEVICES][name]
60 sensors = discovery_info[CONF_SENSORS]
64 for description
in SENSOR_TYPES
65 if description.key
in sensors
72 """A sensor implementation for Amcrest IP camera."""
75 self, name: str, device: AmcrestDevice, description: SensorEntityDescription
77 """Initialize a sensor for Amcrest camera."""
88 """Return True if entity is available."""
89 return self.
_api_api.available
92 """Get the latest data and updates the state."""
95 _LOGGER.debug(
"Updating %s sensor", self.
namename)
101 serial_number := (await self.
_api_api.async_serial_number)
103 self.
_attr_unique_id_attr_unique_id = f
"{serial_number}-{sensor_type}-{self._channel}"
105 if sensor_type == SENSOR_PTZ_PRESET:
108 elif sensor_type == SENSOR_SDCARD:
109 storage = await self.
_api_api.async_storage_all
112 f
"{storage['total'][0]:.2f} {storage['total'][1]}"
116 f
"{storage['total'][0]} {storage['total'][1]}"
120 f
"{storage['used'][0]:.2f} {storage['used'][1]}"
124 f
"{storage['used'][0]} {storage['used'][1]}"
130 except AmcrestError
as error:
134 """Subscribe to update signal."""
None async_added_to_hass(self)
None __init__(self, str name, AmcrestDevice device, SensorEntityDescription description)
_attr_extra_state_attributes
None async_write_ha_state(self)
None async_on_remove(self, CALLBACK_TYPE func)
str|UndefinedType|None name(self)
None log_update_error(logging.Logger logger, str action, str|UndefinedType|None name, str entity_type, Exception error, int level=logging.ERROR)
str service_signal(str service, *str args)
None async_setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback async_add_entities, DiscoveryInfoType|None discovery_info=None)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)