PyPlumIO 0.5.23__tar.gz → 0.5.25__tar.gz

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.
Files changed (142) hide show
  1. {pyplumio-0.5.23 → pyplumio-0.5.25}/PKG-INFO +1 -1
  2. {pyplumio-0.5.23 → pyplumio-0.5.25}/PyPlumIO.egg-info/PKG-INFO +1 -1
  3. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/_version.py +2 -2
  4. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/helpers/data_types.py +1 -1
  5. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/helpers/parameter.py +19 -3
  6. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/helpers/test_data_types.py +6 -0
  7. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/helpers/test_parameter.py +13 -1
  8. {pyplumio-0.5.23 → pyplumio-0.5.25}/.gitattributes +0 -0
  9. {pyplumio-0.5.23 → pyplumio-0.5.25}/.github/CODE_OF_CONDUCT.md +0 -0
  10. {pyplumio-0.5.23 → pyplumio-0.5.25}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  11. {pyplumio-0.5.23 → pyplumio-0.5.25}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  12. {pyplumio-0.5.23 → pyplumio-0.5.25}/.github/dependabot.yml +0 -0
  13. {pyplumio-0.5.23 → pyplumio-0.5.25}/.github/workflows/ci.yml +0 -0
  14. {pyplumio-0.5.23 → pyplumio-0.5.25}/.github/workflows/codeql-analysis.yml +0 -0
  15. {pyplumio-0.5.23 → pyplumio-0.5.25}/.github/workflows/deploy.yml +0 -0
  16. {pyplumio-0.5.23 → pyplumio-0.5.25}/.github/workflows/documentation.yml +0 -0
  17. {pyplumio-0.5.23 → pyplumio-0.5.25}/.gitignore +0 -0
  18. {pyplumio-0.5.23 → pyplumio-0.5.25}/.pre-commit-config.yaml +0 -0
  19. {pyplumio-0.5.23 → pyplumio-0.5.25}/.vscode/settings.json +0 -0
  20. {pyplumio-0.5.23 → pyplumio-0.5.25}/LICENSE +0 -0
  21. {pyplumio-0.5.23 → pyplumio-0.5.25}/MANIFEST.in +0 -0
  22. {pyplumio-0.5.23 → pyplumio-0.5.25}/PyPlumIO.egg-info/SOURCES.txt +0 -0
  23. {pyplumio-0.5.23 → pyplumio-0.5.25}/PyPlumIO.egg-info/dependency_links.txt +0 -0
  24. {pyplumio-0.5.23 → pyplumio-0.5.25}/PyPlumIO.egg-info/requires.txt +0 -0
  25. {pyplumio-0.5.23 → pyplumio-0.5.25}/PyPlumIO.egg-info/top_level.txt +0 -0
  26. {pyplumio-0.5.23 → pyplumio-0.5.25}/README.md +0 -0
  27. {pyplumio-0.5.23 → pyplumio-0.5.25}/docs/Makefile +0 -0
  28. {pyplumio-0.5.23 → pyplumio-0.5.25}/docs/make.bat +0 -0
  29. {pyplumio-0.5.23 → pyplumio-0.5.25}/docs/source/callbacks.rst +0 -0
  30. {pyplumio-0.5.23 → pyplumio-0.5.25}/docs/source/conf.py +0 -0
  31. {pyplumio-0.5.23 → pyplumio-0.5.25}/docs/source/connecting.rst +0 -0
  32. {pyplumio-0.5.23 → pyplumio-0.5.25}/docs/source/frames.rst +0 -0
  33. {pyplumio-0.5.23 → pyplumio-0.5.25}/docs/source/index.rst +0 -0
  34. {pyplumio-0.5.23 → pyplumio-0.5.25}/docs/source/mixers_thermostats.rst +0 -0
  35. {pyplumio-0.5.23 → pyplumio-0.5.25}/docs/source/protocol.rst +0 -0
  36. {pyplumio-0.5.23 → pyplumio-0.5.25}/docs/source/reading.rst +0 -0
  37. {pyplumio-0.5.23 → pyplumio-0.5.25}/docs/source/schedules.rst +0 -0
  38. {pyplumio-0.5.23 → pyplumio-0.5.25}/docs/source/writing.rst +0 -0
  39. {pyplumio-0.5.23 → pyplumio-0.5.25}/images/ecomax.png +0 -0
  40. {pyplumio-0.5.23 → pyplumio-0.5.25}/images/rs485.png +0 -0
  41. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/__init__.py +0 -0
  42. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/__main__.py +0 -0
  43. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/connection.py +0 -0
  44. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/const.py +0 -0
  45. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/devices/__init__.py +0 -0
  46. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/devices/ecomax.py +0 -0
  47. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/devices/ecoster.py +0 -0
  48. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/devices/mixer.py +0 -0
  49. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/devices/thermostat.py +0 -0
  50. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/exceptions.py +0 -0
  51. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/filters.py +0 -0
  52. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/frames/__init__.py +0 -0
  53. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/frames/messages.py +0 -0
  54. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/frames/requests.py +0 -0
  55. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/frames/responses.py +0 -0
  56. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/helpers/__init__.py +0 -0
  57. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/helpers/event_manager.py +0 -0
  58. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/helpers/factory.py +0 -0
  59. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/helpers/schedule.py +0 -0
  60. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/helpers/task_manager.py +0 -0
  61. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/helpers/timeout.py +0 -0
  62. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/helpers/uid.py +0 -0
  63. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/protocol.py +0 -0
  64. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/py.typed +0 -0
  65. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/stream.py +0 -0
  66. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/__init__.py +0 -0
  67. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/alerts.py +0 -0
  68. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/boiler_load.py +0 -0
  69. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/boiler_power.py +0 -0
  70. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/ecomax_parameters.py +0 -0
  71. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/fan_power.py +0 -0
  72. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/frame_versions.py +0 -0
  73. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/fuel_consumption.py +0 -0
  74. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/fuel_level.py +0 -0
  75. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/lambda_sensor.py +0 -0
  76. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/mixer_parameters.py +0 -0
  77. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/mixer_sensors.py +0 -0
  78. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/modules.py +0 -0
  79. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/network_info.py +0 -0
  80. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/output_flags.py +0 -0
  81. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/outputs.py +0 -0
  82. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/pending_alerts.py +0 -0
  83. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/product_info.py +0 -0
  84. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/program_version.py +0 -0
  85. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/regulator_data.py +0 -0
  86. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/regulator_data_schema.py +0 -0
  87. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/schedules.py +0 -0
  88. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/statuses.py +0 -0
  89. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/temperatures.py +0 -0
  90. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/thermostat_parameters.py +0 -0
  91. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/structures/thermostat_sensors.py +0 -0
  92. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyplumio/utils.py +0 -0
  93. {pyplumio-0.5.23 → pyplumio-0.5.25}/pyproject.toml +0 -0
  94. {pyplumio-0.5.23 → pyplumio-0.5.25}/requirements.txt +0 -0
  95. {pyplumio-0.5.23 → pyplumio-0.5.25}/requirements_docs.txt +0 -0
  96. {pyplumio-0.5.23 → pyplumio-0.5.25}/requirements_test.txt +0 -0
  97. {pyplumio-0.5.23 → pyplumio-0.5.25}/setup.cfg +0 -0
  98. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/__init__.py +0 -0
  99. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/conftest.py +0 -0
  100. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/frames/test_init.py +0 -0
  101. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/frames/test_messages.py +0 -0
  102. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/frames/test_requests.py +0 -0
  103. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/frames/test_responses.py +0 -0
  104. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/helpers/__init__.py +0 -0
  105. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/helpers/test_event_manager.py +0 -0
  106. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/helpers/test_factory.py +0 -0
  107. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/helpers/test_schedule.py +0 -0
  108. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/helpers/test_task_manager.py +0 -0
  109. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/helpers/test_timeout.py +0 -0
  110. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/helpers/test_uid.py +0 -0
  111. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/ruff.toml +0 -0
  112. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/test_connection.py +0 -0
  113. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/test_devices.py +0 -0
  114. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/test_filters.py +0 -0
  115. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/test_init.py +0 -0
  116. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/test_main.py +0 -0
  117. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/test_protocol.py +0 -0
  118. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/test_stream.py +0 -0
  119. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/test_utils.py +0 -0
  120. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/messages/regulator_data.json +0 -0
  121. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/messages/sensor_data.json +0 -0
  122. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/requests/alerts.json +0 -0
  123. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/requests/ecomax_control.json +0 -0
  124. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/requests/ecomax_parameters.json +0 -0
  125. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/requests/mixer_parameters.json +0 -0
  126. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/requests/set_ecomax_parameter.json +0 -0
  127. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/requests/set_mixer_parameter.json +0 -0
  128. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/requests/set_schedule.json +0 -0
  129. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/requests/set_thermostat_parameter.json +0 -0
  130. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/requests/thermostat_parameters.json +0 -0
  131. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/responses/alerts.json +0 -0
  132. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/responses/device_available.json +0 -0
  133. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/responses/ecomax_parameters.json +0 -0
  134. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/responses/mixer_parameters.json +0 -0
  135. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/responses/password.json +0 -0
  136. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/responses/program_version.json +0 -0
  137. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/responses/regulator_data_schema.json +0 -0
  138. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/responses/schedules.json +0 -0
  139. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/responses/thermostat_parameters.json +0 -0
  140. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/responses/uid.json +0 -0
  141. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/unknown/unknown_ecomax_parameter.json +0 -0
  142. {pyplumio-0.5.23 → pyplumio-0.5.25}/tests/testdata/unknown/unknown_mixer_parameter.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyPlumIO
3
- Version: 0.5.23
3
+ Version: 0.5.25
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
  Metadata-Version: 2.1
2
2
  Name: PyPlumIO
3
- Version: 0.5.23
3
+ Version: 0.5.25
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
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.5.23'
16
- __version_tuple__ = version_tuple = (0, 5, 23)
15
+ __version__ = version = '0.5.25'
16
+ __version_tuple__ = version_tuple = (0, 5, 25)
@@ -181,7 +181,7 @@ class String(DataType):
181
181
 
182
182
  def unpack(self, data: bytes) -> None:
183
183
  """Unpack the data."""
184
- self._value = data.split(b"\0", 1)[0].decode()
184
+ self._value = data.split(b"\0", 1)[0].decode("utf-8", "replace")
185
185
  self._size = len(self.value) + 1
186
186
 
187
187
 
@@ -113,9 +113,18 @@ class Parameter(ABC):
113
113
 
114
114
  def _call_relational_method(self, method_to_call: str, other: Any) -> Any:
115
115
  """Call a specified relational method."""
116
- handler = getattr(self.values.value, method_to_call)
117
- other = other.value if isinstance(other, ParameterValues) else other
118
- return handler(_normalize_parameter_value(other))
116
+ if isinstance(other, Parameter):
117
+ other = other.values
118
+
119
+ if isinstance(other, ParameterValues):
120
+ handler = getattr(self.values, method_to_call)
121
+ return handler(other)
122
+
123
+ if isinstance(other, (int, float, bool)) or other in (STATE_OFF, STATE_ON):
124
+ handler = getattr(self.values.value, method_to_call)
125
+ return handler(_normalize_parameter_value(other))
126
+ else:
127
+ return NotImplemented
119
128
 
