1 """Viessmann ViCare button device."""
3 from __future__
import annotations
5 from contextlib
import suppress
6 from dataclasses
import dataclass
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,
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
29 _LOGGER = logging.getLogger(__name__)
32 @dataclass(frozen=True)
34 ButtonEntityDescription, ViCareRequiredKeysMixinWithSet
36 """Describes ViCare button entity."""
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(),
51 device_list: list[ViCareDevice],
52 ) -> list[ViCareButton]:
53 """Create ViCare button entities for a device."""
62 for device
in device_list
63 for description
in BUTTON_DESCRIPTIONS
64 if is_supported(description.key, description, device.api)
70 config_entry: ConfigEntry,
71 async_add_entities: AddEntitiesCallback,
73 """Create the ViCare button entities."""
74 device_list = hass.data[DOMAIN][config_entry.entry_id][DEVICE_LIST]
77 await hass.async_add_executor_job(
85 """Representation of a ViCare button."""
87 entity_description: ViCareButtonEntityDescription
91 description: ViCareButtonEntityDescription,
92 device_serial: str |
None,
93 device_config: PyViCareDeviceConfig,
94 device: PyViCareDevice,
96 """Initialize the button."""
97 super().
__init__(description.key, device_serial, device_config, device)
101 """Handle the button press."""
103 with suppress(PyViCareNotSupportedFeatureError):
105 except requests.exceptions.ConnectionError:
106 _LOGGER.error(
"Unable to retrieve data from ViCare server")
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)
str|None get_device_serial(PyViCareDevice device)
bool is_supported(str name, ViCareRequiredKeysMixin entity_description, vicare_device)