python-selve-new 2.5.5__tar.gz → 2.5.7__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 (109) hide show
  1. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/PKG-INFO +1 -1
  2. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/python_selve_new.egg-info/PKG-INFO +1 -1
  3. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/__init__.py +18 -7
  4. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/_version.py +3 -3
  5. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_mock_commands.py +3 -3
  6. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/.github/FUNDING.yml +0 -0
  7. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/.github/architect.chatmode.md +0 -0
  8. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/.github/ask.chatmode.md +0 -0
  9. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/.github/code.chatmode.md +0 -0
  10. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/.github/debug.chatmode.md +0 -0
  11. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/.github/workflows/python-publish.yml +0 -0
  12. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/.github/workflows/tests.yml +0 -0
  13. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/.gitignore +0 -0
  14. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/.idea/.gitignore +0 -0
  15. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/.idea/inspectionProfiles/profiles_settings.xml +0 -0
  16. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/.idea/misc.xml +0 -0
  17. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/.idea/modules.xml +0 -0
  18. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/.idea/python-selve-new.iml +0 -0
  19. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/.idea/vcs.xml +0 -0
  20. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/CHANGELOG.md +0 -0
  21. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/LICENSE +0 -0
  22. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/README.md +0 -0
  23. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/coverage_xdist_example.txt +0 -0
  24. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/debug_response.py +0 -0
  25. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/debug_test.bat +0 -0
  26. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/direct_hardware_test.bat +0 -0
  27. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/direct_hardware_test.py +0 -0
  28. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/generate_coverage.bat +0 -0
  29. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/package.sh +0 -0
  30. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/pyproject.toml +0 -0
  31. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/python_selve_new.egg-info/SOURCES.txt +0 -0
  32. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/python_selve_new.egg-info/dependency_links.txt +0 -0
  33. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/python_selve_new.egg-info/requires.txt +0 -0
  34. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/python_selve_new.egg-info/top_level.txt +0 -0
  35. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/release.py +0 -0
  36. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/run_all_tests.bat +0 -0
  37. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/run_hardware_tests.bat +0 -0
  38. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/run_integration_tests.bat +0 -0
  39. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/run_mock_tests.bat +0 -0
  40. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/run_single_test.bat +0 -0
  41. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/run_tests.bat +0 -0
  42. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/commands/__init__.py +0 -0
  43. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/commands/command.py +0 -0
  44. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/commands/device.py +0 -0
  45. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/commands/event.py +0 -0
  46. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/commands/firmware.py +0 -0
  47. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/commands/group.py +0 -0
  48. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/commands/iveo.py +0 -0
  49. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/commands/param.py +0 -0
  50. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/commands/senSim.py +0 -0
  51. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/commands/sender.py +0 -0
  52. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/commands/sensor.py +0 -0
  53. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/commands/service.py +0 -0
  54. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/device.py +0 -0
  55. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/gateway.py +0 -0
  56. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/group.py +0 -0
  57. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/iveo.py +0 -0
  58. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/senSim.py +0 -0
  59. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/sender.py +0 -0
  60. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/sensor.py +0 -0
  61. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/util/__init__.py +0 -0
  62. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/util/errors.py +0 -0
  63. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/util/protocol.py +0 -0
  64. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/selve/util/serial_transport.py +0 -0
  65. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/setup.cfg +0 -0
  66. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/setup.py +0 -0
  67. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/setup_and_test.bat +0 -0
  68. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/__init__.py +0 -0
  69. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/conftest.py +0 -0
  70. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/integration/README.md +0 -0
  71. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/integration/__init__.py +0 -0
  72. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/integration/conftest.py +0 -0
  73. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/integration/test_device_integration.py +0 -0
  74. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/integration/test_selve_gateway_integration.py +0 -0
  75. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/integration/test_selve_hardware.py +0 -0
  76. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/integration/test_selve_integration.py +0 -0
  77. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/test_import.py +0 -0
  78. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/test_replacement.py +0 -0
  79. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/__init__.py +0 -0
  80. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/mock_utils.py +0 -0
  81. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_command_coverage.py +0 -0
  82. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_commands.py +0 -0
  83. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_device.py +0 -0
  84. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_device_classes_coverage.py +0 -0
  85. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_device_commands_extended.py +0 -0
  86. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_gateway_configuration_issues.py +0 -0
  87. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_gateway_error_handling_fixed.py +0 -0
  88. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_group.py +0 -0
  89. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_group_commands.py +0 -0
  90. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_missing_components.py +0 -0
  91. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_mock_devices_and_groups.py +0 -0
  92. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_mock_sensors_and_senders.py +0 -0
  93. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_param_commands_extended.py +0 -0
  94. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_port_discovery.py +0 -0
  95. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_selve_advanced_coverage.py +0 -0
  96. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_selve_core_coverage.py +0 -0
  97. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_selve_edge_cases.py +0 -0
  98. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_selve_gateway.py +0 -0
  99. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_selve_init_comprehensive.py +0 -0
  100. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_selve_init_response_coverage.py +0 -0
  101. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_selve_init_simple.py +0 -0
  102. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_selve_main_class_extensive.py +0 -0
  103. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_sender_commands_extended.py +0 -0
  104. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_sensim_commands_extended.py +0 -0
  105. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_sensor_commands_extended.py +0 -0
  106. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_service_command_errors.py +0 -0
  107. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_service_commands.py +0 -0
  108. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_util.py +0 -0
  109. {python_selve_new-2.5.5 → python_selve_new-2.5.7}/tests/unit/test_utility_coverage.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-selve-new
