python-roborock 5.5.1__tar.gz → 5.7.0__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 (103) hide show
  1. {python_roborock-5.5.1 → python_roborock-5.7.0}/PKG-INFO +1 -1
  2. {python_roborock-5.5.1 → python_roborock-5.7.0}/pyproject.toml +1 -1
  3. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/cli.py +57 -19
  4. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/v1/v1_code_mappings.py +33 -0
  5. {python_roborock-5.5.1 → python_roborock-5.7.0}/.gitignore +0 -0
  6. {python_roborock-5.5.1 → python_roborock-5.7.0}/LICENSE +0 -0
  7. {python_roborock-5.5.1 → python_roborock-5.7.0}/README.md +0 -0
  8. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/__init__.py +0 -0
  9. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/broadcast_protocol.py +0 -0
  10. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/callbacks.py +0 -0
  11. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/const.py +0 -0
  12. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/__init__.py +0 -0
  13. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/b01_q10/__init__.py +0 -0
  14. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
  15. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
  16. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/b01_q7/__init__.py +0 -0
  17. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
  18. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/b01_q7/b01_q7_containers.py +0 -0
  19. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/code_mappings.py +0 -0
  20. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/containers.py +0 -0
  21. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/dyad/__init__.py +0 -0
  22. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/dyad/dyad_code_mappings.py +0 -0
  23. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/dyad/dyad_containers.py +0 -0
  24. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/v1/__init__.py +0 -0
  25. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/v1/v1_clean_modes.py +0 -0
  26. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/v1/v1_containers.py +0 -0
  27. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/zeo/__init__.py +0 -0
  28. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/zeo/zeo_code_mappings.py +0 -0
  29. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/data/zeo/zeo_containers.py +0 -0
  30. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/device_features.py +0 -0
  31. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/README.md +0 -0
  32. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/__init__.py +0 -0
  33. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/cache.py +0 -0
  34. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/device.py +0 -0
  35. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/device_manager.py +0 -0
  36. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/file_cache.py +0 -0
  37. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/rpc/__init__.py +0 -0
  38. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/rpc/a01_channel.py +0 -0
  39. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/rpc/b01_q10_channel.py +0 -0
  40. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/rpc/b01_q7_channel.py +0 -0
  41. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/rpc/v1_channel.py +0 -0
  42. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/__init__.py +0 -0
  43. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/a01/__init__.py +0 -0
  44. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/b01/__init__.py +0 -0
  45. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/b01/q10/__init__.py +0 -0
  46. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/b01/q10/command.py +0 -0
  47. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/b01/q10/common.py +0 -0
  48. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/b01/q10/status.py +0 -0
  49. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/b01/q10/vacuum.py +0 -0
  50. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/b01/q7/__init__.py +0 -0
  51. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/b01/q7/clean_summary.py +0 -0
  52. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/b01/q7/map.py +0 -0
  53. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/b01/q7/map_content.py +0 -0
  54. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/traits_mixin.py +0 -0
  55. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/__init__.py +0 -0
  56. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/child_lock.py +0 -0
  57. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/clean_summary.py +0 -0
  58. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/command.py +0 -0
  59. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/common.py +0 -0
  60. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/consumeable.py +0 -0
  61. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/device_features.py +0 -0
  62. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
  63. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
  64. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/flow_led_status.py +0 -0
  65. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/home.py +0 -0
  66. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/led_status.py +0 -0
  67. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/map_content.py +0 -0
  68. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/maps.py +0 -0
  69. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/network_info.py +0 -0
  70. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/rooms.py +0 -0
  71. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/routines.py +0 -0
  72. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
  73. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/status.py +0 -0
  74. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
  75. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/volume.py +0 -0
  76. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
  77. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/transport/__init__.py +0 -0
  78. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/transport/channel.py +0 -0
  79. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/transport/local_channel.py +0 -0
  80. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/devices/transport/mqtt_channel.py +0 -0
  81. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/diagnostics.py +0 -0
  82. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/exceptions.py +0 -0
  83. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/map/__init__.py +0 -0
  84. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/map/b01_map_parser.py +0 -0
  85. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/map/map_parser.py +0 -0
  86. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/map/proto/__init__.py +0 -0
  87. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/map/proto/b01_scmap.proto +0 -0
  88. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/map/proto/b01_scmap_pb2.py +0 -0
  89. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/mqtt/__init__.py +0 -0
  90. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/mqtt/health_manager.py +0 -0
  91. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/mqtt/roborock_session.py +0 -0
  92. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/mqtt/session.py +0 -0
  93. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/protocol.py +0 -0
  94. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/protocols/__init__.py +0 -0
  95. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/protocols/a01_protocol.py +0 -0
  96. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/protocols/b01_q10_protocol.py +0 -0
  97. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/protocols/b01_q7_protocol.py +0 -0
  98. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/protocols/v1_protocol.py +0 -0
  99. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/py.typed +0 -0
  100. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/roborock_message.py +0 -0
  101. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/roborock_typing.py +0 -0
  102. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/util.py +0 -0
  103. {python_roborock-5.5.1 → python_roborock-5.7.0}/roborock/web_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-roborock
3
- Version: 5.5.1
3
+ Version: 5.7.0
4
4
  Summary: A package to control Roborock vacuums.
5
5
  Project-URL: Repository, https://github.com/python-roborock/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 = "5.5.1"
3
+ version = "5.7.0"
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"
@@ -878,12 +878,12 @@ def _parse_diagnostic_file(diagnostic_path: Path) -> dict[str, dict[str, Any]]:
878
878
  device_features = traits_data.get("device_features", {})
879
879
 
880
880
  # newFeatureInfo is the integer
881
- new_feature_info = device_features.get("newFeatureInfo")
881
+ new_feature_info = device_features.get("newFeatureInfo", device_data.get("featureSet"))
882
882
  if new_feature_info is not None:
883
- current_product_data["new_feature_info"] = new_feature_info
883
+ current_product_data["new_feature_info"] = int(new_feature_info)
884
884
 
885
885
  # newFeatureInfoStr is the hex string
886
- new_feature_info_str = device_features.get("newFeatureInfoStr")
886
+ new_feature_info_str = device_data.get("newFeatureSet")
887
887
  if new_feature_info_str:
888
888
  current_product_data["new_feature_info_str"] = new_feature_info_str
889
889
 
@@ -1048,29 +1048,67 @@ def update_docs(data_file: str, output_file: str):
1048
1048
  data_path = Path(data_file)
1049
1049
  output_path = Path(output_file)
1050
1050
 
1051
- if not data_path.exists():
1052
- click.echo(f"Error: Data file not found at '{data_path}'", err=True)
1053
- return
1054
-
1055
- click.echo(f"Loading data from {data_path}...")
1056
- with open(data_path, encoding="utf-8") as f:
1057
- product_data_from_yaml = yaml.safe_load(f)
1058
-
1059
- if not product_data_from_yaml:
1060
- click.echo("No data found in YAML file. Exiting.", err=True)
1051
+ product_data_from_yaml = {}
1052
+ if data_path.exists():
1053
+ click.echo(f"Loading data from {data_path}...")
1054
+ with open(data_path, encoding="utf-8") as f:
1055
+ product_data_from_yaml = yaml.safe_load(f) or {}
1056
+ else:
1057
+ click.echo(f"Data file not found at '{data_path}', will try testdata.")
1058
+
1059
+ combined_product_data = {}
1060
+
1061
+ testdata_path = Path("tests/testdata")
1062
+ if testdata_path.exists():
1063
+ products_by_id = {}
1064
+ for f in testdata_path.glob("home_data_product_*.json"):
1065
+ with open(f, encoding="utf-8") as file:
1066
+ data = json.load(file)
1067
+ products_by_id[data.get("id")] = data
1068
+
1069
+ loaded_testdata = False
1070
+ for f in testdata_path.glob("home_data_device_*.json"):
1071
+ with open(f, encoding="utf-8") as file:
1072
+ device_data = json.load(file)
1073
+ product_id = device_data["productId"]
1074
+ if product_id in products_by_id:
1075
+ product_data = products_by_id[product_id]
1076
+ model = product_data["model"]
1077
+ short_model = model.split(".")[-1]
1078
+ product_nickname = SHORT_MODEL_TO_ENUM.get(short_model)
1079
+ feature_set = device_data.get("featureSet", "0")
1080
+ new_feature_set = device_data.get("newFeatureSet", "0")
1081
+ combined_product_data[model] = {
1082
+ "product_nickname": product_nickname.name if product_nickname else "Unknown",
1083
+ "protocol_version": device_data["pv"],
1084
+ "new_feature_info": int(feature_set),
1085
+ "new_feature_info_str": new_feature_set,
1086
+ "feature_info": [],
1087
+ }
1088
+ print("Loaded %s", product_id)
1089
+ loaded_testdata = True
1090
+ if loaded_testdata:
1091
+ click.echo("Loaded mock testdata from local repository.")
1092
+
1093
+ if product_data_from_yaml:
1094
+ for model, data in product_data_from_yaml.items():
1095
+ combined_product_data[model] = data
1096
+
1097
+ if not combined_product_data:
1098
+ click.echo("No data found from YAML or testdata. Exiting.", err=True)
1061
1099
  return
1062
1100
 
1063
1101
  product_features_map = {}
1064
1102
  all_feature_names = set()
1065
1103
 
1066
- # Process the raw data from YAML to build the feature map
1067
- for model, data in product_data_from_yaml.items():
1104
+ # Process the combined data to build the feature map
1105
+ for model, data in combined_product_data.items():
1068
1106
  # Reconstruct the DeviceFeatures object from the raw data in the YAML file
1069
1107
  device_features = DeviceFeatures.from_feature_flags(
1070
- new_feature_info=data.get("new_feature_info"),
1071
- new_feature_info_str=data.get("new_feature_info_str"),
1072
- feature_info=data.get("feature_info"),
1073
- product_nickname=data.get("product_nickname"),
1108
+ new_feature_info=data.get("new_feature_info", 0),
1109
+ new_feature_info_str=data.get("new_feature_info_str", ""),
1110
+ feature_info=data.get("feature_info", []),
1111
+ product_nickname=data.get("product_nickname", ""),
1074
1112
  )
1075
1113
  features_dict = asdict(device_features)
1076
1114
 
@@ -551,13 +551,46 @@ class RoborockDockErrorCode(RoborockEnum):
551
551
  """Describes the error code of the dock."""
552
552
 
553
553
  ok = 0
554
+ """No error condition."""
555
+
556
+ no_dustbin_or_filter = 32
557
+ """No dock dustbin or filter installed.
558
+
559
+ This error message applies to auto-empty docks.
560
+ """
561
+
562
+ auto_empty_dock_fan_error = 33
563
+ """Auto-Empty Dock fan error: Dock dustbin or filter out of place."""
564
+
554
565
  duct_blockage = 34
566
+ """Auto-Empty Dock jammed: Dock dustbin, filter, or air duct jammed, check and clean it."""
567
+
568
+ auto_empty_dock_voltage_error = 35
569
+ """Auto-Empty Dock voltage error: Unable to empty the dustbin."""
570
+
555
571
  water_empty = 38
572
+ """Clean water tank empty: Check tank placement or refill as required."""
573
+
556
574
  waste_water_tank_full = 39
575
+ """Check the dirty water tank: Check tank placement or empty as required."""
576
+
557
577
  maintenance_brush_jammed = 42
578
+ """Self-cleaning roller error: Maintenance brush jammed. Remove and clean."""
579
+
558
580
  dirty_tank_latch_open = 44
581
+ """Water filter blocked: Clean and reinstall.
582
+
583
+ Make sure that the dirty water tank cover is closed and the latch is secured.
584
+ """
585
+
559
586
  no_dustbin = 46
587
+ """Dustbin not installed (Standard error for missing dustbin).
588
+
589
+ This error message applies to larger wash docks.
590
+ """
591
+
560
592
  cleaning_tank_full_or_blocked = 53
593
+ """Cleaning tank full or blocked (Water filter or sink strainer blocked/not installed)."""
561
594
 
562
595
 
563
596
  class RoborockDockTypeCode(RoborockEnum):
File without changes