PyPlumIO 0.5.22__py3-none-any.whl → 0.5.24__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,6 +6,8 @@ from collections.abc import Generator
6
6
  from dataclasses import dataclass
7
7
  from typing import TYPE_CHECKING, Any, Final
8
8
 
9
+ from dataslots import dataslots
10
+
9
11
  from pyplumio.const import (
10
12
  ATTR_DEVICE_INDEX,
11
13
  ATTR_INDEX,
@@ -16,12 +18,14 @@ from pyplumio.const import (
16
18
  )
17
19
  from pyplumio.frames import Request
18
20
  from pyplumio.helpers.parameter import (
19
- BinaryParameter,
20
- BinaryParameterDescription,
21
+ SET_RETRIES,
22
+ Number,
23
+ NumberDescription,
21
24
  Parameter,
22
25
  ParameterDescription,
23
26
  ParameterValues,
24
- ParameterValueType,
27
+ Switch,
28
+ SwitchDescription,
25
29
  unpack_parameter,
26
30
  )
27
31
  from pyplumio.structures import StructureDecoder
@@ -35,8 +39,18 @@ ATTR_MIXER_PARAMETERS: Final = "mixer_parameters"
35
39
  MIXER_PARAMETER_SIZE: Final = 3
36
40
 
37
41
 
42
+ @dataclass
43
+ class MixerParameterDescription(ParameterDescription):
44
+ """Represents a mixer parameter description."""
45
+
46
+ __slots__ = ()
47
+
48
+ multiplier: float = 1.0
49
+ offset: int = 0
50
+
51
+
38
52
  class MixerParameter(Parameter):
39
- """Represents a mixer parameter."""
53
+ """Represent a mixer parameter."""
40
54
 
41
55
  __slots__ = ()
42
56
 
@@ -55,186 +69,191 @@ class MixerParameter(Parameter):
55
69
  },
56
70
  )
57
71
 
58
- async def set(self, value: ParameterValueType, retries: int = 5) -> bool:
59
- """Set a parameter value."""
60
- if isinstance(value, (int, float)):
61
- value = int((value + self.description.offset) / self.description.multiplier)
62
72
 
73
+ @dataslots
74
+ @dataclass
75
+ class MixerNumberDescription(MixerParameterDescription, NumberDescription):
76
+ """Represent a mixer number description."""
77
+
78
+
79
+ class MixerNumber(MixerParameter, Number):
80
+ """Represents a mixer number."""
81
+
82
+ __slots__ = ()
83
+
84
+ description: MixerNumberDescription
85
+
86
+ async def set(self, value: int | float, retries: int = SET_RETRIES) -> bool:
87
+ """Set a parameter value."""
88
+ value = (value + self.description.offset) / self.description.multiplier
63
89
  return await super().set(value, retries)
64
90
 
65
91
  @property
66
- def value(self) -> ParameterValueType:
92
+ def value(self) -> float:
67
93
  """Return the parameter value."""
68
94
  return (
69
95
  self.values.value - self.description.offset
70
96
  ) * self.description.multiplier
71
97
 
72
98
  @property
73
- def min_value(self) -> ParameterValueType:
99
+ def min_value(self) -> float:
74
100
  """Return the minimum allowed value."""
75
101
  return (
76
102
  self.values.min_value - self.description.offset
77
103
  ) * self.description.multiplier
78
104
 
79
105
  @property
80
- def max_value(self) -> ParameterValueType:
106
+ def max_value(self) -> float:
81
107
  """Return the maximum allowed value."""
82
108
  return (
83
109
  self.values.max_value - self.description.offset
84
110
  ) * self.description.multiplier
85
111
 
86
112
 
87
- class MixerBinaryParameter(BinaryParameter, MixerParameter):
88
- """Represents a mixer binary parameter."""
89
-
90
- __slots__ = ()
91
-
92
-
113
+ @dataslots
93
114
  @dataclass
94
- class MixerParameterDescription(ParameterDescription):
95
- """Represents a mixer parameter description."""
115
+ class MixerSwitchDescription(MixerParameterDescription, SwitchDescription):
116
+ """Represents a mixer switch description."""
96
117
 
97
- multiplier: float = 1
98
- offset: int = 0
99
118
 
119
+ class MixerSwitch(MixerParameter, Switch):
120
+ """Represents a mixer switch."""
100
121
 
