1 """Support for MyBMW button entities."""
3 from __future__
import annotations
5 from collections.abc
import Callable, Coroutine
6 from dataclasses
import dataclass
8 from typing
import TYPE_CHECKING, Any
10 from bimmer_connected.models
import MyBMWAPIError
11 from bimmer_connected.vehicle
import MyBMWVehicle
12 from bimmer_connected.vehicle.remote_services
import RemoteServiceStatus
19 from .
import BMWConfigEntry
20 from .entity
import BMWBaseEntity
23 from .coordinator
import BMWDataUpdateCoordinator
25 _LOGGER = logging.getLogger(__name__)
28 @dataclass(frozen=True, kw_only=True)
30 """Class describing BMW button entities."""
32 remote_function: Callable[[MyBMWVehicle], Coroutine[Any, Any, RemoteServiceStatus]]
33 enabled_when_read_only: bool =
False
34 is_available: Callable[[MyBMWVehicle], bool] =
lambda _:
True
37 BUTTON_TYPES: tuple[BMWButtonEntityDescription, ...] = (
40 translation_key=
"light_flash",
41 remote_function=
lambda vehicle: vehicle.remote_services.trigger_remote_light_flash(),
45 translation_key=
"sound_horn",
46 remote_function=
lambda vehicle: vehicle.remote_services.trigger_remote_horn(),
49 key=
"activate_air_conditioning",
50 translation_key=
"activate_air_conditioning",
51 remote_function=
lambda vehicle: vehicle.remote_services.trigger_remote_air_conditioning(),
54 key=
"deactivate_air_conditioning",
55 translation_key=
"deactivate_air_conditioning",
56 name=
"Deactivate air conditioning",
57 remote_function=
lambda vehicle: vehicle.remote_services.trigger_remote_air_conditioning_stop(),
58 is_available=
lambda vehicle: vehicle.is_remote_climate_stop_enabled,
62 translation_key=
"find_vehicle",
63 remote_function=
lambda vehicle: vehicle.remote_services.trigger_remote_vehicle_finder(),
70 config_entry: BMWConfigEntry,
71 async_add_entities: AddEntitiesCallback,
73 """Set up the BMW buttons from config entry."""
74 coordinator = config_entry.runtime_data.coordinator
76 entities: list[BMWButton] = []
78 for vehicle
in coordinator.account.vehicles:
81 BMWButton(coordinator, vehicle, description)
82 for description
in BUTTON_TYPES
83 if (
not coordinator.read_only
and description.is_available(vehicle))
84 or (coordinator.read_only
and description.enabled_when_read_only)
92 """Representation of a MyBMW button."""
94 entity_description: BMWButtonEntityDescription
98 coordinator: BMWDataUpdateCoordinator,
99 vehicle: MyBMWVehicle,
100 description: BMWButtonEntityDescription,
102 """Initialize BMW vehicle sensor."""
103 super().
__init__(coordinator, vehicle)
108 """Press the button."""
111 except MyBMWAPIError
as ex:
None async_update_listeners(self)