Загрузить файлы в «custom_components/rtkey»
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
from typing import Any
|
||||
|
||||
from homeassistant.components.sensor import SensorEntity
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.helpers.device_registry import DeviceInfo
|
||||
from homeassistant.helpers.entity import EntityCategory
|
||||
|
||||
from . import DOMAIN, RTKeyCamerasApi, _LOGGER
|
||||
|
||||
|
||||
async def async_setup_entry(
|
||||
hass: HomeAssistant,
|
||||
config_entry: ConfigEntry,
|
||||
async_add_entities: Any,
|
||||
) -> None:
|
||||
cameras_api: RTKeyCamerasApi = hass.data[DOMAIN][config_entry.entry_id]["cameras_api"]
|
||||
|
||||
if not cameras_api.event_sensor_enabled:
|
||||
_LOGGER.info("Сенсоры событий отключены")
|
||||
return
|
||||
|
||||
intercoms_info = await cameras_api.get_intercoms_info()
|
||||
|
||||
entities = [
|
||||
RTKeyEventSensor(hass, config_entry, cameras_api, intercom_info)
|
||||
for intercom_info in intercoms_info.get("data", {}).get("devices", [])
|
||||
]
|
||||
async_add_entities(entities)
|
||||
|
||||
|
||||
class RTKeyEventSensor(SensorEntity):
|
||||
"""Сенсор последнего события домофона."""
|
||||
|
||||
_attr_should_poll = False
|
||||
_attr_entity_category = EntityCategory.DIAGNOSTIC
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
hass: HomeAssistant,
|
||||
config_entry: ConfigEntry,
|
||||
cameras_api: RTKeyCamerasApi,
|
||||
intercom_info: dict,
|
||||
) -> None:
|
||||
self.hass = hass
|
||||
self.cameras_api = cameras_api
|
||||
self.intercom_id = str(intercom_info["id"])
|
||||
self.camera_id = intercom_info.get("camera_id")
|
||||
|
||||
self.device_name = cameras_api.build_device_name(
|
||||
intercom_info.get("name_by_user") or
|
||||
intercom_info.get("description") or
|
||||
intercom_info.get("name_by_company", "Домофон")
|
||||
)
|
||||
|
||||
self._attr_unique_id = f"event_sensor_{self.intercom_id}"
|
||||
self._attr_name = "Последнее событие"
|
||||
self._attr_icon = "mdi:bell-ring"
|
||||
|
||||
self._attr_native_value = "Нет событий"
|
||||
self._event_data = None
|
||||
|
||||
async def async_added_to_hass(self) -> None:
|
||||
await super().async_added_to_hass()
|
||||
self.cameras_api.register_event_listener(self._handle_event_update)
|
||||
|
||||
if self.intercom_id in self.cameras_api.last_events:
|
||||
self._update_from_event()
|
||||
|
||||
async def async_will_remove_from_hass(self) -> None:
|
||||
self.cameras_api.unregister_event_listener(self._handle_event_update)
|
||||
await super().async_will_remove_from_hass()
|
||||
|
||||
@callback
|
||||
def _handle_event_update(self, intercom_id: str):
|
||||
if intercom_id == self.intercom_id:
|
||||
self._update_from_event()
|
||||
|
||||
def _update_from_event(self):
|
||||
event_info = self.cameras_api.last_events.get(self.intercom_id)
|
||||
if not event_info:
|
||||
return
|
||||
|
||||
new_value = event_info["description"]
|
||||
|
||||
# ✅ Обновляем только если значение изменилось
|
||||
if self._attr_native_value != new_value:
|
||||
self._event_data = event_info
|
||||
self._attr_native_value = new_value
|
||||
self.async_write_ha_state()
|
||||
_LOGGER.debug(f"Обновлён сенсор события для {self.device_name}: {self._attr_native_value}")
|
||||
|
||||
@property
|
||||
def extra_state_attributes(self) -> dict[str, Any]:
|
||||
if not self._event_data:
|
||||
return {}
|
||||
|
||||
attrs = {
|
||||
"Время": self._event_data.get("local_time", ""),
|
||||
"Тип события": self._event_data.get("event_type", ""),
|
||||
}
|
||||
|
||||
archive_url = self._event_data.get("archive_url")
|
||||
if archive_url:
|
||||
attrs["Архив видео"] = archive_url
|
||||
|
||||
event = self._event_data.get("event", {})
|
||||
rfid = event.get("rfid")
|
||||
if rfid:
|
||||
attrs["RFID"] = rfid
|
||||
|
||||
return attrs
|
||||
|
||||
@property
|
||||
def device_info(self) -> DeviceInfo:
|
||||
device_id = self.camera_id or self.intercom_id
|
||||
return {
|
||||
"identifiers": {(DOMAIN, device_id)},
|
||||
"name": self.device_name,
|
||||
"manufacturer": "RT Key",
|
||||
"model": "Домофон",
|
||||
}
|
||||
Reference in New Issue
Block a user