diff --git a/roborock/cli.py b/roborock/cli.py index 60e32c1c..b60c4959 100644 --- a/roborock/cli.py +++ b/roborock/cli.py @@ -41,8 +41,8 @@ from pyshark.capture.live_capture import LiveCapture, UnknownInterfaceException # type: ignore from pyshark.packet.packet import Packet # type: ignore -from roborock import SHORT_MODEL_TO_ENUM, RoborockCommand -from roborock.data import DeviceData, RoborockBase, UserData +from roborock import RoborockCommand +from roborock.data import RoborockBase, UserData from roborock.device_features import DeviceFeatures from roborock.devices.cache import Cache, CacheData from roborock.devices.device import RoborockDevice @@ -53,7 +53,6 @@ from roborock.devices.traits.v1.map_content import MapContentTrait from roborock.exceptions import RoborockException, RoborockUnsupportedFeature from roborock.protocol import MessageParser -from roborock.version_1_apis.roborock_mqtt_client_v1 import RoborockMqttClientV1 from roborock.web_api import RoborockApiClient _LOGGER = logging.getLogger(__name__) @@ -822,44 +821,46 @@ async def get_device_info(ctx: click.Context): """ click.echo("Discovering devices...") context: RoborockContext = ctx.obj - connection_cache = await context.get_devices() - - home_data = connection_cache.cache_data.home_data - - all_devices = home_data.get_all_devices() - if not all_devices: + device_connection_manager = await context.get_device_manager() + device_manager = await device_connection_manager.ensure_device_manager() + devices = await device_manager.get_devices() + if not devices: click.echo("No devices found.") return - click.echo(f"Found {len(all_devices)} devices. Fetching data...") + click.echo(f"Found {len(devices)} devices. Fetching data...") all_products_data = {} - for device in all_devices: + for device in devices: click.echo(f" - Processing {device.name} ({device.duid})") - product_info = home_data.product_map[device.product_id] - device_data = DeviceData(device, product_info.model) - mqtt_client = RoborockMqttClientV1(connection_cache.user_data, device_data) - try: - init_status_result = await mqtt_client.send_command( - RoborockCommand.APP_GET_INIT_STATUS, - ) - product_nickname = SHORT_MODEL_TO_ENUM.get(product_info.model.split(".")[-1]).name - current_product_data = { - "Protocol Version": device.pv, - "Product Nickname": product_nickname, - "New Feature Info": init_status_result.get("new_feature_info"), - "New Feature Info Str": init_status_result.get("new_feature_info_str"), - "Feature Info": init_status_result.get("feature_info"), - } + if device.product.model in all_products_data: + click.echo(f" - Skipping duplicate model {device.product.model}") + continue - all_products_data[product_info.model] = current_product_data + current_product_data = { + "Protocol Version": device.device_info.pv, + "Product Nickname": device.product.product_nickname.name, + } + if device.v1_properties is not None: + try: + result: list[dict[str, Any]] = await device.v1_properties.command.send( + RoborockCommand.APP_GET_INIT_STATUS + ) + except Exception as e: + click.echo(f" - Error processing device {device.name}: {e}", err=True) + continue + init_status_result = result[0] if result else {} + current_product_data.update( + { + "New Feature Info": init_status_result.get("new_feature_info"), + "New Feature Info Str": init_status_result.get("new_feature_info_str"), + "Feature Info": init_status_result.get("feature_info"), + } + ) - except Exception as e: - click.echo(f" - Error processing device {device.name}: {e}", err=True) - finally: - await mqtt_client.async_release() + all_products_data[device.product.model] = current_product_data if all_products_data: click.echo("\n--- Device Information (copy to your YAML file) ---\n") diff --git a/roborock/devices/README.md b/roborock/devices/README.md index f5add151..9d31df1b 100644 --- a/roborock/devices/README.md +++ b/roborock/devices/README.md @@ -556,8 +556,6 @@ The new design: - Clear separation of concerns through layers - Users work with devices, not raw clients -**Note**: Legacy APIs in `version_1_apis/` and `version_a01_apis/` are deprecated and will be removed. - ## Implementation Details