PyPlumIO 0.5.20__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.
@@ -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
- try:
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: None
47
- if math.isnan(level.value)
48
- else (level.value / 10),
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", unit_of_measurement=UnitOfMeasurement.CELSIUS
111
+ name="mixer_target_temp",
112
+ unit_of_measurement=UnitOfMeasurement.CELSIUS,
112
113
  ),
113
114
  MixerParameterDescription(
114
- name="min_target_temp", unit_of_measurement=UnitOfMeasurement.CELSIUS
115
+ name="min_target_temp",
116
+ unit_of_measurement=UnitOfMeasurement.CELSIUS,
115
117
  ),
116
118
  MixerParameterDescription(
117
- name="max_target_temp", unit_of_measurement=UnitOfMeasurement.CELSIUS
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(name="weather_control"),
124
- MixerParameterDescription(name="heating_curve", multiplier=0.1),
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(name="weather_factor"),
131
- MixerParameterDescription(name="work_mode"),
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(name="thermostat_operation"),
138
- MixerParameterDescription(name="thermostat_mode"),
139
- MixerBinaryParameterDescription(name="disable_pump_on_thermostat"),
140
- MixerBinaryParameterDescription(name="summer_work"),
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="circuit_target_temp", unit_of_measurement=UnitOfMeasurement.CELSIUS
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="day_target_temp", unit_of_measurement=UnitOfMeasurement.CELSIUS
175
+ name="night_target_temp",
176
+ unit_of_measurement=UnitOfMeasurement.CELSIUS,
149
177
  ),
150
178
  MixerParameterDescription(
151
- name="night_target_temp", unit_of_measurement=UnitOfMeasurement.CELSIUS
179
+ name="min_target_temp",
180
+ unit_of_measurement=UnitOfMeasurement.CELSIUS,
152
181
  ),
