python-roborock 3.12.1__tar.gz → 3.12.2__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 (96) hide show
  1. {python_roborock-3.12.1 → python_roborock-3.12.2}/PKG-INFO +1 -1
  2. {python_roborock-3.12.1 → python_roborock-3.12.2}/pyproject.toml +1 -1
  3. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/protocol.py +31 -3
  4. {python_roborock-3.12.1 → python_roborock-3.12.2}/.gitignore +0 -0
  5. {python_roborock-3.12.1 → python_roborock-3.12.2}/LICENSE +0 -0
  6. {python_roborock-3.12.1 → python_roborock-3.12.2}/README.md +0 -0
  7. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/__init__.py +0 -0
  8. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/api.py +0 -0
  9. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/broadcast_protocol.py +0 -0
  10. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/callbacks.py +0 -0
  11. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/cli.py +0 -0
  12. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/cloud_api.py +0 -0
  13. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/command_cache.py +0 -0
  14. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/const.py +0 -0
  15. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/__init__.py +0 -0
  16. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/b01_q10/__init__.py +0 -0
  17. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
  18. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
  19. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/b01_q7/__init__.py +0 -0
  20. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
  21. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/b01_q7/b01_q7_containers.py +0 -0
  22. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/code_mappings.py +0 -0
  23. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/containers.py +0 -0
  24. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/dyad/__init__.py +0 -0
  25. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/dyad/dyad_code_mappings.py +0 -0
  26. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/dyad/dyad_containers.py +0 -0
  27. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/v1/__init__.py +0 -0
  28. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/v1/v1_clean_modes.py +0 -0
  29. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/v1/v1_code_mappings.py +0 -0
  30. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/v1/v1_containers.py +0 -0
  31. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/zeo/__init__.py +0 -0
  32. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/zeo/zeo_code_mappings.py +0 -0
  33. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/data/zeo/zeo_containers.py +0 -0
  34. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/device_features.py +0 -0
  35. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/README.md +0 -0
  36. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/__init__.py +0 -0
  37. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/a01_channel.py +0 -0
  38. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/b01_channel.py +0 -0
  39. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/cache.py +0 -0
  40. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/channel.py +0 -0
  41. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/device.py +0 -0
  42. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/device_manager.py +0 -0
  43. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/file_cache.py +0 -0
  44. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/local_channel.py +0 -0
  45. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/mqtt_channel.py +0 -0
  46. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/__init__.py +0 -0
  47. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/a01/__init__.py +0 -0
  48. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/b01/__init__.py +0 -0
  49. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/traits_mixin.py +0 -0
  50. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/__init__.py +0 -0
  51. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/child_lock.py +0 -0
  52. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/clean_summary.py +0 -0
  53. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/command.py +0 -0
  54. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/common.py +0 -0
  55. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/consumeable.py +0 -0
  56. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/device_features.py +0 -0
  57. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
  58. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
  59. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/flow_led_status.py +0 -0
  60. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/home.py +0 -0
  61. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/led_status.py +0 -0
  62. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/map_content.py +0 -0
  63. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/maps.py +0 -0
  64. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/network_info.py +0 -0
  65. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/rooms.py +0 -0
  66. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/routines.py +0 -0
  67. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
  68. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/status.py +0 -0
  69. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
  70. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/volume.py +0 -0
  71. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
  72. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/devices/v1_channel.py +0 -0
  73. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/exceptions.py +0 -0
  74. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/map/__init__.py +0 -0
  75. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/map/map_parser.py +0 -0
  76. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/mqtt/__init__.py +0 -0
  77. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/mqtt/health_manager.py +0 -0
  78. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/mqtt/roborock_session.py +0 -0
  79. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/mqtt/session.py +0 -0
  80. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/protocols/__init__.py +0 -0
  81. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/protocols/a01_protocol.py +0 -0
  82. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/protocols/b01_protocol.py +0 -0
  83. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/protocols/v1_protocol.py +0 -0
  84. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/py.typed +0 -0
  85. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/roborock_future.py +0 -0
  86. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/roborock_message.py +0 -0
  87. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/roborock_typing.py +0 -0
  88. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/util.py +0 -0
  89. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/version_1_apis/__init__.py +0 -0
  90. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/version_1_apis/roborock_client_v1.py +0 -0
  91. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/version_1_apis/roborock_local_client_v1.py +0 -0
  92. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/version_1_apis/roborock_mqtt_client_v1.py +0 -0
  93. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/version_a01_apis/__init__.py +0 -0
  94. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/version_a01_apis/roborock_client_a01.py +0 -0
  95. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/version_a01_apis/roborock_mqtt_client_a01.py +0 -0
  96. {python_roborock-3.12.1 → python_roborock-3.12.2}/roborock/web_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-roborock
