Use entity class attributes for agent_dvr (#52501)
* Use entity class attributes for agent_dvr * Apply suggestions from code review Co-authored-by: Milan Meulemans <milan.meulemans@live.be> * rework Co-authored-by: Milan Meulemans <milan.meulemans@live.be>
This commit is contained in:
parent
19b4d2e4d2
commit
00741d4273
2 changed files with 38 additions and 99 deletions
|
@ -35,90 +35,60 @@ async def async_setup_entry(
|
|||
class AgentBaseStation(AlarmControlPanelEntity):
|
||||
"""Representation of an Agent DVR Alarm Control Panel."""
|
||||
|
||||
_attr_icon = ICON
|
||||
_attr_supported_features = (
|
||||
SUPPORT_ALARM_ARM_HOME | SUPPORT_ALARM_ARM_AWAY | SUPPORT_ALARM_ARM_NIGHT
|
||||
)
|
||||
|
||||
def __init__(self, client):
|
||||
"""Initialize the alarm control panel."""
|
||||
self._state = None
|
||||
self._client = client
|
||||
self._unique_id = f"{client.unique}_CP"
|
||||
name = CONST_ALARM_CONTROL_PANEL_NAME
|
||||
self._name = name = f"{client.name} {name}"
|
||||
|
||||
@property
|
||||
def icon(self):
|
||||
"""Return icon."""
|
||||
return ICON
|
||||
|
||||
@property
|
||||
def state(self):
|
||||
"""Return the state of the device."""
|
||||
return self._state
|
||||
|
||||
@property
|
||||
def supported_features(self) -> int:
|
||||
"""Return the list of supported features."""
|
||||
return SUPPORT_ALARM_ARM_HOME | SUPPORT_ALARM_ARM_AWAY | SUPPORT_ALARM_ARM_NIGHT
|
||||
|
||||
@property
|
||||
def device_info(self):
|
||||
"""Return the device info for adding the entity to the agent object."""
|
||||
return {
|
||||
"identifiers": {(AGENT_DOMAIN, self._client.unique)},
|
||||
self._attr_name = f"{client.name} {CONST_ALARM_CONTROL_PANEL_NAME}"
|
||||
self._attr_unique_id = f"{client.unique}_CP"
|
||||
self._attr_device_info = {
|
||||
"identifiers": {(AGENT_DOMAIN, client.unique)},
|
||||
"manufacturer": "Agent",
|
||||
"model": CONST_ALARM_CONTROL_PANEL_NAME,
|
||||
"sw_version": self._client.version,
|
||||
"sw_version": client.version,
|
||||
}
|
||||
|
||||
async def async_update(self):
|
||||
"""Update the state of the device."""
|
||||
await self._client.update()
|
||||
self._attr_available = self._client.is_available
|
||||
armed = self._client.is_armed
|
||||
if armed is None:
|
||||
self._state = None
|
||||
self._attr_state = None
|
||||
return
|
||||
if armed:
|
||||
prof = (await self._client.get_active_profile()).lower()
|
||||
self._state = STATE_ALARM_ARMED_AWAY
|
||||
self._attr_state = STATE_ALARM_ARMED_AWAY
|
||||
if prof == CONF_HOME_MODE_NAME:
|
||||
self._state = STATE_ALARM_ARMED_HOME
|
||||
self._attr_state = STATE_ALARM_ARMED_HOME
|
||||
elif prof == CONF_NIGHT_MODE_NAME:
|
||||
self._state = STATE_ALARM_ARMED_NIGHT
|
||||
self._attr_state = STATE_ALARM_ARMED_NIGHT
|
||||
else:
|
||||
self._state = STATE_ALARM_DISARMED
|
||||
self._attr_state = STATE_ALARM_DISARMED
|
||||
|
||||
async def async_alarm_disarm(self, code=None):
|
||||
"""Send disarm command."""
|
||||
await self._client.disarm()
|
||||
self._state = STATE_ALARM_DISARMED
|
||||
self._attr_state = STATE_ALARM_DISARMED
|
||||
|
||||
async def async_alarm_arm_away(self, code=None):
|
||||
"""Send arm away command. Uses custom mode."""
|
||||
await self._client.arm()
|
||||
await self._client.set_active_profile(CONF_AWAY_MODE_NAME)
|
||||
self._state = STATE_ALARM_ARMED_AWAY
|
||||
self._attr_state = STATE_ALARM_ARMED_AWAY
|
||||
|
||||
async def async_alarm_arm_home(self, code=None):
|
||||
"""Send arm home command. Uses custom mode."""
|
||||
await self._client.arm()
|
||||
await self._client.set_active_profile(CONF_HOME_MODE_NAME)
|
||||
self._state = STATE_ALARM_ARMED_HOME
|
||||
self._attr_state = STATE_ALARM_ARMED_HOME
|
||||
|
||||
async def async_alarm_arm_night(self, code=None):
|
||||
"""Send arm night command. Uses custom mode."""
|
||||
await self._client.arm()
|
||||
await self._client.set_active_profile(CONF_NIGHT_MODE_NAME)
|
||||
self._state = STATE_ALARM_ARMED_NIGHT
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""Return the name of the base station."""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def available(self) -> bool:
|
||||
"""Device available."""
|
||||
return self._client.is_available
|
||||
|
||||
@property
|
||||
def unique_id(self) -> str:
|
||||
"""Return a unique ID."""
|
||||
return self._unique_id
|
||||
self._attr_state = STATE_ALARM_ARMED_NIGHT
|
||||
|
|
|
@ -67,31 +67,27 @@ async def async_setup_entry(
|
|||
class AgentCamera(MjpegCamera):
|
||||
"""Representation of an Agent Device Stream."""
|
||||
|
||||
_attr_supported_features = SUPPORT_ON_OFF
|
||||
|
||||
def __init__(self, device):
|
||||
"""Initialize as a subclass of MjpegCamera."""
|
||||
self._servername = device.client.name
|
||||
self.server_url = device.client._server_url
|
||||
|
||||
device_info = {
|
||||
CONF_NAME: device.name,
|
||||
CONF_MJPEG_URL: f"{self.server_url}{device.mjpeg_image_url}&size={device.mjpegStreamWidth}x{device.mjpegStreamHeight}",
|
||||
CONF_STILL_IMAGE_URL: f"{self.server_url}{device.still_image_url}&size={device.mjpegStreamWidth}x{device.mjpegStreamHeight}",
|
||||
CONF_MJPEG_URL: f"{device.client._server_url}{device.mjpeg_image_url}&size={device.mjpegStreamWidth}x{device.mjpegStreamHeight}",
|
||||
CONF_STILL_IMAGE_URL: f"{device.client._server_url}{device.still_image_url}&size={device.mjpegStreamWidth}x{device.mjpegStreamHeight}",
|
||||
}
|
||||
self.device = device
|
||||
self._removed = False
|
||||
self._name = f"{self._servername} {device.name}"
|
||||
self._unique_id = f"{device._client.unique}_{device.typeID}_{device.id}"
|
||||
self._attr_name = f"{device.client.name} {device.name}"
|
||||
self._attr_unique_id = f"{device._client.unique}_{device.typeID}_{device.id}"
|
||||
self._attr_should_poll = True
|
||||
super().__init__(device_info)
|
||||
|
||||
@property
|
||||
def device_info(self):
|
||||
"""Return the device info for adding the entity to the agent object."""
|
||||
return {
|
||||
"identifiers": {(AGENT_DOMAIN, self._unique_id)},
|
||||
"name": self._name,
|
||||
self._attr_device_info = {
|
||||
"identifiers": {(AGENT_DOMAIN, self.unique_id)},
|
||||
"name": self.name,
|
||||
"manufacturer": "Agent",
|
||||
"model": "Camera",
|
||||
"sw_version": self.device.client.version,
|
||||
"sw_version": device.client.version,
|
||||
}
|
||||
|
||||
async def async_update(self):
|
||||
|
@ -99,18 +95,18 @@ class AgentCamera(MjpegCamera):
|
|||
try:
|
||||
await self.device.update()
|
||||
if self._removed:
|
||||
_LOGGER.debug("%s reacquired", self._name)
|
||||
_LOGGER.debug("%s reacquired", self.name)
|
||||
self._removed = False
|
||||
except AgentError:
|
||||
# server still available - camera error
|
||||
if self.device.client.is_available and not self._removed:
|
||||
_LOGGER.error("%s lost", self._name)
|
||||
_LOGGER.error("%s lost", self.name)
|
||||
self._removed = True
|
||||
|
||||
@property
|
||||
def extra_state_attributes(self):
|
||||
"""Return the Agent DVR camera state attributes."""
|
||||
return {
|
||||
self._attr_available = self.device.client.is_available
|
||||
self._attr_icon = "mdi:camcorder-off"
|
||||
if self.is_on:
|
||||
self._attr_icon = "mdi:camcorder"
|
||||
self._attr_extra_state_attributes = {
|
||||
ATTR_ATTRIBUTION: ATTRIBUTION,
|
||||
"editable": False,
|
||||
"enabled": self.is_on,
|
||||
|
@ -121,11 +117,6 @@ class AgentCamera(MjpegCamera):
|
|||
"alerts_enabled": self.device.alerts_active,
|
||||
}
|
||||
|
||||
@property
|
||||
def should_poll(self) -> bool:
|
||||
"""Update the state periodically."""
|
||||
return True
|
||||
|
||||
@property
|
||||
def is_recording(self) -> bool:
|
||||
"""Return whether the monitor is recording."""
|
||||
|
@ -141,43 +132,21 @@ class AgentCamera(MjpegCamera):
|
|||
"""Return whether the monitor has alerted."""
|
||||
return self.device.detected
|
||||
|
||||
@property
|
||||
def available(self) -> bool:
|
||||
"""Return True if entity is available."""
|
||||
return self.device.client.is_available
|
||||
|
||||
@property
|
||||
def connected(self) -> bool:
|
||||
"""Return True if entity is connected."""
|
||||
return self.device.connected
|
||||
|
||||
@property
|
||||
def supported_features(self) -> int:
|
||||
"""Return supported features."""
|
||||
return SUPPORT_ON_OFF
|
||||
|
||||
@property
|
||||
def is_on(self) -> bool:
|
||||
"""Return true if on."""
|
||||
return self.device.online
|
||||
|
||||
@property
|
||||
def icon(self):
|
||||
"""Return the icon to use in the frontend, if any."""
|
||||
if self.is_on:
|
||||
return "mdi:camcorder"
|
||||
return "mdi:camcorder-off"
|
||||
|
||||
@property
|
||||
def motion_detection_enabled(self):
|
||||
"""Return the camera motion detection status."""
|
||||
return self.device.detector_active
|
||||
|
||||
@property
|
||||
def unique_id(self) -> str:
|
||||
"""Return a unique identifier for this agent object."""
|
||||
return self._unique_id
|
||||
|
||||
async def async_enable_alerts(self):
|
||||
"""Enable alerts."""
|
||||
await self.device.alerts_on()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue