PyPlumIO 0.5.40__py3-none-any.whl → 0.5.42__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.
pyplumio/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.5.40'
21
- __version_tuple__ = version_tuple = (0, 5, 40)
20
+ __version__ = version = '0.5.42'
21
+ __version_tuple__ = version_tuple = (0, 5, 42)
@@ -13,6 +13,7 @@ from typing_extensions import TypeAlias
13
13
 
14
14
  from pyplumio.const import BYTE_UNDEFINED, STATE_OFF, STATE_ON, State, UnitOfMeasurement
15
15
  from pyplumio.frames import Request
16
+ from pyplumio.utils import is_divisible
16
17
 
17
18
  if TYPE_CHECKING:
18
19
  from pyplumio.devices import Device
@@ -47,17 +48,6 @@ def is_valid_parameter(data: bytearray) -> bool:
47
48
  return any(x for x in data if x != BYTE_UNDEFINED)
48
49
 
49
50
 
50
- def parameter_value_to_int(value: NumericType | State | bool) -> int:
51
- """Convert a parameter value to an integer.
52
-
53
- If the value is STATE_OFF or STATE_ON, it returns 0 or 1 respectively.
54
- """
55
- if value in get_args(State):
56
- return 1 if value == STATE_ON else 0
57
-
58
- return int(value)
59
-
60
-
61
51
  @dataclass
62
52
  class ParameterValues:
63
53
  """Represents a parameter values."""
@@ -125,7 +115,7 @@ class Parameter(ABC):
125
115
 
126
116
  if isinstance(other, (int, float, bool)) or other in get_args(State):
127
117
  handler = getattr(self.values.value, method_to_call)
128
- return handler(parameter_value_to_int(other))
118
+ return handler(self._pack_value(other))
129
119
  else:
130
120
  return NotImplemented
131
121
 
@@ -180,25 +170,16 @@ class Parameter(ABC):
180
170
  )
181
171
  return type(self)(self.device, self.description, values)
182
172
 
183
- def validate(self, value: NumericType | State | bool) -> int:
184
- """Validate a parameter value."""
185
- int_value = parameter_value_to_int(value)
186
- if int_value < self.values.min_value or int_value > self.values.max_value:
187
- raise ValueError(
188
- f"Invalid value: {value}. Must be between "
189
- f"{self.min_value} and {self.max_value}."
190
- )
191
-
192
- return int_value
193
-
194
173
  async def set(self, value: Any, retries: int = 5, timeout: float = 5.0) -> bool:
195
174
  """Set a parameter value."""
196
- return await self._attempt_update(self.validate(value), retries, timeout)
175
+ self.validate(value)
176
+ return await self._attempt_update(self._pack_value(value), retries, timeout)
197
177
 
198
178
  def set_nowait(self, value: Any, retries: int = 5, timeout: float = 5.0) -> None:
199
179
  """Set a parameter value without waiting."""
180
+ self.validate(value)
200
181
  self.device.create_task(
201
- self._attempt_update(self.validate(value), retries, timeout)
182
+ self._attempt_update(self._pack_value(value), retries, timeout)
202
183
  )
203
184
 