3
- Version: 2.5.5
3
+ Version: 2.5.7
4
4
  Summary: Python library for interfacing with selve devices using the USB-RF controller. Written completely new.
5
5
  Home-page: https://github.com/Kannix2005/python-selve-new
6
6
  Author: Stefan Altheimer
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-selve-new
3
- Version: 2.5.5
3
+ Version: 2.5.7
4
4
  Summary: Python library for interfacing with selve devices using the USB-RF controller. Written completely new.
5
5
  Home-page: https://github.com/Kannix2005/python-selve-new
6
6
  Author: Stefan Altheimer
@@ -775,6 +775,16 @@ class Selve:
775
775
  async def discover(self):
776
776
 
777
777
  await self.stopWorker()
778
+ # Rebuild transport for a clean connection (avoids stale StreamReader state
779
+ # left over from _probe_port, which explains why USB-replug was needed).
780
+ await self._teardown_transport()
781
+ # Flush any stale messages left in the receive queue from the probe phase
782
+ # (unsolicited gateway events or responses the cancelled dispatch task never
783
+ # consumed). If we don't do this, the dispatch loop matches those old
784
+ # messages against the new discover() command futures, resolving them with
785
+ # the wrong response object and causing silent discover failures.
786
+ self.rxQ = asyncio.Queue()
787
+ self._pending_futures.clear()
778
788
  await self.setEvents(0,0,0,0,0)
779
789
  rdy = await self.gatewayReady()
780
790
  if rdy:
@@ -1096,6 +1106,10 @@ class Selve:
1096
1106
  dev.state = MovementState.UP_ON
1097
1107
  elif response.command is DriveCommandCommeo.STOP:
1098
1108
  dev.state = MovementState.STOPPED_OFF
1109
+ elif response.command is DriveCommandCommeo.DRIVESTEPDOWN:
1110
+ dev.state = MovementState.DOWN_ON
1111
+ elif response.command is DriveCommandCommeo.DRIVESTEPUP:
1112
+ dev.state = MovementState.UP_ON
1099
1113
  self.addOrUpdateDevice(dev, SelveTypes.DEVICE)
1100
1114
  for id in response.failedIds:
1101
1115
  dev = self.getDevice(id, SelveTypes.DEVICE)
@@ -1455,7 +1469,6 @@ class Selve:
1455
1469
  await self.executeCommand(CommandDriveUp(device.id, type))
1456
1470
  device.state = MovementState.UP_ON
1457
1471
  self.addOrUpdateDevice(device, SelveTypes.DEVICE)
1458
- await self.updateCommeoDeviceValuesAsync(device.id)
1459
1472
  self._start_movement_polling(device.id)
1460
1473
  else:
1461
1474
  self.setDeviceState(device.id, MovementState.UP_ON, SelveTypes.IVEO)
@@ -1469,7 +1482,6 @@ class Selve:
1469
1482
  await self.executeCommand(CommandDriveDown(device.id, type))
1470
1483
  device.state = MovementState.DOWN_ON
1471
1484
  self.addOrUpdateDevice(device, SelveTypes.DEVICE)
1472
- await self.updateCommeoDeviceValuesAsync(device.id)
1473
1485
  self._start_movement_polling(device.id)
1474
1486
  else:
1475
1487
  self.setDeviceState(device.id, MovementState.DOWN_ON, SelveTypes.IVEO)
@@ -1481,7 +1493,6 @@ class Selve:
1481
1493
  async def moveDevicePos1(self, device: SelveDevice | IveoDevice, type=DeviceCommandType.MANUAL):
1482
1494
  if device.communicationType is CommunicationType.COMMEO:
1483
1495
  await self.executeCommand(CommandDrivePos1(device.id, type))
1484
- await self.updateCommeoDeviceValuesAsync(device.id)
1485
1496
  self._start_movement_polling(device.id)
1486
1497
  else:
1487
1498
  self.setDeviceState(device.id, MovementState.UP_ON, SelveTypes.IVEO)
@@ -1493,7 +1504,6 @@ class Selve:
1493
1504
  async def moveDevicePos2(self, device: SelveDevice | IveoDevice, type=DeviceCommandType.MANUAL):
1494
1505
  if device.communicationType is CommunicationType.COMMEO:
1495
1506
  await self.executeCommand(CommandDrivePos2(device.id, type))
1496
- await self.updateCommeoDeviceValuesAsync(device.id)
1497
1507
  self._start_movement_polling(device.id)
1498
1508
  else:
1499
1509
  self.setDeviceState(device.id, MovementState.DOWN_ON, SelveTypes.IVEO)
@@ -1504,17 +1514,18 @@ class Selve:
1504
1514
 
1505
1515
  async def moveDevicePos(self, device: SelveDevice, pos: int = 0, type=DeviceCommandType.MANUAL):
1506
1516
  await self.executeCommand(CommandDrivePos(device.id, type, param=Util.percentageToValue(pos)))
1507
- await self.updateCommeoDeviceValuesAsync(device.id)
1508
1517
  self._start_movement_polling(device.id)
1509
1518
 
1510
1519
  async def moveDeviceStepUp(self, device: SelveDevice, degrees: int = 0, type=DeviceCommandType.MANUAL):
1511
1520
  await self.executeCommand(CommandDriveStepUp(device.id, type, param=Util.degreesToValue(degrees)))
1512
- await self.updateCommeoDeviceValuesAsync(device.id)
1521
+ device.state = MovementState.UP_ON
1522
+ self.addOrUpdateDevice(device, SelveTypes.DEVICE)
1513
1523
  self._start_movement_polling(device.id)
1514
1524
 
1515
1525
  async def moveDeviceStepDown(self, device: SelveDevice, degrees: int = 0, type=DeviceCommandType.MANUAL):
1516
1526
  await self.executeCommand(CommandDriveStepDown(device.id, type, param=Util.degreesToValue(degrees)))
1517
- await self.updateCommeoDeviceValuesAsync(device.id)
1527
+ device.state = MovementState.DOWN_ON
1528
+ self.addOrUpdateDevice(device, SelveTypes.DEVICE)
1518
1529
  self._start_movement_polling(device.id)
1519
1530
 
1520
1531
  async def stopDevice(self, device: SelveDevice | IveoDevice, type=DeviceCommandType.MANUAL):
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '2.5.5'
22
- __version_tuple__ = version_tuple = (2, 5, 5)
21
+ __version__ = version = '2.5.7'
22
+ __version_tuple__ = version_tuple = (2, 5, 7)
23
23
 
24
- __commit_id__ = commit_id = 'g289213896'
24
+ __commit_id__ = commit_id = 'gaf58df608'
@@ -72,9 +72,9 @@ class TestMockCommands(unittest.TestCase):
72
72
  # Check that the device state was updated
73
73
  self.assertEqual(self.commeo_device.state, MovementState.UP_ON)
74
74
 
75
- # Check that device values were updated
76
- self.selve.updateCommeoDeviceValuesAsync.assert_called_once_with(1)
77
-
75
+ # updateCommeoDeviceValuesAsync is NOT called immediately; the poll loop handles updates
76
+ self.selve.updateCommeoDeviceValuesAsync.assert_not_called()
77
+
78
78
  self.loop.run_until_complete(test_async())
79
79
 
80
80
  def test_move_device_up_command_exception(self):