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 +2 -2
- pyplumio/helpers/parameter.py +66 -29
- pyplumio/structures/ecomax_parameters.py +15 -34
- pyplumio/structures/mixer_parameters.py +12 -31
- pyplumio/structures/thermostat_parameters.py +7 -35
- pyplumio/utils.py +11 -0
- {pyplumio-0.5.40.dist-info → pyplumio-0.5.42.dist-info}/METADATA +1 -1
- {pyplumio-0.5.40.dist-info → pyplumio-0.5.42.dist-info}/RECORD +11 -11
- {pyplumio-0.5.40.dist-info → pyplumio-0.5.42.dist-info}/WHEEL +0 -0
- {pyplumio-0.5.40.dist-info → pyplumio-0.5.42.dist-info}/licenses/LICENSE +0 -0
- {pyplumio-0.5.40.dist-info → pyplumio-0.5.42.dist-info}/top_level.txt +0 -0
pyplumio/_version.py
CHANGED
pyplumio/helpers/parameter.py
CHANGED
@@ -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(
|
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
|
-
|
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.
|
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
|
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
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
return
|
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
|
-
|
472
|
-
unit_of_measurement=UnitOfMeasurement.
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
return
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
pyplumio/__init__.py,sha256=3ibJ43RIdfFrWp1PAsQixybAA--NPRw43B5OdLOwsU8,3319
|
2
2
|
pyplumio/__main__.py,sha256=3IwHHSq-iay5FaeMc95klobe-xv82yydSKcBE7BFZ6M,500
|
3
|
-
pyplumio/_version.py,sha256=
|
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=
|
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=
|
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=
|
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
|
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=
|
54
|
+
pyplumio/structures/thermostat_parameters.py,sha256=Hy07KU7wbUBtpX4pkPlnT7lIxiqtj6pEkGxRArfsIfc,7272
|
55
55
|
pyplumio/structures/thermostat_sensors.py,sha256=8e1TxYIJTQKT0kIGO9gG4hGdLOBUpIhiPToQyOMyeNE,3237
|
56
|
-
pyplumio-0.5.
|
57
|
-
pyplumio-0.5.
|
58
|
-
pyplumio-0.5.
|
59
|
-
pyplumio-0.5.
|
60
|
-
pyplumio-0.5.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|