101
- @dataclass
102
- class MixerBinaryParameterDescription(
103
- MixerParameterDescription, BinaryParameterDescription
104
- ):
105
- """Represents a mixer binary parameter description."""
122
+ __slots__ = ()
123
+
124
+ description: MixerSwitchDescription
106
125
 
107
126
 
108
127
  MIXER_PARAMETERS: dict[ProductType, tuple[MixerParameterDescription, ...]] = {
109
128
  ProductType.ECOMAX_P: (
110
- MixerParameterDescription(
129
+ MixerNumberDescription(
111
130
  name="mixer_target_temp",
112
131
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
113
132
  ),
114
- MixerParameterDescription(
133
+ MixerNumberDescription(
115
134
  name="min_target_temp",
116
135
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
117
136
  ),
118
- MixerParameterDescription(
137
+ MixerNumberDescription(
119
138
  name="max_target_temp",
120
139
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
121
140
  ),
122
- MixerParameterDescription(
141
+ MixerNumberDescription(
123
142
  name="thermostat_decrease_target_temp",
124
143
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
125
144
  ),
126
- MixerBinaryParameterDescription(
145
+ MixerSwitchDescription(
127
146
  name="weather_control",
128
147
  ),
129
- MixerParameterDescription(
148
+ MixerNumberDescription(
130
149
  name="heating_curve",
131
150
  multiplier=0.1,
132
151
  ),
133
- MixerParameterDescription(
152
+ MixerNumberDescription(
134
153
  name="heating_curve_shift",
135
154
  offset=20,
136
155
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
137
156
  ),
138
- MixerParameterDescription(
157
+ MixerNumberDescription(
139
158
  name="weather_factor",
140
159
  ),
141
- MixerParameterDescription(
160
+ MixerNumberDescription(
142
161
  name="work_mode",
143
162
  ),
144
- MixerParameterDescription(
163
+ MixerNumberDescription(
145
164
  name="mixer_input_dead_zone",
146
165
  multiplier=0.1,
147
166
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
148
167
  ),
149
- MixerBinaryParameterDescription(
168
+ MixerSwitchDescription(
150
169
  name="thermostat_operation",
151
170
  ),
152
- MixerParameterDescription(
171
+ MixerNumberDescription(
153
172
  name="thermostat_mode",
154
173
  ),
155
- MixerBinaryParameterDescription(
174
+ MixerSwitchDescription(
156
175
  name="disable_pump_on_thermostat",
157
176
  ),
158
- MixerBinaryParameterDescription(
177
+ MixerSwitchDescription(
159
178
  name="summer_work",
160
179
  ),
161
180
  ),
162
181
  ProductType.ECOMAX_I: (
163
- MixerParameterDescription(
182
+ MixerNumberDescription(
164
183
  name="work_mode",
165
184
  ),
166
- MixerParameterDescription(
185
+ MixerNumberDescription(
167
186
  name="circuit_target_temp",
168
187
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
169
188
  ),
170
- MixerParameterDescription(
189
+ MixerNumberDescription(
171
190
  name="day_target_temp",
172
191
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
173
192
  ),
174
- MixerParameterDescription(
193
+ MixerNumberDescription(
175
194
  name="night_target_temp",
176
195
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
177
196
  ),
178
- MixerParameterDescription(
197
+ MixerNumberDescription(
179
198
  name="min_target_temp",
180
199
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
181
200
  ),
182
- MixerParameterDescription(
201
+ MixerNumberDescription(
183
202
  name="max_target_temp",
184
203
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
185
204
  ),
186
- MixerBinaryParameterDescription(
205
+ MixerSwitchDescription(
187
206
  name="summer_work",
188
207
  ),
189
- MixerBinaryParameterDescription(
208
+ MixerSwitchDescription(
190
209
  name="weather_control",
191
210
  ),
192
- MixerParameterDescription(
211
+ MixerNumberDescription(
193
212
  name="enable_circuit",
194
213
  ),
195
- MixerParameterDescription(
214
+ MixerNumberDescription(
196
215
  name="constant_water_preset_temp",
197
216
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
198
217
  ),
199
- MixerParameterDescription(
218
+ MixerNumberDescription(
200
219
  name="thermostat_decrease_temp",
201
220
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
202
221
  ),
203
- MixerParameterDescription(
222
+ MixerNumberDescription(
204
223
  name="thermostat_correction",
205
224
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
206
225
  ),
207
- MixerBinaryParameterDescription(
226
+ MixerSwitchDescription(
208
227
  name="thermostat_pump_lock",
209
228
  ),
210
- MixerParameterDescription(
229
+ MixerNumberDescription(
211
230
  name="valve_opening_time",
212
231
  unit_of_measurement=UnitOfMeasurement.SECONDS,
213
232
  ),
214
- MixerParameterDescription(
233
+ MixerNumberDescription(
215
234
  name="mixer_input_dead_zone",
216
235
  multiplier=0.1,
217
236
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
218
237
  ),
219
- MixerParameterDescription(
238
+ MixerNumberDescription(
220
239
  name="proportional_range",
221
240
  ),
222
- MixerParameterDescription(
241
+ MixerNumberDescription(
223
242
  name="integration_time_constant",
224
243
  ),
225
- MixerParameterDescription(
244
+ MixerNumberDescription(
226
245
  name="heating_curve",
227
246
  multiplier=0.1,
228
247
  ),
229
- MixerParameterDescription(
248
+ MixerNumberDescription(
230
249
  name="heating_curve_shift",
231
250
  offset=20,
232
251
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
233
252
  ),
234
- MixerParameterDescription(
253
+ MixerNumberDescription(
235
254
  name="thermostat_mode",
236
255
  ),
237
- MixerParameterDescription(
256
+ MixerNumberDescription(
238
257
  name="decreasing_constant_water_temp",
239
258
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
240
259
  ),
@@ -8,6 +8,8 @@ from functools import reduce
8
8
  from itertools import chain
9
9
  from typing import Any, Final
10
10
 
11
+ from dataslots import dataslots
12
+
11
13
  from pyplumio.const import (
12
14
  ATTR_PARAMETER,
13
15
  ATTR_SCHEDULE,
@@ -19,11 +21,13 @@ from pyplumio.devices import AddressableDevice, Device
19
21
  from pyplumio.exceptions import FrameDataError
20
22
  from pyplumio.frames import Request
21
23
  from pyplumio.helpers.parameter import (
22
- BinaryParameter,
23
- BinaryParameterDescription,
24
+ Number,
25
+ NumberDescription,
24
26
  Parameter,
25
27
  ParameterDescription,
26
28
  ParameterValues,
29
+ Switch,
30
+ SwitchDescription,
27
31
  unpack_parameter,
28
32
  )
29
33
  from pyplumio.structures import Structure
@@ -80,12 +84,20 @@ SCHEDULES: tuple[str, ...] = (
80
84
  )
81
85
 
82
86
 
87
+ @dataclass
88
+ class ScheduleParameterDescription(ParameterDescription):
89
+ """Represent a schedule parameter description."""
90
+
91
+ __slots__ = ()
92
+
93
+
83
94
  class ScheduleParameter(Parameter):
84
95
  """Represents a schedule parameter."""
85
96
 
86
97
  __slots__ = ()
87
98
 
88
99
  device: AddressableDevice
100
+ description: ScheduleParameterDescription
89
101
 
90
102
  async def create_request(self) -> Request:
91
103
  """Create a request to change the parameter."""
@@ -97,32 +109,40 @@ class ScheduleParameter(Parameter):
97
109
  )
98
110
 
99
111
 
100
- class ScheduleBinaryParameter(ScheduleParameter, BinaryParameter):
101
- """Represents a schedule binary parameter."""
112
+ @dataslots
113
+ @dataclass
114
+ class ScheduleNumberDescription(ScheduleParameterDescription, NumberDescription):
115
+ """Represents a schedule number description."""
116
+
117
+
118
+ class ScheduleNumber(ScheduleParameter, Number):
119
+ """Represents a schedule number."""
102
120
 
103
121
  __slots__ = ()
104
122
 
123
+ description: ScheduleNumberDescription
105
124
 
125
+
126
+ @dataslots
106
127
  @dataclass
107
- class ScheduleParameterDescription(ParameterDescription):
108
- """Represents a schedule parameter description."""
128
+ class ScheduleSwitchDescription(ScheduleParameterDescription, SwitchDescription):
129
+ """Represents a schedule switch description."""
109
130
 
110
131
 
111
- @dataclass
112
- class ScheduleBinaryParameterDescription(
113
- BinaryParameterDescription, ScheduleParameterDescription
114
- ):
115
- """Represents a schedule binary parameter description."""
132
+ class ScheduleSwitch(ScheduleParameter, Switch):
133
+ """Represents a schedule switch."""
134
+
135
+ __slots__ = ()
136
+
137
+ description: ScheduleSwitchDescription
116
138
 
117
139
 
118
140
  SCHEDULE_PARAMETERS: list[ScheduleParameterDescription] = list(
119
141
  chain.from_iterable(
120
142
  [
121
143
  [
122
- ScheduleBinaryParameterDescription(
123
- name=f"{name}_{ATTR_SCHEDULE_SWITCH}"
124
- ),
125
- ScheduleParameterDescription(name=f"{name}_{ATTR_SCHEDULE_PARAMETER}"),
144
+ ScheduleSwitchDescription(name=f"{name}_{ATTR_SCHEDULE_SWITCH}"),
145
+ ScheduleNumberDescription(name=f"{name}_{ATTR_SCHEDULE_PARAMETER}"),
126
146
  ]
127
147
  for name in SCHEDULES
128
148
  ]
@@ -6,6 +6,8 @@ from collections.abc import Generator
6
6
  from dataclasses import dataclass
7
7
  from typing import TYPE_CHECKING, Any, Final
8
8
 
9
+ from dataslots import dataslots
10
+
9
11
  from pyplumio.const import (
10
12
  ATTR_INDEX,
11
13
  ATTR_OFFSET,
@@ -16,12 +18,14 @@ from pyplumio.const import (
16
18
  )
17
19
  from pyplumio.frames import Request
18
20
  from pyplumio.helpers.parameter import (
19
- BinaryParameter,
20
- BinaryParameterDescription,
21
+ SET_TIMEOUT,
22
+ Number,
23
+ NumberDescription,
21
24
  Parameter,
22
25
  ParameterDescription,
23
26
  ParameterValues,
24
- ParameterValueType,
27
+ Switch,
28
+ SwitchDescription,
25
29
  unpack_parameter,
26
30
  )
27
31
  from pyplumio.structures import StructureDecoder
@@ -38,6 +42,16 @@ ATTR_THERMOSTAT_PARAMETERS: Final = "thermostat_parameters"
38
42
  THERMOSTAT_PARAMETER_SIZE: Final = 3
39
43
 
40
44
 
45
+ @dataclass
46
+ class ThermostatParameterDescription(ParameterDescription):
47
+ """Represents a thermostat parameter description."""
48
+
49
+ __slots__ = ()
50
+
51
+ multiplier: float = 1.0
52
+ size: int = 1
53
+
54
+
41
55
  class ThermostatParameter(Parameter):
42
56
  """Represents a thermostat parameter."""
43
57
 
@@ -50,7 +64,7 @@ class ThermostatParameter(Parameter):
50
64
  def __init__(
51
65
  self,
52
66
  device: Thermostat,
53
- description: ParameterDescription,
67
+ description: ThermostatParameterDescription,
54
68
  values: ParameterValues | None = None,
55
69
  index: int = 0,
56
70
  offset: int = 0,
@@ -74,119 +88,124 @@ class ThermostatParameter(Parameter):
74
88
  },
75
89
  )
76
90
 
77
- async def set(self, value: ParameterValueType, retries: int = 5) -> bool:
78
- """Set a parameter value."""
79
- if isinstance(value, (int, float)):
80
- value = int(value / self.description.multiplier)
81
91
 
92
+ @dataslots
93
+ @dataclass
94
+ class ThermostatNumberDescription(ThermostatParameterDescription, NumberDescription):
95
+ """Represent a thermostat number description."""
96
+
97
+
98
+ class ThermostatNumber(ThermostatParameter, Number):
99
+ """Represents a thermostat number."""
100
+
101
+ __slots__ = ()
102
+
103
+ description: ThermostatNumberDescription
104
+
105
+ async def set(self, value: int | float, retries: int = SET_TIMEOUT) -> bool:
106
+ """Set a parameter value."""
107
+ value = value / self.description.multiplier
82
108
  return await super().set(value, retries)
83
109
 
84
110
  @property
85
- def value(self) -> ParameterValueType:
86
- """Return the parameter value."""
111
+ def value(self) -> float:
112
+ """Return the value."""
87
113
  return self.values.value * self.description.multiplier
88
114
 
89
115
  @property
90
- def min_value(self) -> ParameterValueType:
116
+ def min_value(self) -> float:
91
117
  """Return the minimum allowed value."""
92
118
  return self.values.min_value * self.description.multiplier
93
119
 
94
120
  @property
95
- def max_value(self) -> ParameterValueType:
121
+ def max_value(self) -> float:
96
122
  """Return the maximum allowed value."""
97
123
  return self.values.max_value * self.description.multiplier
98
124
 
99
125
 
100
- class ThermostatBinaryParameter(BinaryParameter, ThermostatParameter):
101
- """Represents a thermostat binary parameter."""
102
-
103
- __slots__ = ()
104
-
105
-
126
+ @dataslots
106
127
  @dataclass
107
- class ThermostatParameterDescription(ParameterDescription):
108
- """Represents a thermostat parameter description."""
128
+ class ThermostatSwitchDescription(ThermostatParameterDescription, SwitchDescription):
129
+ """Represents a thermostat switch description."""
109
130
 
110
- multiplier: float = 1.0
111
- size: int = 1
112
131
 
132
+ class ThermostatSwitch(ThermostatParameter, Switch):
133
+ """Represents a thermostat switch."""
113
134
 
114
- @dataclass
115
- class ThermostatBinaryParameterDescription(
116
- ThermostatParameterDescription, BinaryParameterDescription
117
- ):
118
- """Represents a thermostat binary parameter description."""
135
+ __slots__ = ()
136
+
137
+ description: ThermostatSwitchDescription
119
138
 
120
139
 
121
140
  THERMOSTAT_PARAMETERS: tuple[ThermostatParameterDescription, ...] = (
122
- ThermostatParameterDescription(
141
+ ThermostatNumberDescription(
123
142
  name="mode",
124
143
  ),
125
- ThermostatParameterDescription(
144
+ ThermostatNumberDescription(
126
145
  name="party_target_temp",
127
146
  size=2,
128
147
  multiplier=0.1,
129
148
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
130
149
  ),
131
- ThermostatParameterDescription(
150
+ ThermostatNumberDescription(
132
151
  name="holidays_target_temp",
133
152
  size=2,
134
153
  multiplier=0.1,
135
154
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
136
155
  ),
137
- ThermostatParameterDescription(
156
+ ThermostatNumberDescription(
138
157
  name="correction",
139
158
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
140
159
  ),
141
- ThermostatParameterDescription(
160
+ ThermostatNumberDescription(
142
161
  name="away_timer",
143
162
  unit_of_measurement=UnitOfMeasurement.DAYS,
144
163
  ),
145
- ThermostatParameterDescription(
164
+ ThermostatNumberDescription(
146
165
  name="airing_timer",
147
166
  unit_of_measurement=UnitOfMeasurement.DAYS,
148
167
  ),
149
- ThermostatParameterDescription(
168
+ ThermostatNumberDescription(
150
169
  name="party_timer",
151
170
  unit_of_measurement=UnitOfMeasurement.DAYS,
152
171
  ),
153
- ThermostatParameterDescription(
172
+ ThermostatNumberDescription(
154
173
  name="holidays_timer",
155
174
  unit_of_measurement=UnitOfMeasurement.DAYS,
156
175
  ),
157
- ThermostatParameterDescription(
176
+ ThermostatNumberDescription(
158
177
  name="hysteresis",
159
178
  multiplier=0.1,
160
179
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
161
180
  ),
162
- ThermostatParameterDescription(
181
+ ThermostatNumberDescription(
163
182
  name="day_target_temp",
164
183
  size=2,
165
184
  multiplier=0.1,
166
185
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
167
186
  ),
168
- ThermostatParameterDescription(
187
+ ThermostatNumberDescription(
169
188
  name="night_target_temp",
170
189
  size=2,
171
190
  multiplier=0.1,
172
191
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
173
192
  ),
174
- ThermostatParameterDescription(
193
+ ThermostatNumberDescription(
175
194
  name="antifreeze_target_temp",
176
195
  size=2,
177
196
  multiplier=0.1,
178
197
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
179
198
  ),
180
- ThermostatParameterDescription(
199
+ ThermostatNumberDescription(
181
200
  name="heating_target_temp",
182
201
  size=2,
183
202
  multiplier=0.1,
184
203
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
185
204
  ),
186
- ThermostatParameterDescription(
205
+ ThermostatNumberDescription(
187
206
  name="heating_timer",
188
207
  ),
189
- ThermostatParameterDescription(
208
+ ThermostatNumberDescription(
190
209
  name="off_timer",
191
210
  ),
192
211
  )