153
182
  MixerParameterDescription(
154
- name="min_target_temp", unit_of_measurement=UnitOfMeasurement.CELSIUS
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="max_target_temp", unit_of_measurement=UnitOfMeasurement.CELSIUS
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", unit_of_measurement=UnitOfMeasurement.CELSIUS
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", unit_of_measurement=UnitOfMeasurement.SECONDS
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(name="proportional_range"),
183
- MixerParameterDescription(name="integration_time_constant"),
184
- MixerParameterDescription(name="heating_curve", multiplier=0.1),
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(name="thermostat_mode"),
234
+ MixerParameterDescription(
235
+ name="thermostat_mode",
236
+ ),
191
237
  MixerParameterDescription(
192
238
  name="decreasing_constant_water_temp",
193
239
  unit_of_measurement=UnitOfMeasurement.CELSIUS,
@@ -18,7 +18,7 @@ DEFAULT_NETMASK: Final = "255.255.255.0"
18
18
  NETWORK_INFO_SIZE: Final = 25
19
19
 
20
20
 
21
- @dataclass
21
+ @dataclass(frozen=True)
22
22
  class EthernetParameters:
23
23
  """Represents an ethernet parameters."""
24
24
 
@@ -35,7 +35,7 @@ class EthernetParameters:
35
35
  status: bool = True
36
36
 
37
37
 
38
- @dataclass
38
+ @dataclass(frozen=True)
39
39
  class WirelessParameters(EthernetParameters):
40
40
  """Represents a wireless network parameters."""
41
41
 
@@ -50,7 +50,7 @@ class WirelessParameters(EthernetParameters):
50
50
  signal_quality: int = 100
51
51
 
52
52
 
53
- @dataclass
53
+ @dataclass(frozen=True)
54
54
  class NetworkInfo:
55
55
  """Represents a network parameters."""
56
56
 
@@ -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
- message += b"\x01"
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: str = ".".join(str(x) for x in __version_tuple__[0:3])
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[ATTR_VERSION] if ATTR_VERSION in data else VersionInfo()
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
- version_info = VersionInfo()
59
- [
60
- version_info.struct_tag,
61
- version_info.struct_version,
62
- version_info.device_id,
63
- version_info.processor_signature,
64
- software_version1,
65
- software_version2,
66
- software_version3,
67
- self.frame.recipient,
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(data, {ATTR_VERSION: version_info}),
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, values, description, index)
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(name="mode"),
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", unit_of_measurement=UnitOfMeasurement.CELSIUS
138
+ name="correction",
139
+ unit_of_measurement=UnitOfMeasurement.CELSIUS,
137
140
  ),
138
141
  ThermostatParameterDescription(
139
- name="away_timer", unit_of_measurement=UnitOfMeasurement.DAYS
142
+ name="away_timer",
143
+ unit_of_measurement=UnitOfMeasurement.DAYS,
140
144
  ),
141
145
  ThermostatParameterDescription(
142
- name="airing_timer", unit_of_measurement=UnitOfMeasurement.DAYS
146
+ name="airing_timer",
147
+ unit_of_measurement=UnitOfMeasurement.DAYS,
143
148
  ),
144
149
  ThermostatParameterDescription(
145
- name="party_timer", unit_of_measurement=UnitOfMeasurement.DAYS
150
+ name="party_timer",
151
+ unit_of_measurement=UnitOfMeasurement.DAYS,
146
152
  ),
147
153
  ThermostatParameterDescription(
148
- name="holidays_timer", unit_of_measurement=UnitOfMeasurement.DAYS
154
+ name="holidays_timer",
155
+ unit_of_measurement=UnitOfMeasurement.DAYS,
149
156
  ),
150
157
  ThermostatParameterDescription(
151
- name="hysteresis", multiplier=0.1, unit_of_measurement=UnitOfMeasurement.CELSIUS
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(name="heating_timer"),
178
- ThermostatParameterDescription(name="off_timer"),
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 typing import Any
5
+ from collections.abc import Mapping
6
+ from typing import TypeVar
6
7
 
7
8
 
8
- def to_camelcase(text: str, overrides: dict[str, str] | None = None) -> str:
9
+ def to_camelcase(text: str, overrides: Mapping[str, str] | None = None) -> str:
9
10
  """Convert snake_case to CamelCase."""
10
- if overrides is None:
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
- def ensure_dict(data: dict | None, *args: Any) -> dict:
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 = data if data is not None else {}
22
- for new_data in args:
23
- data |= new_data
26
+ data = initial if initial is not None else {}
27
+ for extra in args:
28
+ data |= extra
24
29
 
25
30
  return data
@@ -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=eONbmd59kUJvI6efSg_Cy7fvmhvKc1Uota8ebahOmE0,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=i4C7WYALp6BEHzeMjiebH8GWI2qGIEPk6OlUIx_2UP4,7870
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=W9YW4nw6v2wdKKqFblUx03_hFJw0dVjnVkDHNL8P2dg,16632
14
- pyplumio/devices/ecoster.py,sha256=J4YtPmFmFwaq4LzYf28aMmB97cRAbMsVyUdBLGki42g,313
15
- pyplumio/devices/mixer.py,sha256=PGk0lXveN6q5sm0B50YG0yCVYoKi1a9TA3v44bGgi3A,2947
16
- pyplumio/devices/thermostat.py,sha256=UR3KEkIBU-zx2LALvrt_QiFkiBT1CpKk7vYR1MSYdWY,2402
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=eSaqFGwED_UlugDwGRusfpivolqV6TISs1XnzBH6e60,5863
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=RpdYSguc0cap_Onf9VnL-yCd_KwR2JPD49trZCRKPpI,1090
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=07v97o9paqj_Ua9HkmEvwPgDT6a9btd8PKVSpVcTC4c,25835
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=d1_MvG6n5f57ZEVZwSFFTXux0N07Gt1KnPDtlDfoMNQ,4055
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.20.dist-info/LICENSE,sha256=m-UuZFjXJ22uPTGm9kSHS8bqjsf5T8k2wL9bJn1Y04o,1088
58
- PyPlumIO-0.5.20.dist-info/METADATA,sha256=nTyxUOv5kPz-K5xNnm389H-eFlLN48mXYMmc3E4zHQ0,5415
59
- PyPlumIO-0.5.20.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
60
- PyPlumIO-0.5.20.dist-info/top_level.txt,sha256=kNBz9UPPkPD9teDn3U_sEy5LjzwLm9KfADCXtBlbw8A,9
61
- PyPlumIO-0.5.20.dist-info/RECORD,,
@@ -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."""