3
- Version: 3.12.1
3
+ Version: 3.12.2
4
4
  Summary: A package to control Roborock vacuums.
5
5
  Project-URL: Repository, https://github.com/humbertogontijo/python-roborock
6
6
  Project-URL: Documentation, https://python-roborock.readthedocs.io/
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-roborock"
3
- version = "3.12.1"
3
+ version = "3.12.2"
4
4
  description = "A package to control Roborock vacuums."
5
5
  authors = [{ name = "humbertogontijo", email = "humbertogontijo@users.noreply.github.com" }, {name="Lash-L"}, {name="allenporter"}]
6
6
  requires-python = ">=3.11, <4"
@@ -341,9 +341,35 @@ class PrefixedStruct(Struct):
341
341
  def _parse(self, stream, context, path):
342
342
  subcon1 = Peek(Optional(Bytes(3)))
343
343
  peek_version = subcon1.parse_stream(stream, **context)
344
- if peek_version not in (b"1.0", b"A01", b"B01", b"L01"):
345
- subcon2 = Bytes(4)
346
- subcon2.parse_stream(stream, **context)
344
+
345
+ valid_versions = (b"1.0", b"A01", b"B01", b"L01")
346
+ if peek_version not in valid_versions:
347
+ # Current stream position does not start with a valid version.
348
+ # Scan forward to find one.
349
+ current_pos = stream_tell(stream, path)
350
+ # Read remaining data to find a valid header
351
+ data = stream.read()
352
+
353
+ start_index = -1
354
+ # Find the earliest occurrence of any valid version in a single pass
355
+ for i in range(len(data) - 2):
356
+ if data[i : i + 3] in valid_versions:
357
+ start_index = i
358
+ break
359
+
360
+ if start_index != -1:
361
+ # Found a valid version header at `start_index`.
362
+ # Seek to that position (original_pos + index).
363
+ if start_index != 4:
364
+ # 4 is the typical/expected amount we prune off,
365
+ # therefore, we only want a debug if we have a different length.
366
+ _LOGGER.debug("Stripping %d bytes of invalid data from stream", start_index)
367
+ stream_seek(stream, current_pos + start_index, 0, path)
368
+ else:
369
+ _LOGGER.debug("No valid version header found in stream, continuing anyways...")
370
+ # Seek back to the original position to avoid parsing at EOF
371
+ stream_seek(stream, current_pos, 0, path)
372
+
347
373
  return super()._parse(stream, context, path)
348
374
 
349
375
  def _build(self, obj, stream, context, path):
@@ -511,6 +537,8 @@ def create_local_decoder(local_key: str, connect_nonce: int | None = None, ack_n
511
537
  parsed_messages, remaining = MessageParser.parse(
512
538
  buffer, local_key=local_key, connect_nonce=connect_nonce, ack_nonce=ack_nonce
513
539
  )
540
+ if remaining:
541
+ _LOGGER.debug("Found %d extra bytes: %s", len(remaining), remaining)
514
542
  buffer = remaining
515
543
  return parsed_messages
516
544