1 """Support for AirGradient buttons."""
3 from collections.abc
import Awaitable, Callable
4 from dataclasses
import dataclass
6 from airgradient
import AirGradientClient, ConfigurationControl
9 DOMAIN
as BUTTON_DOMAIN,
11 ButtonEntityDescription,
18 from .
import AirGradientConfigEntry
19 from .const
import DOMAIN
20 from .coordinator
import AirGradientCoordinator
21 from .entity
import AirGradientEntity
24 @dataclass(frozen=True, kw_only=True)
26 """Describes AirGradient button entity."""
28 press_fn: Callable[[AirGradientClient], Awaitable[
None]]
32 key=
"co2_calibration",
33 translation_key=
"co2_calibration",
34 entity_category=EntityCategory.CONFIG,
35 press_fn=
lambda client: client.request_co2_calibration(),
39 translation_key=
"led_bar_test",
40 entity_category=EntityCategory.CONFIG,
41 press_fn=
lambda client: client.request_led_bar_test(),
47 entry: AirGradientConfigEntry,
48 async_add_entities: AddEntitiesCallback,
50 """Set up AirGradient button entities based on a config entry."""
51 coordinator = entry.runtime_data
52 model = coordinator.data.measures.model
54 added_entities =
False
57 def _check_entities() -> None:
58 nonlocal added_entities
61 coordinator.data.config.configuration_control
is ConfigurationControl.LOCAL
62 and not added_entities
71 coordinator.data.config.configuration_control
72 is not ConfigurationControl.LOCAL
75 entity_registry = er.async_get(hass)
76 for entity_description
in (CO2_CALIBRATION, LED_BAR_TEST):
77 unique_id = f
"{coordinator.serial_number}-{entity_description.key}"
78 if entity_id := entity_registry.async_get_entity_id(
79 BUTTON_DOMAIN, DOMAIN, unique_id
81 entity_registry.async_remove(entity_id)
82 added_entities =
False
84 coordinator.async_add_listener(_check_entities)
89 """Defines an AirGradient button."""
91 entity_description: AirGradientButtonEntityDescription
95 coordinator: AirGradientCoordinator,
96 description: AirGradientButtonEntityDescription,
98 """Initialize airgradient button."""
101 self.
_attr_unique_id_attr_unique_id = f
"{coordinator.serial_number}-{description.key}"
104 """Press the button."""