python-roborock 5.5.1__tar.gz → 5.6.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.6.0}/PKG-INFO +1 -1
  2. {python_roborock-5.5.1 → python_roborock-5.6.0}/pyproject.toml +1 -1
  3. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/cli.py +57 -19
  4. {python_roborock-5.5.1 → python_roborock-5.6.0}/.gitignore +0 -0
  5. {python_roborock-5.5.1 → python_roborock-5.6.0}/LICENSE +0 -0
  6. {python_roborock-5.5.1 → python_roborock-5.6.0}/README.md +0 -0
  7. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/__init__.py +0 -0
  8. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/broadcast_protocol.py +0 -0
  9. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/callbacks.py +0 -0
  10. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/const.py +0 -0
  11. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/__init__.py +0 -0
  12. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/b01_q10/__init__.py +0 -0
  13. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
  14. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
  15. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/b01_q7/__init__.py +0 -0
  16. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
  17. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/b01_q7/b01_q7_containers.py +0 -0
  18. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/code_mappings.py +0 -0
  19. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/containers.py +0 -0
  20. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/dyad/__init__.py +0 -0
  21. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/dyad/dyad_code_mappings.py +0 -0
  22. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/dyad/dyad_containers.py +0 -0
  23. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/v1/__init__.py +0 -0
  24. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/v1/v1_clean_modes.py +0 -0
  25. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/v1/v1_code_mappings.py +0 -0
  26. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/v1/v1_containers.py +0 -0
  27. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/zeo/__init__.py +0 -0
  28. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/zeo/zeo_code_mappings.py +0 -0
  29. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/data/zeo/zeo_containers.py +0 -0
  30. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/device_features.py +0 -0
  31. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/README.md +0 -0
  32. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/__init__.py +0 -0
  33. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/cache.py +0 -0
  34. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/device.py +0 -0
  35. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/device_manager.py +0 -0
  36. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/file_cache.py +0 -0
  37. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/rpc/__init__.py +0 -0
  38. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/rpc/a01_channel.py +0 -0
  39. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/rpc/b01_q10_channel.py +0 -0
  40. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/rpc/b01_q7_channel.py +0 -0
  41. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/rpc/v1_channel.py +0 -0
  42. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/__init__.py +0 -0
  43. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/a01/__init__.py +0 -0
  44. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/b01/__init__.py +0 -0
  45. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/b01/q10/__init__.py +0 -0
  46. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/b01/q10/command.py +0 -0
  47. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/b01/q10/common.py +0 -0
  48. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/b01/q10/status.py +0 -0
  49. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/b01/q10/vacuum.py +0 -0
  50. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/b01/q7/__init__.py +0 -0
  51. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/b01/q7/clean_summary.py +0 -0
  52. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/b01/q7/map.py +0 -0
  53. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/b01/q7/map_content.py +0 -0
  54. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/traits_mixin.py +0 -0
  55. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/__init__.py +0 -0
  56. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/child_lock.py +0 -0
  57. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/clean_summary.py +0 -0
  58. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/command.py +0 -0
  59. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/common.py +0 -0
  60. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/consumeable.py +0 -0
  61. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/device_features.py +0 -0
  62. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
  63. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
  64. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/flow_led_status.py +0 -0
  65. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/home.py +0 -0
  66. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/led_status.py +0 -0
  67. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/map_content.py +0 -0
  68. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/maps.py +0 -0
  69. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/network_info.py +0 -0
  70. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/rooms.py +0 -0
  71. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/routines.py +0 -0
  72. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
  73. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/status.py +0 -0
  74. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
  75. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/volume.py +0 -0
  76. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
  77. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/transport/__init__.py +0 -0
  78. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/transport/channel.py +0 -0
  79. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/transport/local_channel.py +0 -0
  80. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/devices/transport/mqtt_channel.py +0 -0
  81. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/diagnostics.py +0 -0
  82. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/exceptions.py +0 -0
  83. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/map/__init__.py +0 -0
  84. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/map/b01_map_parser.py +0 -0
  85. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/map/map_parser.py +0 -0
  86. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/map/proto/__init__.py +0 -0
  87. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/map/proto/b01_scmap.proto +0 -0
  88. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/map/proto/b01_scmap_pb2.py +0 -0
  89. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/mqtt/__init__.py +0 -0
  90. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/mqtt/health_manager.py +0 -0
  91. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/mqtt/roborock_session.py +0 -0
  92. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/mqtt/session.py +0 -0
  93. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/protocol.py +0 -0
  94. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/protocols/__init__.py +0 -0
  95. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/protocols/a01_protocol.py +0 -0
  96. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/protocols/b01_q10_protocol.py +0 -0
  97. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/protocols/b01_q7_protocol.py +0 -0
  98. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/protocols/v1_protocol.py +0 -0
  99. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/py.typed +0 -0
  100. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/roborock_message.py +0 -0
  101. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/roborock_typing.py +0 -0
  102. {python_roborock-5.5.1 → python_roborock-5.6.0}/roborock/util.py +0 -0
  103. {python_roborock-5.5.1 → python_roborock-5.6.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.6.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.6.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
 
File without changes