204
185
  async def _attempt_update(
@@ -269,6 +250,18 @@ class Parameter(ABC):
269
250
 
270
251
  return parameter
271
252
 
253
+ @abstractmethod
254
+ def _pack_value(self, value: Any) -> int:
255
+ """Pack the parameter value."""
256
+
257
+ @abstractmethod
258
+ def _unpack_value(self, value: int) -> Any:
259
+ """Unpack the parameter value."""
260
+
261
+ @abstractmethod
262
+ def validate(self, value: Any) -> bool:
263
+ """Validate a parameter value."""
264
+
272
265
  @property
273
266
  @abstractmethod
274
267
  def value(self) -> NumericType | State | bool:
@@ -294,6 +287,8 @@ class Parameter(ABC):
294
287
  class NumberDescription(ParameterDescription):
295
288
  """Represents a parameter description."""
296
289
 
290
+ step: float = 1.0
291
+ precision: int = 6
297
292
  unit_of_measurement: UnitOfMeasurement | Literal["%"] | None = None
298
293
 
299
294
 
@@ -304,6 +299,30 @@ class Number(Parameter):
304
299
 
305
300
  description: NumberDescription
306
301
 
302
+ def _pack_value(self, value: NumericType) -> int:
303
+ """Pack the parameter value."""
304
+ return int(round(value / self.description.step))
305
+
306
+ def _unpack_value(self, value: int) -> NumericType:
307
+ """Unpack the parameter value."""
308
+ return round(value * self.description.step, self.description.precision)
309
+
310
+ def validate(self, value: Any) -> bool:
311
+ """Validate a parameter value."""
312
+ if value < self.min_value or value > self.max_value:
313
+ raise ValueError(
314
+ f"Invalid value: {value}. The value must be between {self.min_value} "
315
+ f"and {self.max_value}."
316
+ )
317
+
318
+ if not is_divisible(value, self.description.step, self.description.precision):
319
+ raise ValueError(
320
+ f"Invalid value: {value}. The value must be adjusted in increments of "
321
+ f"{self.description.step}."
322
+ )
323
+
324
+ return True
325
+
307
326
  async def set(
308
327
  self, value: NumericType, retries: int = 5, timeout: float = 5.0
309
328
  ) -> bool:
@@ -323,17 +342,17 @@ class Number(Parameter):
323
342
  @property
324
343
  def value(self) -> NumericType:
325
344
  """Return the value."""
326
- return self.values.value
345
+ return self._unpack_value(self.values.value)
327
346
 
328
347
  @property
329
348
  def min_value(self) -> NumericType:
330
349
  """Return the minimum allowed value."""
331
- return self.values.min_value
350
+ return self._unpack_value(self.values.min_value)
332
351
 
333
352
  @property
334
353
  def max_value(self) -> NumericType:
335
354
  """Return the maximum allowed value."""
336
- return self.values.max_value
355
+ return self._unpack_value(self.values.max_value)
337
356
 
338
357
  @property
339
358
  def unit_of_measurement(self) -> UnitOfMeasurement | Literal["%"] | None:
@@ -354,6 +373,24 @@ class Switch(Parameter):
354
373
 
355
374
  description: SwitchDescription
356
375
 
376
+ def _pack_value(self, value: State | bool) -> int:
377
+ """Pack the parameter value."""
378
+ if value in get_args(State):
379
+ return 1 if value == STATE_ON else 0
380
+
381
+ return int(value)
382
+
383
+ def _unpack_value(self, value: int) -> State:
384
+ """Unpack the parameter value."""
385
+ return STATE_ON if value == 1 else STATE_OFF
386
+
387
+ def validate(self, value: Any) -> bool:
388
+ """Validate a parameter value."""
389
+ if not isinstance(value, bool) and value not in get_args(State):
390
+ raise ValueError(f"Invalid switch value: {value}. Must be 'on' or 'off'.")
391
+
392
+ return True
393
+
357
394
  async def set(
358
395
  self, value: State | bool, retries: int = 5, timeout: float = 5.0
359
396
  ) -> bool:
@@ -399,7 +436,7 @@ class Switch(Parameter):
399
436
  @property
400
437
  def value(self) -> State:
401
438
  """Return the value."""
402
- return STATE_ON if self.values.value == 1 else STATE_OFF
439
+ return self._unpack_value(self.values.value)
403
440
 
404
441
  @property
405
442
  def min_value(self) -> Literal["off"]:
@@ -23,6 +23,7 @@ from pyplumio.frames import Request
23
23
  from pyplumio.helpers.parameter import (
24
24
  Number,
25
25
  NumberDescription,
26
+ NumericType,
26
27
  Parameter,
27
28
  ParameterDescription,
28
29
  ParameterValues,
@@ -89,9 +90,7 @@ class EcomaxParameter(Parameter):
89
90
  class EcomaxNumberDescription(EcomaxParameterDescription, NumberDescription):
90
91
  """Represents an ecoMAX number description."""
91
92
 
92
- multiplier: float = 1.0
93
93
  offset: int = 0
94
- precision: int = 6
95
94
 
96
95
 
97
96
  class EcomaxNumber(EcomaxParameter, Number):
@@ -101,31 +100,13 @@ class EcomaxNumber(EcomaxParameter, Number):
101
100
 
102
101
  description: EcomaxNumberDescription
103
102
 
104
- async def set(
105
- self, value: float | int, retries: int = 5, timeout: float = 5.0
106
- ) -> bool:
107
- """Set a parameter value."""
108
- value += self.description.offset
109
- value = round(value / self.description.multiplier, self.description.precision)
110
- return await super().set(value, retries, timeout)
111
-
112
- @property
113
- def value(self) -> float:
114
- """Return the value."""
115
- value = self.values.value - self.description.offset
116
- return round(value * self.description.multiplier, self.description.precision)
117
-
118
- @property
119
- def min_value(self) -> float:
120
- """Return the minimum allowed value."""
121
- value = self.values.min_value - self.description.offset
122
- return round(value * self.description.multiplier, self.description.precision)
123
-
124
- @property
125
- def max_value(self) -> float:
126
- """Return the maximum allowed value."""
127
- value = self.values.max_value - self.description.offset
128
- return round(value * self.description.multiplier, self.description.precision)
103
+ def _pack_value(self, value: NumericType) -> int:
104
+ """Pack the parameter value."""
105
+ return super()._pack_value(value + self.description.offset)
106
+
107
+ def _unpack_value(self, value: int) -> NumericType:
108
+ """Unpack the parameter value."""
109
+ return super()._unpack_value(value - self.description.offset)
129
110
 
130
111
 
131
112
  @dataslots
@@ -468,8 +449,8 @@ ECOMAX_PARAMETERS: dict[ProductType, tuple[EcomaxParameterDescription, ...]] = {
468
449
  ),
469
450
  EcomaxNumberDescription(
470
451
  name="max_fuel_flow",
471
- multiplier=20,
472
- unit_of_measurement=UnitOfMeasurement.GRAMS,
452
+ step=0.2,
453
+ unit_of_measurement=UnitOfMeasurement.KILOGRAMS_PER_HOUR,
473
454
  ),
474
455
  EcomaxNumberDescription(
475
456
  name="feeder_calibration",
@@ -479,7 +460,7 @@ ECOMAX_PARAMETERS: dict[ProductType, tuple[EcomaxParameterDescription, ...]] = {
479
460
  ),
480
461
  EcomaxNumberDescription(
481
462
  name="fuel_calorific_value",
482
- multiplier=0.1,
463
+ step=0.1,
483
464
  unit_of_measurement=UnitOfMeasurement.KILO_WATT_HOUR_PER_KILOGRAM,
484
465
  ),
485
466
  EcomaxNumberDescription(
@@ -546,7 +527,7 @@ ECOMAX_PARAMETERS: dict[ProductType, tuple[EcomaxParameterDescription, ...]] = {
546
527
  ),
547
528
  EcomaxNumberDescription(
548
529
  name="heating_curve",
549
- multiplier=0.1,
530
+ step=0.1,
550
531
  ),
551
532
  EcomaxNumberDescription(
552
533
  name="heating_curve_shift",
@@ -703,12 +684,12 @@ ECOMAX_PARAMETERS: dict[ProductType, tuple[EcomaxParameterDescription, ...]] = {
703
684
  ),
704
685
  EcomaxNumberDescription(
705
686
  name="solar_pump_on_delta_temp",
706
- multiplier=0.1,
687
+ step=0.1,
707
688
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
708
689
  ),
709
690
  EcomaxNumberDescription(
710
691
  name="solar_pump_off_delta_temp",
711
- multiplier=0.1,
692
+ step=0.1,
712
693
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
713
694
  ),
714
695
  EcomaxNumberDescription(
@@ -801,7 +782,7 @@ ECOMAX_PARAMETERS: dict[ProductType, tuple[EcomaxParameterDescription, ...]] = {
801
782
  ),
802
783
  EcomaxNumberDescription(
803
784
  name="thermostat_hysteresis",
804
- multiplier=0.1,
785
+ step=0.1,
805
786
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
806
787
  ),
807
788
  EcomaxNumberDescription(
@@ -20,6 +20,7 @@ from pyplumio.frames import Request
20
20
  from pyplumio.helpers.parameter import (
21
21
  Number,
22
22
  NumberDescription,
23
+ NumericType,
23
24
  Parameter,
24
25
  ParameterDescription,
25
26
  ParameterValues,
@@ -71,9 +72,7 @@ class MixerParameter(Parameter):
71
72
  class MixerNumberDescription(MixerParameterDescription, NumberDescription):
72
73
  """Represent a mixer number description."""
73
74
 
74
- multiplier: float = 1.0
75
75
  offset: int = 0
76
- precision: int = 6
77
76
 
78
77
 
79
78
  class MixerNumber(MixerParameter, Number):
@@ -83,31 +82,13 @@ class MixerNumber(MixerParameter, Number):
83
82
 
84
83
  description: MixerNumberDescription
85
84
 
86
- async def set(
87
- self, value: int | float, retries: int = 5, timeout: float = 5.0
88
- ) -> bool:
89
- """Set a parameter value."""
90
- value += self.description.offset
91
- value = round(value / self.description.multiplier, self.description.precision)
92
- return await super().set(value, retries, timeout)
93
-
94
- @property
95
- def value(self) -> float:
96
- """Return the parameter value."""
97
- value = self.values.value - self.description.offset
98
- return round(value * self.description.multiplier, self.description.precision)
99
-
100
- @property
101
- def min_value(self) -> float:
102
- """Return the minimum allowed value."""
103
- value = self.values.min_value - self.description.offset
104
- return round(value * self.description.multiplier, self.description.precision)
105
-
106
- @property
107
- def max_value(self) -> float:
108
- """Return the maximum allowed value."""
109
- value = self.values.max_value - self.description.offset
110
- return round(value * self.description.multiplier, self.description.precision)
85
+ def _pack_value(self, value: NumericType) -> int:
86
+ """Pack the parameter value."""
87
+ return super()._pack_value(value + self.description.offset)
88
+
89
+ def _unpack_value(self, value: int) -> NumericType:
90
+ """Unpack the parameter value."""
91
+ return super()._unpack_value(value - self.description.offset)
111
92
 
112
93
 
113
94
  @dataslots
@@ -147,7 +128,7 @@ MIXER_PARAMETERS: dict[ProductType, tuple[MixerParameterDescription, ...]] = {
147
128
  ),
148
129
  MixerNumberDescription(
149
130
  name="heating_curve",
150
- multiplier=0.1,
131
+ step=0.1,
151
132
  ),
152
133
  MixerNumberDescription(
153
134
  name="heating_curve_shift",
@@ -162,7 +143,7 @@ MIXER_PARAMETERS: dict[ProductType, tuple[MixerParameterDescription, ...]] = {
162
143
  ),
163
144
  MixerNumberDescription(
164
145
  name="mixer_input_dead_zone",
165
- multiplier=0.1,
146
+ step=0.1,
166
147
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
167
148
  ),
168
149
  MixerSwitchDescription(
@@ -232,7 +213,7 @@ MIXER_PARAMETERS: dict[ProductType, tuple[MixerParameterDescription, ...]] = {
232
213
  ),
233
214
  MixerNumberDescription(
234
215
  name="mixer_input_dead_zone",
235
- multiplier=0.1,
216
+ step=0.1,
236
217
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
237
218
  ),
238
219
  MixerNumberDescription(
@@ -243,7 +224,7 @@ MIXER_PARAMETERS: dict[ProductType, tuple[MixerParameterDescription, ...]] = {
243
224
  ),
244
225
  MixerNumberDescription(
245
226
  name="heating_curve",
246
- multiplier=0.1,
227
+ step=0.1,
247
228
  ),
248
229
  MixerNumberDescription(
249
230
  name="heating_curve_shift",
@@ -92,9 +92,6 @@ class ThermostatParameter(Parameter):
92
92
  class ThermostatNumberDescription(ThermostatParameterDescription, NumberDescription):
93
93
  """Represent a thermostat number description."""
94
94
 
95
- multiplier: float = 1.0
96
- precision: int = 6
97
-
98
95
 
99
96
  class ThermostatNumber(ThermostatParameter, Number):
100
97
  """Represents a thermostat number."""
@@ -103,31 +100,6 @@ class ThermostatNumber(ThermostatParameter, Number):
103
100
 
104
101
  description: ThermostatNumberDescription
105
102
 
106
- async def set(
107
- self, value: int | float, retries: int = 5, timeout: float = 5.0
108
- ) -> bool:
109
- """Set a parameter value."""
110
- value = round(value / self.description.multiplier, self.description.precision)
111
- return await super().set(value, retries, timeout)
112
-
113
- @property
114
- def value(self) -> float:
115
- """Return the value."""
116
- value = self.values.value * self.description.multiplier
117
- return round(value, self.description.precision)
118
-
119
- @property
120
- def min_value(self) -> float:
121
- """Return the minimum allowed value."""
122
- value = self.values.min_value * self.description.multiplier
123
- return round(value, self.description.precision)
124
-
125
- @property
126
- def max_value(self) -> float:
127
- """Return the maximum allowed value."""
128
- value = self.values.max_value * self.description.multiplier
129
- return round(value, self.description.precision)
130
-
131
103
 
132
104
  @dataslots
133
105
  @dataclass
@@ -150,13 +122,13 @@ THERMOSTAT_PARAMETERS: tuple[ThermostatParameterDescription, ...] = (
150
122
  ThermostatNumberDescription(
151
123
  name="party_target_temp",
152
124
  size=2,
153
- multiplier=0.1,
125
+ step=0.1,
154
126
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
155
127
  ),
156
128
  ThermostatNumberDescription(
157
129
  name="holidays_target_temp",
158
130
  size=2,
159
- multiplier=0.1,
131
+ step=0.1,
160
132
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
161
133
  ),
162
134
  ThermostatNumberDescription(
@@ -181,31 +153,31 @@ THERMOSTAT_PARAMETERS: tuple[ThermostatParameterDescription, ...] = (
181
153
  ),
182
154
  ThermostatNumberDescription(
183
155
  name="hysteresis",
184
- multiplier=0.1,
156
+ step=0.1,
185
157
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
186
158
  ),
187
159
  ThermostatNumberDescription(
188
160
  name="day_target_temp",
189
161
  size=2,
190
- multiplier=0.1,
162
+ step=0.1,
191
163
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
192
164
  ),
193
165
  ThermostatNumberDescription(
194
166
  name="night_target_temp",
195
167
  size=2,
196
- multiplier=0.1,
168
+ step=0.1,
197
169
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
198
170
  ),
199
171
  ThermostatNumberDescription(
200
172
  name="antifreeze_target_temp",
201
173
  size=2,
202
- multiplier=0.1,
174
+ step=0.1,
203
175
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
204
176
  ),
205
177
  ThermostatNumberDescription(
206
178
  name="heating_target_temp",
207
179
  size=2,
208
- multiplier=0.1,
180
+ step=0.1,
209
181
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
210
182
  ),
211
183
  ThermostatNumberDescription(
pyplumio/utils.py CHANGED
@@ -28,3 +28,14 @@ def ensure_dict(initial: dict[KT, VT] | None, *args: dict[KT, VT]) -> dict[KT, V
28
28
  data |= extra
29
29
 
30
30
  return data
31
+
32
+
33
+ def is_divisible(a: float, b: float, precision: int = 6) -> bool:
34
+ """Check if a is divisible by b."""
35
+ scale: int = 10**precision
36
+ b_scaled = round(b * scale)
37
+ if b_scaled == 0:
38
+ raise ValueError("Division by zero is not allowed.")
39
+
40
+ a_scaled = round(a * scale)
41
+ return a_scaled % b_scaled == 0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyPlumIO
3
- Version: 0.5.40
3
+ Version: 0.5.42
4
4
  Summary: PyPlumIO is a native ecoNET library for Plum ecoMAX controllers.
5
5
  Author-email: Denis Paavilainen <denpa@denpa.pro>
6
6
  License: MIT License
@@ -1,6 +1,6 @@
1
1
  pyplumio/__init__.py,sha256=3ibJ43RIdfFrWp1PAsQixybAA--NPRw43B5OdLOwsU8,3319
2
2
  pyplumio/__main__.py,sha256=3IwHHSq-iay5FaeMc95klobe-xv82yydSKcBE7BFZ6M,500
3
- pyplumio/_version.py,sha256=8SkoQ1bDYnZ1291QdHGZtZ3GhfZXANAptFoTzlxDmOw,513
3
+ pyplumio/_version.py,sha256=a_t6VzKNKwRmdztAoxQ2F5XjG1X3ma68qioTXtwboxc,513
4
4
  pyplumio/connection.py,sha256=-dbrIK6ewoYNeBQod9ZmXT8JkxMKbcS6nosINFsg9RI,5972
5
5
  pyplumio/const.py,sha256=26s1TJF7IJa6o1pjDmHaAzPgMJ5c-fb0jeSkzDQ6Bic,5577
6
6
  pyplumio/exceptions.py,sha256=_B_0EgxDxd2XyYv3WpZM733q0cML5m6J-f55QOvYRpI,996
@@ -8,7 +8,7 @@ pyplumio/filters.py,sha256=AMW1zHQ1YjJfHX7e87Dhv7AGixJ3y9Vn-_JAQn7vIsg,12526
8
8
  pyplumio/protocol.py,sha256=VRxrj8vZ1FMawqblKkyxg_V61TBSvVynd9u0JXYnMUU,8090
9
9
  pyplumio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  pyplumio/stream.py,sha256=Ne-mWkO6FpILAjGdagbAh_VL3QEla-eDiT2N-kOc5o4,4883
11
- pyplumio/utils.py,sha256=TnBzRopinyp92wruguijxcIYmaeyNVTFX0dygI5FCMU,823
11
+ pyplumio/utils.py,sha256=psvR5hTJGs8Hi3xv7dH58S7BVFv14qIZLZmiHCdPgdY,1146
12
12
  pyplumio/devices/__init__.py,sha256=Erjd3DeEop_yelnLtRRaPbwMIuD1NwVh7dMM1_2KxtI,8155
13
13
  pyplumio/devices/ecomax.py,sha256=0LCVeTMzC1isu0HE_MHp7bEXJXUCinXNWVVFTn4k92E,15855
14
14
  pyplumio/devices/ecoster.py,sha256=jNWli7ye9T6yfkcFJZhhUHH7KOv-L6AgYFp_dKyv3OM,263
@@ -22,7 +22,7 @@ pyplumio/helpers/__init__.py,sha256=H2xxdkF-9uADLwEbfBUoxNTdwru3L5Z2cfJjgsuRsn0,
22
22
  pyplumio/helpers/data_types.py,sha256=nB3afOLmppgSCWkZoX1-1yWPNMMNSem77x7XQ1Mi8H8,9103
23
23
  pyplumio/helpers/event_manager.py,sha256=xQOfiP_nP1Pz5zhB6HU5gXyyJXjhisYshL8_HRxDgt8,6412
24
24
  pyplumio/helpers/factory.py,sha256=9uXUmVRvPkg9IyrfYYVbz9wsYAXltMTXkm1x82dhMyA,1126
25
- pyplumio/helpers/parameter.py,sha256=zfcSJK-55uwJTcLYMY5e7Zwr4M4SQXq8bsM4pnHZ7aQ,12689
25
+ pyplumio/helpers/parameter.py,sha256=pvZPT06o7jbpmFo3C0OtHq8OAJPo-gbXFPo7yvL3DYc,14029
26
26
  pyplumio/helpers/schedule.py,sha256=Dl28p3iz8okr5AT5v78WiJv6ggYlO-f2Jk6r5t1wY0A,5266
27
27
  pyplumio/helpers/task_manager.py,sha256=HAd69yGTRL0zQsu-ywnbLu1UXiJzgHWuhYWA--vs4lQ,1181
28
28
  pyplumio/helpers/timeout.py,sha256=JAhWNtIpcXyVILIwHWVy5mYofqbbRDGKLdTUKkQuajs,772
@@ -31,13 +31,13 @@ pyplumio/structures/__init__.py,sha256=EjK-5qJZ0F7lpP2b6epvTMg9cIBl4Kn91nqNkEcLw
31
31
  pyplumio/structures/alerts.py,sha256=O4P0sbBu1g7AN_AApcViy9CcrY5Vry_LZJgidNUF7Co,3664
32
32
  pyplumio/structures/boiler_load.py,sha256=p3mOzZUU-g7A2tG_yp8podEqpI81hlsOZmHELyPNRY8,838
33
33
  pyplumio/structures/boiler_power.py,sha256=72qsvccg49FdRdXv2f2K5sGpjT7wAOLFjlIGWpO-DVg,901
34
- pyplumio/structures/ecomax_parameters.py,sha256=4hsLM8pgcLrfYL0loLqTH4kMSdVzOThu5SL_QTodSYs,27997
34
+ pyplumio/structures/ecomax_parameters.py,sha256=_QWlwJm_IhQJ744vx6-WZb96kxjrEKleNteiE0wqLZE,27225
35
35
  pyplumio/structures/fan_power.py,sha256=Q5fv-7_2NVuLeQPIVIylvgN7M8-a9D8rRUE0QGjyS3w,871
36
36
  pyplumio/structures/frame_versions.py,sha256=hbcVuhuPNy5qd39Vk7w4WdPCW-TNx1cAYWzA2mXocyk,1548
37
37
  pyplumio/structures/fuel_consumption.py,sha256=_p2dI4H67Eopn7IF0Gj77A8c_8lNKhhDDAtmugxLd4s,976
38
38
  pyplumio/structures/fuel_level.py,sha256=mJpp1dnRD1wXi_6EyNX7TNXosjcr905rSHOnuZ5VD74,1069
39
39
  pyplumio/structures/lambda_sensor.py,sha256=JNSCiBJoM8Uk3OGbmFIigaLOntQST5U_UrmCpaQBlM0,1595
40
- pyplumio/structures/mixer_parameters.py,sha256=idF3tYukfAz1EM1CE-hZBjjmGrNZN6X1MlcZr3FHrzA,9089
40
+ pyplumio/structures/mixer_parameters.py,sha256=-ZevCkrcUemmK7RIhGtVJyVgMNc4-Kxfk5ZEUvQ1wTw,8305
41
41
  pyplumio/structures/mixer_sensors.py,sha256=-cN7U-Fr2fmAQ5McQL7bZUC8CFlb1y8TN0f_dqy3UK0,2312
42
42
  pyplumio/structures/modules.py,sha256=oXUIqrOAV1dZzBV5zUH3HDUSFvNOjpUSx0TF9nZVnbs,2569
43
43
  pyplumio/structures/network_info.py,sha256=kPxmIaDGm5SyLRKVFzcrODlUtB0u5JjiZqekoKSyDpA,4159
@@ -51,10 +51,10 @@ pyplumio/structures/regulator_data_schema.py,sha256=XM6M9ep3NyogbLPqp88mMTg8Sa9e
51
51
  pyplumio/structures/schedules.py,sha256=_D8HmxMVvAAPb0cc_xSxXFRNwR9u-RWuyTy0Z5KscUk,6717
52
52
  pyplumio/structures/statuses.py,sha256=wkoynyMRr1VREwfBC6vU48kPA8ZQ83pcXuciy2xHJrk,1166
53
53
  pyplumio/structures/temperatures.py,sha256=1CDzehNmbALz1Jyt_9gZNIk52q6Wv-xQXjijVDCVYec,2337
54
- pyplumio/structures/thermostat_parameters.py,sha256=QA-ZyulBG3P10sqgdI7rmpQYlKm9SJIXxBxAXs8Bwow,8295
54
+ pyplumio/structures/thermostat_parameters.py,sha256=Hy07KU7wbUBtpX4pkPlnT7lIxiqtj6pEkGxRArfsIfc,7272
55
55
  pyplumio/structures/thermostat_sensors.py,sha256=8e1TxYIJTQKT0kIGO9gG4hGdLOBUpIhiPToQyOMyeNE,3237
56
- pyplumio-0.5.40.dist-info/licenses/LICENSE,sha256=m-UuZFjXJ22uPTGm9kSHS8bqjsf5T8k2wL9bJn1Y04o,1088
57
- pyplumio-0.5.40.dist-info/METADATA,sha256=z0l9YkCbECUiLHaMMZLRsNai2Tty9lh8m-Ms9L7qF68,5532
58
- pyplumio-0.5.40.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
59
- pyplumio-0.5.40.dist-info/top_level.txt,sha256=kNBz9UPPkPD9teDn3U_sEy5LjzwLm9KfADCXtBlbw8A,9
60
- pyplumio-0.5.40.dist-info/RECORD,,
56
+ pyplumio-0.5.42.dist-info/licenses/LICENSE,sha256=m-UuZFjXJ22uPTGm9kSHS8bqjsf5T8k2wL9bJn1Y04o,1088
57
+ pyplumio-0.5.42.dist-info/METADATA,sha256=oj8ixR7GtUtp7-7RHf1TQ7ByQ8TVm-_vkinabJ8vkE0,5532
58
+ pyplumio-0.5.42.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
59
+ pyplumio-0.5.42.dist-info/top_level.txt,sha256=kNBz9UPPkPD9teDn3U_sEy5LjzwLm9KfADCXtBlbw8A,9
60
+ pyplumio-0.5.42.dist-info/RECORD,,