Home Assistant Unofficial Reference 2024.12.1
button.py
Go to the documentation of this file.
1 """Viessmann ViCare button device."""
2 
3 from __future__ import annotations
4 
5 from contextlib import suppress
6 from dataclasses import dataclass
7 import logging
8 
9 from PyViCare.PyViCareDevice import Device as PyViCareDevice
10 from PyViCare.PyViCareDeviceConfig import PyViCareDeviceConfig
11 from PyViCare.PyViCareUtils import (
12  PyViCareInvalidDataError,
13  PyViCareNotSupportedFeatureError,
14  PyViCareRateLimitError,
15 )
16 import requests
17 
18 from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
19 from homeassistant.config_entries import ConfigEntry
20 from homeassistant.const import EntityCategory
21 from homeassistant.core import HomeAssistant
22 from homeassistant.helpers.entity_platform import AddEntitiesCallback
23 
24 from .const import DEVICE_LIST, DOMAIN
25 from .entity import ViCareEntity
26 from .types import ViCareDevice, ViCareRequiredKeysMixinWithSet
27 from .utils import get_device_serial, is_supported
28 
29 _LOGGER = logging.getLogger(__name__)
30 
31 
32 @dataclass(frozen=True)
34  ButtonEntityDescription, ViCareRequiredKeysMixinWithSet
35 ):
36  """Describes ViCare button entity."""
37 
38 
39 BUTTON_DESCRIPTIONS: tuple[ViCareButtonEntityDescription, ...] = (
41  key="activate_onetimecharge",
42  translation_key="activate_onetimecharge",
43  entity_category=EntityCategory.CONFIG,
44  value_getter=lambda api: api.getOneTimeCharge(),
45  value_setter=lambda api: api.activateOneTimeCharge(),
46  ),
47 )
48 
49 
51  device_list: list[ViCareDevice],
52 ) -> list[ViCareButton]:
53  """Create ViCare button entities for a device."""
54 
55  return [
57  description,
58  get_device_serial(device.api),
59  device.config,
60  device.api,
61  )
62  for device in device_list
63  for description in BUTTON_DESCRIPTIONS
64  if is_supported(description.key, description, device.api)
65  ]
66 
67 
69  hass: HomeAssistant,
70  config_entry: ConfigEntry,
71  async_add_entities: AddEntitiesCallback,
72 ) -> None:
73  """Create the ViCare button entities."""
74  device_list = hass.data[DOMAIN][config_entry.entry_id][DEVICE_LIST]
75 
77  await hass.async_add_executor_job(
78  _build_entities,
79  device_list,
80  )
81  )
82 
83 
85  """Representation of a ViCare button."""
86 
87  entity_description: ViCareButtonEntityDescription
88 
89  def __init__(
90  self,
91  description: ViCareButtonEntityDescription,
92  device_serial: str | None,
93  device_config: PyViCareDeviceConfig,
94  device: PyViCareDevice,
95  ) -> None:
96  """Initialize the button."""
97  super().__init__(description.key, device_serial, device_config, device)
98  self.entity_descriptionentity_description = description
99 
100  def press(self) -> None:
101  """Handle the button press."""
102  try:
103  with suppress(PyViCareNotSupportedFeatureError):
104  self.entity_descriptionentity_description.value_setter(self._api)
105  except requests.exceptions.ConnectionError:
106  _LOGGER.error("Unable to retrieve data from ViCare server")
107  except ValueError:
108  _LOGGER.error("Unable to decode data from ViCare server")
109  except PyViCareRateLimitError as limit_exception:
110  _LOGGER.error("Vicare API rate limit exceeded: %s", limit_exception)
111  except PyViCareInvalidDataError as invalid_data_exception:
112  _LOGGER.error("Invalid data from Vicare server: %s", invalid_data_exception)
None __init__(self, ViCareButtonEntityDescription description, str|None device_serial, PyViCareDeviceConfig device_config, PyViCareDevice device)
Definition: button.py:95
list[ViCareButton] _build_entities(list[ViCareDevice] device_list)
Definition: button.py:52
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: button.py:72
str|None get_device_serial(PyViCareDevice device)
Definition: utils.py:35
bool is_supported(str name, ViCareRequiredKeysMixin entity_description, vicare_device)
Definition: utils.py:56