Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Support for Blink Motion detection switches."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
8  SwitchDeviceClass,
9  SwitchEntity,
10  SwitchEntityDescription,
11 )
12 from homeassistant.core import HomeAssistant
13 from homeassistant.exceptions import HomeAssistantError
14 from homeassistant.helpers.device_registry import DeviceInfo
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 from homeassistant.helpers.update_coordinator import CoordinatorEntity
17 
18 from .const import DEFAULT_BRAND, DOMAIN, TYPE_CAMERA_ARMED
19 from .coordinator import BlinkConfigEntry, BlinkUpdateCoordinator
20 
21 SWITCH_TYPES: tuple[SwitchEntityDescription, ...] = (
23  key=TYPE_CAMERA_ARMED,
24  translation_key="camera_motion",
25  device_class=SwitchDeviceClass.SWITCH,
26  ),
27 )
28 
29 
31  hass: HomeAssistant,
32  config_entry: BlinkConfigEntry,
33  async_add_entities: AddEntitiesCallback,
34 ) -> None:
35  """Set up the Blink switches."""
36  coordinator = config_entry.runtime_data
37 
39  BlinkSwitch(coordinator, camera, description)
40  for camera in coordinator.api.cameras
41  for description in SWITCH_TYPES
42  )
43 
44 
45 class BlinkSwitch(CoordinatorEntity[BlinkUpdateCoordinator], SwitchEntity):
46  """Representation of a Blink motion detection switch."""
47 
48  _attr_has_entity_name = True
49 
50  def __init__(
51  self,
52  coordinator: BlinkUpdateCoordinator,
53  camera,
54  description: SwitchEntityDescription,
55  ) -> None:
56  """Initialize the switch."""
57  super().__init__(coordinator)
58  self._camera_camera = coordinator.api.cameras[camera]
59  self.entity_descriptionentity_description = description
60  serial = self._camera_camera.serial
61  self._attr_unique_id_attr_unique_id = f"{serial}-{description.key}"
62  self._attr_device_info_attr_device_info = DeviceInfo(
63  identifiers={(DOMAIN, serial)},
64  serial_number=serial,
65  name=camera,
66  manufacturer=DEFAULT_BRAND,
67  model=self._camera_camera.camera_type,
68  )
69 
70  async def async_turn_on(self, **kwargs: Any) -> None:
71  """Turn the switch on."""
72  try:
73  await self._camera_camera.async_arm(True)
74 
75  except TimeoutError as er:
76  raise HomeAssistantError(
77  translation_domain=DOMAIN,
78  translation_key="failed_arm_motion",
79  ) from er
80 
81  await self.coordinator.async_refresh()
82 
83  async def async_turn_off(self, **kwargs: Any) -> None:
84  """Turn the switch off."""
85  try:
86  await self._camera_camera.async_arm(False)
87 
88  except TimeoutError as er:
89  raise HomeAssistantError(
90  translation_domain=DOMAIN,
91  translation_key="failed_disarm_motion",
92  ) from er
93 
94  await self.coordinator.async_refresh()
95 
96  @property
97  def is_on(self) -> bool:
98  """Return if Camera Motion is enabled."""
99  return self._camera_camera.motion_enabled