PyPlumIO 0.5.21__py3-none-any.whl → 0.5.22__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-0.5.21.dist-info → PyPlumIO-0.5.22.dist-info}/METADATA +7 -7
- PyPlumIO-0.5.22.dist-info/RECORD +60 -0
- {PyPlumIO-0.5.21.dist-info → PyPlumIO-0.5.22.dist-info}/WHEEL +1 -1
- pyplumio/__init__.py +2 -2
- pyplumio/_version.py +2 -2
- pyplumio/connection.py +2 -10
- pyplumio/devices/__init__.py +14 -14
- pyplumio/devices/ecomax.py +117 -117
- pyplumio/devices/mixer.py +47 -41
- pyplumio/devices/thermostat.py +33 -32
- pyplumio/exceptions.py +9 -9
- pyplumio/filters.py +56 -37
- pyplumio/frames/__init__.py +6 -6
- pyplumio/frames/messages.py +4 -6
- pyplumio/helpers/data_types.py +8 -7
- pyplumio/helpers/event_manager.py +36 -25
- pyplumio/helpers/parameter.py +43 -16
- pyplumio/helpers/task_manager.py +7 -2
- pyplumio/helpers/timeout.py +0 -3
- pyplumio/helpers/uid.py +2 -2
- pyplumio/protocol.py +32 -26
- pyplumio/stream.py +2 -2
- pyplumio/structures/alerts.py +40 -31
- pyplumio/structures/ecomax_parameters.py +321 -131
- pyplumio/structures/frame_versions.py +5 -6
- pyplumio/structures/lambda_sensor.py +6 -6
- pyplumio/structures/mixer_parameters.py +74 -28
- pyplumio/structures/network_info.py +2 -3
- pyplumio/structures/product_info.py +0 -4
- pyplumio/structures/program_version.py +24 -17
- pyplumio/structures/thermostat_parameters.py +25 -12
- pyplumio/utils.py +12 -7
- PyPlumIO-0.5.21.dist-info/RECORD +0 -61
- pyplumio/helpers/typing.py +0 -29
- {PyPlumIO-0.5.21.dist-info → PyPlumIO-0.5.22.dist-info}/LICENSE +0 -0
- {PyPlumIO-0.5.21.dist-info → PyPlumIO-0.5.22.dist-info}/top_level.txt +0 -0
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
from __future__ import annotations
|
4
4
|
|
5
|
+
from contextlib import suppress
|
5
6
|
from typing import Any, Final
|
6
7
|
|
7
8
|
from pyplumio.const import FrameType
|
@@ -21,15 +22,13 @@ class FrameVersionsStructure(StructureDecoder):
|
|
21
22
|
|
22
23
|
def _unpack_frame_versions(self, message: bytearray) -> tuple[FrameType | int, int]:
|
23
24
|
"""Unpack frame versions."""
|
24
|
-
|
25
|
-
frame_type = message[self._offset]
|
26
|
-
frame_type = FrameType(frame_type)
|
27
|
-
except ValueError:
|
28
|
-
pass
|
29
|
-
|
25
|
+
frame_type = message[self._offset]
|
30
26
|
self._offset += 1
|
31
27
|
version = UnsignedShort.from_bytes(message, self._offset)
|
32
28
|
self._offset += version.size
|
29
|
+
with suppress(ValueError):
|
30
|
+
frame_type = FrameType(frame_type)
|
31
|
+
|
33
32
|
return frame_type, version.value
|
34
33
|
|
35
34
|
def decode(
|
@@ -30,22 +30,22 @@ class LambdaSensorStructure(StructureDecoder):
|
|
30
30
|
if lambda_state == BYTE_UNDEFINED:
|
31
31
|
return ensure_dict(data), offset
|
32
32
|
|
33
|
-
with suppress(ValueError):
|
34
|
-
lambda_state = LambdaState(lambda_state)
|
35
|
-
|
36
33
|
lambda_target = message[offset]
|
37
34
|
offset += 1
|
38
35
|
level = UnsignedShort.from_bytes(message, offset)
|
39
36
|
offset += level.size
|
37
|
+
with suppress(ValueError):
|
38
|
+
lambda_state = LambdaState(lambda_state)
|
39
|
+
|
40
40
|
return (
|
41
41
|
ensure_dict(
|
42
42
|
data,
|
43
43
|
{
|
44
44
|
ATTR_LAMBDA_STATE: lambda_state,
|
45
45
|
ATTR_LAMBDA_TARGET: lambda_target,
|
46
|
-
ATTR_LAMBDA_LEVEL:
|
47
|
-
|
48
|
-
|
46
|
+
ATTR_LAMBDA_LEVEL: (
|
47
|
+
None if math.isnan(level.value) else (level.value / 10)
|
48
|
+
),
|
49
49
|
},
|
50
50
|
),
|
51
51
|
offset,
|
@@ -21,9 +21,9 @@ from pyplumio.helpers.parameter import (
|
|
21
21
|
Parameter,
|
22
22
|
ParameterDescription,
|
23
23
|
ParameterValues,
|
24
|
+
ParameterValueType,
|
24
25
|
unpack_parameter,
|
25
26
|
)
|
26
|
-
from pyplumio.helpers.typing import ParameterValueType
|
27
27
|
from pyplumio.structures import StructureDecoder
|
28
28
|
from pyplumio.utils import ensure_dict
|
29
29
|
|
@@ -108,57 +108,90 @@ class MixerBinaryParameterDescription(
|
|
108
108
|
MIXER_PARAMETERS: dict[ProductType, tuple[MixerParameterDescription, ...]] = {
|
109
109
|
ProductType.ECOMAX_P: (
|
110
110
|
MixerParameterDescription(
|
111
|
-
name="mixer_target_temp",
|
111
|
+
name="mixer_target_temp",
|
112
|
+
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
112
113
|
),
|
113
114
|
MixerParameterDescription(
|
114
|
-
name="min_target_temp",
|
115
|
+
name="min_target_temp",
|
116
|
+
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
115
117
|
),
|
116
118
|
MixerParameterDescription(
|
117
|
-
name="max_target_temp",
|
119
|
+
name="max_target_temp",
|
120
|
+
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
118
121
|
),
|
119
122
|
MixerParameterDescription(
|
120
123
|
name="thermostat_decrease_target_temp",
|
121
124
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
122
125
|
),
|
123
|
-
MixerBinaryParameterDescription(
|
124
|
-
|
126
|
+
MixerBinaryParameterDescription(
|
127
|
+
name="weather_control",
|
128
|
+
),
|
129
|
+
MixerParameterDescription(
|
130
|
+
name="heating_curve",
|
131
|
+
multiplier=0.1,
|
132
|
+
),
|
125
133
|
MixerParameterDescription(
|
126
134
|
name="heating_curve_shift",
|
127
135
|
offset=20,
|
128
136
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
129
137
|
),
|
130
|
-
MixerParameterDescription(
|
131
|
-
|
138
|
+
MixerParameterDescription(
|
139
|
+
name="weather_factor",
|
140
|
+
),
|
141
|
+
MixerParameterDescription(
|
142
|
+
name="work_mode",
|
143
|
+
),
|
132
144
|
MixerParameterDescription(
|
133
145
|
name="mixer_input_dead_zone",
|
134
146
|
multiplier=0.1,
|
135
147
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
136
148
|
),
|
137
|
-
MixerBinaryParameterDescription(
|
138
|
-
|
139
|
-
|
140
|
-
|
149
|
+
MixerBinaryParameterDescription(
|
150
|
+
name="thermostat_operation",
|
151
|
+
),
|
152
|
+
MixerParameterDescription(
|
153
|
+
name="thermostat_mode",
|
154
|
+
),
|
155
|
+
MixerBinaryParameterDescription(
|
156
|
+
name="disable_pump_on_thermostat",
|
157
|
+
),
|
158
|
+
MixerBinaryParameterDescription(
|
159
|
+
name="summer_work",
|
160
|
+
),
|
141
161
|
),
|
142
162
|
ProductType.ECOMAX_I: (
|
143
|
-
MixerParameterDescription(name="work_mode"),
|
144
163
|
MixerParameterDescription(
|
145
|
-
name="
|
164
|
+
name="work_mode",
|
165
|
+
),
|
166
|
+
MixerParameterDescription(
|
167
|
+
name="circuit_target_temp",
|
168
|
+
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
169
|
+
),
|
170
|
+
MixerParameterDescription(
|
171
|
+
name="day_target_temp",
|
172
|
+
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
146
173
|
),
|
147
174
|
MixerParameterDescription(
|
148
|
-
name="
|
175
|
+
name="night_target_temp",
|
176
|
+
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
149
177
|
),
|
150
178
|
MixerParameterDescription(
|
151
|
-
name="
|
179
|
+
name="min_target_temp",
|
180
|
+
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
152
181
|
),
|
153
182
|
MixerParameterDescription(
|
154
|
-
name="
|
183
|
+
name="max_target_temp",
|
184
|
+
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
185
|
+
),
|
186
|
+
MixerBinaryParameterDescription(
|
187
|
+
name="summer_work",
|
188
|
+
),
|
189
|
+
MixerBinaryParameterDescription(
|
190
|
+
name="weather_control",
|
155
191
|
),
|
156
192
|
MixerParameterDescription(
|
157
|
-
name="
|
193
|
+
name="enable_circuit",
|
158
194
|
),
|
159
|
-
MixerBinaryParameterDescription(name="summer_work"),
|
160
|
-
MixerBinaryParameterDescription(name="weather_control"),
|
161
|
-
MixerParameterDescription(name="enable_circuit"),
|
162
195
|
MixerParameterDescription(
|
163
196
|
name="constant_water_preset_temp",
|
164
197
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
@@ -168,26 +201,39 @@ MIXER_PARAMETERS: dict[ProductType, tuple[MixerParameterDescription, ...]] = {
|
|
168
201
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
169
202
|
),
|
170
203
|
MixerParameterDescription(
|
171
|
-
name="thermostat_correction",
|
204
|
+
name="thermostat_correction",
|
205
|
+
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
206
|
+
),
|
207
|
+
MixerBinaryParameterDescription(
|
208
|
+
name="thermostat_pump_lock",
|
172
209
|
),
|
173
|
-
MixerBinaryParameterDescription(name="thermostat_pump_lock"),
|
174
210
|
MixerParameterDescription(
|
175
|
-
name="valve_opening_time",
|
211
|
+
name="valve_opening_time",
|
212
|
+
unit_of_measurement=UnitOfMeasurement.SECONDS,
|
176
213
|
),
|
177
214
|
MixerParameterDescription(
|
178
215
|
name="mixer_input_dead_zone",
|
179
216
|
multiplier=0.1,
|
180
217
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
181
218
|
),
|
182
|
-
MixerParameterDescription(
|
183
|
-
|
184
|
-
|
219
|
+
MixerParameterDescription(
|
220
|
+
name="proportional_range",
|
221
|
+
),
|
222
|
+
MixerParameterDescription(
|
223
|
+
name="integration_time_constant",
|
224
|
+
),
|
225
|
+
MixerParameterDescription(
|
226
|
+
name="heating_curve",
|
227
|
+
multiplier=0.1,
|
228
|
+
),
|
185
229
|
MixerParameterDescription(
|
186
230
|
name="heating_curve_shift",
|
187
231
|
offset=20,
|
188
232
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
189
233
|
),
|
190
|
-
MixerParameterDescription(
|
234
|
+
MixerParameterDescription(
|
235
|
+
name="thermostat_mode",
|
236
|
+
),
|
191
237
|
MixerParameterDescription(
|
192
238
|
name="decreasing_constant_water_temp",
|
193
239
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
@@ -66,9 +66,8 @@ class NetworkInfoStructure(Structure):
|
|
66
66
|
|
67
67
|
def encode(self, data: dict[str, Any]) -> bytearray:
|
68
68
|
"""Encode data to the bytearray message."""
|
69
|
-
message = bytearray()
|
70
|
-
|
71
|
-
network_info = data[ATTR_NETWORK] if ATTR_NETWORK in data else NetworkInfo()
|
69
|
+
message = bytearray(b"\x01")
|
70
|
+
network_info: NetworkInfo = data.get(ATTR_NETWORK, NetworkInfo())
|
72
71
|
message += IPv4(network_info.eth.ip).to_bytes()
|
73
72
|
message += IPv4(network_info.eth.netmask).to_bytes()
|
74
73
|
message += IPv4(network_info.eth.gateway).to_bytes()
|
@@ -53,16 +53,12 @@ class ProductInfoStructure(StructureDecoder):
|
|
53
53
|
"""Decode bytes and return message data and offset."""
|
54
54
|
product_type, product_id = struct.unpack_from("<BH", message)
|
55
55
|
offset += 3
|
56
|
-
|
57
56
|
uid = VarBytes.from_bytes(message, offset)
|
58
57
|
offset += uid.size
|
59
|
-
|
60
58
|
logo = UnsignedShort.from_bytes(message, offset)
|
61
59
|
offset += logo.size
|
62
|
-
|
63
60
|
image = UnsignedShort.from_bytes(message, offset)
|
64
61
|
offset += image.size
|
65
|
-
|
66
62
|
model_name = VarString.from_bytes(message, offset)
|
67
63
|
offset += model_name.size
|
68
64
|
|
@@ -14,7 +14,7 @@ ATTR_VERSION: Final = "version"
|
|
14
14
|
|
15
15
|
VERSION_INFO_SIZE: Final = 15
|
16
16
|
|
17
|
-
SOFTWARE_VERSION:
|
17
|
+
SOFTWARE_VERSION: Final = ".".join(str(x) for x in __version_tuple__[0:3])
|
18
18
|
|
19
19
|
struct_program_version = struct.Struct("<2sB2s3s3HB")
|
20
20
|
|
@@ -38,7 +38,7 @@ class ProgramVersionStructure(Structure):
|
|
38
38
|
def encode(self, data: dict[str, Any]) -> bytearray:
|
39
39
|
"""Encode data to the bytearray message."""
|
40
40
|
message = bytearray(struct_program_version.size)
|
41
|
-
version_info = data
|
41
|
+
version_info: VersionInfo = data.get(ATTR_VERSION, VersionInfo())
|
42
42
|
struct_program_version.pack_into(
|
43
43
|
message,
|
44
44
|
0,
|
@@ -55,22 +55,29 @@ class ProgramVersionStructure(Structure):
|
|
55
55
|
self, message: bytearray, offset: int = 0, data: dict[str, Any] | None = None
|
56
56
|
) -> tuple[dict[str, Any], int]:
|
57
57
|
"""Decode bytes and return message data and offset."""
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
] = struct_program_version.unpack_from(message)
|
69
|
-
version_info.software = ".".join(
|
70
|
-
map(str, [software_version1, software_version2, software_version3])
|
71
|
-
)
|
58
|
+
(
|
59
|
+
struct_tag,
|
60
|
+
struct_version,
|
61
|
+
device_id,
|
62
|
+
processor_signature,
|
63
|
+
software1,
|
64
|
+
software2,
|
65
|
+
software3,
|
66
|
+
_, # recipient
|
67
|
+
) = struct_program_version.unpack_from(message)
|
72
68
|
|
73
69
|
return (
|
74
|
-
ensure_dict(
|
70
|
+
ensure_dict(
|
71
|
+
data,
|
72
|
+
{
|
73
|
+
ATTR_VERSION: VersionInfo(
|
74
|
+
software=".".join(map(str, [software1, software2, software3])),
|
75
|
+
struct_tag=struct_tag,
|
76
|
+
struct_version=struct_version,
|
77
|
+
device_id=device_id,
|
78
|
+
processor_signature=processor_signature,
|
79
|
+
)
|
80
|
+
},
|
81
|
+
),
|
75
82
|
offset + VERSION_INFO_SIZE,
|
76
83
|
)
|
@@ -21,9 +21,9 @@ from pyplumio.helpers.parameter import (
|
|
21
21
|
Parameter,
|
22
22
|
ParameterDescription,
|
23
23
|
ParameterValues,
|
24
|
+
ParameterValueType,
|
24
25
|
unpack_parameter,
|
25
26
|
)
|
26
|
-
from pyplumio.helpers.typing import ParameterValueType
|
27
27
|
from pyplumio.structures import StructureDecoder
|
28
28
|
from pyplumio.structures.thermostat_sensors import ATTR_THERMOSTATS_AVAILABLE
|
29
29
|
from pyplumio.utils import ensure_dict
|
@@ -50,14 +50,14 @@ class ThermostatParameter(Parameter):
|
|
50
50
|
def __init__(
|
51
51
|
self,
|
52
52
|
device: Thermostat,
|
53
|
-
values: ParameterValues,
|
54
53
|
description: ParameterDescription,
|
54
|
+
values: ParameterValues | None = None,
|
55
55
|
index: int = 0,
|
56
56
|
offset: int = 0,
|
57
57
|
):
|
58
58
|
"""Initialize a new thermostat parameter."""
|
59
59
|
self.offset = offset
|
60
|
-
super().__init__(device,
|
60
|
+
super().__init__(device, description, values, index)
|
61
61
|
|
62
62
|
async def create_request(self) -> Request:
|
63
63
|
"""Create a request to change the parameter."""
|
@@ -119,7 +119,9 @@ class ThermostatBinaryParameterDescription(
|
|
119
119
|
|
120
120
|
|
121
121
|
THERMOSTAT_PARAMETERS: tuple[ThermostatParameterDescription, ...] = (
|
122
|
-
ThermostatParameterDescription(
|
122
|
+
ThermostatParameterDescription(
|
123
|
+
name="mode",
|
124
|
+
),
|
123
125
|
ThermostatParameterDescription(
|
124
126
|
name="party_target_temp",
|
125
127
|
size=2,
|
@@ -133,22 +135,29 @@ THERMOSTAT_PARAMETERS: tuple[ThermostatParameterDescription, ...] = (
|
|
133
135
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
134
136
|
),
|
135
137
|
ThermostatParameterDescription(
|
136
|
-
name="correction",
|
138
|
+
name="correction",
|
139
|
+
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
137
140
|
),
|
138
141
|
ThermostatParameterDescription(
|
139
|
-
name="away_timer",
|
142
|
+
name="away_timer",
|
143
|
+
unit_of_measurement=UnitOfMeasurement.DAYS,
|
140
144
|
),
|
141
145
|
ThermostatParameterDescription(
|
142
|
-
name="airing_timer",
|
146
|
+
name="airing_timer",
|
147
|
+
unit_of_measurement=UnitOfMeasurement.DAYS,
|
143
148
|
),
|
144
149
|
ThermostatParameterDescription(
|
145
|
-
name="party_timer",
|
150
|
+
name="party_timer",
|
151
|
+
unit_of_measurement=UnitOfMeasurement.DAYS,
|
146
152
|
),
|
147
153
|
ThermostatParameterDescription(
|
148
|
-
name="holidays_timer",
|
154
|
+
name="holidays_timer",
|
155
|
+
unit_of_measurement=UnitOfMeasurement.DAYS,
|
149
156
|
),
|
150
157
|
ThermostatParameterDescription(
|
151
|
-
name="hysteresis",
|
158
|
+
name="hysteresis",
|
159
|
+
multiplier=0.1,
|
160
|
+
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
152
161
|
),
|
153
162
|
ThermostatParameterDescription(
|
154
163
|
name="day_target_temp",
|
@@ -174,8 +183,12 @@ THERMOSTAT_PARAMETERS: tuple[ThermostatParameterDescription, ...] = (
|
|
174
183
|
multiplier=0.1,
|
175
184
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
176
185
|
),
|
177
|
-
ThermostatParameterDescription(
|
178
|
-
|
186
|
+
ThermostatParameterDescription(
|
187
|
+
name="heating_timer",
|
188
|
+
),
|
189
|
+
ThermostatParameterDescription(
|
190
|
+
name="off_timer",
|
191
|
+
),
|
179
192
|
)
|
180
193
|
|
181
194
|
|
pyplumio/utils.py
CHANGED
@@ -2,12 +2,13 @@
|
|
2
2
|
|
3
3
|
from __future__ import annotations
|
4
4
|
|
5
|
-
from
|
5
|
+
from collections.abc import Mapping
|
6
|
+
from typing import TypeVar
|
6
7
|
|
7
8
|
|
8
|
-
def to_camelcase(text: str, overrides:
|
9
|
+
def to_camelcase(text: str, overrides: Mapping[str, str] | None = None) -> str:
|
9
10
|
"""Convert snake_case to CamelCase."""
|
10
|
-
if overrides
|
11
|
+
if not overrides:
|
11
12
|
return "".join((x.capitalize() or "_") for x in text.split("_"))
|
12
13
|
|
13
14
|
return "".join(
|
@@ -16,10 +17,14 @@ def to_camelcase(text: str, overrides: dict[str, str] | None = None) -> str:
|
|
16
17
|
)
|
17
18
|
|
18
19
|
|
19
|
-
|
20
|
+
KT = TypeVar("KT") # Key type.
|
21
|
+
VT = TypeVar("VT") # Value type.
|
22
|
+
|
23
|
+
|
24
|
+
def ensure_dict(initial: dict[KT, VT] | None, *args: dict[KT, VT]) -> dict[KT, VT]:
|
20
25
|
"""Create or merge multiple dictionaries."""
|
21
|
-
data =
|
22
|
-
for
|
23
|
-
data |=
|
26
|
+
data = initial if initial is not None else {}
|
27
|
+
for extra in args:
|
28
|
+
data |= extra
|
24
29
|
|
25
30
|
return data
|
PyPlumIO-0.5.21.dist-info/RECORD
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
pyplumio/__init__.py,sha256=cclyAwy7OsW673iHcwkVrJSNnf32oF51Y_0uEEF5cdI,3293
|
2
|
-
pyplumio/__main__.py,sha256=3IwHHSq-iay5FaeMc95klobe-xv82yydSKcBE7BFZ6M,500
|
3
|
-
pyplumio/_version.py,sha256=qwvYpiZ4pV_W2HOchGsudGTbl7hCvV-xhS0ii39Ac0I,413
|
4
|
-
pyplumio/connection.py,sha256=ZZHXHFpbOBVd9DGZV_H8lpdYtYoc3nP9fRolKATKDnQ,6096
|
5
|
-
pyplumio/const.py,sha256=8rpiVbVb5R_6Rm6J2sgCnaVrkD-2Fzhd1RYMz0MBgwo,3915
|
6
|
-
pyplumio/exceptions.py,sha256=193z3zfnswYhIYPzCIpxCiWat4qI3cV85sqT4YOSo-4,699
|
7
|
-
pyplumio/filters.py,sha256=bIonYc_QbGMsL8aWweSLUmP7gKqDD646zELf_PqqQBg,11161
|
8
|
-
pyplumio/protocol.py,sha256=Ci4p4bqADfWeGk9fzcGMudRbe-dFFa1UNot9no5Lj3M,7845
|
9
|
-
pyplumio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
|
-
pyplumio/stream.py,sha256=DqMqdi3HG9hODgfGo4eTKLkfoaSh5RS4kBHNn3ODvVg,4472
|
11
|
-
pyplumio/utils.py,sha256=GV7P1hPLoQsx3uqYviQ15FXJmkmTxwtDibAc-yRarvo,688
|
12
|
-
pyplumio/devices/__init__.py,sha256=O5SyEt_x1nJ1JYkG6v3dTZ54tu9sKIdj4l256JhvLHg,6585
|
13
|
-
pyplumio/devices/ecomax.py,sha256=IPHyC8OjnGaQ_ZztcchgQjEJmNj8LfnP9sTJyslEQ14,16914
|
14
|
-
pyplumio/devices/ecoster.py,sha256=J4YtPmFmFwaq4LzYf28aMmB97cRAbMsVyUdBLGki42g,313
|
15
|
-
pyplumio/devices/mixer.py,sha256=qJAmar7DdsQL1Syg0WOCBVQn3GyBTWEVyr5ZfpGytCk,2975
|
16
|
-
pyplumio/devices/thermostat.py,sha256=HCnLVBX8mn6lmpCgl1DbDoCMI6T97sqmK-36cYcjXVA,2430
|
17
|
-
pyplumio/frames/__init__.py,sha256=BAMbMHbn4F9psrf3sv0eJQA2Jd86qf7LQ5vBQY59gjA,7462
|
18
|
-
pyplumio/frames/messages.py,sha256=QLuvo1wlpDZR1MpOdu7s6fRUX20Dtt6EWFLkAsqyax4,3617
|
19
|
-
pyplumio/frames/requests.py,sha256=Ra8xH5oKYhkEUtadN-9ZsJKkt5xZkz5O7edQVsDhNsM,7221
|
20
|
-
pyplumio/frames/responses.py,sha256=j4awA2-MfsoPdENC4Fvae4_Oa70rDhH19ebmEoAqhh8,6532
|
21
|
-
pyplumio/helpers/__init__.py,sha256=H2xxdkF-9uADLwEbfBUoxNTdwru3L5Z2cfJjgsuRsn0,31
|
22
|
-
pyplumio/helpers/data_types.py,sha256=H_pYkLgIu30lDFU0UUZ1V3vYxa9A_-1nhiJu-HCLuoc,8212
|
23
|
-
pyplumio/helpers/event_manager.py,sha256=dCNLnSRZgewZ9Ppi-JtkxtvOmNd4ZejA7UT4oAT8FWM,5865
|
24
|
-
pyplumio/helpers/factory.py,sha256=eiTkYUCernUn0VNDDdEN4IyjNPrXK8vnJESXyLaqFzE,1017
|
25
|
-
pyplumio/helpers/parameter.py,sha256=gYCA2SLU_lbdtQZq5U64yzpyLoEIa0R1wyJJGmgL63I,8699
|
26
|
-
pyplumio/helpers/schedule.py,sha256=-IZJ-CU4PhFlsE586wTw--ovDrTo2Hs4JneCHhc0e-Y,5013
|
27
|
-
pyplumio/helpers/task_manager.py,sha256=y5j7u31V6UE7g2ZhdsYsPykY-Awo73oWsNRUOrLSILg,1075
|
28
|
-
pyplumio/helpers/timeout.py,sha256=k-829fBcHT5IR3isrMSgNbPYK-ubeY1BAwndCDIiX9E,824
|
29
|
-
pyplumio/helpers/typing.py,sha256=y55UdpIpPIRuUBPgfPmZHAwPdIUjQO924-kO7AVXhes,685
|
30
|
-
pyplumio/helpers/uid.py,sha256=yaBjcsFKuhOaznftk33kdIepQHpK-labEQr59QNKhPM,975
|
31
|
-
pyplumio/structures/__init__.py,sha256=EjK-5qJZ0F7lpP2b6epvTMg9cIBl4Kn91nqNkEcLwTc,1299
|
32
|
-
pyplumio/structures/alerts.py,sha256=a1CIf8vSEj5aefdqECIfCY5kV4tQ4kabMkp-_ixeWic,3260
|
33
|
-
pyplumio/structures/boiler_load.py,sha256=p3mOzZUU-g7A2tG_yp8podEqpI81hlsOZmHELyPNRY8,838
|
34
|
-
pyplumio/structures/boiler_power.py,sha256=72qsvccg49FdRdXv2f2K5sGpjT7wAOLFjlIGWpO-DVg,901
|
35
|
-
pyplumio/structures/ecomax_parameters.py,sha256=6HVEh4aNw0CGZD3CVQeYyKXQ0pzueQR_Tpm5fF3_0hA,25815
|
36
|
-
pyplumio/structures/fan_power.py,sha256=Q5fv-7_2NVuLeQPIVIylvgN7M8-a9D8rRUE0QGjyS3w,871
|
37
|
-
pyplumio/structures/frame_versions.py,sha256=x_OSirGYopQYgsRZIM3b1YlKHNIPmCbvAzhzO1wqy5k,1560
|
38
|
-
pyplumio/structures/fuel_consumption.py,sha256=_p2dI4H67Eopn7IF0Gj77A8c_8lNKhhDDAtmugxLd4s,976
|
39
|
-
pyplumio/structures/fuel_level.py,sha256=mJpp1dnRD1wXi_6EyNX7TNXosjcr905rSHOnuZ5VD74,1069
|
40
|
-
pyplumio/structures/lambda_sensor.py,sha256=6iUVyrPe6_QaGPo1lRzOfqorcTIIXRwnq3h861IJYGs,1587
|
41
|
-
pyplumio/structures/mixer_parameters.py,sha256=ny7Ox94IooQd1ua22zGYkXLFaZQWGUYLEIM2_8vXk0U,8249
|
42
|
-
pyplumio/structures/mixer_sensors.py,sha256=O91929Ts1YXFmKdPRc1r_BYDgrqkv5QVtE1nGzLpuAI,2260
|
43
|
-
pyplumio/structures/modules.py,sha256=ukju4TQmRRJfgl94QU4zytZLU5px8nw3sgfSLn9JysU,2520
|
44
|
-
pyplumio/structures/network_info.py,sha256=ws2UdOhB89oKqmtW1Vsmfj0InRW4Sp6_kL1d4psk-8w,4094
|
45
|
-
pyplumio/structures/output_flags.py,sha256=07N0kxlvR5WZAURuChk_BqSiXR8eaQrtI5qlkgCf4Yc,1345
|
46
|
-
pyplumio/structures/outputs.py,sha256=1xsJPkjN643-aFawqVoupGatUIUJfQG_g252n051Qi0,1916
|
47
|
-
pyplumio/structures/pending_alerts.py,sha256=Uq9WpB4MW9AhDkqmDhk-g0J0h4pVq0Q50z12dYEv6kY,739
|
48
|
-
pyplumio/structures/product_info.py,sha256=bVH7NvIOWwmmHcgbLfD-IIag4sgBRA6RMmuC6SKTrJE,2409
|
49
|
-
pyplumio/structures/program_version.py,sha256=4h3u46l2btUcooDRHyrqN3Y9M8WNEzwCmkNVEzfi-V8,2359
|
50
|
-
pyplumio/structures/regulator_data.py,sha256=Dun3RjfHHoV2W5RTSQcAimBL0Or3O957vYQj7Pbi7CM,2309
|
51
|
-
pyplumio/structures/regulator_data_schema.py,sha256=BMshEpiP-lwTgSkbTuow9KlxCwKwQXV0nFPcBpW0SJg,1505
|
52
|
-
pyplumio/structures/schedules.py,sha256=-koo05nLkpKuj1ZPiC1NB_21MAFn1FzQ6VLC0DboYeg,6346
|
53
|
-
pyplumio/structures/statuses.py,sha256=wkoynyMRr1VREwfBC6vU48kPA8ZQ83pcXuciy2xHJrk,1166
|
54
|
-
pyplumio/structures/temperatures.py,sha256=1CDzehNmbALz1Jyt_9gZNIk52q6Wv-xQXjijVDCVYec,2337
|
55
|
-
pyplumio/structures/thermostat_parameters.py,sha256=pjbWsT6z7mlDiUrC5MWGqMtGP0deeVMYeeTa7yGEwJ8,7706
|
56
|
-
pyplumio/structures/thermostat_sensors.py,sha256=ZmjWgYtTZ5M8Lnz_Q5N4JD8G3MvEmByPFjYsy6XZOmo,3177
|
57
|
-
PyPlumIO-0.5.21.dist-info/LICENSE,sha256=m-UuZFjXJ22uPTGm9kSHS8bqjsf5T8k2wL9bJn1Y04o,1088
|
58
|
-
PyPlumIO-0.5.21.dist-info/METADATA,sha256=mc-yvbFJArE1iYRxb8RCkL2MdoKZjkZKOn8nWgWD8t8,5415
|
59
|
-
PyPlumIO-0.5.21.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
60
|
-
PyPlumIO-0.5.21.dist-info/top_level.txt,sha256=kNBz9UPPkPD9teDn3U_sEy5LjzwLm9KfADCXtBlbw8A,9
|
61
|
-
PyPlumIO-0.5.21.dist-info/RECORD,,
|
pyplumio/helpers/typing.py
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
"""Contains type aliases."""
|
2
|
-
|
3
|
-
from __future__ import annotations
|
4
|
-
|
5
|
-
from typing import Literal, Protocol, Union, runtime_checkable
|
6
|
-
|
7
|
-
ParameterValueType = Union[int, float, bool, Literal["off"], Literal["on"]]
|
8
|
-
|
9
|
-
|
10
|
-
@runtime_checkable
|
11
|
-
class SupportsSubtraction(Protocol):
|
12
|
-
"""Supports subtraction operation."""
|
13
|
-
|
14
|
-
__slots__ = ()
|
15
|
-
|
16
|
-
def __sub__(
|
17
|
-
self: SupportsSubtraction, other: SupportsSubtraction
|
18
|
-
) -> SupportsSubtraction:
|
19
|
-
"""Subtract a value."""
|
20
|
-
|
21
|
-
|
22
|
-
@runtime_checkable
|
23
|
-
class SupportsComparison(Protocol):
|
24
|
-
"""Supports comparison."""
|
25
|
-
|
26
|
-
__slots__ = ()
|
27
|
-
|
28
|
-
def __eq__(self: SupportsComparison, other: SupportsComparison) -> bool:
|
29
|
-
"""Compare a value."""
|
File without changes
|
File without changes
|