1 """Support for OpenTherm Gateway select entities."""
3 from collections.abc
import Awaitable, Callable
4 from dataclasses
import dataclass
5 from enum
import IntEnum, StrEnum
6 from functools
import partial
8 from pyotgw.vars
import (
25 from .
import OpenThermGatewayHub
29 GATEWAY_DEVICE_DESCRIPTION,
32 from .entity
import OpenThermEntityDescription, OpenThermStatusEntity
36 """OpenTherm Gateway GPIO modes."""
46 DHW_BLOCK =
"dhw_block"
50 """OpenThermGateway LED modes."""
52 RX_ANY =
"receive_any"
53 TX_ANY =
"transmit_any"
54 THERMOSTAT_TRAFFIC =
"thermostat_traffic"
55 BOILER_TRAFFIC =
"boiler_traffic"
56 SETPOINT_OVERRIDE_ACTIVE =
"setpoint_override_active"
58 CENTRAL_HEATING_ON =
"central_heating_on"
59 HOT_WATER_ON =
"hot_water_on"
60 COMFORT_MODE_ON =
"comfort_mode_on"
61 TX_ERROR_DETECTED =
"transmit_error_detected"
62 BOILER_MAINTENANCE_REQUIRED =
"boiler_maintenance_required"
63 RAISED_POWER_MODE_ACTIVE =
"raised_power_mode_active"
67 """pyotgw GPIO modes."""
81 """pyotgw LED modes."""
85 THERMOSTAT_TRAFFIC =
"T"
87 SETPOINT_OVERRIDE_ACTIVE =
"O"
89 CENTRAL_HEATING_ON =
"H"
92 TX_ERROR_DETECTED =
"E"
93 BOILER_MAINTENANCE_REQUIRED =
"M"
94 RAISED_POWER_MODE_ACTIVE =
"P"
98 pyotgw_led_mode: PyotgwLEDMode,
99 ) -> OpenThermSelectLEDMode |
None:
100 """Convert pyotgw LED mode to Home Assistant LED mode."""
103 if pyotgw_led_mode
in PyotgwLEDMode
109 gpio_id: str, gw_hub: OpenThermGatewayHub, mode: str
110 ) -> OpenThermSelectGPIOMode |
None:
111 """Set gpio mode, return selected option or None."""
112 value = await gw_hub.gateway.set_gpio_mode(
117 if value
in PyotgwGPIOMode
123 led_id: str, gw_hub: OpenThermGatewayHub, mode: str
124 ) -> OpenThermSelectLEDMode |
None:
125 """Set gpio mode, return selected option or None."""
126 value = await gw_hub.gateway.set_led_mode(
131 if value
in PyotgwLEDMode
136 @dataclass(frozen=True, kw_only=True)
138 OpenThermEntityDescription, SelectEntityDescription
140 """Describes an opentherm_gw select entity."""
142 select_action: Callable[[OpenThermGatewayHub, str], Awaitable]
143 convert_pyotgw_state_to_ha_state: Callable
146 SELECT_DESCRIPTIONS: tuple[OpenThermSelectEntityDescription, ...] = (
149 translation_key=
"gpio_mode_n",
150 translation_placeholders={
"gpio_id":
"A"},
151 device_description=GATEWAY_DEVICE_DESCRIPTION,
154 for mode
in OpenThermSelectGPIOMode
155 if mode != OpenThermSelectGPIOMode.DS1820
157 select_action=partial(set_gpio_mode,
"A"),
158 convert_pyotgw_state_to_ha_state=(
160 if state
in PyotgwGPIOMode
166 translation_key=
"gpio_mode_n",
167 translation_placeholders={
"gpio_id":
"B"},
168 device_description=GATEWAY_DEVICE_DESCRIPTION,
169 options=
list(OpenThermSelectGPIOMode),
170 select_action=partial(set_gpio_mode,
"B"),
171 convert_pyotgw_state_to_ha_state=(
173 if state
in PyotgwGPIOMode
179 translation_key=
"led_mode_n",
180 translation_placeholders={
"led_id":
"A"},
181 device_description=GATEWAY_DEVICE_DESCRIPTION,
182 options=
list(OpenThermSelectLEDMode),
183 select_action=partial(set_led_mode,
"A"),
184 convert_pyotgw_state_to_ha_state=pyotgw_led_mode_to_ha_led_mode,
188 translation_key=
"led_mode_n",
189 translation_placeholders={
"led_id":
"B"},
190 device_description=GATEWAY_DEVICE_DESCRIPTION,
191 options=
list(OpenThermSelectLEDMode),
192 select_action=partial(set_led_mode,
"B"),
193 convert_pyotgw_state_to_ha_state=pyotgw_led_mode_to_ha_led_mode,
197 translation_key=
"led_mode_n",
198 translation_placeholders={
"led_id":
"C"},
199 device_description=GATEWAY_DEVICE_DESCRIPTION,
200 options=
list(OpenThermSelectLEDMode),
201 select_action=partial(set_led_mode,
"C"),
202 convert_pyotgw_state_to_ha_state=pyotgw_led_mode_to_ha_led_mode,
206 translation_key=
"led_mode_n",
207 translation_placeholders={
"led_id":
"D"},
208 device_description=GATEWAY_DEVICE_DESCRIPTION,
209 options=
list(OpenThermSelectLEDMode),
210 select_action=partial(set_led_mode,
"D"),
211 convert_pyotgw_state_to_ha_state=pyotgw_led_mode_to_ha_led_mode,
215 translation_key=
"led_mode_n",
216 translation_placeholders={
"led_id":
"E"},
217 device_description=GATEWAY_DEVICE_DESCRIPTION,
218 options=
list(OpenThermSelectLEDMode),
219 select_action=partial(set_led_mode,
"E"),
220 convert_pyotgw_state_to_ha_state=pyotgw_led_mode_to_ha_led_mode,
224 translation_key=
"led_mode_n",
225 translation_placeholders={
"led_id":
"F"},
226 device_description=GATEWAY_DEVICE_DESCRIPTION,
227 options=
list(OpenThermSelectLEDMode),
228 select_action=partial(set_led_mode,
"F"),
229 convert_pyotgw_state_to_ha_state=pyotgw_led_mode_to_ha_led_mode,
236 config_entry: ConfigEntry,
237 async_add_entities: AddEntitiesCallback,
239 """Set up the OpenTherm Gateway select entities."""
240 gw_hub = hass.data[DATA_OPENTHERM_GW][DATA_GATEWAYS][config_entry.data[CONF_ID]]
243 OpenThermSelect(gw_hub, description)
for description
in SELECT_DESCRIPTIONS
248 """Represent an OpenTherm Gateway select."""
250 _attr_current_option =
None
251 _attr_entity_category = EntityCategory.CONFIG
252 entity_description: OpenThermSelectEntityDescription
255 """Change the selected option."""
257 if new_option
is not None:
263 """Handle status updates from the component."""
None async_select_option(self, str option)
None receive_report(self, dict[OpenThermDataSource, dict] status)
None async_write_ha_state(self)
web.Response get(self, web.Request request, str config_key)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
OpenThermSelectLEDMode|None pyotgw_led_mode_to_ha_led_mode(PyotgwLEDMode pyotgw_led_mode)
OpenThermSelectLEDMode|None set_led_mode(str led_id, OpenThermGatewayHub gw_hub, str mode)
OpenThermSelectGPIOMode|None set_gpio_mode(str gpio_id, OpenThermGatewayHub gw_hub, str mode)