Home Assistant Unofficial Reference 2024.12.1
button.py
Go to the documentation of this file.
1 """Support for EZVIZ button controls."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from typing import Any
8 
9 from pyezviz import EzvizClient
10 from pyezviz.constants import SupportExt
11 from pyezviz.exceptions import HTTPError, PyEzvizError
12 
13 from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
14 from homeassistant.config_entries import ConfigEntry
15 from homeassistant.core import HomeAssistant
16 from homeassistant.exceptions import HomeAssistantError
17 from homeassistant.helpers.entity_platform import AddEntitiesCallback
18 
19 from .const import DATA_COORDINATOR, DOMAIN
20 from .coordinator import EzvizDataUpdateCoordinator
21 from .entity import EzvizEntity
22 
23 PARALLEL_UPDATES = 1
24 
25 
26 @dataclass(frozen=True, kw_only=True)
28  """Describe a EZVIZ Button."""
29 
30  method: Callable[[EzvizClient, str, str], Any]
31  supported_ext: str
32 
33 
34 BUTTON_ENTITIES = (
36  key="ptz_up",
37  translation_key="ptz_up",
38  method=lambda pyezviz_client, serial, run: pyezviz_client.ptz_control(
39  "UP", serial, run
40  ),
41  supported_ext=str(SupportExt.SupportPtz.value),
42  ),
44  key="ptz_down",
45  translation_key="ptz_down",
46  method=lambda pyezviz_client, serial, run: pyezviz_client.ptz_control(
47  "DOWN", serial, run
48  ),
49  supported_ext=str(SupportExt.SupportPtz.value),
50  ),
52  key="ptz_left",
53  translation_key="ptz_left",
54  method=lambda pyezviz_client, serial, run: pyezviz_client.ptz_control(
55  "LEFT", serial, run
56  ),
57  supported_ext=str(SupportExt.SupportPtz.value),
58  ),
60  key="ptz_right",
61  translation_key="ptz_right",
62  method=lambda pyezviz_client, serial, run: pyezviz_client.ptz_control(
63  "RIGHT", serial, run
64  ),
65  supported_ext=str(SupportExt.SupportPtz.value),
66  ),
67 )
68 
69 
71  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
72 ) -> None:
73  """Set up EZVIZ button based on a config entry."""
74  coordinator: EzvizDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
75  DATA_COORDINATOR
76  ]
77 
78  # Add button entities if supportExt value indicates PTZ capbility.
79  # Could be missing or "0" for unsupported.
80  # If present with value of "1" then add button entity.
81 
83  EzvizButtonEntity(coordinator, camera, entity_description)
84  for camera in coordinator.data
85  for capability, value in coordinator.data[camera]["supportExt"].items()
86  for entity_description in BUTTON_ENTITIES
87  if capability == entity_description.supported_ext
88  if value == "1"
89  )
90 
91 
93  """Representation of a EZVIZ button entity."""
94 
95  entity_description: EzvizButtonEntityDescription
96 
97  def __init__(
98  self,
99  coordinator: EzvizDataUpdateCoordinator,
100  serial: str,
101  description: EzvizButtonEntityDescription,
102  ) -> None:
103  """Initialize the button."""
104  super().__init__(coordinator, serial)
105  self._attr_unique_id_attr_unique_id = f"{serial}_{description.key}"
106  self.entity_descriptionentity_description = description
107 
108  def press(self) -> None:
109  """Execute the button action."""
110  try:
111  self.entity_descriptionentity_description.method(
112  self.coordinator.ezviz_client, self._serial_serial, "START"
113  )
114  self.entity_descriptionentity_description.method(
115  self.coordinator.ezviz_client, self._serial_serial, "STOP"
116  )
117  except (HTTPError, PyEzvizError) as err:
118  raise HomeAssistantError(
119  f"Cannot perform PTZ action on {self.name}"
120  ) from err
None __init__(self, EzvizDataUpdateCoordinator coordinator, str serial, EzvizButtonEntityDescription description)
Definition: button.py:102
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: button.py:72