1 """Switches for the Elexa Guardian integration."""
3 from __future__
import annotations
5 from collections.abc
import Awaitable, Callable, Mapping
6 from dataclasses
import dataclass
9 from aioguardian
import Client
17 from .
import GuardianData
18 from .const
import API_VALVE_STATUS, API_WIFI_STATUS, DOMAIN
19 from .entity
import ValveControllerEntity, ValveControllerEntityDescription
20 from .util
import convert_exceptions_to_homeassistant_error
21 from .valve
import GuardianValveState
23 ATTR_AVG_CURRENT =
"average_current"
24 ATTR_CONNECTED_CLIENTS =
"connected_clients"
25 ATTR_INST_CURRENT =
"instantaneous_current"
26 ATTR_INST_CURRENT_DDT =
"instantaneous_current_ddt"
27 ATTR_STATION_CONNECTED =
"station_connected"
28 ATTR_TRAVEL_COUNT =
"travel_count"
30 SWITCH_KIND_ONBOARD_AP =
"onboard_ap"
31 SWITCH_KIND_VALVE =
"valve"
34 @dataclass(frozen=True, kw_only=True)
36 SwitchEntityDescription, ValveControllerEntityDescription
38 """Describe a Guardian valve controller switch."""
40 extra_state_attributes_fn: Callable[[dict[str, Any]], Mapping[str, Any]]
41 is_on_fn: Callable[[dict[str, Any]], bool]
42 off_fn: Callable[[Client], Awaitable]
43 on_fn: Callable[[Client], Awaitable]
47 """Disable the onboard AP."""
49 await client.wifi.disable_ap()
53 """Enable the onboard AP."""
55 await client.wifi.enable_ap()
59 """Close the valve."""
61 await client.valve.close()
67 await client.valve.open()
71 def is_open(data: dict[str, Any]) -> bool:
72 """Return if the valve is opening."""
73 return data[
"state"]
in (
74 GuardianValveState.FINISH_OPENING,
75 GuardianValveState.OPEN,
76 GuardianValveState.OPENING,
77 GuardianValveState.START_OPENING,
81 VALVE_CONTROLLER_DESCRIPTIONS = (
83 key=SWITCH_KIND_ONBOARD_AP,
84 translation_key=
"onboard_access_point",
85 entity_category=EntityCategory.CONFIG,
86 extra_state_attributes_fn=
lambda data: {
87 ATTR_CONNECTED_CLIENTS: data.get(
"ap_clients"),
88 ATTR_STATION_CONNECTED: data[
"station_connected"],
90 api_category=API_WIFI_STATUS,
91 is_on_fn=
lambda data: data[
"ap_enabled"],
92 off_fn=_async_disable_ap,
93 on_fn=_async_enable_ap,
96 key=SWITCH_KIND_VALVE,
97 translation_key=
"valve_controller",
98 api_category=API_VALVE_STATUS,
99 extra_state_attributes_fn=
lambda data: {
100 ATTR_AVG_CURRENT: data[
"average_current"],
101 ATTR_INST_CURRENT: data[
"instantaneous_current"],
102 ATTR_INST_CURRENT_DDT: data[
"instantaneous_current_ddt"],
103 ATTR_TRAVEL_COUNT: data[
"travel_count"],
106 off_fn=_async_close_valve,
107 on_fn=_async_open_valve,
113 hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
115 """Set up Guardian switches based on a config entry."""
116 data: GuardianData = hass.data[DOMAIN][entry.entry_id]
120 for description
in VALVE_CONTROLLER_DESCRIPTIONS
125 """Define a switch related to a Guardian valve controller."""
127 entity_description: ValveControllerSwitchDescription
133 description: ValveControllerSwitchDescription,
136 super().
__init__(entry, data.valve_controller_coordinators, description)
142 """Return entity specific state attributes."""
143 return self.
entity_descriptionentity_description.extra_state_attributes_fn(self.coordinator.data)
147 """Return True if entity is on."""
150 @convert_exceptions_to_homeassistant_error
152 """Turn the switch off."""
156 @convert_exceptions_to_homeassistant_error
158 """Turn the switch on."""
None __init__(self, ConfigEntry entry, GuardianData data, ValveControllerSwitchDescription description)
Mapping[str, Any] extra_state_attributes(self)
None async_turn_on(self, **Any kwargs)
None async_turn_off(self, **Any kwargs)
None async_request_refresh(self)
None _async_disable_ap(Client client)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
bool is_open(dict[str, Any] data)
None _async_open_valve(Client client)
None _async_close_valve(Client client)
None _async_enable_ap(Client client)