Use the new EntityDescription for motionEye switches (#53536)

This commit is contained in:
Dermot Duffy 2021-07-28 00:06:41 -07:00 committed by GitHub
parent 1968b95829
commit 1aec069f3a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 28 deletions

View file

@ -52,7 +52,7 @@ from homeassistant.helpers.dispatcher import (
async_dispatcher_connect, async_dispatcher_connect,
async_dispatcher_send, async_dispatcher_send,
) )
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo, EntityDescription
from homeassistant.helpers.network import get_url from homeassistant.helpers.network import get_url
from homeassistant.helpers.update_coordinator import ( from homeassistant.helpers.update_coordinator import (
CoordinatorEntity, CoordinatorEntity,
@ -442,7 +442,7 @@ class MotionEyeEntity(CoordinatorEntity):
client: MotionEyeClient, client: MotionEyeClient,
coordinator: DataUpdateCoordinator, coordinator: DataUpdateCoordinator,
options: MappingProxyType[str, Any], options: MappingProxyType[str, Any],
enabled_by_default: bool = True, entity_description: EntityDescription = None,
) -> None: ) -> None:
"""Initialize a motionEye entity.""" """Initialize a motionEye entity."""
self._camera_id = camera[KEY_ID] self._camera_id = camera[KEY_ID]
@ -457,14 +457,10 @@ class MotionEyeEntity(CoordinatorEntity):
self._client = client self._client = client
self._camera: dict[str, Any] | None = camera self._camera: dict[str, Any] | None = camera
self._options = options self._options = options
self._enabled_by_default = enabled_by_default if entity_description is not None:
self.entity_description = entity_description
super().__init__(coordinator) super().__init__(coordinator)
@property
def entity_registry_enabled_default(self) -> bool:
"""Whether or not the entity is enabled by default."""
return self._enabled_by_default
@property @property
def unique_id(self) -> str: def unique_id(self) -> str:
"""Return a unique id for this instance.""" """Return a unique id for this instance."""

View file

@ -18,6 +18,7 @@ from motioneye_client.const import (
from homeassistant.components.switch import SwitchEntity from homeassistant.components.switch import SwitchEntity
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity import EntityDescription
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
@ -25,12 +26,30 @@ from . import MotionEyeEntity, get_camera_from_cameras, listen_for_new_cameras
from .const import CONF_CLIENT, CONF_COORDINATOR, DOMAIN, TYPE_MOTIONEYE_SWITCH_BASE from .const import CONF_CLIENT, CONF_COORDINATOR, DOMAIN, TYPE_MOTIONEYE_SWITCH_BASE
MOTIONEYE_SWITCHES = [ MOTIONEYE_SWITCHES = [
(KEY_MOTION_DETECTION, "Motion Detection", True), EntityDescription(
(KEY_TEXT_OVERLAY, "Text Overlay", False), key=KEY_MOTION_DETECTION,
(KEY_VIDEO_STREAMING, "Video Streaming", False), name="Motion Detection",
(KEY_STILL_IMAGES, "Still Images", True), entity_registry_enabled_default=True,
(KEY_MOVIES, "Movies", True), ),
(KEY_UPLOAD_ENABLED, "Upload Enabled", False), EntityDescription(
key=KEY_TEXT_OVERLAY, name="Text Overlay", entity_registry_enabled_default=False
),
EntityDescription(
key=KEY_VIDEO_STREAMING,
name="Video Streaming",
entity_registry_enabled_default=False,
),
EntityDescription(
key=KEY_STILL_IMAGES, name="Still Images", entity_registry_enabled_default=True
),
EntityDescription(
key=KEY_MOVIES, name="Movies", entity_registry_enabled_default=True
),
EntityDescription(
key=KEY_UPLOAD_ENABLED,
name="Upload Enabled",
entity_registry_enabled_default=False,
),
] ]
@ -48,14 +67,12 @@ async def async_setup_entry(
MotionEyeSwitch( MotionEyeSwitch(
entry.entry_id, entry.entry_id,
camera, camera,
switch_key,
switch_key_friendly_name,
entry_data[CONF_CLIENT], entry_data[CONF_CLIENT],
entry_data[CONF_COORDINATOR], entry_data[CONF_COORDINATOR],
entry.options, entry.options,
enabled, entity_description,
) )
for switch_key, switch_key_friendly_name, enabled in MOTIONEYE_SWITCHES for entity_description in MOTIONEYE_SWITCHES
] ]
) )
@ -69,36 +86,34 @@ class MotionEyeSwitch(MotionEyeEntity, SwitchEntity):
self, self,
config_entry_id: str, config_entry_id: str,
camera: dict[str, Any], camera: dict[str, Any],
switch_key: str,
switch_key_friendly_name: str,
client: MotionEyeClient, client: MotionEyeClient,
coordinator: DataUpdateCoordinator, coordinator: DataUpdateCoordinator,
options: MappingProxyType[str, str], options: MappingProxyType[str, str],
enabled_by_default: bool, entity_description: EntityDescription,
) -> None: ) -> None:
"""Initialize the switch.""" """Initialize the switch."""
self._switch_key = switch_key
self._switch_key_friendly_name = switch_key_friendly_name
super().__init__( super().__init__(
config_entry_id, config_entry_id,
f"{TYPE_MOTIONEYE_SWITCH_BASE}_{switch_key}", f"{TYPE_MOTIONEYE_SWITCH_BASE}_{entity_description.key}",
camera, camera,
client, client,
coordinator, coordinator,
options, options,
enabled_by_default, entity_description,
) )
@property @property
def name(self) -> str: def name(self) -> str:
"""Return the name of the switch.""" """Return the name of the switch."""
camera_prepend = f"{self._camera[KEY_NAME]} " if self._camera else "" camera_prepend = f"{self._camera[KEY_NAME]} " if self._camera else ""
return f"{camera_prepend}{self._switch_key_friendly_name}" return f"{camera_prepend}{self.entity_description.name}"
@property @property
def is_on(self) -> bool: def is_on(self) -> bool:
"""Return true if the switch is on.""" """Return true if the switch is on."""
return bool(self._camera and self._camera.get(self._switch_key, False)) return bool(
self._camera and self._camera.get(self.entity_description.key, False)
)
async def _async_send_set_camera(self, value: bool) -> None: async def _async_send_set_camera(self, value: bool) -> None:
"""Set a switch value.""" """Set a switch value."""
@ -107,7 +122,7 @@ class MotionEyeSwitch(MotionEyeEntity, SwitchEntity):
# stale configuration. # stale configuration.
camera = await self._client.async_get_camera(self._camera_id) camera = await self._client.async_get_camera(self._camera_id)
if camera: if camera:
camera[self._switch_key] = value camera[self.entity_description.key] = value
await self._client.async_set_camera(self._camera_id, camera) await self._client.async_set_camera(self._camera_id, camera)
async def async_turn_on(self, **kwargs: Any) -> None: async def async_turn_on(self, **kwargs: Any) -> None: