From f95c791bbf55cce86c9c52dfc815333d3f16884e Mon Sep 17 00:00:00 2001 From: Harry Coureau Date: Tue, 10 Nov 2026 21:07:59 +0000 Subject: [PATCH 1/2] fix: report unknown product families in device info --- roborock/cli.py | 5 ++--- tests/test_cli.py | 56 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/roborock/cli.py b/roborock/cli.py index c797213c..8a8d46a1 100644 --- a/roborock/cli.py +++ b/roborock/cli.py @@ -1203,11 +1203,10 @@ async def get_device_info(ctx: click.Context, record: bool, device_info_file: st click.echo(f" - Skipping duplicate model {model}") continue + product_nickname = SHORT_MODEL_TO_ENUM.get(model.split(".")[-1]) current_product_data = { "protocol_version": device.device_info.pv, - "product_nickname": device.product.product_nickname.name - if device.product.product_nickname - else "Unknown", + "product_nickname": product_nickname.name if product_nickname else "Unknown", } if device.v1_properties is not None: try: diff --git a/tests/test_cli.py b/tests/test_cli.py index 2dc63835..444e5e8b 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -3,14 +3,18 @@ import json from pathlib import Path from typing import Any -from unittest.mock import Mock +from unittest.mock import AsyncMock, Mock import pytest +import yaml from click.testing import CliRunner -from roborock.cli import ConnectionCache, RoborockContext, cli -from roborock.data import HomeDataSchedule, UserData +from roborock.cli import ConnectionCache, DeviceConnectionManager, RoborockContext, cli +from roborock.data import HomeDataProduct, HomeDataSchedule, RoborockCategory, UserData +from roborock.devices.device import RoborockDevice +from roborock.devices.device_manager import DeviceManager from roborock.exceptions import RoborockException +from roborock.roborock_typing import RoborockCommand from roborock.web_api import RoborockApiClient from tests.mock_data import USER_DATA, USER_EMAIL @@ -85,3 +89,49 @@ def test_update_job_api_error(mock_api: Mock, tmp_path: Path, job_data: dict[str assert result.exit_code == 1 assert result.output == "Error: Job not found\n" mock_api.return_value.update_job.assert_awaited_once() + + +@pytest.mark.parametrize( + ("model", "expected_nickname"), + [ + ("roborock.vacuum.a294", "Unknown"), + ("roborock.vacuum.unrecognized", "Unknown"), + ("roborock.vacuum.a87", "PEARLPLUS"), + ("roborock.vacuum.a101", "PEARLS"), + ], +) +def test_get_device_info_product_nickname(monkeypatch: pytest.MonkeyPatch, model: str, expected_nickname: str) -> None: + """Device info exports unknown families and retains mapped family names.""" + product = HomeDataProduct(id="test-product", name="Test vacuum", model=model, category=RoborockCategory.VACUUM) + init_status = { + "new_feature_info": 2247397454282751, + "new_feature_info_str": "0000009021D0B410C0C47EFDA82934C952BA8F507EDEFFFE", + "feature_info": list(range(111, 126)), + } + device = Mock(spec=RoborockDevice) + device.name = "Test vacuum" + device.duid = "test-device" + device.product = product + device.device_info = Mock(pv="1.0") + device.v1_properties = Mock() + send_command = AsyncMock(return_value=[init_status]) + device.v1_properties.command.send = send_command + device_manager = AsyncMock(spec=DeviceManager) + device_manager.get_devices.return_value = [device] + connection_manager = AsyncMock(spec=DeviceConnectionManager) + connection_manager.ensure_device_manager.return_value = device_manager + monkeypatch.setattr(RoborockContext, "get_device_manager", AsyncMock(return_value=connection_manager)) + + result = CliRunner().invoke(cli, ["get-device-info"]) + + assert result.exit_code == 0, result.output + device_info = yaml.safe_load(result.output.split("--- Device Information (copy to your YAML file) ---\n\n")[1]) + assert device_info == { + model: { + "protocol_version": "1.0", + "product_nickname": expected_nickname, + **init_status, + "product": product.as_dict(), + } + } + send_command.assert_awaited_once_with(RoborockCommand.APP_GET_INIT_STATUS) From a0f98ef7a784fd3dc71b37c8ac5a6339ecba62e3 Mon Sep 17 00:00:00 2001 From: Harry Coureau Date: Tue, 10 Nov 2026 21:27:55 +0000 Subject: [PATCH 2/2] fix: correct unknown model families in device catalogue --- device_info.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/device_info.yaml b/device_info.yaml index 07bbc036..d1ba38f1 100644 --- a/device_info.yaml +++ b/device_info.yaml @@ -1125,7 +1125,7 @@ roborock.vacuum.s5e: - 125 roborock.vacuum.sc05: protocol_version: B01 - product_nickname: PEARLPLUS + product_nickname: Unknown product: id: 5ayEx3aKgStqZZ0v5IpMBP name: Roborock Q7 Series @@ -1303,7 +1303,7 @@ roborock.vacuum.sc05: property: 'null' roborock.vacuum.a288: protocol_version: '1.0' - product_nickname: PEARLPLUS + product_nickname: Unknown new_feature_info: 4499197267967999 new_feature_info_str: 0000000000099518CCFF7EFDA8E93EDDDBFF8F7F7EFEFFFF feature_info: @@ -1456,7 +1456,7 @@ roborock.vacuum.a288: roborock.vacuum.ss07: protocol_version: B01 - product_nickname: PEARLPLUS + product_nickname: Unknown product: id: 3gKDz7BnDrjXOVBAEXj4uw name: Roborock Q10 Series