1 """The Flexit Nordic (BACnet) integration."""
3 import asyncio.exceptions
4 from collections.abc
import Awaitable, Callable
5 from dataclasses
import dataclass
7 from flexit_bacnet
import FlexitBACnet
8 from flexit_bacnet.bacnet
import DecodingError
13 NumberEntityDescription,
22 from .
import FlexitCoordinator
23 from .const
import DOMAIN
24 from .entity
import FlexitEntity
27 @dataclass(kw_only=True, frozen=True)
29 """Describes a Flexit number entity."""
31 native_value_fn: Callable[[FlexitBACnet], float]
32 set_native_value_fn: Callable[[FlexitBACnet], Callable[[int], Awaitable[
None]]]
35 NUMBERS: tuple[FlexitNumberEntityDescription, ...] = (
37 key=
"away_extract_fan_setpoint",
38 translation_key=
"away_extract_fan_setpoint",
39 device_class=NumberDeviceClass.POWER_FACTOR,
43 mode=NumberMode.SLIDER,
44 native_value_fn=
lambda device: device.fan_setpoint_extract_air_away,
45 set_native_value_fn=
lambda device: device.set_fan_setpoint_extract_air_away,
46 native_unit_of_measurement=PERCENTAGE,
49 key=
"away_supply_fan_setpoint",
50 translation_key=
"away_supply_fan_setpoint",
51 device_class=NumberDeviceClass.POWER_FACTOR,
55 mode=NumberMode.SLIDER,
56 native_value_fn=
lambda device: device.fan_setpoint_supply_air_away,
57 set_native_value_fn=
lambda device: device.set_fan_setpoint_supply_air_away,
58 native_unit_of_measurement=PERCENTAGE,
61 key=
"cooker_hood_extract_fan_setpoint",
62 translation_key=
"cooker_hood_extract_fan_setpoint",
63 device_class=NumberDeviceClass.POWER_FACTOR,
67 mode=NumberMode.SLIDER,
68 native_value_fn=
lambda device: device.fan_setpoint_extract_air_cooker,
69 set_native_value_fn=
lambda device: device.set_fan_setpoint_extract_air_cooker,
70 native_unit_of_measurement=PERCENTAGE,
73 key=
"cooker_hood_supply_fan_setpoint",
74 translation_key=
"cooker_hood_supply_fan_setpoint",
75 device_class=NumberDeviceClass.POWER_FACTOR,
79 mode=NumberMode.SLIDER,
80 native_value_fn=
lambda device: device.fan_setpoint_supply_air_cooker,
81 set_native_value_fn=
lambda device: device.set_fan_setpoint_supply_air_cooker,
82 native_unit_of_measurement=PERCENTAGE,
85 key=
"fireplace_extract_fan_setpoint",
86 translation_key=
"fireplace_extract_fan_setpoint",
87 device_class=NumberDeviceClass.POWER_FACTOR,
91 mode=NumberMode.SLIDER,
92 native_value_fn=
lambda device: device.fan_setpoint_extract_air_fire,
93 set_native_value_fn=
lambda device: device.set_fan_setpoint_extract_air_fire,
94 native_unit_of_measurement=PERCENTAGE,
97 key=
"fireplace_supply_fan_setpoint",
98 translation_key=
"fireplace_supply_fan_setpoint",
99 device_class=NumberDeviceClass.POWER_FACTOR,
101 native_max_value=100,
103 mode=NumberMode.SLIDER,
104 native_value_fn=
lambda device: device.fan_setpoint_supply_air_fire,
105 set_native_value_fn=
lambda device: device.set_fan_setpoint_supply_air_fire,
106 native_unit_of_measurement=PERCENTAGE,
109 key=
"high_extract_fan_setpoint",
110 translation_key=
"high_extract_fan_setpoint",
111 device_class=NumberDeviceClass.POWER_FACTOR,
113 native_max_value=100,
115 mode=NumberMode.SLIDER,
116 native_value_fn=
lambda device: device.fan_setpoint_extract_air_high,
117 set_native_value_fn=
lambda device: device.set_fan_setpoint_extract_air_high,
118 native_unit_of_measurement=PERCENTAGE,
121 key=
"high_supply_fan_setpoint",
122 translation_key=
"high_supply_fan_setpoint",
123 device_class=NumberDeviceClass.POWER_FACTOR,
125 native_max_value=100,
127 mode=NumberMode.SLIDER,
128 native_value_fn=
lambda device: device.fan_setpoint_supply_air_high,
129 set_native_value_fn=
lambda device: device.set_fan_setpoint_supply_air_high,
130 native_unit_of_measurement=PERCENTAGE,
133 key=
"home_extract_fan_setpoint",
134 translation_key=
"home_extract_fan_setpoint",
135 device_class=NumberDeviceClass.POWER_FACTOR,
137 native_max_value=100,
139 mode=NumberMode.SLIDER,
140 native_value_fn=
lambda device: device.fan_setpoint_extract_air_home,
141 set_native_value_fn=
lambda device: device.set_fan_setpoint_extract_air_home,
142 native_unit_of_measurement=PERCENTAGE,
145 key=
"home_supply_fan_setpoint",
146 translation_key=
"home_supply_fan_setpoint",
147 device_class=NumberDeviceClass.POWER_FACTOR,
149 native_max_value=100,
151 mode=NumberMode.SLIDER,
152 native_value_fn=
lambda device: device.fan_setpoint_supply_air_home,
153 set_native_value_fn=
lambda device: device.set_fan_setpoint_supply_air_home,
154 native_unit_of_measurement=PERCENTAGE,
161 config_entry: ConfigEntry,
162 async_add_entities: AddEntitiesCallback,
164 """Set up Flexit (bacnet) number from a config entry."""
165 coordinator: FlexitCoordinator = hass.data[DOMAIN][config_entry.entry_id]
168 FlexitNumber(coordinator, description)
for description
in NUMBERS
173 """Representation of a Flexit Number."""
175 entity_description: FlexitNumberEntityDescription
179 coordinator: FlexitCoordinator,
180 entity_description: FlexitNumberEntityDescription,
182 """Initialize Flexit (bacnet) number."""
187 f
"{coordinator.device.serial_number}-{entity_description.key}"
192 """Return the state of the number."""
193 return self.
entity_descriptionentity_description.native_value_fn(self.coordinator.device)
196 """Update the current value."""
198 self.coordinator.device
201 await set_native_value_fn(
int(value))
202 except (asyncio.exceptions.TimeoutError, ConnectionError, DecodingError)
as exc:
203 raise HomeAssistantError
from exc
None async_set_native_value(self, float value)
None __init__(self, FlexitCoordinator coordinator, FlexitNumberEntityDescription entity_description)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)