120
129
  def __int__(self) -> int:
121
130
  """Return an integer representation of parameter's value."""
@@ -161,6 +170,13 @@ class Parameter(ABC):
161
170
  """Compare if parameter value is less that other."""
162
171
  return self._call_relational_method("__lt__", other)
163
172
 
173
+ def __copy__(self) -> Parameter:
174
+ """Create a copy of parameter."""
175
+ values = type(self.values)(
176
+ self.values.value, self.values.min_value, self.values.max_value
177
+ )
178
+ return type(self)(self.device, self.description, values)
179
+
164
180
  async def set(self, value: Any, retries: int = SET_RETRIES) -> bool:
165
181
  """Set a parameter value."""
166
182
  if (value := _normalize_parameter_value(value)) == self.values.value:
@@ -229,6 +229,12 @@ def test_string() -> None:
229
229
  assert data_type == data_types.String.from_bytes(buffer)
230
230
  assert data_type == "test"
231
231
 
232
+ # Test with unknown unicode char.
233
+ buffer = b"test\xd8\x00"
234
+ data_type = data_types.String.from_bytes(buffer)
235
+ assert data_type.value == "test�"
236
+ assert data_type.size == 6
237
+
232
238
 
233
239
  def test_var_bytes() -> None:
234
240
  """Test a variable bytes data type."""
@@ -1,5 +1,6 @@
1
1
  """Contains tests for the parameter helper class."""
2
2
 
3
+ from copy import copy
3
4
  from unittest.mock import Mock, patch
4
5
 
5
6
  import pytest
@@ -171,21 +172,32 @@ def test_switch_update(switch: Switch) -> None:
171
172
 
172
173
  def test_number_relational(number: Number):
173
174
  """Test number relational methods."""
175
+ new_number = copy(number)
176
+ assert number == new_number
174
177
  assert (number - 1) == 0
178
+ new_values = ParameterValues(value=1, min_value=0, max_value=5)
179
+ number.update(new_values)
180
+ assert number == new_values
175
181
  assert (number + 1) == 2
176
182
  assert (number * 5) == 5
177
183
  assert (number / 1) == 1
178
184
  assert (number // 1) == 1
185
+ assert number.__eq__("cola") is NotImplemented
179
186
 
180
187
 
181
188
  def test_switch_relational(switch: Switch):
182
189
  """Test switch relational methods."""
190
+ new_switch = copy(switch)
191
+ assert switch == new_switch
192
+ new_values = ParameterValues(value=1, min_value=0, max_value=1)
183
193
  assert (switch + 1) == 1
184
- switch.update(ParameterValues(value=1, min_value=0, max_value=0))
194
+ switch.update(new_values)
195
+ assert switch == new_values
185
196
  assert (switch - 1) == 0
186
197
  assert (switch * 0) == 0
187
198
  assert (switch / 1) == 1
188
199
  assert (switch // 1) == 1
200
+ assert switch.__eq__("cola") is NotImplemented
189
201
 
190
202
 
191
203
  def test_number_compare(number: Number) -> None:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes