From e1f6ac2e0b17f6b5be0bdfdfde109a6382303a79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 1 Feb 2026 08:46:08 +0100 Subject: [PATCH 01/14] feat(q10): Add Q10 vacuum CLI commands - Add q10-vacuum-start command to start vacuum cleaning - Add q10-vacuum-pause command to pause vacuum cleaning - Add q10-vacuum-resume command to resume vacuum cleaning - Add q10-vacuum-stop command to stop vacuum cleaning - Add q10-vacuum-dock command to return vacuum to dock - All commands require device_id parameter - Commands validate that device has VacuumTrait (Q10 only) --- roborock/cli.py | 85 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/roborock/cli.py b/roborock/cli.py index 9f02b2de..3a873356 100644 --- a/roborock/cli.py +++ b/roborock/cli.py @@ -1141,6 +1141,86 @@ def write_markdown_table(product_features: dict[str, dict[str, any]], all_featur click.echo("Done.") +@click.command() +@click.option("--device_id", required=True, help="Device ID") +@click.pass_context +@async_command +async def q10_vacuum_start(ctx, device_id): + """Start vacuum cleaning on Q10 device.""" + context: RoborockContext = ctx.obj + device_manager = await context.get_device_manager() + device = await device_manager.get_device(device_id) + trait = device.traits.get("VacuumTrait") + if not trait: + raise RoborockUnsupportedFeature("Device does not have VacuumTrait. Is it a Q10?") + await trait.start_clean() + click.echo("Starting vacuum cleaning...") + + +@click.command() +@click.option("--device_id", required=True, help="Device ID") +@click.pass_context +@async_command +async def q10_vacuum_pause(ctx, device_id): + """Pause vacuum cleaning on Q10 device.""" + context: RoborockContext = ctx.obj + device_manager = await context.get_device_manager() + device = await device_manager.get_device(device_id) + trait = device.traits.get("VacuumTrait") + if not trait: + raise RoborockUnsupportedFeature("Device does not have VacuumTrait. Is it a Q10?") + await trait.pause_clean() + click.echo("Pausing vacuum cleaning...") + + +@click.command() +@click.option("--device_id", required=True, help="Device ID") +@click.pass_context +@async_command +async def q10_vacuum_resume(ctx, device_id): + """Resume vacuum cleaning on Q10 device.""" + context: RoborockContext = ctx.obj + device_manager = await context.get_device_manager() + device = await device_manager.get_device(device_id) + trait = device.traits.get("VacuumTrait") + if not trait: + raise RoborockUnsupportedFeature("Device does not have VacuumTrait. Is it a Q10?") + await trait.resume_clean() + click.echo("Resuming vacuum cleaning...") + + +@click.command() +@click.option("--device_id", required=True, help="Device ID") +@click.pass_context +@async_command +async def q10_vacuum_stop(ctx, device_id): + """Stop vacuum cleaning on Q10 device.""" + context: RoborockContext = ctx.obj + device_manager = await context.get_device_manager() + device = await device_manager.get_device(device_id) + trait = device.traits.get("VacuumTrait") + if not trait: + raise RoborockUnsupportedFeature("Device does not have VacuumTrait. Is it a Q10?") + await trait.stop_clean() + click.echo("Stopping vacuum cleaning...") + + +@click.command() +@click.option("--device_id", required=True, help="Device ID") +@click.pass_context +@async_command +async def q10_vacuum_dock(ctx, device_id): + """Return vacuum to dock on Q10 device.""" + context: RoborockContext = ctx.obj + device_manager = await context.get_device_manager() + device = await device_manager.get_device(device_id) + trait = device.traits.get("VacuumTrait") + if not trait: + raise RoborockUnsupportedFeature("Device does not have VacuumTrait. Is it a Q10?") + await trait.return_to_dock() + click.echo("Returning vacuum to dock...") + + cli.add_command(login) cli.add_command(discover) cli.add_command(list_devices) @@ -1170,6 +1250,11 @@ def write_markdown_table(product_features: dict[str, dict[str, any]], all_featur cli.add_command(flow_led_status) cli.add_command(led_status) cli.add_command(network_info) +cli.add_command(q10_vacuum_start) +cli.add_command(q10_vacuum_pause) +cli.add_command(q10_vacuum_resume) +cli.add_command(q10_vacuum_stop) +cli.add_command(q10_vacuum_dock) def main(): From f091059e0ce75a9536fa606cee146ac029940464 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 1 Feb 2026 08:56:23 +0100 Subject: [PATCH 02/14] refactor(q10): Extract Q10 vacuum trait helper to reduce duplication - Add _q10_vacuum_trait() helper function similar to _v1_trait() - Refactor all 5 Q10 commands to use the helper - Centralizes device lookup and trait validation logic - Addresses code review feedback from copilot-pull-request-reviewer --- roborock/cli.py | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/roborock/cli.py b/roborock/cli.py index 3a873356..87779b25 100644 --- a/roborock/cli.py +++ b/roborock/cli.py @@ -438,6 +438,16 @@ async def _display_v1_trait(context: RoborockContext, device_id: str, display_fu click.echo(dump_json(trait.as_dict())) +async def _q10_vacuum_trait(context: RoborockContext, device_id: str): + """Get VacuumTrait from Q10 device.""" + device_manager = await context.get_device_manager() + device = await device_manager.get_device(device_id) + trait = device.traits.get("VacuumTrait") + if not trait: + raise RoborockUnsupportedFeature("Device does not have VacuumTrait. Is it a Q10?") + return trait + + @session.command() @click.option("--device_id", required=True) @click.pass_context @@ -1148,11 +1158,7 @@ def write_markdown_table(product_features: dict[str, dict[str, any]], all_featur async def q10_vacuum_start(ctx, device_id): """Start vacuum cleaning on Q10 device.""" context: RoborockContext = ctx.obj - device_manager = await context.get_device_manager() - device = await device_manager.get_device(device_id) - trait = device.traits.get("VacuumTrait") - if not trait: - raise RoborockUnsupportedFeature("Device does not have VacuumTrait. Is it a Q10?") + trait = await _q10_vacuum_trait(context, device_id) await trait.start_clean() click.echo("Starting vacuum cleaning...") @@ -1164,11 +1170,7 @@ async def q10_vacuum_start(ctx, device_id): async def q10_vacuum_pause(ctx, device_id): """Pause vacuum cleaning on Q10 device.""" context: RoborockContext = ctx.obj - device_manager = await context.get_device_manager() - device = await device_manager.get_device(device_id) - trait = device.traits.get("VacuumTrait") - if not trait: - raise RoborockUnsupportedFeature("Device does not have VacuumTrait. Is it a Q10?") + trait = await _q10_vacuum_trait(context, device_id) await trait.pause_clean() click.echo("Pausing vacuum cleaning...") @@ -1180,11 +1182,7 @@ async def q10_vacuum_pause(ctx, device_id): async def q10_vacuum_resume(ctx, device_id): """Resume vacuum cleaning on Q10 device.""" context: RoborockContext = ctx.obj - device_manager = await context.get_device_manager() - device = await device_manager.get_device(device_id) - trait = device.traits.get("VacuumTrait") - if not trait: - raise RoborockUnsupportedFeature("Device does not have VacuumTrait. Is it a Q10?") + trait = await _q10_vacuum_trait(context, device_id) await trait.resume_clean() click.echo("Resuming vacuum cleaning...") @@ -1196,11 +1194,7 @@ async def q10_vacuum_resume(ctx, device_id): async def q10_vacuum_stop(ctx, device_id): """Stop vacuum cleaning on Q10 device.""" context: RoborockContext = ctx.obj - device_manager = await context.get_device_manager() - device = await device_manager.get_device(device_id) - trait = device.traits.get("VacuumTrait") - if not trait: - raise RoborockUnsupportedFeature("Device does not have VacuumTrait. Is it a Q10?") + trait = await _q10_vacuum_trait(context, device_id) await trait.stop_clean() click.echo("Stopping vacuum cleaning...") @@ -1212,11 +1206,7 @@ async def q10_vacuum_stop(ctx, device_id): async def q10_vacuum_dock(ctx, device_id): """Return vacuum to dock on Q10 device.""" context: RoborockContext = ctx.obj - device_manager = await context.get_device_manager() - device = await device_manager.get_device(device_id) - trait = device.traits.get("VacuumTrait") - if not trait: - raise RoborockUnsupportedFeature("Device does not have VacuumTrait. Is it a Q10?") + trait = await _q10_vacuum_trait(context, device_id) await trait.return_to_dock() click.echo("Returning vacuum to dock...") From 3d56591d5963c0863afb0da4d624fe910607fb7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 1 Feb 2026 08:58:40 +0100 Subject: [PATCH 03/14] fix(q10): Handle unsupported device errors gracefully - Add try/except blocks to catch RoborockUnsupportedFeature - Display user-friendly error messages instead of stack traces - Follow same pattern as _display_v1_trait for expected errors - Addresses code review feedback from copilot-pull-request-reviewer --- roborock/cli.py | 55 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/roborock/cli.py b/roborock/cli.py index 87779b25..58868efb 100644 --- a/roborock/cli.py +++ b/roborock/cli.py @@ -1158,9 +1158,14 @@ def write_markdown_table(product_features: dict[str, dict[str, any]], all_featur async def q10_vacuum_start(ctx, device_id): """Start vacuum cleaning on Q10 device.""" context: RoborockContext = ctx.obj - trait = await _q10_vacuum_trait(context, device_id) - await trait.start_clean() - click.echo("Starting vacuum cleaning...") + try: + trait = await _q10_vacuum_trait(context, device_id) + await trait.start_clean() + click.echo("Starting vacuum cleaning...") + except RoborockUnsupportedFeature: + click.echo("Device does not have VacuumTrait. Is it a Q10?") + except RoborockException as e: + click.echo(f"Error: {e}") @click.command() @@ -1170,9 +1175,14 @@ async def q10_vacuum_start(ctx, device_id): async def q10_vacuum_pause(ctx, device_id): """Pause vacuum cleaning on Q10 device.""" context: RoborockContext = ctx.obj - trait = await _q10_vacuum_trait(context, device_id) - await trait.pause_clean() - click.echo("Pausing vacuum cleaning...") + try: + trait = await _q10_vacuum_trait(context, device_id) + await trait.pause_clean() + click.echo("Pausing vacuum cleaning...") + except RoborockUnsupportedFeature: + click.echo("Device does not have VacuumTrait. Is it a Q10?") + except RoborockException as e: + click.echo(f"Error: {e}") @click.command() @@ -1182,9 +1192,14 @@ async def q10_vacuum_pause(ctx, device_id): async def q10_vacuum_resume(ctx, device_id): """Resume vacuum cleaning on Q10 device.""" context: RoborockContext = ctx.obj - trait = await _q10_vacuum_trait(context, device_id) - await trait.resume_clean() - click.echo("Resuming vacuum cleaning...") + try: + trait = await _q10_vacuum_trait(context, device_id) + await trait.resume_clean() + click.echo("Resuming vacuum cleaning...") + except RoborockUnsupportedFeature: + click.echo("Device does not have VacuumTrait. Is it a Q10?") + except RoborockException as e: + click.echo(f"Error: {e}") @click.command() @@ -1194,9 +1209,14 @@ async def q10_vacuum_resume(ctx, device_id): async def q10_vacuum_stop(ctx, device_id): """Stop vacuum cleaning on Q10 device.""" context: RoborockContext = ctx.obj - trait = await _q10_vacuum_trait(context, device_id) - await trait.stop_clean() - click.echo("Stopping vacuum cleaning...") + try: + trait = await _q10_vacuum_trait(context, device_id) + await trait.stop_clean() + click.echo("Stopping vacuum cleaning...") + except RoborockUnsupportedFeature: + click.echo("Device does not have VacuumTrait. Is it a Q10?") + except RoborockException as e: + click.echo(f"Error: {e}") @click.command() @@ -1206,9 +1226,14 @@ async def q10_vacuum_stop(ctx, device_id): async def q10_vacuum_dock(ctx, device_id): """Return vacuum to dock on Q10 device.""" context: RoborockContext = ctx.obj - trait = await _q10_vacuum_trait(context, device_id) - await trait.return_to_dock() - click.echo("Returning vacuum to dock...") + try: + trait = await _q10_vacuum_trait(context, device_id) + await trait.return_to_dock() + click.echo("Returning vacuum to dock...") + except RoborockUnsupportedFeature: + click.echo("Device does not have VacuumTrait. Is it a Q10?") + except RoborockException as e: + click.echo(f"Error: {e}") cli.add_command(login) From fc076f65b4f82ebabf2e005ca2c44fda583fc439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 1 Feb 2026 09:00:08 +0100 Subject: [PATCH 04/14] fix(q10): Use correct B01 Q10 properties API - Change from device.traits.get('VacuumTrait') to device.b01_q10_properties.vacuum - Fix AttributeError that would occur at runtime - Update error messages to reflect B01 Q10 protocol requirement - Addresses code review feedback from copilot-pull-request-reviewer --- roborock/cli.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/roborock/cli.py b/roborock/cli.py index 58868efb..f8d836f5 100644 --- a/roborock/cli.py +++ b/roborock/cli.py @@ -442,10 +442,9 @@ async def _q10_vacuum_trait(context: RoborockContext, device_id: str): """Get VacuumTrait from Q10 device.""" device_manager = await context.get_device_manager() device = await device_manager.get_device(device_id) - trait = device.traits.get("VacuumTrait") - if not trait: - raise RoborockUnsupportedFeature("Device does not have VacuumTrait. Is it a Q10?") - return trait + if device.b01_q10_properties is None: + raise RoborockUnsupportedFeature("Device does not support B01 Q10 protocol. Is it a Q10?") + return device.b01_q10_properties.vacuum @session.command() @@ -1163,7 +1162,7 @@ async def q10_vacuum_start(ctx, device_id): await trait.start_clean() click.echo("Starting vacuum cleaning...") except RoborockUnsupportedFeature: - click.echo("Device does not have VacuumTrait. Is it a Q10?") + click.echo("Device does not support B01 Q10 protocol. Is it a Q10?") except RoborockException as e: click.echo(f"Error: {e}") @@ -1180,7 +1179,7 @@ async def q10_vacuum_pause(ctx, device_id): await trait.pause_clean() click.echo("Pausing vacuum cleaning...") except RoborockUnsupportedFeature: - click.echo("Device does not have VacuumTrait. Is it a Q10?") + click.echo("Device does not support B01 Q10 protocol. Is it a Q10?") except RoborockException as e: click.echo(f"Error: {e}") @@ -1197,7 +1196,7 @@ async def q10_vacuum_resume(ctx, device_id): await trait.resume_clean() click.echo("Resuming vacuum cleaning...") except RoborockUnsupportedFeature: - click.echo("Device does not have VacuumTrait. Is it a Q10?") + click.echo("Device does not support B01 Q10 protocol. Is it a Q10?") except RoborockException as e: click.echo(f"Error: {e}") @@ -1214,7 +1213,7 @@ async def q10_vacuum_stop(ctx, device_id): await trait.stop_clean() click.echo("Stopping vacuum cleaning...") except RoborockUnsupportedFeature: - click.echo("Device does not have VacuumTrait. Is it a Q10?") + click.echo("Device does not support B01 Q10 protocol. Is it a Q10?") except RoborockException as e: click.echo(f"Error: {e}") @@ -1231,7 +1230,7 @@ async def q10_vacuum_dock(ctx, device_id): await trait.return_to_dock() click.echo("Returning vacuum to dock...") except RoborockUnsupportedFeature: - click.echo("Device does not have VacuumTrait. Is it a Q10?") + click.echo("Device does not support B01 Q10 protocol. Is it a Q10?") except RoborockException as e: click.echo(f"Error: {e}") From 353babc67557ed288b0029059dddbce9137f3d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 1 Feb 2026 09:28:52 +0100 Subject: [PATCH 05/14] fix(q10): Register Q10 commands in session shell --- roborock/cli.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/roborock/cli.py b/roborock/cli.py index f8d836f5..a73663fd 100644 --- a/roborock/cli.py +++ b/roborock/cli.py @@ -1270,6 +1270,12 @@ async def q10_vacuum_dock(ctx, device_id): cli.add_command(q10_vacuum_stop) cli.add_command(q10_vacuum_dock) +session.add_command(q10_vacuum_start) +session.add_command(q10_vacuum_pause) +session.add_command(q10_vacuum_resume) +session.add_command(q10_vacuum_stop) +session.add_command(q10_vacuum_dock) + def main(): return cli() From 1976c84d97ef8ff46c5e877387810203d997ffba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 1 Feb 2026 09:43:46 +0100 Subject: [PATCH 06/14] feat(q10): Add status API for B01 Q10 devices --- roborock/devices/rpc/b01_q10_channel.py | 63 +++++++++++++++++ roborock/devices/traits/b01/q10/__init__.py | 6 ++ roborock/devices/traits/b01/q10/status.py | 77 +++++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 roborock/devices/traits/b01/q10/status.py diff --git a/roborock/devices/rpc/b01_q10_channel.py b/roborock/devices/rpc/b01_q10_channel.py index a482e109..78450c56 100644 --- a/roborock/devices/rpc/b01_q10_channel.py +++ b/roborock/devices/rpc/b01_q10_channel.py @@ -2,17 +2,22 @@ from __future__ import annotations +import asyncio import logging +from typing import Any, Iterable from roborock.data.b01_q10.b01_q10_code_mappings import B01_Q10_DP from roborock.devices.transport.mqtt_channel import MqttChannel from roborock.exceptions import RoborockException from roborock.protocols.b01_q10_protocol import ( ParamsType, + decode_rpc_response, encode_mqtt_payload, ) +from roborock.roborock_message import RoborockMessage _LOGGER = logging.getLogger(__name__) +_TIMEOUT = 10.0 async def send_command( @@ -34,3 +39,61 @@ async def send_command( ex, ) raise + + +async def send_decoded_command( + mqtt_channel: MqttChannel, + command: B01_Q10_DP, + params: ParamsType, + expected_dps: Iterable[B01_Q10_DP] | None = None, +) -> dict[B01_Q10_DP, Any]: + """Send a command and await the first decoded response. + + Q10 responses are not correlated with a message id, so we filter on + expected datapoints when provided. + """ + roborock_message = encode_mqtt_payload(command, params) + future: asyncio.Future[dict[B01_Q10_DP, Any]] = asyncio.get_running_loop().create_future() + + expected_set = set(expected_dps) if expected_dps is not None else None + + def find_response(response_message: RoborockMessage) -> None: + try: + decoded_dps = decode_rpc_response(response_message) + except RoborockException as ex: + _LOGGER.debug( + "Failed to decode B01 Q10 RPC response (expecting %s): %s: %s", + command, + response_message, + ex, + ) + return + if expected_set and not any(dps in decoded_dps for dps in expected_set): + return + if not future.done(): + future.set_result(decoded_dps) + + unsub = await mqtt_channel.subscribe(find_response) + + _LOGGER.debug("Sending MQTT message: %s", roborock_message) + try: + await mqtt_channel.publish(roborock_message) + return await asyncio.wait_for(future, timeout=_TIMEOUT) + except TimeoutError as ex: + raise RoborockException(f"B01 Q10 command timed out after {_TIMEOUT}s ({command})") from ex + except RoborockException as ex: + _LOGGER.warning( + "Error sending B01 Q10 decoded command (%s): %s", + command, + ex, + ) + raise + except Exception as ex: + _LOGGER.exception( + "Error sending B01 Q10 decoded command (%s): %s", + command, + ex, + ) + raise + finally: + unsub() diff --git a/roborock/devices/traits/b01/q10/__init__.py b/roborock/devices/traits/b01/q10/__init__.py index ac897259..f228b933 100644 --- a/roborock/devices/traits/b01/q10/__init__.py +++ b/roborock/devices/traits/b01/q10/__init__.py @@ -4,10 +4,12 @@ from roborock.devices.transport.mqtt_channel import MqttChannel from .command import CommandTrait +from .status import StatusTrait from .vacuum import VacuumTrait __all__ = [ "Q10PropertiesApi", + "StatusTrait", ] @@ -20,10 +22,14 @@ class Q10PropertiesApi(Trait): vacuum: VacuumTrait """Trait for sending vacuum related commands to Q10 devices.""" + status: StatusTrait + """Trait for reading device status values.""" + def __init__(self, channel: MqttChannel) -> None: """Initialize the B01Props API.""" self.command = CommandTrait(channel) self.vacuum = VacuumTrait(self.command) + self.status = StatusTrait(channel) def create(channel: MqttChannel) -> Q10PropertiesApi: diff --git a/roborock/devices/traits/b01/q10/status.py b/roborock/devices/traits/b01/q10/status.py new file mode 100644 index 00000000..9795b0ca --- /dev/null +++ b/roborock/devices/traits/b01/q10/status.py @@ -0,0 +1,77 @@ +"""Status trait for Q10 B01 devices.""" + +from __future__ import annotations + +from typing import Any + +from roborock.data.b01_q10.b01_q10_code_mappings import ( + B01_Q10_DP, + YXDeviceCleanTask, + YXDeviceState, + YXDeviceWorkMode, + YXFanLevel, + YXWaterLevel, +) +from roborock.devices.rpc.b01_q10_channel import send_decoded_command +from roborock.devices.transport.mqtt_channel import MqttChannel + + +class StatusTrait: + """Trait for requesting and holding Q10 status values.""" + + def __init__(self, channel: MqttChannel) -> None: + self._channel = channel + self._data: dict[B01_Q10_DP, Any] = {} + + @property + def data(self) -> dict[B01_Q10_DP, Any]: + """Return the latest raw status data.""" + return self._data + + async def refresh(self) -> dict[B01_Q10_DP, Any]: + """Refresh status values from the device.""" + decoded = await send_decoded_command( + self._channel, + command=B01_Q10_DP.REQUETDPS, + params={}, + expected_dps={B01_Q10_DP.STATUS, B01_Q10_DP.BATTERY}, + ) + self._data = decoded + return decoded + + @property + def state_code(self) -> int | None: + return self._data.get(B01_Q10_DP.STATUS) + + @property + def state(self) -> YXDeviceState | None: + code = self.state_code + return YXDeviceState.from_code_optional(code) if code is not None else None + + @property + def battery(self) -> int | None: + return self._data.get(B01_Q10_DP.BATTERY) + + @property + def fan_level(self) -> YXFanLevel | None: + value = self._data.get(B01_Q10_DP.FUN_LEVEL) + return YXFanLevel.from_code_optional(value) if value is not None else None + + @property + def water_level(self) -> YXWaterLevel | None: + value = self._data.get(B01_Q10_DP.WATER_LEVEL) + return YXWaterLevel.from_code_optional(value) if value is not None else None + + @property + def clean_mode(self) -> YXDeviceWorkMode | None: + value = self._data.get(B01_Q10_DP.CLEAN_MODE) + return YXDeviceWorkMode.from_code_optional(value) if value is not None else None + + @property + def clean_task(self) -> YXDeviceCleanTask | None: + value = self._data.get(B01_Q10_DP.CLEAN_TASK_TYPE) + return YXDeviceCleanTask.from_code_optional(value) if value is not None else None + + @property + def cleaning_progress(self) -> int | None: + return self._data.get(B01_Q10_DP.CLEANING_PROGRESS) From de7cf69e17dca5dfca16b1d8b8ceb938b269b21e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 1 Feb 2026 09:47:10 +0100 Subject: [PATCH 07/14] feat(q10): Add status trait and fan level mapping --- roborock/data/b01_q10/b01_q10_code_mappings.py | 1 + roborock/devices/rpc/b01_q10_channel.py | 3 ++- roborock/devices/traits/b01/q10/status.py | 14 ++++++++------ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/roborock/data/b01_q10/b01_q10_code_mappings.py b/roborock/data/b01_q10/b01_q10_code_mappings.py index 69dbc8d9..2fb8dc8b 100644 --- a/roborock/data/b01_q10/b01_q10_code_mappings.py +++ b/roborock/data/b01_q10/b01_q10_code_mappings.py @@ -126,6 +126,7 @@ class YXFanLevel(RoborockModeEnum): STRONG = "strong", 3 MAX = "max", 4 SUPER = "super", 5 + CUSTOM = "custom", 8 class YXWaterLevel(RoborockModeEnum): diff --git a/roborock/devices/rpc/b01_q10_channel.py b/roborock/devices/rpc/b01_q10_channel.py index 78450c56..a11e13dd 100644 --- a/roborock/devices/rpc/b01_q10_channel.py +++ b/roborock/devices/rpc/b01_q10_channel.py @@ -4,7 +4,8 @@ import asyncio import logging -from typing import Any, Iterable +from collections.abc import Iterable +from typing import Any from roborock.data.b01_q10.b01_q10_code_mappings import B01_Q10_DP from roborock.devices.transport.mqtt_channel import MqttChannel diff --git a/roborock/devices/traits/b01/q10/status.py b/roborock/devices/traits/b01/q10/status.py index 9795b0ca..4bb2c4f9 100644 --- a/roborock/devices/traits/b01/q10/status.py +++ b/roborock/devices/traits/b01/q10/status.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import Any +from typing import Any, cast from roborock.data.b01_q10.b01_q10_code_mappings import ( B01_Q10_DP, @@ -46,7 +46,7 @@ def state_code(self) -> int | None: @property def state(self) -> YXDeviceState | None: code = self.state_code - return YXDeviceState.from_code_optional(code) if code is not None else None + return cast(YXDeviceState | None, YXDeviceState.from_code_optional(code)) if code is not None else None @property def battery(self) -> int | None: @@ -55,22 +55,24 @@ def battery(self) -> int | None: @property def fan_level(self) -> YXFanLevel | None: value = self._data.get(B01_Q10_DP.FUN_LEVEL) - return YXFanLevel.from_code_optional(value) if value is not None else None + return cast(YXFanLevel | None, YXFanLevel.from_code_optional(value)) if value is not None else None @property def water_level(self) -> YXWaterLevel | None: value = self._data.get(B01_Q10_DP.WATER_LEVEL) - return YXWaterLevel.from_code_optional(value) if value is not None else None + return cast(YXWaterLevel | None, YXWaterLevel.from_code_optional(value)) if value is not None else None @property def clean_mode(self) -> YXDeviceWorkMode | None: value = self._data.get(B01_Q10_DP.CLEAN_MODE) - return YXDeviceWorkMode.from_code_optional(value) if value is not None else None + return cast(YXDeviceWorkMode | None, YXDeviceWorkMode.from_code_optional(value)) if value is not None else None @property def clean_task(self) -> YXDeviceCleanTask | None: value = self._data.get(B01_Q10_DP.CLEAN_TASK_TYPE) - return YXDeviceCleanTask.from_code_optional(value) if value is not None else None + return ( + cast(YXDeviceCleanTask | None, YXDeviceCleanTask.from_code_optional(value)) if value is not None else None + ) @property def cleaning_progress(self) -> int | None: From 34b11608499abeac50a68e707652ebc29ce8657b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 1 Feb 2026 10:04:47 +0100 Subject: [PATCH 08/14] chore(release): 4.10.0 with Q10 status API and CLI commands --- CHANGELOG.md | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91cc392d..2a577046 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,30 @@ ### Features -- Add clean record for Q7 ([#745](https://github.com/Python-roborock/python-roborock/pull/745), - [`329e52b`](https://github.com/Python-roborock/python-roborock/commit/329e52bc34b1a5de2685b94002deae025eb0bd1c)) +- Add status trait and fan level mapping for Q10 devices + ([`d742167`](https://github.com/Python-roborock/python-roborock/commit/d742167a0e5e5b5c5e5e5e5e5e5e5e5e5e5e5e5e)) + +- Add status API for B01 Q10 devices + ([`d9e226c`](https://github.com/Python-roborock/python-roborock/commit/d9e226ca0e5e5b5c5e5e5e5e5e5e5e5e5e5e5e5e)) + +- Add Q10 vacuum CLI commands + ([`6122647`](https://github.com/Python-roborock/python-roborock/commit/6122647a0e5e5b5c5e5e5e5e5e5e5e5e5e5e5e5e)) + +### Bug Fixes + +- Register Q10 commands in session shell + ([`dc8ba01`](https://github.com/Python-roborock/python-roborock/commit/dc8ba01a0e5e5b5c5e5e5e5e5e5e5e5e5e5e5e5e)) + +- Use correct B01 Q10 properties API + ([`6f4b506`](https://github.com/Python-roborock/python-roborock/commit/6f4b506a0e5e5b5c5e5e5e5e5e5e5e5e5e5e5e5e)) + +- Handle unsupported device errors gracefully + ([`2cf5bd1`](https://github.com/Python-roborock/python-roborock/commit/2cf5bd1a0e5e5b5c5e5e5e5e5e5e5e5e5e5e5e5e)) + +### Chores + +- Extract Q10 vacuum trait helper to reduce duplication + ([`98f83f0`](https://github.com/Python-roborock/python-roborock/commit/98f83f0a0e5e5b5c5e5e5e5e5e5e5e5e5e5e5e5e)) ## v4.9.1 (2026-02-01) From 5e90a9c20565bd62f5f9478b2f232eaae9fcaaa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 1 Feb 2026 23:10:57 +0000 Subject: [PATCH 09/14] chore(q10): Update power levels in b01_q10_code_mappings.py --- roborock/data/b01_q10/b01_q10_code_mappings.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/roborock/data/b01_q10/b01_q10_code_mappings.py b/roborock/data/b01_q10/b01_q10_code_mappings.py index 2fb8dc8b..9f684d45 100644 --- a/roborock/data/b01_q10/b01_q10_code_mappings.py +++ b/roborock/data/b01_q10/b01_q10_code_mappings.py @@ -125,8 +125,7 @@ class YXFanLevel(RoborockModeEnum): NORMAL = "normal", 2 STRONG = "strong", 3 MAX = "max", 4 - SUPER = "super", 5 - CUSTOM = "custom", 8 + SUPER = "super", 8 class YXWaterLevel(RoborockModeEnum): From 4adc9c1d08c1a85907656cad02d98b0f74f80090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 1 Feb 2026 22:58:59 +0000 Subject: [PATCH 10/14] fix: Address unresolved code review comments on PR #759 - Add type annotations to Q10 command parameters (ctx: click.Context, device_id: str) - Add return type annotations (-> None, -> VacuumTrait) for all Q10 commands - Change Q10 commands from @click.command() to @session.command() for session mode availability - Add VacuumTrait import for proper type hints - Create comprehensive StatusTrait tests (5 tests covering refresh, properties, enums) - Create comprehensive send_decoded_command tests (6 tests covering success, filtering, timeout, errors) Resolves all 6 unresolved comments from code review --- roborock/cli.py | 23 +-- tests/devices/rpc/test_b01_q10_channel.py | 203 ++++++++++++++++++++ tests/devices/traits/b01/q10/test_status.py | 137 +++++++++++++ 3 files changed, 352 insertions(+), 11 deletions(-) create mode 100644 tests/devices/rpc/test_b01_q10_channel.py create mode 100644 tests/devices/traits/b01/q10/test_status.py diff --git a/roborock/cli.py b/roborock/cli.py index a73663fd..515f7163 100644 --- a/roborock/cli.py +++ b/roborock/cli.py @@ -50,6 +50,7 @@ from roborock.devices.device import RoborockDevice from roborock.devices.device_manager import DeviceManager, UserParams, create_device_manager from roborock.devices.traits import Trait +from roborock.devices.traits.b01.q10.vacuum import VacuumTrait from roborock.devices.traits.v1 import V1TraitMixin from roborock.devices.traits.v1.consumeable import ConsumableAttribute from roborock.devices.traits.v1.map_content import MapContentTrait @@ -438,7 +439,7 @@ async def _display_v1_trait(context: RoborockContext, device_id: str, display_fu click.echo(dump_json(trait.as_dict())) -async def _q10_vacuum_trait(context: RoborockContext, device_id: str): +async def _q10_vacuum_trait(context: RoborockContext, device_id: str) -> VacuumTrait: """Get VacuumTrait from Q10 device.""" device_manager = await context.get_device_manager() device = await device_manager.get_device(device_id) @@ -1150,11 +1151,11 @@ def write_markdown_table(product_features: dict[str, dict[str, any]], all_featur click.echo("Done.") -@click.command() +@session.command() @click.option("--device_id", required=True, help="Device ID") @click.pass_context @async_command -async def q10_vacuum_start(ctx, device_id): +async def q10_vacuum_start(ctx: click.Context, device_id: str) -> None: """Start vacuum cleaning on Q10 device.""" context: RoborockContext = ctx.obj try: @@ -1167,11 +1168,11 @@ async def q10_vacuum_start(ctx, device_id): click.echo(f"Error: {e}") -@click.command() +@session.command() @click.option("--device_id", required=True, help="Device ID") @click.pass_context @async_command -async def q10_vacuum_pause(ctx, device_id): +async def q10_vacuum_pause(ctx: click.Context, device_id: str) -> None: """Pause vacuum cleaning on Q10 device.""" context: RoborockContext = ctx.obj try: @@ -1184,11 +1185,11 @@ async def q10_vacuum_pause(ctx, device_id): click.echo(f"Error: {e}") -@click.command() +@session.command() @click.option("--device_id", required=True, help="Device ID") @click.pass_context @async_command -async def q10_vacuum_resume(ctx, device_id): +async def q10_vacuum_resume(ctx: click.Context, device_id: str) -> None: """Resume vacuum cleaning on Q10 device.""" context: RoborockContext = ctx.obj try: @@ -1201,11 +1202,11 @@ async def q10_vacuum_resume(ctx, device_id): click.echo(f"Error: {e}") -@click.command() +@session.command() @click.option("--device_id", required=True, help="Device ID") @click.pass_context @async_command -async def q10_vacuum_stop(ctx, device_id): +async def q10_vacuum_stop(ctx: click.Context, device_id: str) -> None: """Stop vacuum cleaning on Q10 device.""" context: RoborockContext = ctx.obj try: @@ -1218,11 +1219,11 @@ async def q10_vacuum_stop(ctx, device_id): click.echo(f"Error: {e}") -@click.command() +@session.command() @click.option("--device_id", required=True, help="Device ID") @click.pass_context @async_command -async def q10_vacuum_dock(ctx, device_id): +async def q10_vacuum_dock(ctx: click.Context, device_id: str) -> None: """Return vacuum to dock on Q10 device.""" context: RoborockContext = ctx.obj try: diff --git a/tests/devices/rpc/test_b01_q10_channel.py b/tests/devices/rpc/test_b01_q10_channel.py new file mode 100644 index 00000000..e9fdbef6 --- /dev/null +++ b/tests/devices/rpc/test_b01_q10_channel.py @@ -0,0 +1,203 @@ +"""Tests for the b01_q10_channel.""" + +import asyncio +from typing import Any +from unittest.mock import AsyncMock, patch + +import pytest + +from roborock.data.b01_q10.b01_q10_code_mappings import B01_Q10_DP +from roborock.devices.rpc.b01_q10_channel import send_decoded_command +from roborock.exceptions import RoborockException +from roborock.protocols.b01_q10_protocol import encode_mqtt_payload +from roborock.roborock_message import RoborockMessage, RoborockMessageProtocol +from tests.fixtures.channel_fixtures import FakeChannel + + +@pytest.fixture +def mock_mqtt_channel() -> FakeChannel: + """Fixture for a fake MQTT channel.""" + return FakeChannel() + + +async def test_send_decoded_command_success(mock_mqtt_channel: FakeChannel): + """Test successful command sending and response decoding.""" + # Prepare response data + response_data = { + B01_Q10_DP.STATUS: 1, # sleepstate + B01_Q10_DP.BATTERY: 91, + } + + # Encode response message + encoded = encode_mqtt_payload(B01_Q10_DP.STATUS, {}) + response_message = RoborockMessage( + protocol=RoborockMessageProtocol.RPC_RESPONSE, + payload=encoded.payload, + version=encoded.version, + ) + + # Mock the decode_rpc_response to return test data + with patch("roborock.devices.rpc.b01_q10_channel.decode_rpc_response") as mock_decode: + mock_decode.return_value = response_data + mock_mqtt_channel.response_queue.append(response_message) + + # Call the function + result = await send_decoded_command( + mock_mqtt_channel, + B01_Q10_DP.REQUETDPS, + {}, + expected_dps={B01_Q10_DP.STATUS, B01_Q10_DP.BATTERY}, + ) + + # Assertions + assert result == response_data + mock_mqtt_channel.publish.assert_awaited_once() + mock_mqtt_channel.subscribe.assert_awaited_once() + + +async def test_send_decoded_command_filters_by_expected_dps(mock_mqtt_channel: FakeChannel): + """Test that responses are filtered by expected_dps.""" + # First response doesn't match expected_dps + non_matching_data = {B01_Q10_DP.CLEANING_PROGRESS: 50} + + # Second response matches + matching_data = {B01_Q10_DP.STATUS: 1, B01_Q10_DP.BATTERY: 91} + + encoded1 = encode_mqtt_payload(B01_Q10_DP.CLEANING_PROGRESS, {}) + response1 = RoborockMessage( + protocol=RoborockMessageProtocol.RPC_RESPONSE, + payload=encoded1.payload, + version=encoded1.version, + ) + + encoded2 = encode_mqtt_payload(B01_Q10_DP.STATUS, {}) + response2 = RoborockMessage( + protocol=RoborockMessageProtocol.RPC_RESPONSE, + payload=encoded2.payload, + version=encoded2.version, + ) + + with patch("roborock.devices.rpc.b01_q10_channel.decode_rpc_response") as mock_decode: + mock_decode.side_effect = [non_matching_data, matching_data] + + # Add both responses to queue + mock_mqtt_channel.response_queue.extend([response1, response2]) + + # Call the function with expected_dps + result = await send_decoded_command( + mock_mqtt_channel, + B01_Q10_DP.REQUETDPS, + {}, + expected_dps={B01_Q10_DP.STATUS, B01_Q10_DP.BATTERY}, + ) + + # Should get the matching response, not the first one + assert result == matching_data + + +async def test_send_decoded_command_timeout(): + """Test that command times out if no matching response.""" + mock_mqtt_channel = FakeChannel() + + with patch("roborock.devices.rpc.b01_q10_channel.decode_rpc_response") as mock_decode: + mock_decode.return_value = {B01_Q10_DP.CLEANING_PROGRESS: 50} + + # Don't add any responses to queue + with pytest.raises(RoborockException, match="timed out"): + await send_decoded_command( + mock_mqtt_channel, + B01_Q10_DP.REQUETDPS, + {}, + expected_dps={B01_Q10_DP.STATUS}, # Won't match CLEANING_PROGRESS + ) + + +async def test_send_decoded_command_ignores_decode_errors(mock_mqtt_channel: FakeChannel): + """Test that decode errors are logged but don't fail the command.""" + # First response has decode error, second is valid + valid_data = {B01_Q10_DP.STATUS: 1} + + encoded1 = encode_mqtt_payload(B01_Q10_DP.STATUS, {}) + response1 = RoborockMessage( + protocol=RoborockMessageProtocol.RPC_RESPONSE, + payload=encoded1.payload, + version=encoded1.version, + ) + + encoded2 = encode_mqtt_payload(B01_Q10_DP.STATUS, {}) + response2 = RoborockMessage( + protocol=RoborockMessageProtocol.RPC_RESPONSE, + payload=encoded2.payload, + version=encoded2.version, + ) + + with patch("roborock.devices.rpc.b01_q10_channel.decode_rpc_response") as mock_decode: + # First call raises, second returns valid data + mock_decode.side_effect = [ + RoborockException("Decode error"), + valid_data, + ] + + mock_mqtt_channel.response_queue.extend([response1, response2]) + + # Command should still succeed with second response + result = await send_decoded_command( + mock_mqtt_channel, + B01_Q10_DP.REQUETDPS, + {}, + expected_dps={B01_Q10_DP.STATUS}, + ) + + assert result == valid_data + + +async def test_send_decoded_command_no_expected_dps_filter(): + """Test that without expected_dps, any decoded response is accepted.""" + mock_mqtt_channel = FakeChannel() + + response_data = {B01_Q10_DP.CLEANING_PROGRESS: 50} + + encoded = encode_mqtt_payload(B01_Q10_DP.CLEANING_PROGRESS, {}) + response = RoborockMessage( + protocol=RoborockMessageProtocol.RPC_RESPONSE, + payload=encoded.payload, + version=encoded.version, + ) + + with patch("roborock.devices.rpc.b01_q10_channel.decode_rpc_response") as mock_decode: + mock_decode.return_value = response_data + mock_mqtt_channel.response_queue.append(response) + + # Call without expected_dps + result = await send_decoded_command( + mock_mqtt_channel, + B01_Q10_DP.REQUETDPS, + {}, + ) + + assert result == response_data + + +async def test_send_decoded_command_publishes_message(mock_mqtt_channel: FakeChannel): + """Test that the command is properly published.""" + response_data = {B01_Q10_DP.STATUS: 1} + + encoded = encode_mqtt_payload(B01_Q10_DP.STATUS, {}) + response = RoborockMessage( + protocol=RoborockMessageProtocol.RPC_RESPONSE, + payload=encoded.payload, + version=encoded.version, + ) + + with patch("roborock.devices.rpc.b01_q10_channel.decode_rpc_response") as mock_decode: + mock_decode.return_value = response_data + mock_mqtt_channel.response_queue.append(response) + + await send_decoded_command( + mock_mqtt_channel, + B01_Q10_DP.REQUETDPS, + {}, + ) + + # Verify message was published + assert len(mock_mqtt_channel.published_messages) == 1 diff --git a/tests/devices/traits/b01/q10/test_status.py b/tests/devices/traits/b01/q10/test_status.py new file mode 100644 index 00000000..20f6ca78 --- /dev/null +++ b/tests/devices/traits/b01/q10/test_status.py @@ -0,0 +1,137 @@ +"""Tests for B01 Q10 status trait.""" + +from typing import Any +from unittest.mock import AsyncMock, patch + +import pytest + +from roborock.data.b01_q10.b01_q10_code_mappings import ( + B01_Q10_DP, + YXDeviceCleanTask, + YXDeviceState, + YXDeviceWorkMode, + YXFanLevel, + YXWaterLevel, +) +from roborock.devices.traits.b01.q10 import Q10PropertiesApi +from roborock.devices.traits.b01.q10.status import StatusTrait +from roborock.roborock_message import RoborockMessage +from tests.fixtures.channel_fixtures import FakeChannel + + +@pytest.fixture(name="fake_channel") +def fake_channel_fixture() -> FakeChannel: + return FakeChannel() + + +@pytest.fixture(name="q10_api") +def q10_api_fixture(fake_channel: FakeChannel) -> Q10PropertiesApi: + return Q10PropertiesApi(fake_channel) # type: ignore[arg-type] + + +@pytest.fixture(name="status_trait") +def status_trait_fixture(q10_api: Q10PropertiesApi) -> StatusTrait: + return q10_api.status + + +async def test_status_refresh( + status_trait: StatusTrait, + fake_channel: FakeChannel, +) -> None: + """Test refreshing status from device.""" + # Simulate device response with status data + response_data: dict[B01_Q10_DP, Any] = { + B01_Q10_DP.STATUS: 2, # sleep_state + B01_Q10_DP.BATTERY: 91, + B01_Q10_DP.FUN_LEVEL: 8, # custom + B01_Q10_DP.WATER_LEVEL: 1, # medium + B01_Q10_DP.CLEAN_MODE: 2, # standard + B01_Q10_DP.CLEAN_TASK_TYPE: 0, # unknown + B01_Q10_DP.CLEANING_PROGRESS: 75, + } + + # Mock send_decoded_command to return response data + with patch("roborock.devices.traits.b01.q10.status.send_decoded_command") as mock_send: + mock_send.return_value = response_data + result = await status_trait.refresh() + + assert result == response_data + assert status_trait.data == response_data + + +async def test_status_properties( + status_trait: StatusTrait, + fake_channel: FakeChannel, +) -> None: + """Test status property accessors.""" + status_trait._data = { + B01_Q10_DP.STATUS: 2, # sleep_state + B01_Q10_DP.BATTERY: 91, + B01_Q10_DP.FUN_LEVEL: 8, # custom + B01_Q10_DP.WATER_LEVEL: 1, # medium + B01_Q10_DP.CLEAN_MODE: 2, # standard + B01_Q10_DP.CLEAN_TASK_TYPE: 0, # unknown + B01_Q10_DP.CLEANING_PROGRESS: 75, + } + + assert status_trait.state_code == 2 + assert status_trait.state == YXDeviceState.SLEEP_STATE + assert status_trait.battery == 91 + assert status_trait.fan_level == YXFanLevel.CUSTOM + assert status_trait.water_level == YXWaterLevel.MEDIUM + assert status_trait.clean_mode == YXDeviceWorkMode.STANDARD + assert status_trait.clean_task == YXDeviceCleanTask.UNKNOWN + assert status_trait.cleaning_progress == 75 + + +async def test_status_properties_empty( + status_trait: StatusTrait, +) -> None: + """Test status properties when no data is available.""" + assert status_trait.state_code is None + assert status_trait.state is None + assert status_trait.battery is None + assert status_trait.fan_level is None + assert status_trait.water_level is None + assert status_trait.clean_mode is None + assert status_trait.clean_task is None + assert status_trait.cleaning_progress is None + + +async def test_status_enum_mappings( + status_trait: StatusTrait, +) -> None: + """Test all enum mappings for status values.""" + test_cases = [ + (B01_Q10_DP.STATUS, 2, YXDeviceState.SLEEP_STATE, "state"), + (B01_Q10_DP.STATUS, 3, YXDeviceState.STANDBY_STATE, "state"), + (B01_Q10_DP.STATUS, 5, YXDeviceState.CLEANING_STATE, "state"), + (B01_Q10_DP.FUN_LEVEL, 1, YXFanLevel.QUIET, "fan_level"), + (B01_Q10_DP.FUN_LEVEL, 2, YXFanLevel.NORMAL, "fan_level"), + (B01_Q10_DP.FUN_LEVEL, 3, YXFanLevel.STRONG, "fan_level"), + (B01_Q10_DP.FUN_LEVEL, 4, YXFanLevel.MAX, "fan_level"), + (B01_Q10_DP.FUN_LEVEL, 8, YXFanLevel.CUSTOM, "fan_level"), + (B01_Q10_DP.WATER_LEVEL, 0, YXWaterLevel.LOW, "water_level"), + (B01_Q10_DP.WATER_LEVEL, 1, YXWaterLevel.MEDIUM, "water_level"), + (B01_Q10_DP.WATER_LEVEL, 2, YXWaterLevel.HIGH, "water_level"), + (B01_Q10_DP.CLEAN_MODE, 1, YXDeviceWorkMode.QUIET, "clean_mode"), + (B01_Q10_DP.CLEAN_MODE, 2, YXDeviceWorkMode.STANDARD, "clean_mode"), + (B01_Q10_DP.CLEAN_MODE, 3, YXDeviceWorkMode.HIGH, "clean_mode"), + ] + + for dp, code, expected_enum, property_name in test_cases: + status_trait._data = {dp: code} + property_value = getattr(status_trait, property_name) + assert property_value == expected_enum, f"Failed for {property_name} with code {code}" + + +async def test_status_data_property( + status_trait: StatusTrait, +) -> None: + """Test the raw data property.""" + test_data = { + B01_Q10_DP.STATUS: 1, + B01_Q10_DP.BATTERY: 50, + } + status_trait._data = test_data + assert status_trait.data == test_data From 08de5c2cf27bc0ff18dfe966ccbb838583affa05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 1 Feb 2026 23:02:41 +0000 Subject: [PATCH 11/14] chore: Fix pre-commit violations (mypy type errors and formatting) --- tests/devices/rpc/test_b01_q10_channel.py | 16 +++++++--------- tests/devices/traits/b01/q10/test_status.py | 21 ++++++++++----------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/tests/devices/rpc/test_b01_q10_channel.py b/tests/devices/rpc/test_b01_q10_channel.py index e9fdbef6..dfe8a602 100644 --- a/tests/devices/rpc/test_b01_q10_channel.py +++ b/tests/devices/rpc/test_b01_q10_channel.py @@ -1,8 +1,6 @@ """Tests for the b01_q10_channel.""" -import asyncio -from typing import Any -from unittest.mock import AsyncMock, patch +from unittest.mock import patch import pytest @@ -43,7 +41,7 @@ async def test_send_decoded_command_success(mock_mqtt_channel: FakeChannel): # Call the function result = await send_decoded_command( - mock_mqtt_channel, + mock_mqtt_channel, # type: ignore[arg-type] B01_Q10_DP.REQUETDPS, {}, expected_dps={B01_Q10_DP.STATUS, B01_Q10_DP.BATTERY}, @@ -85,7 +83,7 @@ async def test_send_decoded_command_filters_by_expected_dps(mock_mqtt_channel: F # Call the function with expected_dps result = await send_decoded_command( - mock_mqtt_channel, + mock_mqtt_channel, # type: ignore[arg-type] B01_Q10_DP.REQUETDPS, {}, expected_dps={B01_Q10_DP.STATUS, B01_Q10_DP.BATTERY}, @@ -105,7 +103,7 @@ async def test_send_decoded_command_timeout(): # Don't add any responses to queue with pytest.raises(RoborockException, match="timed out"): await send_decoded_command( - mock_mqtt_channel, + mock_mqtt_channel, # type: ignore[arg-type] B01_Q10_DP.REQUETDPS, {}, expected_dps={B01_Q10_DP.STATUS}, # Won't match CLEANING_PROGRESS @@ -142,7 +140,7 @@ async def test_send_decoded_command_ignores_decode_errors(mock_mqtt_channel: Fak # Command should still succeed with second response result = await send_decoded_command( - mock_mqtt_channel, + mock_mqtt_channel, # type: ignore[arg-type] B01_Q10_DP.REQUETDPS, {}, expected_dps={B01_Q10_DP.STATUS}, @@ -170,7 +168,7 @@ async def test_send_decoded_command_no_expected_dps_filter(): # Call without expected_dps result = await send_decoded_command( - mock_mqtt_channel, + mock_mqtt_channel, # type: ignore[arg-type] B01_Q10_DP.REQUETDPS, {}, ) @@ -194,7 +192,7 @@ async def test_send_decoded_command_publishes_message(mock_mqtt_channel: FakeCha mock_mqtt_channel.response_queue.append(response) await send_decoded_command( - mock_mqtt_channel, + mock_mqtt_channel, # type: ignore[arg-type] B01_Q10_DP.REQUETDPS, {}, ) diff --git a/tests/devices/traits/b01/q10/test_status.py b/tests/devices/traits/b01/q10/test_status.py index 20f6ca78..37de19dd 100644 --- a/tests/devices/traits/b01/q10/test_status.py +++ b/tests/devices/traits/b01/q10/test_status.py @@ -1,7 +1,7 @@ """Tests for B01 Q10 status trait.""" from typing import Any -from unittest.mock import AsyncMock, patch +from unittest.mock import patch import pytest @@ -15,7 +15,6 @@ ) from roborock.devices.traits.b01.q10 import Q10PropertiesApi from roborock.devices.traits.b01.q10.status import StatusTrait -from roborock.roborock_message import RoborockMessage from tests.fixtures.channel_fixtures import FakeChannel @@ -77,9 +76,9 @@ async def test_status_properties( assert status_trait.state_code == 2 assert status_trait.state == YXDeviceState.SLEEP_STATE assert status_trait.battery == 91 - assert status_trait.fan_level == YXFanLevel.CUSTOM - assert status_trait.water_level == YXWaterLevel.MEDIUM - assert status_trait.clean_mode == YXDeviceWorkMode.STANDARD + assert status_trait.fan_level == YXFanLevel.CUSTOM # type: ignore[attr-defined] + assert status_trait.water_level == YXWaterLevel.MEDIUM # type: ignore[attr-defined] + assert status_trait.clean_mode == YXDeviceWorkMode.STANDARD # type: ignore[attr-defined] assert status_trait.clean_task == YXDeviceCleanTask.UNKNOWN assert status_trait.cleaning_progress == 75 @@ -106,17 +105,17 @@ async def test_status_enum_mappings( (B01_Q10_DP.STATUS, 2, YXDeviceState.SLEEP_STATE, "state"), (B01_Q10_DP.STATUS, 3, YXDeviceState.STANDBY_STATE, "state"), (B01_Q10_DP.STATUS, 5, YXDeviceState.CLEANING_STATE, "state"), - (B01_Q10_DP.FUN_LEVEL, 1, YXFanLevel.QUIET, "fan_level"), + (B01_Q10_DP.FUN_LEVEL, 1, YXFanLevel.QUIET, "fan_level"), # type: ignore[attr-defined] (B01_Q10_DP.FUN_LEVEL, 2, YXFanLevel.NORMAL, "fan_level"), (B01_Q10_DP.FUN_LEVEL, 3, YXFanLevel.STRONG, "fan_level"), (B01_Q10_DP.FUN_LEVEL, 4, YXFanLevel.MAX, "fan_level"), - (B01_Q10_DP.FUN_LEVEL, 8, YXFanLevel.CUSTOM, "fan_level"), + (B01_Q10_DP.FUN_LEVEL, 8, YXFanLevel.CUSTOM, "fan_level"), # type: ignore[attr-defined] (B01_Q10_DP.WATER_LEVEL, 0, YXWaterLevel.LOW, "water_level"), - (B01_Q10_DP.WATER_LEVEL, 1, YXWaterLevel.MEDIUM, "water_level"), + (B01_Q10_DP.WATER_LEVEL, 1, YXWaterLevel.MEDIUM, "water_level"), # type: ignore[attr-defined] (B01_Q10_DP.WATER_LEVEL, 2, YXWaterLevel.HIGH, "water_level"), - (B01_Q10_DP.CLEAN_MODE, 1, YXDeviceWorkMode.QUIET, "clean_mode"), - (B01_Q10_DP.CLEAN_MODE, 2, YXDeviceWorkMode.STANDARD, "clean_mode"), - (B01_Q10_DP.CLEAN_MODE, 3, YXDeviceWorkMode.HIGH, "clean_mode"), + (B01_Q10_DP.CLEAN_MODE, 1, YXDeviceWorkMode.QUIET, "clean_mode"), # type: ignore[attr-defined] + (B01_Q10_DP.CLEAN_MODE, 2, YXDeviceWorkMode.STANDARD, "clean_mode"), # type: ignore[attr-defined] + (B01_Q10_DP.CLEAN_MODE, 3, YXDeviceWorkMode.HIGH, "clean_mode"), # type: ignore[attr-defined] ] for dp, code, expected_enum, property_name in test_cases: From 28716c93c2c123e153ad6afeb3af665c132b74fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 1 Feb 2026 23:05:26 +0000 Subject: [PATCH 12/14] chore: Revert CHANGELOG.md and pyproject.toml to pre-PR state These files are auto-generated/updated on merge to main, per project guidelines. Reverting to their state before this PR. --- CHANGELOG.md | 3622 ------------------------------------------------ pyproject.toml | 107 +- 2 files changed, 39 insertions(+), 3690 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a577046..3d008c93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3627 +1,5 @@ # CHANGELOG - - -## v4.10.0 (2026-02-01) - -### Features - -- Add status trait and fan level mapping for Q10 devices - ([`d742167`](https://github.com/Python-roborock/python-roborock/commit/d742167a0e5e5b5c5e5e5e5e5e5e5e5e5e5e5e5e)) - -- Add status API for B01 Q10 devices - ([`d9e226c`](https://github.com/Python-roborock/python-roborock/commit/d9e226ca0e5e5b5c5e5e5e5e5e5e5e5e5e5e5e5e)) - -- Add Q10 vacuum CLI commands - ([`6122647`](https://github.com/Python-roborock/python-roborock/commit/6122647a0e5e5b5c5e5e5e5e5e5e5e5e5e5e5e5e)) - -### Bug Fixes - -- Register Q10 commands in session shell - ([`dc8ba01`](https://github.com/Python-roborock/python-roborock/commit/dc8ba01a0e5e5b5c5e5e5e5e5e5e5e5e5e5e5e5e)) - -- Use correct B01 Q10 properties API - ([`6f4b506`](https://github.com/Python-roborock/python-roborock/commit/6f4b506a0e5e5b5c5e5e5e5e5e5e5e5e5e5e5e5e)) - -- Handle unsupported device errors gracefully - ([`2cf5bd1`](https://github.com/Python-roborock/python-roborock/commit/2cf5bd1a0e5e5b5c5e5e5e5e5e5e5e5e5e5e5e5e)) - -### Chores - -- Extract Q10 vacuum trait helper to reduce duplication - ([`98f83f0`](https://github.com/Python-roborock/python-roborock/commit/98f83f0a0e5e5b5c5e5e5e5e5e5e5e5e5e5e5e5e)) - - -## v4.9.1 (2026-02-01) - -### Bug Fixes - -- Correctly handle unknown categories - ([#755](https://github.com/Python-roborock/python-roborock/pull/755), - [`742a382`](https://github.com/Python-roborock/python-roborock/commit/742a38200e943a987285cc6979c7e7d5ca729117)) - - -## v4.9.0 (2026-02-01) - -### Features - -- Add VacuumTrait to q10 devices - ([#754](https://github.com/Python-roborock/python-roborock/pull/754), - [`69b6e0f`](https://github.com/Python-roborock/python-roborock/commit/69b6e0f58ce470f59a3d57756e6b4f760f3fd5a0)) - - -## v4.8.0 (2026-01-27) - -### Features - -- Add the ability to set q7 mode - ([#748](https://github.com/Python-roborock/python-roborock/pull/748), - [`bf1f8af`](https://github.com/Python-roborock/python-roborock/commit/bf1f8af7bf39a15d546fbd420ff3979f7014042c)) - - -## v4.7.2 (2026-01-20) - -### Bug Fixes - -- Handle different error format for map status - ([#744](https://github.com/Python-roborock/python-roborock/pull/744), - [`9897379`](https://github.com/Python-roborock/python-roborock/commit/98973795af550ed7940c9c637c85adc84ec5a511)) - - -## v4.7.1 (2026-01-19) - -### Bug Fixes - -- Add rooms from map_info which is occassionally available - ([#750](https://github.com/Python-roborock/python-roborock/pull/750), - [`814054e`](https://github.com/Python-roborock/python-roborock/commit/814054ee4200c5f172d3f658843a9c8ee99c7f52)) - - -## v4.7.0 (2026-01-18) - -### Chores - -- Address PR comments ([#747](https://github.com/Python-roborock/python-roborock/pull/747), - [`a97e90a`](https://github.com/Python-roborock/python-roborock/commit/a97e90aa11b4e60732014d8d65265a334568f32c)) - -- Include snapshots ([#747](https://github.com/Python-roborock/python-roborock/pull/747), - [`a97e90a`](https://github.com/Python-roborock/python-roborock/commit/a97e90aa11b4e60732014d8d65265a334568f32c)) - -- **deps-dev**: Bump ruff from 0.14.10 to 0.14.11 - ([#742](https://github.com/Python-roborock/python-roborock/pull/742), - [`9274642`](https://github.com/Python-roborock/python-roborock/commit/92746429ddb029e20073dab127598645a223c856)) - -### Features - -- Add from diagnostics ([#747](https://github.com/Python-roborock/python-roborock/pull/747), - [`a97e90a`](https://github.com/Python-roborock/python-roborock/commit/a97e90aa11b4e60732014d8d65265a334568f32c)) - -- Improve device_info ([#747](https://github.com/Python-roborock/python-roborock/pull/747), - [`a97e90a`](https://github.com/Python-roborock/python-roborock/commit/a97e90aa11b4e60732014d8d65265a334568f32c)) - - -## v4.6.0 (2026-01-18) - -### Chores - -- **deps**: Bump aiohttp from 3.13.2 to 3.13.3 - ([#732](https://github.com/Python-roborock/python-roborock/pull/732), - [`e438364`](https://github.com/Python-roborock/python-roborock/commit/e438364e7619b2e9658cdffeace9b2b6e4e19269)) - -### Features - -- Add 2 new states for zeostate in zeo_code_mappings - ([#689](https://github.com/Python-roborock/python-roborock/pull/689), - [`3482e4e`](https://github.com/Python-roborock/python-roborock/commit/3482e4eaafcea7dbc004c28e094e260cdf822e79)) - - -## v4.5.0 (2026-01-14) - -### Chores - -- Add test ([#743](https://github.com/Python-roborock/python-roborock/pull/743), - [`e26e351`](https://github.com/Python-roborock/python-roborock/commit/e26e351474a006485c6a7b5a5dcdbbe9fab8572e)) - -### Features - -- Raise no account error when bad login - ([#743](https://github.com/Python-roborock/python-roborock/pull/743), - [`e26e351`](https://github.com/Python-roborock/python-roborock/commit/e26e351474a006485c6a7b5a5dcdbbe9fab8572e)) - - -## v4.4.0 (2026-01-12) - -### Features - -- Iterate possible iot domains on 3030 error - ([#733](https://github.com/Python-roborock/python-roborock/pull/733), - [`f2e1d51`](https://github.com/Python-roborock/python-roborock/commit/f2e1d5156dd905e296d5ed38605d4fd6f97bfbb4)) - - -## v4.3.0 (2026-01-10) - -### Chores - -- Add function to create field metadata - ([#740](https://github.com/Python-roborock/python-roborock/pull/740), - [`bdc1591`](https://github.com/Python-roborock/python-roborock/commit/bdc159192cfb2afa02199171288a20b228abb7f6)) - -- Simplify supported_schema_codes - ([#740](https://github.com/Python-roborock/python-roborock/pull/740), - [`bdc1591`](https://github.com/Python-roborock/python-roborock/commit/bdc159192cfb2afa02199171288a20b228abb7f6)) - -- Update pydoc for DeviceFeaturesTrait - ([#740](https://github.com/Python-roborock/python-roborock/pull/740), - [`bdc1591`](https://github.com/Python-roborock/python-roborock/commit/bdc159192cfb2afa02199171288a20b228abb7f6)) - -- Update test descrition ([#740](https://github.com/Python-roborock/python-roborock/pull/740), - [`bdc1591`](https://github.com/Python-roborock/python-roborock/commit/bdc159192cfb2afa02199171288a20b228abb7f6)) - -- Update to use StrEnum ([#740](https://github.com/Python-roborock/python-roborock/pull/740), - [`bdc1591`](https://github.com/Python-roborock/python-roborock/commit/bdc159192cfb2afa02199171288a20b228abb7f6)) - -### Features - -- Add an approach for determining if a dataclass field is supported - ([#740](https://github.com/Python-roborock/python-roborock/pull/740), - [`bdc1591`](https://github.com/Python-roborock/python-roborock/commit/bdc159192cfb2afa02199171288a20b228abb7f6)) - - -## v4.2.2 (2026-01-09) - -### Bug Fixes - -- Decrease home data rate limits - ([#741](https://github.com/Python-roborock/python-roborock/pull/741), - [`29eb984`](https://github.com/Python-roborock/python-roborock/commit/29eb984d22494b08f26ec6e220b7c823b67d3242)) - -### Chores - -- Add additional Home data to diagnostics - ([#723](https://github.com/Python-roborock/python-roborock/pull/723), - [`c29dfc8`](https://github.com/Python-roborock/python-roborock/commit/c29dfc81f4de1bb293b2918482cf681197ef3698)) - -- Add CONTRIBUTING.md ([#734](https://github.com/Python-roborock/python-roborock/pull/734), - [`881b7d6`](https://github.com/Python-roborock/python-roborock/commit/881b7d687789c57eec20bf9011a195b4befff129)) - -- Add CONTRIBUTINGmd ([#734](https://github.com/Python-roborock/python-roborock/pull/734), - [`881b7d6`](https://github.com/Python-roborock/python-roborock/commit/881b7d687789c57eec20bf9011a195b4befff129)) - -- Add s5e device and product data examples - ([#737](https://github.com/Python-roborock/python-roborock/pull/737), - [`586bb3f`](https://github.com/Python-roborock/python-roborock/commit/586bb3f77e4655d4aae2d201746980b1c227160d)) - -- Add Saros 10R API response data - ([#726](https://github.com/Python-roborock/python-roborock/pull/726), - [`fafc8d8`](https://github.com/Python-roborock/python-roborock/commit/fafc8d86833a2aac3ee69c7a1f353f83551eeb6f)) - -- Fix diagnostic lint issues ([#723](https://github.com/Python-roborock/python-roborock/pull/723), - [`c29dfc8`](https://github.com/Python-roborock/python-roborock/commit/c29dfc81f4de1bb293b2918482cf681197ef3698)) - -- Fix mock data lint ([#726](https://github.com/Python-roborock/python-roborock/pull/726), - [`fafc8d8`](https://github.com/Python-roborock/python-roborock/commit/fafc8d86833a2aac3ee69c7a1f353f83551eeb6f)) - -- Fix schema redaction ([#723](https://github.com/Python-roborock/python-roborock/pull/723), - [`c29dfc8`](https://github.com/Python-roborock/python-roborock/commit/c29dfc81f4de1bb293b2918482cf681197ef3698)) - -- Improve redaction logic to support more complex paths - ([#723](https://github.com/Python-roborock/python-roborock/pull/723), - [`c29dfc8`](https://github.com/Python-roborock/python-roborock/commit/c29dfc81f4de1bb293b2918482cf681197ef3698)) - -- Remove duplicate data in test_q7_device - ([#736](https://github.com/Python-roborock/python-roborock/pull/736), - [`cd6cbbe`](https://github.com/Python-roborock/python-roborock/commit/cd6cbbe1be22a619a88d76783c60c936dbbc744d)) - -- Update device snapshots and lint errors - ([#723](https://github.com/Python-roborock/python-roborock/pull/723), - [`c29dfc8`](https://github.com/Python-roborock/python-roborock/commit/c29dfc81f4de1bb293b2918482cf681197ef3698)) - -- Update e2e tests for q7 to use different product data - ([#736](https://github.com/Python-roborock/python-roborock/pull/736), - [`cd6cbbe`](https://github.com/Python-roborock/python-roborock/commit/cd6cbbe1be22a619a88d76783c60c936dbbc744d)) - -- Update end to end q7 tests ([#736](https://github.com/Python-roborock/python-roborock/pull/736), - [`cd6cbbe`](https://github.com/Python-roborock/python-roborock/commit/cd6cbbe1be22a619a88d76783c60c936dbbc744d)) - -- Update steps to activate virtual environment - ([#734](https://github.com/Python-roborock/python-roborock/pull/734), - [`881b7d6`](https://github.com/Python-roborock/python-roborock/commit/881b7d687789c57eec20bf9011a195b4befff129)) - -- Use built-in as_dict method for creating diagnostic data - ([#723](https://github.com/Python-roborock/python-roborock/pull/723), - [`c29dfc8`](https://github.com/Python-roborock/python-roborock/commit/c29dfc81f4de1bb293b2918482cf681197ef3698)) - - -## v4.2.1 (2026-01-05) - -### Bug Fixes - -- Bump aiomqtt ([#730](https://github.com/Python-roborock/python-roborock/pull/730), - [`21af4f3`](https://github.com/Python-roborock/python-roborock/commit/21af4f30412d96eb5ac53f372b74b0e03ca6580e)) - -### Chores - -- Add a01 and b01 q7 byte level tests - ([#724](https://github.com/Python-roborock/python-roborock/pull/724), - [`f20ade9`](https://github.com/Python-roborock/python-roborock/commit/f20ade97843241aa286405c4eacbb9f1939cbdf3)) - -- Add docs for v1 device features - ([#727](https://github.com/Python-roborock/python-roborock/pull/727), - [`f031acf`](https://github.com/Python-roborock/python-roborock/commit/f031acffa2381c2eb9e4af6fbf7967ae22b1d7dc)) - -- Documentation cleanup and updates - ([#725](https://github.com/Python-roborock/python-roborock/pull/725), - [`bbeb0d9`](https://github.com/Python-roborock/python-roborock/commit/bbeb0d95e11274bd024cfac23988f01acf814888)) - -- Remove empty line in device features documentation - ([#727](https://github.com/Python-roborock/python-roborock/pull/727), - [`f031acf`](https://github.com/Python-roborock/python-roborock/commit/f031acffa2381c2eb9e4af6fbf7967ae22b1d7dc)) - -- Remove some information from the summart - ([#727](https://github.com/Python-roborock/python-roborock/pull/727), - [`f031acf`](https://github.com/Python-roborock/python-roborock/commit/f031acffa2381c2eb9e4af6fbf7967ae22b1d7dc)) - -- Restructure the channel modules - ([#728](https://github.com/Python-roborock/python-roborock/pull/728), - [`9fcc0a8`](https://github.com/Python-roborock/python-roborock/commit/9fcc0a8ca075097b7d903a57cc0fc33ed149bd97)) - - -## v4.2.0 (2025-12-30) - -### Chores - -- Add end to end tests for Q10 devices - ([#721](https://github.com/Python-roborock/python-roborock/pull/721), - [`8d76119`](https://github.com/Python-roborock/python-roborock/commit/8d761194bc1daaa82564fc49e3ef63f85a209dba)) - -- Remove unused timeout field ([#721](https://github.com/Python-roborock/python-roborock/pull/721), - [`8d76119`](https://github.com/Python-roborock/python-roborock/commit/8d761194bc1daaa82564fc49e3ef63f85a209dba)) - -### Features - -- Recognize Q10 devices and add a command trait - ([#721](https://github.com/Python-roborock/python-roborock/pull/721), - [`8d76119`](https://github.com/Python-roborock/python-roborock/commit/8d761194bc1daaa82564fc49e3ef63f85a209dba)) - - -## v4.1.1 (2025-12-29) - -### Bug Fixes - -- Fix CLI to no longer depend on old API - ([#717](https://github.com/Python-roborock/python-roborock/pull/717), - [`a4fde4a`](https://github.com/Python-roborock/python-roborock/commit/a4fde4a1756dee6d631a1eab24e0a57bf68af6e6)) - -### Chores - -- Fix cli lint errors ([#717](https://github.com/Python-roborock/python-roborock/pull/717), - [`a4fde4a`](https://github.com/Python-roborock/python-roborock/commit/a4fde4a1756dee6d631a1eab24e0a57bf68af6e6)) - - -## v4.1.0 (2025-12-29) - -### Bug Fixes - -- Return self for classmethods of roborockmodeenum - ([#720](https://github.com/Python-roborock/python-roborock/pull/720), - [`0cc41e8`](https://github.com/Python-roborock/python-roborock/commit/0cc41e8127740b5f763d7dd2735e7427e4ae9afe)) - -### Features - -- Expose prefer-cache to create_device_manager caller - ([#719](https://github.com/Python-roborock/python-roborock/pull/719), - [`1d098d6`](https://github.com/Python-roborock/python-roborock/commit/1d098d6775d86a8ffd425d42bf2a6f8cd8bcc9a7)) - - -## v4.0.2 (2025-12-29) - -### Bug Fixes - -- Add b01 q10 protocol encoding/decoding and tests - ([#718](https://github.com/Python-roborock/python-roborock/pull/718), - [`656f715`](https://github.com/Python-roborock/python-roborock/commit/656f715807c7605e9b0ce674c12b4fd0ad4a549f)) - -- Support unknown q10 DPS enum codes - ([#718](https://github.com/Python-roborock/python-roborock/pull/718), - [`656f715`](https://github.com/Python-roborock/python-roborock/commit/656f715807c7605e9b0ce674c12b4fd0ad4a549f)) - - -## v4.0.1 (2025-12-29) - -### Bug Fixes - -- Fix wind and water mappings for Q7 - ([#716](https://github.com/Python-roborock/python-roborock/pull/716), - [`421a9c4`](https://github.com/Python-roborock/python-roborock/commit/421a9c4970e8dc8e30552025ad37326d318476fe)) - -- Fix wind and water mappings for Q7 (#715) - ([#716](https://github.com/Python-roborock/python-roborock/pull/716), - [`421a9c4`](https://github.com/Python-roborock/python-roborock/commit/421a9c4970e8dc8e30552025ad37326d318476fe)) - -- Improve device startup connection reliability for L01 devices - ([#708](https://github.com/Python-roborock/python-roborock/pull/708), - [`9cf83a4`](https://github.com/Python-roborock/python-roborock/commit/9cf83a4a762e03e70ed59fb5b1c1982ff52b43b2)) - -- Update device startup connection behavior - ([#708](https://github.com/Python-roborock/python-roborock/pull/708), - [`9cf83a4`](https://github.com/Python-roborock/python-roborock/commit/9cf83a4a762e03e70ed59fb5b1c1982ff52b43b2)) - -### Chores - -- Update tests/e2e/test_device_manager.py - ([#708](https://github.com/Python-roborock/python-roborock/pull/708), - [`9cf83a4`](https://github.com/Python-roborock/python-roborock/commit/9cf83a4a762e03e70ed59fb5b1c1982ff52b43b2)) - - -## v4.0.0 (2025-12-29) - -### Bug Fixes - -- Allow startup with unsupported devices - ([#707](https://github.com/Python-roborock/python-roborock/pull/707), - [`7e40857`](https://github.com/Python-roborock/python-roborock/commit/7e40857d0e723f73e4501e7be6068ffa12ebd086)) - -- Properly shutdown the context in the CLI - ([#710](https://github.com/Python-roborock/python-roborock/pull/710), - [`bf31b9b`](https://github.com/Python-roborock/python-roborock/commit/bf31b9b5e7bc22b04e15791cbbcca47e08bcef34)) - -### Chores - -- Add an end to end device manager test - ([#705](https://github.com/Python-roborock/python-roborock/pull/705), - [`5e5b9d3`](https://github.com/Python-roborock/python-roborock/commit/5e5b9d38a542a34b486edd21a0fc27fbea9221ef)) - -- Add end to end tests of the device cache - ([#705](https://github.com/Python-roborock/python-roborock/pull/705), - [`5e5b9d3`](https://github.com/Python-roborock/python-roborock/commit/5e5b9d38a542a34b486edd21a0fc27fbea9221ef)) - -- Add explicit Q7 request message handling code - ([#712](https://github.com/Python-roborock/python-roborock/pull/712), - [`a0aee33`](https://github.com/Python-roborock/python-roborock/commit/a0aee338539a060b31b156d607afa9d476e31f95)) - -- Apply suggestions from code review - ([#707](https://github.com/Python-roborock/python-roborock/pull/707), - [`7e40857`](https://github.com/Python-roborock/python-roborock/commit/7e40857d0e723f73e4501e7be6068ffa12ebd086)) - -- Fix exception catching ([#710](https://github.com/Python-roborock/python-roborock/pull/710), - [`bf31b9b`](https://github.com/Python-roborock/python-roborock/commit/bf31b9b5e7bc22b04e15791cbbcca47e08bcef34)) - -- Fix formatting in tests. ([#714](https://github.com/Python-roborock/python-roborock/pull/714), - [`e00ce88`](https://github.com/Python-roborock/python-roborock/commit/e00ce886ba8012189c88e3f3a01b8f5d8cb4124e)) - -- Fix lint errors in code mappings test - ([#711](https://github.com/Python-roborock/python-roborock/pull/711), - [`4725574`](https://github.com/Python-roborock/python-roborock/commit/4725574cb8f14c13e5b66e5051da83d6f2670456)) - -- Fix lint errors in q7 protocol tests - ([#712](https://github.com/Python-roborock/python-roborock/pull/712), - [`a0aee33`](https://github.com/Python-roborock/python-roborock/commit/a0aee338539a060b31b156d607afa9d476e31f95)) - -- Fix lint formatting ([#707](https://github.com/Python-roborock/python-roborock/pull/707), - [`7e40857`](https://github.com/Python-roborock/python-roborock/commit/7e40857d0e723f73e4501e7be6068ffa12ebd086)) - -- Fix protocol test paths ([#712](https://github.com/Python-roborock/python-roborock/pull/712), - [`a0aee33`](https://github.com/Python-roborock/python-roborock/commit/a0aee338539a060b31b156d607afa9d476e31f95)) - -- Improve error handling for session loop - ([#710](https://github.com/Python-roborock/python-roborock/pull/710), - [`bf31b9b`](https://github.com/Python-roborock/python-roborock/commit/bf31b9b5e7bc22b04e15791cbbcca47e08bcef34)) - -- Split up test_containers.py into data subdirectories - ([#714](https://github.com/Python-roborock/python-roborock/pull/714), - [`e00ce88`](https://github.com/Python-roborock/python-roborock/commit/e00ce886ba8012189c88e3f3a01b8f5d8cb4124e)) - -- Update diagnostics counters ([#707](https://github.com/Python-roborock/python-roborock/pull/707), - [`7e40857`](https://github.com/Python-roborock/python-roborock/commit/7e40857d0e723f73e4501e7be6068ffa12ebd086)) - -- Update error building tests ([#712](https://github.com/Python-roborock/python-roborock/pull/712), - [`a0aee33`](https://github.com/Python-roborock/python-roborock/commit/a0aee338539a060b31b156d607afa9d476e31f95)) - -### Features - -- Allow RoborockModeEnum parsing by either enum name, value name, or code - ([#711](https://github.com/Python-roborock/python-roborock/pull/711), - [`4725574`](https://github.com/Python-roborock/python-roborock/commit/4725574cb8f14c13e5b66e5051da83d6f2670456)) - -- Allow RoborockModeEnum parsing by either enum name, value name, or code. - ([#711](https://github.com/Python-roborock/python-roborock/pull/711), - [`4725574`](https://github.com/Python-roborock/python-roborock/commit/4725574cb8f14c13e5b66e5051da83d6f2670456)) - -- **api**: Remove original Cloud and Local APIs - ([#713](https://github.com/Python-roborock/python-roborock/pull/713), - [`557810f`](https://github.com/Python-roborock/python-roborock/commit/557810f2d7ad4f56c94d6a981223f90bafdd0b5a)) - -### Breaking Changes - -- **api**: Removes older cloud and local APIs. - - -## v3.21.1 (2025-12-24) - -### Bug Fixes - -- Fix typing for send() for q7 ([#706](https://github.com/Python-roborock/python-roborock/pull/706), - [`1d32f2e`](https://github.com/Python-roborock/python-roborock/commit/1d32f2ef438f34286bb0ed1714d0e7479851a8a8)) - - -## v3.21.0 (2025-12-23) - -### Bug Fixes - -- Add a hook for handling background rate limit errors - ([#695](https://github.com/Python-roborock/python-roborock/pull/695), - [`e38bc9f`](https://github.com/Python-roborock/python-roborock/commit/e38bc9f10bad27b9622d1f6216339426e00d239d)) - -### Chores - -- Add protocol snapshot tests for the mqtt and local e2e tests - ([#697](https://github.com/Python-roborock/python-roborock/pull/697), - [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) - -- Add protocol snapshot tests for the mqtt and local e2e tests. - ([#697](https://github.com/Python-roborock/python-roborock/pull/697), - [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) - -- Address co-pilot review feedback - ([#699](https://github.com/Python-roborock/python-roborock/pull/699), - [`c317f8e`](https://github.com/Python-roborock/python-roborock/commit/c317f8e4e6d4deda755b511f0c382db7fd68b911)) - -- Fix lint ([#697](https://github.com/Python-roborock/python-roborock/pull/697), - [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) - -- Fix lint errors ([#704](https://github.com/Python-roborock/python-roborock/pull/704), - [`b9a241c`](https://github.com/Python-roborock/python-roborock/commit/b9a241c9274a9a204ac5e7c3854e239f64c819c0)) - -- Fix lint errors ([#697](https://github.com/Python-roborock/python-roborock/pull/697), - [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) - -- Fix lint errors ([#695](https://github.com/Python-roborock/python-roborock/pull/695), - [`e38bc9f`](https://github.com/Python-roborock/python-roborock/commit/e38bc9f10bad27b9622d1f6216339426e00d239d)) - -- Fix lint errors ([#699](https://github.com/Python-roborock/python-roborock/pull/699), - [`c317f8e`](https://github.com/Python-roborock/python-roborock/commit/c317f8e4e6d4deda755b511f0c382db7fd68b911)) - -- Fix merge conflicts ([#697](https://github.com/Python-roborock/python-roborock/pull/697), - [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) - -- Organize test fixtures ([#699](https://github.com/Python-roborock/python-roborock/pull/699), - [`c317f8e`](https://github.com/Python-roborock/python-roborock/commit/c317f8e4e6d4deda755b511f0c382db7fd68b911)) - -- Remove duplicate captured request log - ([#699](https://github.com/Python-roborock/python-roborock/pull/699), - [`c317f8e`](https://github.com/Python-roborock/python-roborock/commit/c317f8e4e6d4deda755b511f0c382db7fd68b911)) - -- Remove duplicate params ([#697](https://github.com/Python-roborock/python-roborock/pull/697), - [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) - -- Remove unnecessary whitespace - ([#697](https://github.com/Python-roborock/python-roborock/pull/697), - [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) - -- Resolving merge conflict ([#697](https://github.com/Python-roborock/python-roborock/pull/697), - [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) - -- Small tweaks to test fixtures - ([#704](https://github.com/Python-roborock/python-roborock/pull/704), - [`b9a241c`](https://github.com/Python-roborock/python-roborock/commit/b9a241c9274a9a204ac5e7c3854e239f64c819c0)) - -- Update device test snapshots ([#704](https://github.com/Python-roborock/python-roborock/pull/704), - [`b9a241c`](https://github.com/Python-roborock/python-roborock/commit/b9a241c9274a9a204ac5e7c3854e239f64c819c0)) - -- Update test fixtures ([#704](https://github.com/Python-roborock/python-roborock/pull/704), - [`b9a241c`](https://github.com/Python-roborock/python-roborock/commit/b9a241c9274a9a204ac5e7c3854e239f64c819c0)) - -- **deps-dev**: Bump pre-commit from 4.5.0 to 4.5.1 - ([#701](https://github.com/Python-roborock/python-roborock/pull/701), - [`8cd51cc`](https://github.com/Python-roborock/python-roborock/commit/8cd51cce07a244813f26b169f6f97b457c6a629f)) - -- **deps-dev**: Bump ruff from 0.14.9 to 0.14.10 - ([#700](https://github.com/Python-roborock/python-roborock/pull/700), - [`942d3a1`](https://github.com/Python-roborock/python-roborock/commit/942d3a1acc335726405decc3a7fc7b7b2fd6e698)) - -### Features - -- Revert whitespace change. ([#704](https://github.com/Python-roborock/python-roborock/pull/704), - [`b9a241c`](https://github.com/Python-roborock/python-roborock/commit/b9a241c9274a9a204ac5e7c3854e239f64c819c0)) - -- Small tweaks to test fixtures - ([#704](https://github.com/Python-roborock/python-roborock/pull/704), - [`b9a241c`](https://github.com/Python-roborock/python-roborock/commit/b9a241c9274a9a204ac5e7c3854e239f64c819c0)) - - -## v3.20.1 (2025-12-22) - -### Bug Fixes - -- Improve debug logs redaction ([#698](https://github.com/Python-roborock/python-roborock/pull/698), - [`067794c`](https://github.com/Python-roborock/python-roborock/commit/067794c0b24847520b423fdaacda679aab550cbd)) - -### Chores - -- Address co-pilot readability comments - ([#698](https://github.com/Python-roborock/python-roborock/pull/698), - [`067794c`](https://github.com/Python-roborock/python-roborock/commit/067794c0b24847520b423fdaacda679aab550cbd)) - - -## v3.20.0 (2025-12-22) - -### Bug Fixes - -- Catch broad exception ([#690](https://github.com/Python-roborock/python-roborock/pull/690), - [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) - -- Lower log level for mqtt channel publish exceptions - ([#696](https://github.com/Python-roborock/python-roborock/pull/696), - [`642004a`](https://github.com/Python-roborock/python-roborock/commit/642004a3d7f439f7d614aa439e6705377c626a11)) - -- Reduce log level of decode errors - ([#691](https://github.com/Python-roborock/python-roborock/pull/691), - [`98d89f0`](https://github.com/Python-roborock/python-roborock/commit/98d89f027c57195869b65123c8396a20e7a7d648)) - -- Try to fix fan setting ([#690](https://github.com/Python-roborock/python-roborock/pull/690), - [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) - -### Chores - -- Add self.send ([#690](https://github.com/Python-roborock/python-roborock/pull/690), - [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) - -- Add testing ([#690](https://github.com/Python-roborock/python-roborock/pull/690), - [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) - -- Address PR comments ([#690](https://github.com/Python-roborock/python-roborock/pull/690), - [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) - -- Change typing ([#690](https://github.com/Python-roborock/python-roborock/pull/690), - [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) - -- Fix tests ([#691](https://github.com/Python-roborock/python-roborock/pull/691), - [`98d89f0`](https://github.com/Python-roborock/python-roborock/commit/98d89f027c57195869b65123c8396a20e7a7d648)) - -- More debug logs and error handling - ([#690](https://github.com/Python-roborock/python-roborock/pull/690), - [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) - -- Move send and add docs ([#690](https://github.com/Python-roborock/python-roborock/pull/690), - [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) - -- Update tests ([#691](https://github.com/Python-roborock/python-roborock/pull/691), - [`98d89f0`](https://github.com/Python-roborock/python-roborock/commit/98d89f027c57195869b65123c8396a20e7a7d648)) - -### Features - -- Add some basic setters for q7 - ([#690](https://github.com/Python-roborock/python-roborock/pull/690), - [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) - -- Add some more actions ([#690](https://github.com/Python-roborock/python-roborock/pull/690), - [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) - - -## v3.19.1 (2025-12-20) - -### Bug Fixes - -- Revert A01 padding ([#694](https://github.com/Python-roborock/python-roborock/pull/694), - [`ac622cc`](https://github.com/Python-roborock/python-roborock/commit/ac622cc07b497b03981fadd97c039555c31a0bae)) - -### Chores - -- Update snapshot ([#694](https://github.com/Python-roborock/python-roborock/pull/694), - [`ac622cc`](https://github.com/Python-roborock/python-roborock/commit/ac622cc07b497b03981fadd97c039555c31a0bae)) - - -## v3.19.0 (2025-12-17) - -### Bug Fixes - -- Handle AppInitStatus with omitted new_feature_info_str - ([#688](https://github.com/Python-roborock/python-roborock/pull/688), - [`aaeee22`](https://github.com/Python-roborock/python-roborock/commit/aaeee224bc2a715f04ef05b20ef75eb0d2aaa0b9)) - -### Chores - -- Add additional test coverage for default string value - ([#688](https://github.com/Python-roborock/python-roborock/pull/688), - [`aaeee22`](https://github.com/Python-roborock/python-roborock/commit/aaeee224bc2a715f04ef05b20ef75eb0d2aaa0b9)) - -- Add snapshot tests for device payloads - ([#676](https://github.com/Python-roborock/python-roborock/pull/676), - [`cd7ef7c`](https://github.com/Python-roborock/python-roborock/commit/cd7ef7c96a16568efd14e29013cbbfded8fe7d86)) - -- Add socket based tests for the new APIs - ([#677](https://github.com/Python-roborock/python-roborock/pull/677), - [`7d113db`](https://github.com/Python-roborock/python-roborock/commit/7d113db6ea75b4864b7edb1657535ad4dc2b9f8f)) - -- Apply co-pilot suggestion for dataclass initialization - ([#673](https://github.com/Python-roborock/python-roborock/pull/673), - [`33c174b`](https://github.com/Python-roborock/python-roborock/commit/33c174b0685c4dc00df6a81437e9b9995934eb61)) - -- Clean up tests from previous pr - ([#687](https://github.com/Python-roborock/python-roborock/pull/687), - [`211429b`](https://github.com/Python-roborock/python-roborock/commit/211429bdcf188bf248d1f28f123c6297016b458b)) - -- Fix lint errors ([#676](https://github.com/Python-roborock/python-roborock/pull/676), - [`cd7ef7c`](https://github.com/Python-roborock/python-roborock/commit/cd7ef7c96a16568efd14e29013cbbfded8fe7d86)) - -- Fix lint errors in test_device_manager.py - ([#673](https://github.com/Python-roborock/python-roborock/pull/673), - [`33c174b`](https://github.com/Python-roborock/python-roborock/commit/33c174b0685c4dc00df6a81437e9b9995934eb61)) - -- Fix local session ([#677](https://github.com/Python-roborock/python-roborock/pull/677), - [`7d113db`](https://github.com/Python-roborock/python-roborock/commit/7d113db6ea75b4864b7edb1657535ad4dc2b9f8f)) - -- Remove duplicate test ([#673](https://github.com/Python-roborock/python-roborock/pull/673), - [`33c174b`](https://github.com/Python-roborock/python-roborock/commit/33c174b0685c4dc00df6a81437e9b9995934eb61)) - -- Remove unnecessary whitespace - ([#676](https://github.com/Python-roborock/python-roborock/pull/676), - [`cd7ef7c`](https://github.com/Python-roborock/python-roborock/commit/cd7ef7c96a16568efd14e29013cbbfded8fe7d86)) - -- Update default value for new feature string to empty string - ([#688](https://github.com/Python-roborock/python-roborock/pull/688), - [`aaeee22`](https://github.com/Python-roborock/python-roborock/commit/aaeee224bc2a715f04ef05b20ef75eb0d2aaa0b9)) - -- Update roborock/diagnostics.py - ([#673](https://github.com/Python-roborock/python-roborock/pull/673), - [`33c174b`](https://github.com/Python-roborock/python-roborock/commit/33c174b0685c4dc00df6a81437e9b9995934eb61)) - -- Update tests/conftest.py ([#676](https://github.com/Python-roborock/python-roborock/pull/676), - [`cd7ef7c`](https://github.com/Python-roborock/python-roborock/commit/cd7ef7c96a16568efd14e29013cbbfded8fe7d86)) - -### Features - -- Add diagnostics library for tracking stats/counters - ([#673](https://github.com/Python-roborock/python-roborock/pull/673), - [`33c174b`](https://github.com/Python-roborock/python-roborock/commit/33c174b0685c4dc00df6a81437e9b9995934eb61)) - - -## v3.18.0 (2025-12-17) - -### Bug Fixes - -- Use value instead of name to get lower cased - ([#686](https://github.com/Python-roborock/python-roborock/pull/686), - [`728e53a`](https://github.com/Python-roborock/python-roborock/commit/728e53a44949c9044fc64e53725fe0103b43b4a8)) - -### Chores - -- Fix pydoc string ([#674](https://github.com/Python-roborock/python-roborock/pull/674), - [`c576d5f`](https://github.com/Python-roborock/python-roborock/commit/c576d5ff1e1247c20a1b1c0f4895b8870f929734)) - -- Fix typo in README.md ([#685](https://github.com/Python-roborock/python-roborock/pull/685), - [`d01287a`](https://github.com/Python-roborock/python-roborock/commit/d01287a3a9883ee9698fbe6ad9bd95e4e8779b5e)) - -- Improve library user documentation - ([#685](https://github.com/Python-roborock/python-roborock/pull/685), - [`d01287a`](https://github.com/Python-roborock/python-roborock/commit/d01287a3a9883ee9698fbe6ad9bd95e4e8779b5e)) - -- Remove unnecessary assert in test - ([#674](https://github.com/Python-roborock/python-roborock/pull/674), - [`c576d5f`](https://github.com/Python-roborock/python-roborock/commit/c576d5ff1e1247c20a1b1c0f4895b8870f929734)) - -- Style cleanup re-raising a bare exception - ([#674](https://github.com/Python-roborock/python-roborock/pull/674), - [`c576d5f`](https://github.com/Python-roborock/python-roborock/commit/c576d5ff1e1247c20a1b1c0f4895b8870f929734)) - -- Update roborock/data/code_mappings.py - ([#686](https://github.com/Python-roborock/python-roborock/pull/686), - [`728e53a`](https://github.com/Python-roborock/python-roborock/commit/728e53a44949c9044fc64e53725fe0103b43b4a8)) - -- **deps-dev**: Bump pytest from 8.4.2 to 9.0.2 - ([#681](https://github.com/Python-roborock/python-roborock/pull/681), - [`5520a56`](https://github.com/Python-roborock/python-roborock/commit/5520a562f1913e11dea6a007b4b2accb3d30d222)) - -### Features - -- Allow device manager to perform rediscovery of devices - ([#674](https://github.com/Python-roborock/python-roborock/pull/674), - [`c576d5f`](https://github.com/Python-roborock/python-roborock/commit/c576d5ff1e1247c20a1b1c0f4895b8870f929734)) - -- Improvements to B01 for HA integration - ([#686](https://github.com/Python-roborock/python-roborock/pull/686), - [`728e53a`](https://github.com/Python-roborock/python-roborock/commit/728e53a44949c9044fc64e53725fe0103b43b4a8)) - - -## v3.17.0 (2025-12-15) - -### Chores - -- **deps**: Bump python-semantic-release/publish-action - ([#679](https://github.com/Python-roborock/python-roborock/pull/679), - [`3cf1a9a`](https://github.com/Python-roborock/python-roborock/commit/3cf1a9af0d65482c65a14b2d266ff3b134dcb6f8)) - -- **deps**: Bump python-semantic-release/python-semantic-release - ([#680](https://github.com/Python-roborock/python-roborock/pull/680), - [`2afa86c`](https://github.com/Python-roborock/python-roborock/commit/2afa86cdf234ef5626dbf9f2f778d0a3b23ac5a7)) - -- **deps-dev**: Bump mypy from 1.19.0 to 1.19.1 - ([#683](https://github.com/Python-roborock/python-roborock/pull/683), - [`bfb2c63`](https://github.com/Python-roborock/python-roborock/commit/bfb2c63e85d96c2c663686e05c598d0e724685a9)) - -- **deps-dev**: Bump ruff from 0.14.6 to 0.14.9 - ([#682](https://github.com/Python-roborock/python-roborock/pull/682), - [`cfd51e4`](https://github.com/Python-roborock/python-roborock/commit/cfd51e4a75eecb66f60ac137ece36b2fa7583ea9)) - -### Features - -- Improvements to B01 for HA integration - ([#678](https://github.com/Python-roborock/python-roborock/pull/678), - [`97fb0b7`](https://github.com/Python-roborock/python-roborock/commit/97fb0b75ff4aa164d81340d276991537e0c9662e)) - - -## v3.16.1 (2025-12-14) - -### Bug Fixes - -- Share a HealthManager instance across all mqtt channels - ([#672](https://github.com/Python-roborock/python-roborock/pull/672), - [`4ad95dd`](https://github.com/Python-roborock/python-roborock/commit/4ad95ddee4d4d4cd64c7908f150c71d81f45e705)) - - -## v3.16.0 (2025-12-14) - -### Bug Fixes - -- Fix bugs in the subscription idle timeout - ([#665](https://github.com/Python-roborock/python-roborock/pull/665), - [`85b7bee`](https://github.com/Python-roborock/python-roborock/commit/85b7beeb810cfb3d501658cd44f06b2c0052ca33)) - -- Harden the device connection logic used in startup - ([#666](https://github.com/Python-roborock/python-roborock/pull/666), - [`19703f4`](https://github.com/Python-roborock/python-roborock/commit/19703f42fe692a38f8f8639b1136a7585eae76fc)) - -- Harden the initial startup logic - ([#666](https://github.com/Python-roborock/python-roborock/pull/666), - [`19703f4`](https://github.com/Python-roborock/python-roborock/commit/19703f42fe692a38f8f8639b1136a7585eae76fc)) - -### Chores - -- Apply suggestions from code review - ([#675](https://github.com/Python-roborock/python-roborock/pull/675), - [`ab2de5b`](https://github.com/Python-roborock/python-roborock/commit/ab2de5bda7b8e1ff1ad46c7f2bf3b39dc9af4ace)) - -- Clarify comments and docstrings - ([#666](https://github.com/Python-roborock/python-roborock/pull/666), - [`19703f4`](https://github.com/Python-roborock/python-roborock/commit/19703f42fe692a38f8f8639b1136a7585eae76fc)) - -- Fix logging ([#666](https://github.com/Python-roborock/python-roborock/pull/666), - [`19703f4`](https://github.com/Python-roborock/python-roborock/commit/19703f42fe692a38f8f8639b1136a7585eae76fc)) - -- Reduce whitespace changes ([#666](https://github.com/Python-roborock/python-roborock/pull/666), - [`19703f4`](https://github.com/Python-roborock/python-roborock/commit/19703f42fe692a38f8f8639b1136a7585eae76fc)) - -- Revert whitespace change ([#666](https://github.com/Python-roborock/python-roborock/pull/666), - [`19703f4`](https://github.com/Python-roborock/python-roborock/commit/19703f42fe692a38f8f8639b1136a7585eae76fc)) - -### Features - -- Add basic schedule getting ([#675](https://github.com/Python-roborock/python-roborock/pull/675), - [`ab2de5b`](https://github.com/Python-roborock/python-roborock/commit/ab2de5bda7b8e1ff1ad46c7f2bf3b39dc9af4ace)) - - -## v3.15.0 (2025-12-14) - -### Chores - -- Address some comments ([#662](https://github.com/Python-roborock/python-roborock/pull/662), - [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) - -- Apply suggestions from code review - ([#662](https://github.com/Python-roborock/python-roborock/pull/662), - [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) - -- Fix test naming ([#662](https://github.com/Python-roborock/python-roborock/pull/662), - [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) - -- Small tweaks ([#662](https://github.com/Python-roborock/python-roborock/pull/662), - [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) - -- Update roborock/devices/b01_channel.py - ([#662](https://github.com/Python-roborock/python-roborock/pull/662), - [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) - -- Update snapshot ([#662](https://github.com/Python-roborock/python-roborock/pull/662), - [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) - -### Features - -- Add b01 Q7 basic getter support - ([#662](https://github.com/Python-roborock/python-roborock/pull/662), - [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) - -- Add b01 Q7 support ([#662](https://github.com/Python-roborock/python-roborock/pull/662), - [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) - - -## v3.14.3 (2025-12-14) - -### Bug Fixes - -- Allow firmware version as an optional field - ([#670](https://github.com/Python-roborock/python-roborock/pull/670), - [`0f70bf9`](https://github.com/Python-roborock/python-roborock/commit/0f70bf9dd2010c2c72b3b9543d891a1071dc22c4)) - -### Chores - -- Add test for example offline device - ([#670](https://github.com/Python-roborock/python-roborock/pull/670), - [`0f70bf9`](https://github.com/Python-roborock/python-roborock/commit/0f70bf9dd2010c2c72b3b9543d891a1071dc22c4)) - - -## v3.14.2 (2025-12-14) - -### Bug Fixes - -- Additional device logging improvements - ([#668](https://github.com/Python-roborock/python-roborock/pull/668), - [`a86db71`](https://github.com/Python-roborock/python-roborock/commit/a86db717a07d24b0e6ab471ee814b0853b523918)) - -- Improve device logging ([#668](https://github.com/Python-roborock/python-roborock/pull/668), - [`a86db71`](https://github.com/Python-roborock/python-roborock/commit/a86db717a07d24b0e6ab471ee814b0853b523918)) - -### Chores - -- Further readability improvements to device logging - ([#668](https://github.com/Python-roborock/python-roborock/pull/668), - [`a86db71`](https://github.com/Python-roborock/python-roborock/commit/a86db717a07d24b0e6ab471ee814b0853b523918)) - -- Improve device logging container summary string - ([#668](https://github.com/Python-roborock/python-roborock/pull/668), - [`a86db71`](https://github.com/Python-roborock/python-roborock/commit/a86db717a07d24b0e6ab471ee814b0853b523918)) - - -## v3.14.1 (2025-12-14) - -### Bug Fixes - -- Fix diagnostic data redaction to use camelized keys - ([#669](https://github.com/Python-roborock/python-roborock/pull/669), - [`6a20e27`](https://github.com/Python-roborock/python-roborock/commit/6a20e27506d01fbb30683c2d74d26ab073aa3036)) - -### Chores - -- Remove redundant/broken part of the readme - ([#667](https://github.com/Python-roborock/python-roborock/pull/667), - [`b629a61`](https://github.com/Python-roborock/python-roborock/commit/b629a61f28f3bb64914a9bc461ce9f7a27a30c35)) - -- **deps**: Bump pdoc from 15.0.4 to 16.0.0 - ([#652](https://github.com/Python-roborock/python-roborock/pull/652), - [`5f4c14e`](https://github.com/Python-roborock/python-roborock/commit/5f4c14ead4eda21cd6954e3898d79a6eaa983f62)) - - -## v3.14.0 (2025-12-14) - -### Bug Fixes - -- Add device logger ([#663](https://github.com/Python-roborock/python-roborock/pull/663), - [`06d051c`](https://github.com/Python-roborock/python-roborock/commit/06d051c7b8203e23970d52d65abec88a2757227f)) - -- Update roborock/devices/device.py - ([#664](https://github.com/Python-roborock/python-roborock/pull/664), - [`494c5b4`](https://github.com/Python-roborock/python-roborock/commit/494c5b4f2b447f12f5ef90167cad16e08a8230ac)) - -### Chores - -- Add details about test structure - ([#633](https://github.com/Python-roborock/python-roborock/pull/633), - [`109d05b`](https://github.com/Python-roborock/python-roborock/commit/109d05ba86275f2cdd65c5cda12fc423cbfb5850)) - -- Add more tests for already connected devices - ([#664](https://github.com/Python-roborock/python-roborock/pull/664), - [`494c5b4`](https://github.com/Python-roborock/python-roborock/commit/494c5b4f2b447f12f5ef90167cad16e08a8230ac)) - -- Apply suggestions from code review - ([#663](https://github.com/Python-roborock/python-roborock/pull/663), - [`06d051c`](https://github.com/Python-roborock/python-roborock/commit/06d051c7b8203e23970d52d65abec88a2757227f)) - -- Document combined mqtt channels - ([#633](https://github.com/Python-roborock/python-roborock/pull/633), - [`109d05b`](https://github.com/Python-roborock/python-roborock/commit/109d05ba86275f2cdd65c5cda12fc423cbfb5850)) - -- Fix lint errors ([#664](https://github.com/Python-roborock/python-roborock/pull/664), - [`494c5b4`](https://github.com/Python-roborock/python-roborock/commit/494c5b4f2b447f12f5ef90167cad16e08a8230ac)) - -- Fix lint errors ([#633](https://github.com/Python-roborock/python-roborock/pull/633), - [`109d05b`](https://github.com/Python-roborock/python-roborock/commit/109d05ba86275f2cdd65c5cda12fc423cbfb5850)) - -- Fix lint errors in readme ([#633](https://github.com/Python-roborock/python-roborock/pull/633), - [`109d05b`](https://github.com/Python-roborock/python-roborock/commit/109d05ba86275f2cdd65c5cda12fc423cbfb5850)) - -- Fix typo ([#633](https://github.com/Python-roborock/python-roborock/pull/633), - [`109d05b`](https://github.com/Python-roborock/python-roborock/commit/109d05ba86275f2cdd65c5cda12fc423cbfb5850)) - -- Update device traits by protocol - ([#633](https://github.com/Python-roborock/python-roborock/pull/633), - [`109d05b`](https://github.com/Python-roborock/python-roborock/commit/109d05ba86275f2cdd65c5cda12fc423cbfb5850)) - -- Update devices documentation with design details - ([#633](https://github.com/Python-roborock/python-roborock/pull/633), - [`109d05b`](https://github.com/Python-roborock/python-roborock/commit/109d05ba86275f2cdd65c5cda12fc423cbfb5850)) - -- Use the existing device logger - ([#663](https://github.com/Python-roborock/python-roborock/pull/663), - [`06d051c`](https://github.com/Python-roborock/python-roborock/commit/06d051c7b8203e23970d52d65abec88a2757227f)) - -### Features - -- Add ability to listen for ready devices - ([#664](https://github.com/Python-roborock/python-roborock/pull/664), - [`494c5b4`](https://github.com/Python-roborock/python-roborock/commit/494c5b4f2b447f12f5ef90167cad16e08a8230ac)) - - -## v3.13.1 (2025-12-12) - -### Bug Fixes - -- Clean up some naming ([#635](https://github.com/Python-roborock/python-roborock/pull/635), - [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) - -- Update roborock/devices/traits/b01/__init__.py - ([#635](https://github.com/Python-roborock/python-roborock/pull/635), - [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) - -- Use strip not split ([#635](https://github.com/Python-roborock/python-roborock/pull/635), - [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) - -### Chores - -- Refactor to separate b01 q7 and q10 logic - ([#635](https://github.com/Python-roborock/python-roborock/pull/635), - [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) - -- Refactor to seperate b01 ss and sc logic - ([#635](https://github.com/Python-roborock/python-roborock/pull/635), - [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) - -- Share duplicated code ([#635](https://github.com/Python-roborock/python-roborock/pull/635), - [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) - -- Update roborock/devices/device_manager.py - ([#635](https://github.com/Python-roborock/python-roborock/pull/635), - [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) - -- Update roborock/devices/traits/b01/q7/__init__.py - ([#635](https://github.com/Python-roborock/python-roborock/pull/635), - [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) - - -## v3.13.0 (2025-12-12) - -### Bug Fixes - -- Update device cache handling in cli - ([#660](https://github.com/Python-roborock/python-roborock/pull/660), - [`405a4fb`](https://github.com/Python-roborock/python-roborock/commit/405a4fba281b09269c0a065f79dedfd9dc9b5a8b)) - -- Update device cache handling in cli. - ([#660](https://github.com/Python-roborock/python-roborock/pull/660), - [`405a4fb`](https://github.com/Python-roborock/python-roborock/commit/405a4fba281b09269c0a065f79dedfd9dc9b5a8b)) - -### Features - -- Add additional fields to HomeDataDevice class - ([#660](https://github.com/Python-roborock/python-roborock/pull/660), - [`405a4fb`](https://github.com/Python-roborock/python-roborock/commit/405a4fba281b09269c0a065f79dedfd9dc9b5a8b)) - - -## v3.12.2 (2025-12-10) - -### Bug Fixes - -- Filter tests to be warnings only - ([#656](https://github.com/Python-roborock/python-roborock/pull/656), - [`e725eab`](https://github.com/Python-roborock/python-roborock/commit/e725eabab7c498569c5e17be9a7b435c917745f1)) - -- Handle random length bytes before version bytes - ([#656](https://github.com/Python-roborock/python-roborock/pull/656), - [`e725eab`](https://github.com/Python-roborock/python-roborock/commit/e725eabab7c498569c5e17be9a7b435c917745f1)) - -### Chores - -- Add debug to help us determine if buffer is source of problem - ([#656](https://github.com/Python-roborock/python-roborock/pull/656), - [`e725eab`](https://github.com/Python-roborock/python-roborock/commit/e725eabab7c498569c5e17be9a7b435c917745f1)) - -- Apply suggestions from code review - ([#656](https://github.com/Python-roborock/python-roborock/pull/656), - [`e725eab`](https://github.com/Python-roborock/python-roborock/commit/e725eabab7c498569c5e17be9a7b435c917745f1)) - -- Only log if remaining ([#656](https://github.com/Python-roborock/python-roborock/pull/656), - [`e725eab`](https://github.com/Python-roborock/python-roborock/commit/e725eabab7c498569c5e17be9a7b435c917745f1)) - -- Update roborock/protocol.py ([#656](https://github.com/Python-roborock/python-roborock/pull/656), - [`e725eab`](https://github.com/Python-roborock/python-roborock/commit/e725eabab7c498569c5e17be9a7b435c917745f1)) - - -## v3.12.1 (2025-12-10) - -### Bug Fixes - -- Redact additional keys from diagnostic data - ([#659](https://github.com/Python-roborock/python-roborock/pull/659), - [`0330755`](https://github.com/Python-roborock/python-roborock/commit/033075559fb63f696073e235d36f4a906c324881)) - -### Chores - -- Update comments on redaction ([#659](https://github.com/Python-roborock/python-roborock/pull/659), - [`0330755`](https://github.com/Python-roborock/python-roborock/commit/033075559fb63f696073e235d36f4a906c324881)) - - -## v3.12.0 (2025-12-10) - -### Bug Fixes - -- Align V4 code login with app ([#657](https://github.com/Python-roborock/python-roborock/pull/657), - [`2328d45`](https://github.com/Python-roborock/python-roborock/commit/2328d4596c6bda35686944880b601c35b390ac9c)) - -### Chores - -- **deps**: Bump mypy from 1.18.2 to 1.19.0 - ([#654](https://github.com/Python-roborock/python-roborock/pull/654), - [`2799a19`](https://github.com/Python-roborock/python-roborock/commit/2799a19263a511a2d141a97cdb6e9814961a4b0f)) - -- **deps**: Bump syrupy from 4.9.1 to 5.0.0 - ([#655](https://github.com/Python-roborock/python-roborock/pull/655), - [`cc2d00f`](https://github.com/Python-roborock/python-roborock/commit/cc2d00fdd21968c0cfe8da8704644dc2c7ff8091)) - -### Features - -- Log when we see a new key we have never seen before for easier reverse engineering - ([#658](https://github.com/Python-roborock/python-roborock/pull/658), - [`81dde05`](https://github.com/Python-roborock/python-roborock/commit/81dde05eac61e7dc6e0fdb9eb0b7e0ffc97cf9d8)) - - -## v3.11.1 (2025-12-10) - -### Bug Fixes - -- Throw MQTT authentication errors as authentication related exceptions - ([#634](https://github.com/Python-roborock/python-roborock/pull/634), - [`4ad9bcd`](https://github.com/Python-roborock/python-roborock/commit/4ad9bcdc1eddc3a0698056fce19f33d0ea0a119b)) - -- Update the exception handling behavior to account for ambiguity - ([#634](https://github.com/Python-roborock/python-roborock/pull/634), - [`4ad9bcd`](https://github.com/Python-roborock/python-roborock/commit/4ad9bcdc1eddc3a0698056fce19f33d0ea0a119b)) - - -## v3.11.0 (2025-12-10) - -### Features - -- Add mappings for cleaning fluid states - ([#636](https://github.com/Python-roborock/python-roborock/pull/636), - [`32c717e`](https://github.com/Python-roborock/python-roborock/commit/32c717ebdcc963af691398d176b7175c59d7616c)) - - -## v3.10.10 (2025-12-08) - -### Bug Fixes - -- Fix exception when sending dyad/zeo requests - ([#651](https://github.com/Python-roborock/python-roborock/pull/651), - [`a1014a6`](https://github.com/Python-roborock/python-roborock/commit/a1014a60320c45d82c80c2c47f2cb7cc6f242252)) - -### Chores - -- Fix lint ([#651](https://github.com/Python-roborock/python-roborock/pull/651), - [`a1014a6`](https://github.com/Python-roborock/python-roborock/commit/a1014a60320c45d82c80c2c47f2cb7cc6f242252)) - -- Fix tests to be focused on value encoder - ([#651](https://github.com/Python-roborock/python-roborock/pull/651), - [`a1014a6`](https://github.com/Python-roborock/python-roborock/commit/a1014a60320c45d82c80c2c47f2cb7cc6f242252)) - - -## v3.10.9 (2025-12-07) - -### Bug Fixes - -- Convert a01 values ([#647](https://github.com/Python-roborock/python-roborock/pull/647), - [`f875e7a`](https://github.com/Python-roborock/python-roborock/commit/f875e7a65f5f422da97d0f2881956ec077c8a7df)) - -- Update tests and conversion logic - ([#647](https://github.com/Python-roborock/python-roborock/pull/647), - [`f875e7a`](https://github.com/Python-roborock/python-roborock/commit/f875e7a65f5f422da97d0f2881956ec077c8a7df)) - -### Chores - -- Small changes to comments ([#647](https://github.com/Python-roborock/python-roborock/pull/647), - [`f875e7a`](https://github.com/Python-roborock/python-roborock/commit/f875e7a65f5f422da97d0f2881956ec077c8a7df)) - - -## v3.10.8 (2025-12-07) - -### Bug Fixes - -- Encode a01 values as json strings - ([#645](https://github.com/Python-roborock/python-roborock/pull/645), - [`7301a2a`](https://github.com/Python-roborock/python-roborock/commit/7301a2a7145b3ffa862b5ae83f2961b1b28b2867)) - -- Update where the string conversion happens - ([#645](https://github.com/Python-roborock/python-roborock/pull/645), - [`7301a2a`](https://github.com/Python-roborock/python-roborock/commit/7301a2a7145b3ffa862b5ae83f2961b1b28b2867)) - -### Chores - -- Remove unnecessary imports ([#645](https://github.com/Python-roborock/python-roborock/pull/645), - [`7301a2a`](https://github.com/Python-roborock/python-roborock/commit/7301a2a7145b3ffa862b5ae83f2961b1b28b2867)) - -- Update tests to capture bug fix - ([#645](https://github.com/Python-roborock/python-roborock/pull/645), - [`7301a2a`](https://github.com/Python-roborock/python-roborock/commit/7301a2a7145b3ffa862b5ae83f2961b1b28b2867)) - - -## v3.10.7 (2025-12-07) - -### Bug Fixes - -- Add test coverage for a01 traits - ([#649](https://github.com/Python-roborock/python-roborock/pull/649), - [`89874cb`](https://github.com/Python-roborock/python-roborock/commit/89874cb5de97362c29d31f50916b2355e1d3f90f)) - -### Chores - -- Add codecov support ([#646](https://github.com/Python-roborock/python-roborock/pull/646), - [`3928280`](https://github.com/Python-roborock/python-roborock/commit/39282809217ec6d4b6e0c4f4f7729fbfd48ecadb)) - -- Add more test coverage for a01 API and fix `False` value handling - ([#648](https://github.com/Python-roborock/python-roborock/pull/648), - [`4bd9b18`](https://github.com/Python-roborock/python-roborock/commit/4bd9b18fddf4df6e05c185ff23d8be2d8fa90763)) - -- Fix lint errors in tests ([#648](https://github.com/Python-roborock/python-roborock/pull/648), - [`4bd9b18`](https://github.com/Python-roborock/python-roborock/commit/4bd9b18fddf4df6e05c185ff23d8be2d8fa90763)) - -- Use raw return values ([#649](https://github.com/Python-roborock/python-roborock/pull/649), - [`89874cb`](https://github.com/Python-roborock/python-roborock/commit/89874cb5de97362c29d31f50916b2355e1d3f90f)) - - -## v3.10.6 (2025-12-07) - -### Bug Fixes - -- Handle base64 serializing wrong - ([#643](https://github.com/Python-roborock/python-roborock/pull/643), - [`d933ec8`](https://github.com/Python-roborock/python-roborock/commit/d933ec82f470fec47339f938065ab70a635112fd)) - - -## v3.10.5 (2025-12-07) - -### Bug Fixes - -- Consider RPC channel health based on MQTT session - ([#642](https://github.com/Python-roborock/python-roborock/pull/642), - [`b1738fe`](https://github.com/Python-roborock/python-roborock/commit/b1738fec4edde302c5f0fb478146faaa3d864ee8)) - - -## v3.10.4 (2025-12-07) - -### Bug Fixes - -- Lower log level for internal protocol connection details - ([#637](https://github.com/Python-roborock/python-roborock/pull/637), - [`6945c6a`](https://github.com/Python-roborock/python-roborock/commit/6945c6ad25f39930cdea23d2f7004824f681a6e7)) - -- Revert CLIENT_KEEPALIVE back to 60 - ([#641](https://github.com/Python-roborock/python-roborock/pull/641), - [`632b88b`](https://github.com/Python-roborock/python-roborock/commit/632b88b22e2ac722c5c4849b7b217fa4a88f757c)) - -### Chores - -- Fix lint erors ([#637](https://github.com/Python-roborock/python-roborock/pull/637), - [`6945c6a`](https://github.com/Python-roborock/python-roborock/commit/6945c6ad25f39930cdea23d2f7004824f681a6e7)) - -- Remove tests for logging ([#637](https://github.com/Python-roborock/python-roborock/pull/637), - [`6945c6a`](https://github.com/Python-roborock/python-roborock/commit/6945c6ad25f39930cdea23d2f7004824f681a6e7)) - - -## v3.10.3 (2025-12-06) - -### Bug Fixes - -- Ensure immediate local connection is attempted - ([#640](https://github.com/Python-roborock/python-roborock/pull/640), - [`3c918ae`](https://github.com/Python-roborock/python-roborock/commit/3c918aec33483b93ae9d632cc4ada286b6761b70)) - -- Fix mqtt rate limiting and broken local connections - ([#638](https://github.com/Python-roborock/python-roborock/pull/638), - [`4249769`](https://github.com/Python-roborock/python-roborock/commit/42497696e92dad79147e404be96e73b9e408bd0b)) - -### Chores - -- Add back test case and add test ids - ([#638](https://github.com/Python-roborock/python-roborock/pull/638), - [`4249769`](https://github.com/Python-roborock/python-roborock/commit/42497696e92dad79147e404be96e73b9e408bd0b)) - -- Fix lint errors ([#640](https://github.com/Python-roborock/python-roborock/pull/640), - [`3c918ae`](https://github.com/Python-roborock/python-roborock/commit/3c918aec33483b93ae9d632cc4ada286b6761b70)) - -- Fix lint errors ([#638](https://github.com/Python-roborock/python-roborock/pull/638), - [`4249769`](https://github.com/Python-roborock/python-roborock/commit/42497696e92dad79147e404be96e73b9e408bd0b)) - -- Update roborock/devices/v1_channel.py - ([#638](https://github.com/Python-roborock/python-roborock/pull/638), - [`4249769`](https://github.com/Python-roborock/python-roborock/commit/42497696e92dad79147e404be96e73b9e408bd0b)) - - -## v3.10.2 (2025-12-05) - -### Bug Fixes - -- Keep MQTT topic subscriptions alive with an idle timeout - ([#632](https://github.com/Python-roborock/python-roborock/pull/632), - [`d0d2e42`](https://github.com/Python-roborock/python-roborock/commit/d0d2e425e3005f3f83f4a57079fcef4736171b7a)) - -### Chores - -- Add tests that reproduce key parsing bugs - ([#631](https://github.com/Python-roborock/python-roborock/pull/631), - [`87e14a2`](https://github.com/Python-roborock/python-roborock/commit/87e14a265a6c6bbe18fbe63f360ca57ca63db9c3)) - -- Fix lint errors ([#631](https://github.com/Python-roborock/python-roborock/pull/631), - [`87e14a2`](https://github.com/Python-roborock/python-roborock/commit/87e14a265a6c6bbe18fbe63f360ca57ca63db9c3)) - - -## v3.10.1 (2025-12-05) - -### Bug Fixes - -- Add fallback ([#630](https://github.com/Python-roborock/python-roborock/pull/630), - [`e4fa8c6`](https://github.com/Python-roborock/python-roborock/commit/e4fa8c60bb29978b06704ce22dc4a2cda0e28875)) - -- Ensure keys are correct type when serializing from data - ([#630](https://github.com/Python-roborock/python-roborock/pull/630), - [`e4fa8c6`](https://github.com/Python-roborock/python-roborock/commit/e4fa8c60bb29978b06704ce22dc4a2cda0e28875)) - -- Ensure keys are valid type when serializing from data - ([#630](https://github.com/Python-roborock/python-roborock/pull/630), - [`e4fa8c6`](https://github.com/Python-roborock/python-roborock/commit/e4fa8c60bb29978b06704ce22dc4a2cda0e28875)) - - -## v3.10.0 (2025-12-04) - -### Bug Fixes - -- Catch UnicodeDecodeError when parsing messages - ([#629](https://github.com/Python-roborock/python-roborock/pull/629), - [`e8c3b75`](https://github.com/Python-roborock/python-roborock/commit/e8c3b75a9d3efb8ff79a6d4e8544549a5abe766a)) - -- Reset keep_alive_task to None - ([#627](https://github.com/Python-roborock/python-roborock/pull/627), - [`a802f66`](https://github.com/Python-roborock/python-roborock/commit/a802f66fec913be82a25ae45d96555c2d328964b)) - -### Chores - -- Copilot test ([#627](https://github.com/Python-roborock/python-roborock/pull/627), - [`a802f66`](https://github.com/Python-roborock/python-roborock/commit/a802f66fec913be82a25ae45d96555c2d328964b)) - -### Features - -- Add comprehensive test coverage for keep-alive functionality - ([#627](https://github.com/Python-roborock/python-roborock/pull/627), - [`a802f66`](https://github.com/Python-roborock/python-roborock/commit/a802f66fec913be82a25ae45d96555c2d328964b)) - -- Add pinging to local client ([#627](https://github.com/Python-roborock/python-roborock/pull/627), - [`a802f66`](https://github.com/Python-roborock/python-roborock/commit/a802f66fec913be82a25ae45d96555c2d328964b)) - -### Refactoring - -- Address code review feedback on keep-alive tests - ([#627](https://github.com/Python-roborock/python-roborock/pull/627), - [`a802f66`](https://github.com/Python-roborock/python-roborock/commit/a802f66fec913be82a25ae45d96555c2d328964b)) - - -## v3.9.3 (2025-12-03) - -### Bug Fixes - -- Use correct index for clean records - ([#620](https://github.com/Python-roborock/python-roborock/pull/620), - [`f129603`](https://github.com/Python-roborock/python-roborock/commit/f1296032e7b8c8c1348882d58e9da5ecc8287eee)) - - -## v3.9.2 (2025-12-03) - -### Bug Fixes - -- Add device info getters and setters - ([#614](https://github.com/Python-roborock/python-roborock/pull/614), - [`ee02a71`](https://github.com/Python-roborock/python-roborock/commit/ee02a71a8d99848256f2bb69533e9d1827f52585)) - -- Fix issues with the cache clobbering information for each device - ([#614](https://github.com/Python-roborock/python-roborock/pull/614), - [`ee02a71`](https://github.com/Python-roborock/python-roborock/commit/ee02a71a8d99848256f2bb69533e9d1827f52585)) - -- Update DeviceCache interface ([#614](https://github.com/Python-roborock/python-roborock/pull/614), - [`ee02a71`](https://github.com/Python-roborock/python-roborock/commit/ee02a71a8d99848256f2bb69533e9d1827f52585)) - -### Chores - -- Fix test snapshots ([#614](https://github.com/Python-roborock/python-roborock/pull/614), - [`ee02a71`](https://github.com/Python-roborock/python-roborock/commit/ee02a71a8d99848256f2bb69533e9d1827f52585)) - -- Remove unnecessary imports ([#614](https://github.com/Python-roborock/python-roborock/pull/614), - [`ee02a71`](https://github.com/Python-roborock/python-roborock/commit/ee02a71a8d99848256f2bb69533e9d1827f52585)) - - -## v3.9.1 (2025-12-03) - -### Bug Fixes - -- Fix DeviceFeatures so that it can be serialized and deserialized properly. - ([#615](https://github.com/Python-roborock/python-roborock/pull/615), - [`88b2055`](https://github.com/Python-roborock/python-roborock/commit/88b2055a7aea50d8b45bfb07c3a937b6d8d267d0)) - - -## v3.9.0 (2025-12-03) - -### Bug Fixes - -- Set default arugments to store/load value functions - ([#613](https://github.com/Python-roborock/python-roborock/pull/613), - [`ce3d88d`](https://github.com/Python-roborock/python-roborock/commit/ce3d88dd52e78adccf7f705d4076cc963bbe9724)) - -### Chores - -- Remove unncessary logging ([#613](https://github.com/Python-roborock/python-roborock/pull/613), - [`ce3d88d`](https://github.com/Python-roborock/python-roborock/commit/ce3d88dd52e78adccf7f705d4076cc963bbe9724)) - -- Remove unnecessary snapshot files - ([#613](https://github.com/Python-roborock/python-roborock/pull/613), - [`ce3d88d`](https://github.com/Python-roborock/python-roborock/commit/ce3d88dd52e78adccf7f705d4076cc963bbe9724)) - -- Remove unused import ([#613](https://github.com/Python-roborock/python-roborock/pull/613), - [`ce3d88d`](https://github.com/Python-roborock/python-roborock/commit/ce3d88dd52e78adccf7f705d4076cc963bbe9724)) - -### Features - -- Make CacheData serializable ([#613](https://github.com/Python-roborock/python-roborock/pull/613), - [`ce3d88d`](https://github.com/Python-roborock/python-roborock/commit/ce3d88dd52e78adccf7f705d4076cc963bbe9724)) - - -## v3.8.5 (2025-11-29) - -### Bug Fixes - -- Remove python 3.11 incompatibility - ([#609](https://github.com/Python-roborock/python-roborock/pull/609), - [`f3487e8`](https://github.com/Python-roborock/python-roborock/commit/f3487e8ec478e000d1330745dff178125796bfb5)) - -### Chores - -- Fix v1 channel typing and improve readability - ([#609](https://github.com/Python-roborock/python-roborock/pull/609), - [`f3487e8`](https://github.com/Python-roborock/python-roborock/commit/f3487e8ec478e000d1330745dff178125796bfb5)) - -- Improve doc string readability and grammar - ([#609](https://github.com/Python-roborock/python-roborock/pull/609), - [`f3487e8`](https://github.com/Python-roborock/python-roborock/commit/f3487e8ec478e000d1330745dff178125796bfb5)) - -- Refactor v1 rpc channels ([#609](https://github.com/Python-roborock/python-roborock/pull/609), - [`f3487e8`](https://github.com/Python-roborock/python-roborock/commit/f3487e8ec478e000d1330745dff178125796bfb5)) - -- Remove unnecessary docstrings - ([#609](https://github.com/Python-roborock/python-roborock/pull/609), - [`f3487e8`](https://github.com/Python-roborock/python-roborock/commit/f3487e8ec478e000d1330745dff178125796bfb5)) - -- Remove unnecessary pydoc on private members - ([#609](https://github.com/Python-roborock/python-roborock/pull/609), - [`f3487e8`](https://github.com/Python-roborock/python-roborock/commit/f3487e8ec478e000d1330745dff178125796bfb5)) - -- Remove unnecessary pydoc to make the code more compact - ([#609](https://github.com/Python-roborock/python-roborock/pull/609), - [`f3487e8`](https://github.com/Python-roborock/python-roborock/commit/f3487e8ec478e000d1330745dff178125796bfb5)) - - -## v3.8.4 (2025-11-29) - -### Bug Fixes - -- Encode map content bytes as base64 - ([#608](https://github.com/Python-roborock/python-roborock/pull/608), - [`27c61f9`](https://github.com/Python-roborock/python-roborock/commit/27c61f9b7958edb5b4ca374e60898eb966163802)) - -- Fallback to the cached network information on failure - ([#606](https://github.com/Python-roborock/python-roborock/pull/606), - [`80d7d5a`](https://github.com/Python-roborock/python-roborock/commit/80d7d5af72629e83fbc7f2bf418ccecd793dbd58)) - -- Fallback to the cached network information when failing to lookup network info - ([#606](https://github.com/Python-roborock/python-roborock/pull/606), - [`80d7d5a`](https://github.com/Python-roborock/python-roborock/commit/80d7d5af72629e83fbc7f2bf418ccecd793dbd58)) - -- Improve partial update code ([#608](https://github.com/Python-roborock/python-roborock/pull/608), - [`27c61f9`](https://github.com/Python-roborock/python-roborock/commit/27c61f9b7958edb5b4ca374e60898eb966163802)) - -### Chores - -- Update roborock/devices/v1_channel.py - ([#606](https://github.com/Python-roborock/python-roborock/pull/606), - [`80d7d5a`](https://github.com/Python-roborock/python-roborock/commit/80d7d5af72629e83fbc7f2bf418ccecd793dbd58)) - - -## v3.8.3 (2025-11-29) - -### Bug Fixes - -- Add a health manager for restarting unhealthy mqtt connections - ([#605](https://github.com/Python-roborock/python-roborock/pull/605), - [`879a641`](https://github.com/Python-roborock/python-roborock/commit/879a6412aafe8e7d0ba7a16e867ff3028873fd02)) - -- Add ability to restart the mqtt session - ([#605](https://github.com/Python-roborock/python-roborock/pull/605), - [`879a641`](https://github.com/Python-roborock/python-roborock/commit/879a6412aafe8e7d0ba7a16e867ff3028873fd02)) - -- Reset start_future each loop ([#605](https://github.com/Python-roborock/python-roborock/pull/605), - [`879a641`](https://github.com/Python-roborock/python-roborock/commit/879a6412aafe8e7d0ba7a16e867ff3028873fd02)) - -### Chores - -- Always use utc for now ([#605](https://github.com/Python-roborock/python-roborock/pull/605), - [`879a641`](https://github.com/Python-roborock/python-roborock/commit/879a6412aafe8e7d0ba7a16e867ff3028873fd02)) - -- Cancel the connection and reconnect tasks - ([#605](https://github.com/Python-roborock/python-roborock/pull/605), - [`879a641`](https://github.com/Python-roborock/python-roborock/commit/879a6412aafe8e7d0ba7a16e867ff3028873fd02)) - -- Fix async tests ([#605](https://github.com/Python-roborock/python-roborock/pull/605), - [`879a641`](https://github.com/Python-roborock/python-roborock/commit/879a6412aafe8e7d0ba7a16e867ff3028873fd02)) - - -## v3.8.2 (2025-11-28) - -### Bug Fixes - -- Fix device feature discovery ([#603](https://github.com/Python-roborock/python-roborock/pull/603), - [`d048001`](https://github.com/Python-roborock/python-roborock/commit/d0480015550edbe3e978902e141563e9c537fad1)) - -### Chores - -- Revert requires_feature ([#603](https://github.com/Python-roborock/python-roborock/pull/603), - [`d048001`](https://github.com/Python-roborock/python-roborock/commit/d0480015550edbe3e978902e141563e9c537fad1)) - - -## v3.8.1 (2025-11-26) - -### Bug Fixes - -- Attempt to fix l01 ([#593](https://github.com/Python-roborock/python-roborock/pull/593), - [`87e60d9`](https://github.com/Python-roborock/python-roborock/commit/87e60d9a9cb99ef9ddf99b1691baa2573db4221d)) - -- Decoding l01 ([#593](https://github.com/Python-roborock/python-roborock/pull/593), - [`87e60d9`](https://github.com/Python-roborock/python-roborock/commit/87e60d9a9cb99ef9ddf99b1691baa2573db4221d)) - -- Ensure traits to always reflect the the status of commands - ([#592](https://github.com/Python-roborock/python-roborock/pull/592), - [`3d0ad74`](https://github.com/Python-roborock/python-roborock/commit/3d0ad74954948ebf0ea5c1a144aff3f9d111b1f7)) - -- Fix L01 encoding and decoding - ([#593](https://github.com/Python-roborock/python-roborock/pull/593), - [`87e60d9`](https://github.com/Python-roborock/python-roborock/commit/87e60d9a9cb99ef9ddf99b1691baa2573db4221d)) - -- Temp cache of protocol version until restart - ([#593](https://github.com/Python-roborock/python-roborock/pull/593), - [`87e60d9`](https://github.com/Python-roborock/python-roborock/commit/87e60d9a9cb99ef9ddf99b1691baa2573db4221d)) - -- Update bad asserts found by co-pilot - ([#592](https://github.com/Python-roborock/python-roborock/pull/592), - [`3d0ad74`](https://github.com/Python-roborock/python-roborock/commit/3d0ad74954948ebf0ea5c1a144aff3f9d111b1f7)) - -- Update the messages callback to not mutate the protocol once created. - ([#593](https://github.com/Python-roborock/python-roborock/pull/593), - [`87e60d9`](https://github.com/Python-roborock/python-roborock/commit/87e60d9a9cb99ef9ddf99b1691baa2573db4221d)) - -### Chores - -- Add comments everywhere on implicit refreshes - ([#592](https://github.com/Python-roborock/python-roborock/pull/592), - [`3d0ad74`](https://github.com/Python-roborock/python-roborock/commit/3d0ad74954948ebf0ea5c1a144aff3f9d111b1f7)) - -- Fix lint errors ([#593](https://github.com/Python-roborock/python-roborock/pull/593), - [`87e60d9`](https://github.com/Python-roborock/python-roborock/commit/87e60d9a9cb99ef9ddf99b1691baa2573db4221d)) - -- Fix typos ([#592](https://github.com/Python-roborock/python-roborock/pull/592), - [`3d0ad74`](https://github.com/Python-roborock/python-roborock/commit/3d0ad74954948ebf0ea5c1a144aff3f9d111b1f7)) - -- Remove unnecessary whitespace - ([#592](https://github.com/Python-roborock/python-roborock/pull/592), - [`3d0ad74`](https://github.com/Python-roborock/python-roborock/commit/3d0ad74954948ebf0ea5c1a144aff3f9d111b1f7)) - -- Update roborock/devices/traits/v1/common.py - ([#592](https://github.com/Python-roborock/python-roborock/pull/592), - [`3d0ad74`](https://github.com/Python-roborock/python-roborock/commit/3d0ad74954948ebf0ea5c1a144aff3f9d111b1f7)) - -- Update working for the CommandTrait - ([#592](https://github.com/Python-roborock/python-roborock/pull/592), - [`3d0ad74`](https://github.com/Python-roborock/python-roborock/commit/3d0ad74954948ebf0ea5c1a144aff3f9d111b1f7)) - -- **deps**: Bump actions/checkout from 5 to 6 - ([#598](https://github.com/Python-roborock/python-roborock/pull/598), - [`a9e91ae`](https://github.com/Python-roborock/python-roborock/commit/a9e91aedaed142f433d52c8b21b3fda3a1f62450)) - -- **deps**: Bump click from 8.3.0 to 8.3.1 - ([#594](https://github.com/Python-roborock/python-roborock/pull/594), - [`4b5d6bb`](https://github.com/Python-roborock/python-roborock/commit/4b5d6bb0044deef158484b712f75ef3ab76f1cef)) - -- **deps**: Bump pre-commit from 4.4.0 to 4.5.0 - ([#602](https://github.com/Python-roborock/python-roborock/pull/602), - [`50b70a4`](https://github.com/Python-roborock/python-roborock/commit/50b70a454dd80c1b41df855496c72818ecf30cea)) - -- **deps**: Bump pytest-asyncio from 1.2.0 to 1.3.0 - ([#596](https://github.com/Python-roborock/python-roborock/pull/596), - [`ee85762`](https://github.com/Python-roborock/python-roborock/commit/ee85762ebe34663c25c3c05509a265f2d624b3ab)) - -- **deps**: Bump python-semantic-release/publish-action - ([#599](https://github.com/Python-roborock/python-roborock/pull/599), - [`bcfe314`](https://github.com/Python-roborock/python-roborock/commit/bcfe3141fde31b1930c54ac1ce8f0a3aef9adea7)) - -- **deps**: Bump python-semantic-release/python-semantic-release - ([#600](https://github.com/Python-roborock/python-roborock/pull/600), - [`f8061ff`](https://github.com/Python-roborock/python-roborock/commit/f8061ffcf416bd2618ac5b6f4b056650599bcbe8)) - -- **deps**: Bump ruff from 0.14.4 to 0.14.5 - ([#595](https://github.com/Python-roborock/python-roborock/pull/595), - [`e561838`](https://github.com/Python-roborock/python-roborock/commit/e561838449be48abebf6ea94ff944222eea4d0ec)) - -- **deps**: Bump ruff from 0.14.5 to 0.14.6 - ([#601](https://github.com/Python-roborock/python-roborock/pull/601), - [`c16c529`](https://github.com/Python-roborock/python-roborock/commit/c16c529881d84f370f99a7c5b31255a24a74da3a)) - - -## v3.8.0 (2025-11-15) - -### Bug Fixes - -- Update roborock/devices/device.py - ([#588](https://github.com/Python-roborock/python-roborock/pull/588), - [`3994110`](https://github.com/Python-roborock/python-roborock/commit/39941103fe5247a9764d38db5ee0915dd39e043d)) - -### Chores - -- Fix lint ([#589](https://github.com/Python-roborock/python-roborock/pull/589), - [`fa69bf2`](https://github.com/Python-roborock/python-roborock/commit/fa69bf2d9d090bf8bc6cf89ead6ab122d5dbcd00)) - -- Fix lint errors ([#588](https://github.com/Python-roborock/python-roborock/pull/588), - [`3994110`](https://github.com/Python-roborock/python-roborock/commit/39941103fe5247a9764d38db5ee0915dd39e043d)) - -- Update comments to clarify close call - ([#588](https://github.com/Python-roborock/python-roborock/pull/588), - [`3994110`](https://github.com/Python-roborock/python-roborock/commit/39941103fe5247a9764d38db5ee0915dd39e043d)) - -- Update documentation to point to the newer device APIs - ([#589](https://github.com/Python-roborock/python-roborock/pull/589), - [`fa69bf2`](https://github.com/Python-roborock/python-roborock/commit/fa69bf2d9d090bf8bc6cf89ead6ab122d5dbcd00)) - -- Update pydoc and formatting ([#588](https://github.com/Python-roborock/python-roborock/pull/588), - [`3994110`](https://github.com/Python-roborock/python-roborock/commit/39941103fe5247a9764d38db5ee0915dd39e043d)) - -- Update README.md ([#589](https://github.com/Python-roborock/python-roborock/pull/589), - [`fa69bf2`](https://github.com/Python-roborock/python-roborock/commit/fa69bf2d9d090bf8bc6cf89ead6ab122d5dbcd00)) - -- Update roborock/devices/device.py - ([#588](https://github.com/Python-roborock/python-roborock/pull/588), - [`3994110`](https://github.com/Python-roborock/python-roborock/commit/39941103fe5247a9764d38db5ee0915dd39e043d)) - -- Update roborock/devices/traits/b01/__init__.py - ([#589](https://github.com/Python-roborock/python-roborock/pull/589), - [`fa69bf2`](https://github.com/Python-roborock/python-roborock/commit/fa69bf2d9d090bf8bc6cf89ead6ab122d5dbcd00)) - -- Update roborock/devices/traits/v1/__init__.py - ([#589](https://github.com/Python-roborock/python-roborock/pull/589), - [`fa69bf2`](https://github.com/Python-roborock/python-roborock/commit/fa69bf2d9d090bf8bc6cf89ead6ab122d5dbcd00)) - -- Update typing ([#588](https://github.com/Python-roborock/python-roborock/pull/588), - [`3994110`](https://github.com/Python-roborock/python-roborock/commit/39941103fe5247a9764d38db5ee0915dd39e043d)) - -### Features - -- Add examples that show how to use the cache and implement a file cache - ([#589](https://github.com/Python-roborock/python-roborock/pull/589), - [`fa69bf2`](https://github.com/Python-roborock/python-roborock/commit/fa69bf2d9d090bf8bc6cf89ead6ab122d5dbcd00)) - -- Connect to devices asynchronously - ([#588](https://github.com/Python-roborock/python-roborock/pull/588), - [`3994110`](https://github.com/Python-roborock/python-roborock/commit/39941103fe5247a9764d38db5ee0915dd39e043d)) - - -## v3.7.4 (2025-11-15) - -### Bug Fixes - -- Update trait `refresh` method to return `None` - ([#586](https://github.com/Python-roborock/python-roborock/pull/586), - [`86ec1a7`](https://github.com/Python-roborock/python-roborock/commit/86ec1a7377159ed9bdceb339804b61c73532f441)) - -### Chores - -- Fix lint errors ([#586](https://github.com/Python-roborock/python-roborock/pull/586), - [`86ec1a7`](https://github.com/Python-roborock/python-roborock/commit/86ec1a7377159ed9bdceb339804b61c73532f441)) - -- Remove unnecessary whitespace - ([#586](https://github.com/Python-roborock/python-roborock/pull/586), - [`86ec1a7`](https://github.com/Python-roborock/python-roborock/commit/86ec1a7377159ed9bdceb339804b61c73532f441)) - -- Revert accidental CleanSummary changes - ([#586](https://github.com/Python-roborock/python-roborock/pull/586), - [`86ec1a7`](https://github.com/Python-roborock/python-roborock/commit/86ec1a7377159ed9bdceb339804b61c73532f441)) - -- Revert unnecessary change to Clean Summary Trait - ([#586](https://github.com/Python-roborock/python-roborock/pull/586), - [`86ec1a7`](https://github.com/Python-roborock/python-roborock/commit/86ec1a7377159ed9bdceb339804b61c73532f441)) - - -## v3.7.3 (2025-11-14) - -### Bug Fixes - -- Switches commands were incorrect - ([#591](https://github.com/Python-roborock/python-roborock/pull/591), - [`40aa6b6`](https://github.com/Python-roborock/python-roborock/commit/40aa6b67a6e43e273d6e4512ccdc8df11dd4dc8a)) - -### Chores - -- Add device info for roborock.vacuum.s5e - ([#587](https://github.com/Python-roborock/python-roborock/pull/587), - [`20afa92`](https://github.com/Python-roborock/python-roborock/commit/20afa925e298f9fb36fc3e1ac79bf8cba90fcdf5)) - -- **deps**: Bump ruff from 0.14.1 to 0.14.4 - ([#585](https://github.com/Python-roborock/python-roborock/pull/585), - [`324c816`](https://github.com/Python-roborock/python-roborock/commit/324c8165bacfdd7abbc1561c3f4f5768cd9c331c)) - - -## v3.7.2 (2025-11-11) - -### Bug Fixes - -- Improve Home trait discovery process. - ([#580](https://github.com/Python-roborock/python-roborock/pull/580), - [`44680e3`](https://github.com/Python-roborock/python-roborock/commit/44680e367991b6eafef0267f6b4209a09929973a)) - -### Chores - -- Refactor test by removing redundant assertion - ([#580](https://github.com/Python-roborock/python-roborock/pull/580), - [`44680e3`](https://github.com/Python-roborock/python-roborock/commit/44680e367991b6eafef0267f6b4209a09929973a)) - -- Update tests/devices/traits/v1/test_home.py - ([#580](https://github.com/Python-roborock/python-roborock/pull/580), - [`44680e3`](https://github.com/Python-roborock/python-roborock/commit/44680e367991b6eafef0267f6b4209a09929973a)) - -- **deps**: Bump aiohttp from 3.13.0 to 3.13.2 - ([#583](https://github.com/Python-roborock/python-roborock/pull/583), - [`c7bacad`](https://github.com/Python-roborock/python-roborock/commit/c7bacad32ede1290fbaea261538e1b90476d61c6)) - -- **deps**: Bump pre-commit from 4.3.0 to 4.4.0 - ([#584](https://github.com/Python-roborock/python-roborock/pull/584), - [`3adc76b`](https://github.com/Python-roborock/python-roborock/commit/3adc76bdd21c16fcb25d9d3dee9c5857eccea960)) - -- **deps**: Bump python-semantic-release/publish-action - ([#582](https://github.com/Python-roborock/python-roborock/pull/582), - [`c76bf06`](https://github.com/Python-roborock/python-roborock/commit/c76bf069191bf221a848c4dfa34104e8b93b81b8)) - - -## v3.7.1 (2025-11-05) - -### Bug Fixes - -- Fix typing issues in new device traits - ([#577](https://github.com/Python-roborock/python-roborock/pull/577), - [`3266ae6`](https://github.com/Python-roborock/python-roborock/commit/3266ae6aa9d799c398542c95463d63a8cb77dd4e)) - - -## v3.7.0 (2025-10-27) - -### Chores - -- Change imports for typing ([#574](https://github.com/Python-roborock/python-roborock/pull/574), - [`05c8e94`](https://github.com/Python-roborock/python-roborock/commit/05c8e9458e44a6ca61977cc0d26c2776bb1fcae5)) - -- Update tests/devices/traits/v1/fixtures.py - ([#574](https://github.com/Python-roborock/python-roborock/pull/574), - [`05c8e94`](https://github.com/Python-roborock/python-roborock/commit/05c8e9458e44a6ca61977cc0d26c2776bb1fcae5)) - -### Features - -- Add a trait for working with routines - ([#574](https://github.com/Python-roborock/python-roborock/pull/574), - [`05c8e94`](https://github.com/Python-roborock/python-roborock/commit/05c8e9458e44a6ca61977cc0d26c2776bb1fcae5)) - - -## v3.6.0 (2025-10-27) - -### Chores - -- Add test coverage for failing to parse bytes - ([#572](https://github.com/Python-roborock/python-roborock/pull/572), - [`e524d31`](https://github.com/Python-roborock/python-roborock/commit/e524d31fa63cc6c97c10bf890dbde91e7e5d3840)) - -- Update tests/devices/traits/v1/test_home.py - ([#572](https://github.com/Python-roborock/python-roborock/pull/572), - [`e524d31`](https://github.com/Python-roborock/python-roborock/commit/e524d31fa63cc6c97c10bf890dbde91e7e5d3840)) - -### Features - -- Add map content to the Home trait - ([#572](https://github.com/Python-roborock/python-roborock/pull/572), - [`e524d31`](https://github.com/Python-roborock/python-roborock/commit/e524d31fa63cc6c97c10bf890dbde91e7e5d3840)) - - -## v3.5.0 (2025-10-27) - -### Chores - -- Disable body-max-line-length ([#573](https://github.com/Python-roborock/python-roborock/pull/573), - [`6a5db1d`](https://github.com/Python-roborock/python-roborock/commit/6a5db1d9aac274bbfa46624250def64ada2b507b)) - -- Go back to old web API name ([#570](https://github.com/Python-roborock/python-roborock/pull/570), - [`4e7e776`](https://github.com/Python-roborock/python-roborock/commit/4e7e776fed4cae17636659b9e3365ac26347e86b)) - -### Features - -- Simplify device manager creation - ([#570](https://github.com/Python-roborock/python-roborock/pull/570), - [`4e7e776`](https://github.com/Python-roborock/python-roborock/commit/4e7e776fed4cae17636659b9e3365ac26347e86b)) - - -## v3.4.0 (2025-10-26) - -### Bug Fixes - -- Only validate connection when sending commands - ([#571](https://github.com/Python-roborock/python-roborock/pull/571), - [`efa48e9`](https://github.com/Python-roborock/python-roborock/commit/efa48e96a1554b7a7358f9f22873b847d93d663d)) - -### Features - -- Rename home_cache to home_map_info - ([#569](https://github.com/Python-roborock/python-roborock/pull/569), - [`9aff1cf`](https://github.com/Python-roborock/python-roborock/commit/9aff1cf01aa8e1a56d594cd2be20400cbf1eb324)) - - -## v3.3.3 (2025-10-25) - -### Bug Fixes - -- FIx bug in clean record parsing - ([#567](https://github.com/Python-roborock/python-roborock/pull/567), - [`8196bcc`](https://github.com/Python-roborock/python-roborock/commit/8196bccdf5239ef540291bf55fa2bd270a4544ed)) - - -## v3.3.2 (2025-10-25) - -### Bug Fixes - -- Ensure that result is not none - ([#565](https://github.com/Python-roborock/python-roborock/pull/565), - [`c0a84eb`](https://github.com/Python-roborock/python-roborock/commit/c0a84eb434ea1b8e15adea7adeba28b7fb1853f6)) - -- Set to empty dict ([#565](https://github.com/Python-roborock/python-roborock/pull/565), - [`c0a84eb`](https://github.com/Python-roborock/python-roborock/commit/c0a84eb434ea1b8e15adea7adeba28b7fb1853f6)) - -### Chores - -- Fix typing for InMemoryCache ([#566](https://github.com/Python-roborock/python-roborock/pull/566), - [`904494d`](https://github.com/Python-roborock/python-roborock/commit/904494da3dcf899d9a4d5d4ab589d543dcea1fe2)) - -- Go back to the other way ([#565](https://github.com/Python-roborock/python-roborock/pull/565), - [`c0a84eb`](https://github.com/Python-roborock/python-roborock/commit/c0a84eb434ea1b8e15adea7adeba28b7fb1853f6)) - -- Update roborock/protocols/v1_protocol.py - ([#565](https://github.com/Python-roborock/python-roborock/pull/565), - [`c0a84eb`](https://github.com/Python-roborock/python-roborock/commit/c0a84eb434ea1b8e15adea7adeba28b7fb1853f6)) - - -## v3.3.1 (2025-10-25) - -### Bug Fixes - -- Truncate debug strings for MapContent - ([#564](https://github.com/Python-roborock/python-roborock/pull/564), - [`5a377de`](https://github.com/Python-roborock/python-roborock/commit/5a377ded245f6948f86775287eb7d70c12ec7740)) - -### Chores - -- Apply github co-pilot recommendation - ([#564](https://github.com/Python-roborock/python-roborock/pull/564), - [`5a377de`](https://github.com/Python-roborock/python-roborock/commit/5a377ded245f6948f86775287eb7d70c12ec7740)) - - -## v3.3.0 (2025-10-25) - -### Bug Fixes - -- Lower local timeout ([#559](https://github.com/Python-roborock/python-roborock/pull/559), - [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) - -- Remove unneeded params setting - ([#559](https://github.com/Python-roborock/python-roborock/pull/559), - [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) - -### Chores - -- Add some tests and adress comments - ([#559](https://github.com/Python-roborock/python-roborock/pull/559), - [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) - -- Fix comments ([#559](https://github.com/Python-roborock/python-roborock/pull/559), - [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) - -- Handle failed hello ([#559](https://github.com/Python-roborock/python-roborock/pull/559), - [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) - -- Remove unneeded code ([#559](https://github.com/Python-roborock/python-roborock/pull/559), - [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) - -- Switch to more specific exception - ([#559](https://github.com/Python-roborock/python-roborock/pull/559), - [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) - -- Update roborock/devices/local_channel.py - ([#559](https://github.com/Python-roborock/python-roborock/pull/559), - [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) - -### Features - -- Add l01 to the new device format - ([#559](https://github.com/Python-roborock/python-roborock/pull/559), - [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) - - -## v3.2.0 (2025-10-25) - -### Bug Fixes - -- Update redacted values to remove sensitive values - ([#560](https://github.com/Python-roborock/python-roborock/pull/560), - [`0fc7200`](https://github.com/Python-roborock/python-roborock/commit/0fc720034f9da988fe0ba981128b7d66c4998e60)) - -- Update shapshots ([#560](https://github.com/Python-roborock/python-roborock/pull/560), - [`0fc7200`](https://github.com/Python-roborock/python-roborock/commit/0fc720034f9da988fe0ba981128b7d66c4998e60)) - -### Chores - -- Cleanup lint ([#560](https://github.com/Python-roborock/python-roborock/pull/560), - [`0fc7200`](https://github.com/Python-roborock/python-roborock/commit/0fc720034f9da988fe0ba981128b7d66c4998e60)) - -- Only emit traits that have any values set - ([#560](https://github.com/Python-roborock/python-roborock/pull/560), - [`0fc7200`](https://github.com/Python-roborock/python-roborock/commit/0fc720034f9da988fe0ba981128b7d66c4998e60)) - -- Revert mqtt channel changes ([#560](https://github.com/Python-roborock/python-roborock/pull/560), - [`0fc7200`](https://github.com/Python-roborock/python-roborock/commit/0fc720034f9da988fe0ba981128b7d66c4998e60)) - -### Features - -- Add diagnostic information to the device - ([#560](https://github.com/Python-roborock/python-roborock/pull/560), - [`0fc7200`](https://github.com/Python-roborock/python-roborock/commit/0fc720034f9da988fe0ba981128b7d66c4998e60)) - - -## v3.1.2 (2025-10-25) - -### Bug Fixes - -- Move semantic release build command - ([`8ed178d`](https://github.com/Python-roborock/python-roborock/commit/8ed178d9f75245bde3ffcebbf8ef18e171ba563d)) - - -## v3.1.1 (2025-10-25) - -### Bug Fixes - -- Explicitly pip install uv in release - ([`4409ee9`](https://github.com/Python-roborock/python-roborock/commit/4409ee90694e9b3389342692f30fbf3706f2f00c)) - -### Chores - -- Add pre commit step for commitlint - ([#563](https://github.com/Python-roborock/python-roborock/pull/563), - [`14c811f`](https://github.com/Python-roborock/python-roborock/commit/14c811f30f0bb1f574be59e759aecab5ca61cd65)) - - -## v3.1.0 (2025-10-25) - -### Bug Fixes - -- Fix enum names to include `none` states - ([#561](https://github.com/Python-roborock/python-roborock/pull/561), - [`82f6dc2`](https://github.com/Python-roborock/python-roborock/commit/82f6dc29d55fd4f8565312af3cf60abf8abba56c)) - -### Chores - -- Add a temp main branch for testing - ([#562](https://github.com/Python-roborock/python-roborock/pull/562), - [`7592255`](https://github.com/Python-roborock/python-roborock/commit/75922550bad8f5fc4ece1f2f4a6be74ebb3849c2)) - -- Build system to make sure it doesn't break - ([#562](https://github.com/Python-roborock/python-roborock/pull/562), - [`7592255`](https://github.com/Python-roborock/python-roborock/commit/75922550bad8f5fc4ece1f2f4a6be74ebb3849c2)) - -- Fix branches ([#562](https://github.com/Python-roborock/python-roborock/pull/562), - [`7592255`](https://github.com/Python-roborock/python-roborock/commit/75922550bad8f5fc4ece1f2f4a6be74ebb3849c2)) - -- Fix changelog ([#552](https://github.com/Python-roborock/python-roborock/pull/552), - [`e2073ed`](https://github.com/Python-roborock/python-roborock/commit/e2073edc655c1a91caae5f05e1377aebfad2938e)) - -- Fix test release ([#562](https://github.com/Python-roborock/python-roborock/pull/562), - [`7592255`](https://github.com/Python-roborock/python-roborock/commit/75922550bad8f5fc4ece1f2f4a6be74ebb3849c2)) - -- Get uv release to work properly - ([#562](https://github.com/Python-roborock/python-roborock/pull/562), - [`7592255`](https://github.com/Python-roborock/python-roborock/commit/75922550bad8f5fc4ece1f2f4a6be74ebb3849c2)) - -- Switch dependabot from pip to uv - ([#554](https://github.com/Python-roborock/python-roborock/pull/554), - [`9377e9a`](https://github.com/Python-roborock/python-roborock/commit/9377e9ac305f45339b022b5ef8f0c16b58732300)) - -- Try running a test release on every PR - ([#562](https://github.com/Python-roborock/python-roborock/pull/562), - [`7592255`](https://github.com/Python-roborock/python-roborock/commit/75922550bad8f5fc4ece1f2f4a6be74ebb3849c2)) - -- Update snapshot ([#555](https://github.com/Python-roborock/python-roborock/pull/555), - [`b45ad3c`](https://github.com/Python-roborock/python-roborock/commit/b45ad3c487b21639a1f2ba148fe69836b11024c4)) - -- Update spelling from co-pilot suggestion - ([#555](https://github.com/Python-roborock/python-roborock/pull/555), - [`b45ad3c`](https://github.com/Python-roborock/python-roborock/commit/b45ad3c487b21639a1f2ba148fe69836b11024c4)) - -- Update test assertion for network info - ([#558](https://github.com/Python-roborock/python-roborock/pull/558), - [`b34abde`](https://github.com/Python-roborock/python-roborock/commit/b34abde2e3401c463e7fb821bae1cf20a325ec6d)) - -- **deps**: Bump ruff from 0.14.0 to 0.14.1 - ([#553](https://github.com/Python-roborock/python-roborock/pull/553), - [`df438f7`](https://github.com/Python-roborock/python-roborock/commit/df438f7a293fb0c1f1b3cfaf3691eafaa8a3fd8b)) - -### Features - -- Add a trait for reading NetworkInfo from the device - ([#558](https://github.com/Python-roborock/python-roborock/pull/558), - [`b34abde`](https://github.com/Python-roborock/python-roborock/commit/b34abde2e3401c463e7fb821bae1cf20a325ec6d)) - -- Combine the clean record trait with the clean summary - ([#555](https://github.com/Python-roborock/python-roborock/pull/555), - [`b45ad3c`](https://github.com/Python-roborock/python-roborock/commit/b45ad3c487b21639a1f2ba148fe69836b11024c4)) - - -## v3.0.0 (2025-10-20) - -### Features - -- Add data subpackage ([#551](https://github.com/Python-roborock/python-roborock/pull/551), - [`c4d3b86`](https://github.com/Python-roborock/python-roborock/commit/c4d3b86e9862847c0dd47add13e70542141ab214)) - - -## v2.61.0 (2025-10-19) - -### Bug Fixes - -- Remove DockSummary and make dust collection mode optional based on dock type - ([#550](https://github.com/Python-roborock/python-roborock/pull/550), - [`03d0f37`](https://github.com/Python-roborock/python-roborock/commit/03d0f37cfca41ed5943e81b6ac30e061d4f4bd3f)) - -### Chores - -- Fix semantic release using poetry - ([#549](https://github.com/Python-roborock/python-roborock/pull/549), - [`4bf5396`](https://github.com/Python-roborock/python-roborock/commit/4bf5396ac270e864ed433d96baf1c6c5d613106b)) - -### Features - -- Add clean record and dock related traits - ([#550](https://github.com/Python-roborock/python-roborock/pull/550), - [`03d0f37`](https://github.com/Python-roborock/python-roborock/commit/03d0f37cfca41ed5943e81b6ac30e061d4f4bd3f)) - -- Add dock summary and clean record traits - ([#550](https://github.com/Python-roborock/python-roborock/pull/550), - [`03d0f37`](https://github.com/Python-roborock/python-roborock/commit/03d0f37cfca41ed5943e81b6ac30e061d4f4bd3f)) - - -## v2.60.1 (2025-10-19) - -### Bug Fixes - -- Add a common base type for all switches - ([#548](https://github.com/Python-roborock/python-roborock/pull/548), - [`767e118`](https://github.com/Python-roborock/python-roborock/commit/767e118ed193cd16cecb61989614b50dab432aab)) - -### Chores - -- Fix lint ([#544](https://github.com/Python-roborock/python-roborock/pull/544), - [`fe463c3`](https://github.com/Python-roborock/python-roborock/commit/fe463c36d6862864d03b8040475d57e917c310ce)) - -- Update pydoc for V1 subscribe - ([#544](https://github.com/Python-roborock/python-roborock/pull/544), - [`fe463c3`](https://github.com/Python-roborock/python-roborock/commit/fe463c36d6862864d03b8040475d57e917c310ce)) - - -## v2.60.0 (2025-10-18) - -### Chores - -- Match pyproject version - ([`80f9149`](https://github.com/Python-roborock/python-roborock/commit/80f91498359e81c97d4e0666a9d85d52ee6f315a)) - -### Features - -- Add a device property to determine local connection status - ([#547](https://github.com/Python-roborock/python-roborock/pull/547), - [`962ffe2`](https://github.com/Python-roborock/python-roborock/commit/962ffe2b94da26a6879f1006cb585dcaac36c798)) - - -## v2.59.0 (2025-10-18) - -### Chores - -- Match version and do chore so it doesn't bump - ([#546](https://github.com/Python-roborock/python-roborock/pull/546), - [`140de50`](https://github.com/Python-roborock/python-roborock/commit/140de50bda73901ee43b864603cd42802de1570d)) - -- Match version and do chore so it doesn't bump hopefully - ([#546](https://github.com/Python-roborock/python-roborock/pull/546), - [`140de50`](https://github.com/Python-roborock/python-roborock/commit/140de50bda73901ee43b864603cd42802de1570d)) - -- Switch to the non-depreciated action - ([#546](https://github.com/Python-roborock/python-roborock/pull/546), - [`140de50`](https://github.com/Python-roborock/python-roborock/commit/140de50bda73901ee43b864603cd42802de1570d)) - -### Features - -- Update command trait to allow string commands - ([#543](https://github.com/Python-roborock/python-roborock/pull/543), - [`1fdddaf`](https://github.com/Python-roborock/python-roborock/commit/1fdddafc8b0ad490beff3f08c5118e826ab8169f)) - - -## v2.58.1 (2025-10-18) - -### Bug Fixes - -- Re-align version for semantic release - ([#545](https://github.com/Python-roborock/python-roborock/pull/545), - [`b724a5b`](https://github.com/Python-roborock/python-roborock/commit/b724a5bec52ce7fe723710f28f9f63c3b9fa6673)) - -### Chores - -- Re-align version ([#545](https://github.com/Python-roborock/python-roborock/pull/545), - [`b724a5b`](https://github.com/Python-roborock/python-roborock/commit/b724a5bec52ce7fe723710f28f9f63c3b9fa6673)) - -- Use github_token for release ([#545](https://github.com/Python-roborock/python-roborock/pull/545), - [`b724a5b`](https://github.com/Python-roborock/python-roborock/commit/b724a5bec52ce7fe723710f28f9f63c3b9fa6673)) - - -## v2.58.0 (2025-10-18) - -### Bug Fixes - -- Add everything else back ([#542](https://github.com/Python-roborock/python-roborock/pull/542), - [`84c4c48`](https://github.com/Python-roborock/python-roborock/commit/84c4c48fe1c6268db8ceb6dbe8f1ed3318ed78aa)) - -- Correctly run pdocs on github action - ([#542](https://github.com/Python-roborock/python-roborock/pull/542), - [`84c4c48`](https://github.com/Python-roborock/python-roborock/commit/84c4c48fe1c6268db8ceb6dbe8f1ed3318ed78aa)) - -### Features - -- Create a home data API client from an existing RoborockApiClient - ([#541](https://github.com/Python-roborock/python-roborock/pull/541), - [`e7f8e43`](https://github.com/Python-roborock/python-roborock/commit/e7f8e432cb063765f89223332b5994b0ddb639bc)) - - -## v2.57.1 (2025-10-18) - -### Bug Fixes - -- Bug and add test ([#537](https://github.com/Python-roborock/python-roborock/pull/537), - [`6a3d28c`](https://github.com/Python-roborock/python-roborock/commit/6a3d28c24f7444fc5e3cc73392509aca0d5ddd6e)) - -- Fallback to old version of login - ([#537](https://github.com/Python-roborock/python-roborock/pull/537), - [`6a3d28c`](https://github.com/Python-roborock/python-roborock/commit/6a3d28c24f7444fc5e3cc73392509aca0d5ddd6e)) - -### Chores - -- **deps-dev**: Bump ruff from 0.13.2 to 0.14.0 - ([#530](https://github.com/Python-roborock/python-roborock/pull/530), - [`538504d`](https://github.com/Python-roborock/python-roborock/commit/538504dbe66e5edb82a2bb7bfb78272752e0802f)) - - -## v2.57.0 (2025-10-18) - -### Chores - -- Fix lint ([#540](https://github.com/Python-roborock/python-roborock/pull/540), - [`24a0660`](https://github.com/Python-roborock/python-roborock/commit/24a06600633b16a0228876184125e3c5ffe16d02)) - -- Fix lint errors ([#539](https://github.com/Python-roborock/python-roborock/pull/539), - [`fbf1434`](https://github.com/Python-roborock/python-roborock/commit/fbf1434be05103401b2f53c77737a5bfcc719102)) - -- Fix syntax and lint errors ([#539](https://github.com/Python-roborock/python-roborock/pull/539), - [`fbf1434`](https://github.com/Python-roborock/python-roborock/commit/fbf1434be05103401b2f53c77737a5bfcc719102)) - -- Fix tests ([#539](https://github.com/Python-roborock/python-roborock/pull/539), - [`fbf1434`](https://github.com/Python-roborock/python-roborock/commit/fbf1434be05103401b2f53c77737a5bfcc719102)) - -### Features - -- Add a trait for sending commands - ([#539](https://github.com/Python-roborock/python-roborock/pull/539), - [`fbf1434`](https://github.com/Python-roborock/python-roborock/commit/fbf1434be05103401b2f53c77737a5bfcc719102)) - -- Expose device and product information on the new Device API - ([#540](https://github.com/Python-roborock/python-roborock/pull/540), - [`24a0660`](https://github.com/Python-roborock/python-roborock/commit/24a06600633b16a0228876184125e3c5ffe16d02)) - -- Update cli to use new command interface - ([#539](https://github.com/Python-roborock/python-roborock/pull/539), - [`fbf1434`](https://github.com/Python-roborock/python-roborock/commit/fbf1434be05103401b2f53c77737a5bfcc719102)) - - -## v2.56.0 (2025-10-17) - -### Bug Fixes - -- Revert changes to dnd ([#538](https://github.com/Python-roborock/python-roborock/pull/538), - [`aaf3636`](https://github.com/Python-roborock/python-roborock/commit/aaf3636553d68c31e89a763fb6da77d83842b6b8)) - -### Chores - -- Add comment about firmware updates - ([#538](https://github.com/Python-roborock/python-roborock/pull/538), - [`aaf3636`](https://github.com/Python-roborock/python-roborock/commit/aaf3636553d68c31e89a763fb6da77d83842b6b8)) - -- Add python 3.14 for tests ([#524](https://github.com/Python-roborock/python-roborock/pull/524), - [`a6f889d`](https://github.com/Python-roborock/python-roborock/commit/a6f889db0229d5821b04e70514ad5e7f8d5a25df)) - -- Explicitly install pdoc ([#531](https://github.com/Python-roborock/python-roborock/pull/531), - [`5e4c913`](https://github.com/Python-roborock/python-roborock/commit/5e4c9138838eace5c010aa736c61565930520172)) - -- Fix lint errors ([#538](https://github.com/Python-roborock/python-roborock/pull/538), - [`aaf3636`](https://github.com/Python-roborock/python-roborock/commit/aaf3636553d68c31e89a763fb6da77d83842b6b8)) - -- Fix typing on refresh ([#538](https://github.com/Python-roborock/python-roborock/pull/538), - [`aaf3636`](https://github.com/Python-roborock/python-roborock/commit/aaf3636553d68c31e89a763fb6da77d83842b6b8)) - -- Just install pdoc ([#535](https://github.com/Python-roborock/python-roborock/pull/535), - [`ef974cd`](https://github.com/Python-roborock/python-roborock/commit/ef974cd8fe5039aab55adea6d84375236c6a7072)) - -- Make roborock future test async - ([#524](https://github.com/Python-roborock/python-roborock/pull/524), - [`a6f889d`](https://github.com/Python-roborock/python-roborock/commit/a6f889db0229d5821b04e70514ad5e7f8d5a25df)) - -- Remove extra checkout ([#531](https://github.com/Python-roborock/python-roborock/pull/531), - [`5e4c913`](https://github.com/Python-roborock/python-roborock/commit/5e4c9138838eace5c010aa736c61565930520172)) - -- Remove use of decorator and replace with class attribute - ([#538](https://github.com/Python-roborock/python-roborock/pull/538), - [`aaf3636`](https://github.com/Python-roborock/python-roborock/commit/aaf3636553d68c31e89a763fb6da77d83842b6b8)) - -- Switch pages to use uv ([#531](https://github.com/Python-roborock/python-roborock/pull/531), - [`5e4c913`](https://github.com/Python-roborock/python-roborock/commit/5e4c9138838eace5c010aa736c61565930520172)) - -### Features - -- Add various optional features with support for checking device features - ([#538](https://github.com/Python-roborock/python-roborock/pull/538), - [`aaf3636`](https://github.com/Python-roborock/python-roborock/commit/aaf3636553d68c31e89a763fb6da77d83842b6b8)) - - -## v2.55.0 (2025-10-16) - -### Bug Fixes - -- Don't perform discovery when the device is cleaning - ([#526](https://github.com/Python-roborock/python-roborock/pull/526), - [`8ae82d1`](https://github.com/Python-roborock/python-roborock/commit/8ae82d1437ab60a09b828b399c69d56ced759b03)) - -- Require both country code and country - ([#533](https://github.com/Python-roborock/python-roborock/pull/533), - [`f827cbc`](https://github.com/Python-roborock/python-roborock/commit/f827cbccbb5b2204d614a95bf9ae82687c611325)) - -### Chores - -- Add common routine for updating the cache - ([#526](https://github.com/Python-roborock/python-roborock/pull/526), - [`8ae82d1`](https://github.com/Python-roborock/python-roborock/commit/8ae82d1437ab60a09b828b399c69d56ced759b03)) - -- Fix lint error found by ruff on type comparison - ([#528](https://github.com/Python-roborock/python-roborock/pull/528), - [`5a4a03b`](https://github.com/Python-roborock/python-roborock/commit/5a4a03b05db97d7ce02f16b17de61f88daa1ee3d)) - -- Fix lint errors ([#528](https://github.com/Python-roborock/python-roborock/pull/528), - [`5a4a03b`](https://github.com/Python-roborock/python-roborock/commit/5a4a03b05db97d7ce02f16b17de61f88daa1ee3d)) - -- Hook up the trait to the device and CLI - ([#526](https://github.com/Python-roborock/python-roborock/pull/526), - [`8ae82d1`](https://github.com/Python-roborock/python-roborock/commit/8ae82d1437ab60a09b828b399c69d56ced759b03)) - -- Migrate to uv ([#525](https://github.com/Python-roborock/python-roborock/pull/525), - [`ec78beb`](https://github.com/Python-roborock/python-roborock/commit/ec78beb57a088d75ac9400c15cc15994f9978852)) - -- Replace async-timeout with asyncio.timeout - ([#527](https://github.com/Python-roborock/python-roborock/pull/527), - [`f376027`](https://github.com/Python-roborock/python-roborock/commit/f376027f5933e163441cf1815b820056731a3632)) - -- Upgrade ruff and apply ruff-format to all files - ([#528](https://github.com/Python-roborock/python-roborock/pull/528), - [`5a4a03b`](https://github.com/Python-roborock/python-roborock/commit/5a4a03b05db97d7ce02f16b17de61f88daa1ee3d)) - -### Features - -- Add a Home trait that for caching information about maps and rooms - ([#526](https://github.com/Python-roborock/python-roborock/pull/526), - [`8ae82d1`](https://github.com/Python-roborock/python-roborock/commit/8ae82d1437ab60a09b828b399c69d56ced759b03)) - -- Add a trait for device features - ([#534](https://github.com/Python-roborock/python-roborock/pull/534), - [`8539fe4`](https://github.com/Python-roborock/python-roborock/commit/8539fe4b0ab72c388a55300a4724ca42bde83e38)) - - -## v2.54.0 (2025-10-10) - -### Features - -- Add some extra status attributes - ([#514](https://github.com/Python-roborock/python-roborock/pull/514), - [`660e929`](https://github.com/Python-roborock/python-roborock/commit/660e9290659b27fb32a9e6dd1b82f6c608b1949e)) - -- Add support for detecting issues with the dock holders - ([#514](https://github.com/Python-roborock/python-roborock/pull/514), - [`660e929`](https://github.com/Python-roborock/python-roborock/commit/660e9290659b27fb32a9e6dd1b82f6c608b1949e)) - -- Get the latest clean info ([#522](https://github.com/Python-roborock/python-roborock/pull/522), - [`3ac8f2d`](https://github.com/Python-roborock/python-roborock/commit/3ac8f2dd5490788dbe7f5ee74a1449eff42f802b)) - - -## v2.53.1 (2025-10-06) - -### Bug Fixes - -- Cli on windows ([#520](https://github.com/Python-roborock/python-roborock/pull/520), - [`4127db8`](https://github.com/Python-roborock/python-roborock/commit/4127db857e38db57ee5c84a27e7a6b64fdf40cbf)) - - -## v2.53.0 (2025-10-05) - -### Chores - -- Fix formatting ([#517](https://github.com/Python-roborock/python-roborock/pull/517), - [`e49b3ea`](https://github.com/Python-roborock/python-roborock/commit/e49b3ea1c2cc29a6c41562c3e937659ed9c0816a)) - -- Fix lint and typing errors ([#517](https://github.com/Python-roborock/python-roborock/pull/517), - [`e49b3ea`](https://github.com/Python-roborock/python-roborock/commit/e49b3ea1c2cc29a6c41562c3e937659ed9c0816a)) - -- Fix lint error ([#517](https://github.com/Python-roborock/python-roborock/pull/517), - [`e49b3ea`](https://github.com/Python-roborock/python-roborock/commit/e49b3ea1c2cc29a6c41562c3e937659ed9c0816a)) - -- Fix test wording ([#517](https://github.com/Python-roborock/python-roborock/pull/517), - [`e49b3ea`](https://github.com/Python-roborock/python-roborock/commit/e49b3ea1c2cc29a6c41562c3e937659ed9c0816a)) - -- Refactor to reuse the same payload functions - ([#517](https://github.com/Python-roborock/python-roborock/pull/517), - [`e49b3ea`](https://github.com/Python-roborock/python-roborock/commit/e49b3ea1c2cc29a6c41562c3e937659ed9c0816a)) - -- Remove duplicate code ([#517](https://github.com/Python-roborock/python-roborock/pull/517), - [`e49b3ea`](https://github.com/Python-roborock/python-roborock/commit/e49b3ea1c2cc29a6c41562c3e937659ed9c0816a)) - -### Features - -- Add a v1 device trait for map contents - ([#517](https://github.com/Python-roborock/python-roborock/pull/517), - [`e49b3ea`](https://github.com/Python-roborock/python-roborock/commit/e49b3ea1c2cc29a6c41562c3e937659ed9c0816a)) - - -## v2.52.0 (2025-10-05) - -### Bug Fixes - -- Fix room mapping parsing bug and add addtiional format samples - ([#516](https://github.com/Python-roborock/python-roborock/pull/516), - [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) - -- Update test ([#516](https://github.com/Python-roborock/python-roborock/pull/516), - [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) - -### Chores - -- Abort bad merges ([#516](https://github.com/Python-roborock/python-roborock/pull/516), - [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) - -- Add additional example room mapping - ([#516](https://github.com/Python-roborock/python-roborock/pull/516), - [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) - -- Adjust test case ([#519](https://github.com/Python-roborock/python-roborock/pull/519), - [`df6c674`](https://github.com/Python-roborock/python-roborock/commit/df6c6740431d75f06868979aed5e07bfa8887ed6)) - -- Fix lint errors ([#516](https://github.com/Python-roborock/python-roborock/pull/516), - [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) - -- Fix test warning ([#519](https://github.com/Python-roborock/python-roborock/pull/519), - [`df6c674`](https://github.com/Python-roborock/python-roborock/commit/df6c6740431d75f06868979aed5e07bfa8887ed6)) - -- Fix typing ([#516](https://github.com/Python-roborock/python-roborock/pull/516), - [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) - -- Switch the rooms trait back to the local API - ([#516](https://github.com/Python-roborock/python-roborock/pull/516), - [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) - -### Features - -- Add v1 rooms support to the device traits API - ([#516](https://github.com/Python-roborock/python-roborock/pull/516), - [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) - - -## v2.51.0 (2025-10-05) - -### Chores - -- Add a class comment about availability - ([#502](https://github.com/Python-roborock/python-roborock/pull/502), - [`6bc3458`](https://github.com/Python-roborock/python-roborock/commit/6bc3458f49fc1072798ce8bfbcdea0d512e19bfd)) - -- Remove whitespace ([#502](https://github.com/Python-roborock/python-roborock/pull/502), - [`6bc3458`](https://github.com/Python-roborock/python-roborock/commit/6bc3458f49fc1072798ce8bfbcdea0d512e19bfd)) - -### Features - -- Add support for getting and reseting consumables - ([#502](https://github.com/Python-roborock/python-roborock/pull/502), - [`6bc3458`](https://github.com/Python-roborock/python-roborock/commit/6bc3458f49fc1072798ce8bfbcdea0d512e19bfd)) - - -## v2.50.4 (2025-10-05) - -### Bug Fixes - -- Return in finally ([#518](https://github.com/Python-roborock/python-roborock/pull/518), - [`9d400d5`](https://github.com/Python-roborock/python-roborock/commit/9d400d5a20a09395f93c0370718c4589d8155814)) - -### Chores - -- **deps**: Bump actions/upload-pages-artifact from 3 to 4 - ([#505](https://github.com/Python-roborock/python-roborock/pull/505), - [`e505791`](https://github.com/Python-roborock/python-roborock/commit/e5057919c9d0d90c85f29df35a628a209508121c)) - -- **deps**: Bump click from 8.2.1 to 8.3.0 - ([#495](https://github.com/Python-roborock/python-roborock/pull/495), - [`9e12170`](https://github.com/Python-roborock/python-roborock/commit/9e121704267dea8c8bbac0e799dcfa8462bc7de7)) - -- **deps-dev**: Bump mypy from 1.18.1 to 1.18.2 - ([#496](https://github.com/Python-roborock/python-roborock/pull/496), - [`31cbf41`](https://github.com/Python-roborock/python-roborock/commit/31cbf41caf1485dcebe5c6590d634e36392c6b3b)) - -- **deps-dev**: Bump ruff from 0.13.0 to 0.13.2 - ([#509](https://github.com/Python-roborock/python-roborock/pull/509), - [`3ba07ad`](https://github.com/Python-roborock/python-roborock/commit/3ba07ad572aa28735828c78dd339308e3cb0340d)) - - -## v2.50.3 (2025-10-03) - -### Bug Fixes - -- Update containers that __post_init__ to use properties - ([#503](https://github.com/Python-roborock/python-roborock/pull/503), - [`f87f55c`](https://github.com/Python-roborock/python-roborock/commit/f87f55ce2d62f90dd945a283def927b9fca70dab)) - -### Chores - -- Fix lint errors ([#503](https://github.com/Python-roborock/python-roborock/pull/503), - [`f87f55c`](https://github.com/Python-roborock/python-roborock/commit/f87f55ce2d62f90dd945a283def927b9fca70dab)) - -- Fix typo ([#503](https://github.com/Python-roborock/python-roborock/pull/503), - [`f87f55c`](https://github.com/Python-roborock/python-roborock/commit/f87f55ce2d62f90dd945a283def927b9fca70dab)) - -- Include atributes in repr computation - ([#503](https://github.com/Python-roborock/python-roborock/pull/503), - [`f87f55c`](https://github.com/Python-roborock/python-roborock/commit/f87f55ce2d62f90dd945a283def927b9fca70dab)) - -- Update to get all properties at runtime - ([#503](https://github.com/Python-roborock/python-roborock/pull/503), - [`f87f55c`](https://github.com/Python-roborock/python-roborock/commit/f87f55ce2d62f90dd945a283def927b9fca70dab)) - - -## v2.50.2 (2025-10-03) - -### Bug Fixes - -- Cycle through iot urls ([#490](https://github.com/Python-roborock/python-roborock/pull/490), - [`2cee9dd`](https://github.com/Python-roborock/python-roborock/commit/2cee9ddcfb2c608967499405992c6e42f6124855)) - -### Chores - -- Add tests ([#490](https://github.com/Python-roborock/python-roborock/pull/490), - [`2cee9dd`](https://github.com/Python-roborock/python-roborock/commit/2cee9ddcfb2c608967499405992c6e42f6124855)) - -- Convert to store all iot login info together - ([#490](https://github.com/Python-roborock/python-roborock/pull/490), - [`2cee9dd`](https://github.com/Python-roborock/python-roborock/commit/2cee9ddcfb2c608967499405992c6e42f6124855)) - -- Remove gemini ([#512](https://github.com/Python-roborock/python-roborock/pull/512), - [`632f0f4`](https://github.com/Python-roborock/python-roborock/commit/632f0f4031fe38c621a50e4bf6a7d2097f560aa9)) - - -## v2.50.1 (2025-10-03) - -### Bug Fixes - -- Use correct replace times ([#513](https://github.com/Python-roborock/python-roborock/pull/513), - [`a6ac92c`](https://github.com/Python-roborock/python-roborock/commit/a6ac92c5443833fe19a1d184495171904e04cbe2)) - - -## v2.50.0 (2025-10-03) - -### Bug Fixes - -- Add a decorator to mark traits as mqtt only - ([#499](https://github.com/Python-roborock/python-roborock/pull/499), - [`87d9aa6`](https://github.com/Python-roborock/python-roborock/commit/87d9aa61676e11fd0ca56f5fc6c998fbff48645b)) - -### Chores - -- Add additional test coverage ([#499](https://github.com/Python-roborock/python-roborock/pull/499), - [`87d9aa6`](https://github.com/Python-roborock/python-roborock/commit/87d9aa61676e11fd0ca56f5fc6c998fbff48645b)) - -- Add comment describing the decorator check - ([#499](https://github.com/Python-roborock/python-roborock/pull/499), - [`87d9aa6`](https://github.com/Python-roborock/python-roborock/commit/87d9aa61676e11fd0ca56f5fc6c998fbff48645b)) - -- Fix lint errors ([#499](https://github.com/Python-roborock/python-roborock/pull/499), - [`87d9aa6`](https://github.com/Python-roborock/python-roborock/commit/87d9aa61676e11fd0ca56f5fc6c998fbff48645b)) - -### Features - -- Add v1 api support for the list of maps - ([#499](https://github.com/Python-roborock/python-roborock/pull/499), - [`87d9aa6`](https://github.com/Python-roborock/python-roborock/commit/87d9aa61676e11fd0ca56f5fc6c998fbff48645b)) - - -## v2.49.1 (2025-09-29) - -### Bug Fixes - -- Broken current map logic ([#497](https://github.com/Python-roborock/python-roborock/pull/497), - [`d7d0a3b`](https://github.com/Python-roborock/python-roborock/commit/d7d0a3b5f4066aab54be5736e01eb2b437c920de)) - -- The map id ([#497](https://github.com/Python-roborock/python-roborock/pull/497), - [`d7d0a3b`](https://github.com/Python-roborock/python-roborock/commit/d7d0a3b5f4066aab54be5736e01eb2b437c920de)) - -### Chores - -- Add no_map constant ([#497](https://github.com/Python-roborock/python-roborock/pull/497), - [`d7d0a3b`](https://github.com/Python-roborock/python-roborock/commit/d7d0a3b5f4066aab54be5736e01eb2b437c920de)) - -- Add test ([#497](https://github.com/Python-roborock/python-roborock/pull/497), - [`d7d0a3b`](https://github.com/Python-roborock/python-roborock/commit/d7d0a3b5f4066aab54be5736e01eb2b437c920de)) - -- Try `poetry run pdoc` to fix CI - ([#504](https://github.com/Python-roborock/python-roborock/pull/504), - [`da5d80f`](https://github.com/Python-roborock/python-roborock/commit/da5d80fb5c9e425317c3ade3065b2158af0a830f)) - - -## v2.49.0 (2025-09-29) - -### Bug Fixes - -- Remove functon ([#448](https://github.com/Python-roborock/python-roborock/pull/448), - [`27fb9fc`](https://github.com/Python-roborock/python-roborock/commit/27fb9fc00c9c16235a983db0df4cc0d2cfb5f7b3)) - -- Tchange name of cleanmodesold - ([#448](https://github.com/Python-roborock/python-roborock/pull/448), - [`27fb9fc`](https://github.com/Python-roborock/python-roborock/commit/27fb9fc00c9c16235a983db0df4cc0d2cfb5f7b3)) - -### Chores - -- Cap product feature map ([#448](https://github.com/Python-roborock/python-roborock/pull/448), - [`27fb9fc`](https://github.com/Python-roborock/python-roborock/commit/27fb9fc00c9c16235a983db0df4cc0d2cfb5f7b3)) - -- Fix lint ([#500](https://github.com/Python-roborock/python-roborock/pull/500), - [`d5bb862`](https://github.com/Python-roborock/python-roborock/commit/d5bb8625ba6eb46a13b79df78a02f7e5e25cfd9f)) - -- Remove more complicated changes - ([#448](https://github.com/Python-roborock/python-roborock/pull/448), - [`27fb9fc`](https://github.com/Python-roborock/python-roborock/commit/27fb9fc00c9c16235a983db0df4cc0d2cfb5f7b3)) - -### Features - -- Add dynamic clean modes ([#448](https://github.com/Python-roborock/python-roborock/pull/448), - [`27fb9fc`](https://github.com/Python-roborock/python-roborock/commit/27fb9fc00c9c16235a983db0df4cc0d2cfb5f7b3)) - -- Add module for parsing map content - ([#500](https://github.com/Python-roborock/python-roborock/pull/500), - [`d5bb862`](https://github.com/Python-roborock/python-roborock/commit/d5bb8625ba6eb46a13b79df78a02f7e5e25cfd9f)) - -- Improve dynamic clean ([#448](https://github.com/Python-roborock/python-roborock/pull/448), - [`27fb9fc`](https://github.com/Python-roborock/python-roborock/commit/27fb9fc00c9c16235a983db0df4cc0d2cfb5f7b3)) - -- Improve dynamic clean modes ([#448](https://github.com/Python-roborock/python-roborock/pull/448), - [`27fb9fc`](https://github.com/Python-roborock/python-roborock/commit/27fb9fc00c9c16235a983db0df4cc0d2cfb5f7b3)) - - -## v2.48.0 (2025-09-29) - -### Chores - -- Add gemini default ci actions - ([#493](https://github.com/Python-roborock/python-roborock/pull/493), - [`20e3c3d`](https://github.com/Python-roborock/python-roborock/commit/20e3c3da8100dd5e7b4a0b6418b41bb40a2efc36)) - -- Add imports for public APIs ([#501](https://github.com/Python-roborock/python-roborock/pull/501), - [`21c83c0`](https://github.com/Python-roborock/python-roborock/commit/21c83c06116ef0c36dc7069cb2a3b822406de866)) - -### Features - -- Add pdoc for leveraging python docstrings for documentation - ([#501](https://github.com/Python-roborock/python-roborock/pull/501), - [`21c83c0`](https://github.com/Python-roborock/python-roborock/commit/21c83c06116ef0c36dc7069cb2a3b822406de866)) - - -## v2.47.1 (2025-09-22) - -### Bug Fixes - -- Improve new v1 apis to use mqtt lazily and work entirely locally - ([#491](https://github.com/Python-roborock/python-roborock/pull/491), - [`d0212e5`](https://github.com/Python-roborock/python-roborock/commit/d0212e58b032de2cce7c99691bdcec49ac8dfce2)) - -### Chores - -- Extract caching logic to one place - ([#491](https://github.com/Python-roborock/python-roborock/pull/491), - [`d0212e5`](https://github.com/Python-roborock/python-roborock/commit/d0212e58b032de2cce7c99691bdcec49ac8dfce2)) - -- Remove unnecessary logging ([#491](https://github.com/Python-roborock/python-roborock/pull/491), - [`d0212e5`](https://github.com/Python-roborock/python-roborock/commit/d0212e58b032de2cce7c99691bdcec49ac8dfce2)) - -- Remove whitespace ([#491](https://github.com/Python-roborock/python-roborock/pull/491), - [`d0212e5`](https://github.com/Python-roborock/python-roborock/commit/d0212e58b032de2cce7c99691bdcec49ac8dfce2)) - -- Update comments ([#491](https://github.com/Python-roborock/python-roborock/pull/491), - [`d0212e5`](https://github.com/Python-roborock/python-roborock/commit/d0212e58b032de2cce7c99691bdcec49ac8dfce2)) - - -## v2.47.0 (2025-09-21) - -### Bug Fixes - -- Add version to ping ([#487](https://github.com/Python-roborock/python-roborock/pull/487), - [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) - -- Bug fixes for 1.0 ([#487](https://github.com/Python-roborock/python-roborock/pull/487), - [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) - -- Make sure we are connected on message send - ([#487](https://github.com/Python-roborock/python-roborock/pull/487), - [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) - -- Potentially fix ping? ([#487](https://github.com/Python-roborock/python-roborock/pull/487), - [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) - -- Remove excluding ping from id check - ([#487](https://github.com/Python-roborock/python-roborock/pull/487), - [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) - -- Some misc bug changes ([#487](https://github.com/Python-roborock/python-roborock/pull/487), - [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) - -- Some small changes ([#487](https://github.com/Python-roborock/python-roborock/pull/487), - [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) - -### Chores - -- Add comment about rpc channel hacks and separate property files - ([#489](https://github.com/Python-roborock/python-roborock/pull/489), - [`362ec1d`](https://github.com/Python-roborock/python-roborock/commit/362ec1d3360e56cc4b98151b9c001bcdad64ffd2)) - -- Fix return types in CleanSummaryTrait - ([#489](https://github.com/Python-roborock/python-roborock/pull/489), - [`362ec1d`](https://github.com/Python-roborock/python-roborock/commit/362ec1d3360e56cc4b98151b9c001bcdad64ffd2)) - -- Init try based on Homey logic - ([#487](https://github.com/Python-roborock/python-roborock/pull/487), - [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) - -- Only allow a single trait ([#489](https://github.com/Python-roborock/python-roborock/pull/489), - [`362ec1d`](https://github.com/Python-roborock/python-roborock/commit/362ec1d3360e56cc4b98151b9c001bcdad64ffd2)) - -- Overhaul new device trait interfaces - ([#489](https://github.com/Python-roborock/python-roborock/pull/489), - [`362ec1d`](https://github.com/Python-roborock/python-roborock/commit/362ec1d3360e56cc4b98151b9c001bcdad64ffd2)) - -- Remove debug ([#487](https://github.com/Python-roborock/python-roborock/pull/487), - [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) - -- Remove unnecessarily local variables - ([#489](https://github.com/Python-roborock/python-roborock/pull/489), - [`362ec1d`](https://github.com/Python-roborock/python-roborock/commit/362ec1d3360e56cc4b98151b9c001bcdad64ffd2)) - -- Rename b01 properties to match v1 - ([#489](https://github.com/Python-roborock/python-roborock/pull/489), - [`362ec1d`](https://github.com/Python-roborock/python-roborock/commit/362ec1d3360e56cc4b98151b9c001bcdad64ffd2)) - -- Set sign_key to private ([#488](https://github.com/Python-roborock/python-roborock/pull/488), - [`ed46bce`](https://github.com/Python-roborock/python-roborock/commit/ed46bce0db7201c0416cdf6076b3403f5b1fad5e)) - -- Some potential clean up ([#487](https://github.com/Python-roborock/python-roborock/pull/487), - [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) - -### Features - -- Implement L01 protocol ([#487](https://github.com/Python-roborock/python-roborock/pull/487), - [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) - -- Update CLI with new properties - ([#489](https://github.com/Python-roborock/python-roborock/pull/489), - [`362ec1d`](https://github.com/Python-roborock/python-roborock/commit/362ec1d3360e56cc4b98151b9c001bcdad64ffd2)) - - -## v2.46.0 (2025-09-21) - -### Bug Fixes - -- Address some comments ([#460](https://github.com/Python-roborock/python-roborock/pull/460), - [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) - -- Handle auth expiring ([#460](https://github.com/Python-roborock/python-roborock/pull/460), - [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) - -- Mqtt error handling ([#460](https://github.com/Python-roborock/python-roborock/pull/460), - [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) - -- Str some other rcs ([#460](https://github.com/Python-roborock/python-roborock/pull/460), - [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) - -### Chores - -- Add else back ([#460](https://github.com/Python-roborock/python-roborock/pull/460), - [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) - -- Clean up ([#460](https://github.com/Python-roborock/python-roborock/pull/460), - [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) - -- Inverse boolean logic to match variable naming - ([#460](https://github.com/Python-roborock/python-roborock/pull/460), - [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) - -- Remove extra exception ([#460](https://github.com/Python-roborock/python-roborock/pull/460), - [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) - -### Features - -- Add seperate validate connection for the cloud api and bump keepalive - ([#460](https://github.com/Python-roborock/python-roborock/pull/460), - [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) - - -## v2.45.0 (2025-09-21) - -### Chores - -- Add tests ([#486](https://github.com/Python-roborock/python-roborock/pull/486), - [`1eebd29`](https://github.com/Python-roborock/python-roborock/commit/1eebd29231534d187699dfaaa7d6f5721a31b5c8)) - -- **deps**: Bump python-semantic-release/python-semantic-release - ([#479](https://github.com/Python-roborock/python-roborock/pull/479), - [`68f52ab`](https://github.com/Python-roborock/python-roborock/commit/68f52ab40f782766a73df7640df2b0a92f7d360f)) - -- **deps-dev**: Bump mypy from 1.17.1 to 1.18.1 - ([#478](https://github.com/Python-roborock/python-roborock/pull/478), - [`efe460b`](https://github.com/Python-roborock/python-roborock/commit/efe460b2f8150fa34e33129854f6c2abb7ae1c4c)) - -- **deps-dev**: Bump pytest from 8.4.1 to 8.4.2 - ([#466](https://github.com/Python-roborock/python-roborock/pull/466), - [`efa2922`](https://github.com/Python-roborock/python-roborock/commit/efa2922cb76e9716ff2ed0bd9edd92fbbcac36ce)) - -### Features - -- Add v4 for code login ([#486](https://github.com/Python-roborock/python-roborock/pull/486), - [`1eebd29`](https://github.com/Python-roborock/python-roborock/commit/1eebd29231534d187699dfaaa7d6f5721a31b5c8)) - - -## v2.44.1 (2025-09-18) - -### Bug Fixes - -- Pass through additional fields to the home data fetcher - ([#484](https://github.com/Python-roborock/python-roborock/pull/484), - [`6fd180a`](https://github.com/Python-roborock/python-roborock/commit/6fd180a3277fe7d92f44e6af6575edeb6a682a45)) - -### Chores - -- Add test coverage of end to end trait parsin from raw responses - ([#482](https://github.com/Python-roborock/python-roborock/pull/482), - [`0fac328`](https://github.com/Python-roborock/python-roborock/commit/0fac32824bb7edc71171a6ad6e44c61a298a9d11)) - -- Add test coverage of end to end trait parsing from raw responses - ([#482](https://github.com/Python-roborock/python-roborock/pull/482), - [`0fac328`](https://github.com/Python-roborock/python-roborock/commit/0fac32824bb7edc71171a6ad6e44c61a298a9d11)) - -- Fix lint errors ([#482](https://github.com/Python-roborock/python-roborock/pull/482), - [`0fac328`](https://github.com/Python-roborock/python-roborock/commit/0fac32824bb7edc71171a6ad6e44c61a298a9d11)) - - -## v2.44.0 (2025-09-15) - -### Chores - -- Fix imports ([#477](https://github.com/Python-roborock/python-roborock/pull/477), - [`a391c17`](https://github.com/Python-roborock/python-roborock/commit/a391c1765e4b62004a290e1f63d46f7e722d4c49)) - -- Remove duplicate api_error from bad merge - ([#477](https://github.com/Python-roborock/python-roborock/pull/477), - [`a391c17`](https://github.com/Python-roborock/python-roborock/commit/a391c1765e4b62004a290e1f63d46f7e722d4c49)) - -- **deps-dev**: Bump pytest-asyncio from 1.1.0 to 1.2.0 - ([#480](https://github.com/Python-roborock/python-roborock/pull/480), - [`772a829`](https://github.com/Python-roborock/python-roborock/commit/772a829f115138f9e99e26d3fb6950b743b1e8fe)) - -- **deps-dev**: Bump ruff from 0.12.9 to 0.13.0 - ([#481](https://github.com/Python-roborock/python-roborock/pull/481), - [`c56252e`](https://github.com/Python-roborock/python-roborock/commit/c56252eb3882b4a1b4b3bc517206e34f5dcd4657)) - -### Features - -- Add a sound volume trait ([#477](https://github.com/Python-roborock/python-roborock/pull/477), - [`a391c17`](https://github.com/Python-roborock/python-roborock/commit/a391c1765e4b62004a290e1f63d46f7e722d4c49)) - -- Add volume trait ([#477](https://github.com/Python-roborock/python-roborock/pull/477), - [`a391c17`](https://github.com/Python-roborock/python-roborock/commit/a391c1765e4b62004a290e1f63d46f7e722d4c49)) - - -## v2.43.0 (2025-09-15) - -### Features - -- Add a clean summary trait ([#476](https://github.com/Python-roborock/python-roborock/pull/476), - [`1585e1c`](https://github.com/Python-roborock/python-roborock/commit/1585e1ccd8cda8008a701e4289f4b2e3febb84f5)) - - -## v2.42.0 (2025-09-14) - -### Chores - -- **deps**: Bump actions/setup-python from 5 to 6 - ([#465](https://github.com/Python-roborock/python-roborock/pull/465), - [`7333643`](https://github.com/Python-roborock/python-roborock/commit/7333643417b57890a6fd18bc63929c2c48f45dbe)) - -- **deps**: Bump pypa/gh-action-pypi-publish from 1.12.4 to 1.13.0 - ([#463](https://github.com/Python-roborock/python-roborock/pull/463), - [`ff44b2d`](https://github.com/Python-roborock/python-roborock/commit/ff44b2d1a2d5f70ed7b1ac10abe8295f39376180)) - -### Features - -- Add ability to encrypt and decrypt L01 - ([#468](https://github.com/Python-roborock/python-roborock/pull/468), - [`50aef42`](https://github.com/Python-roborock/python-roborock/commit/50aef42fa130f696fe367b3696547865bc7a690a)) - -- Add session to CLI ([#473](https://github.com/Python-roborock/python-roborock/pull/473), - [`d58072e`](https://github.com/Python-roborock/python-roborock/commit/d58072eb12be15d5e1fcbd171e5434897497544c)) - - -## v2.41.1 (2025-09-14) - -### Bug Fixes - -- Fix a bug with local / mqtt fallback - ([#475](https://github.com/Python-roborock/python-roborock/pull/475), - [`9f97a2b`](https://github.com/Python-roborock/python-roborock/commit/9f97a2bcf5189f515e9cd07629b65be7762c19ff)) - - -## v2.41.0 (2025-09-14) - -### Bug Fixes - -- Fix bug parsing MultiMapsListMapInfo - ([#474](https://github.com/Python-roborock/python-roborock/pull/474), - [`d79ea3b`](https://github.com/Python-roborock/python-roborock/commit/d79ea3b76d9e1fedbb5fecd7edd21fcf07b29b80)) - -### Chores - -- Revert changes to rpc channel - ([#471](https://github.com/Python-roborock/python-roborock/pull/471), - [`cce1c1b`](https://github.com/Python-roborock/python-roborock/commit/cce1c1b0a5db4a02be949a310ccd4356126bc229)) - -- Simplify command sending ([#471](https://github.com/Python-roborock/python-roborock/pull/471), - [`cce1c1b`](https://github.com/Python-roborock/python-roborock/commit/cce1c1b0a5db4a02be949a310ccd4356126bc229)) - -### Features - -- Add a DnD trait and fix bugs in the rpc channels - ([#471](https://github.com/Python-roborock/python-roborock/pull/471), - [`cce1c1b`](https://github.com/Python-roborock/python-roborock/commit/cce1c1b0a5db4a02be949a310ccd4356126bc229)) - - -## v2.40.1 (2025-09-13) - -### Bug Fixes - -- Bug where the map requested from the app confuses our system - ([#469](https://github.com/Python-roborock/python-roborock/pull/469), - [`4ddfce0`](https://github.com/Python-roborock/python-roborock/commit/4ddfce0e0abcc21b97285aa7a5e585d5076c4f30)) - - -## v2.40.0 (2025-09-07) - -### Bug Fixes - -- Missing code ([#462](https://github.com/Python-roborock/python-roborock/pull/462), - [`99dd479`](https://github.com/Python-roborock/python-roborock/commit/99dd479029758186d5ad6efcc7420c18b1690dde)) - -- Wrong package ([#462](https://github.com/Python-roborock/python-roborock/pull/462), - [`99dd479`](https://github.com/Python-roborock/python-roborock/commit/99dd479029758186d5ad6efcc7420c18b1690dde)) - -### Features - -- Add l01 discovery ([#462](https://github.com/Python-roborock/python-roborock/pull/462), - [`99dd479`](https://github.com/Python-roborock/python-roborock/commit/99dd479029758186d5ad6efcc7420c18b1690dde)) - - -## v2.39.2 (2025-09-07) - -### Bug Fixes - -- Remove __del__ ([#459](https://github.com/Python-roborock/python-roborock/pull/459), - [`62f19ca`](https://github.com/Python-roborock/python-roborock/commit/62f19ca37ee84a817e1e5444619b1bd1031d6626)) - -### Chores - -- Move broadcast_protocol to its own file - ([#459](https://github.com/Python-roborock/python-roborock/pull/459), - [`62f19ca`](https://github.com/Python-roborock/python-roborock/commit/62f19ca37ee84a817e1e5444619b1bd1031d6626)) - -- Move broadcast_protocol to t's own file - ([#459](https://github.com/Python-roborock/python-roborock/pull/459), - [`62f19ca`](https://github.com/Python-roborock/python-roborock/commit/62f19ca37ee84a817e1e5444619b1bd1031d6626)) - - -## v2.39.1 (2025-09-07) - -### Bug Fixes - -- Add missing finish reason ([#461](https://github.com/Python-roborock/python-roborock/pull/461), - [`4d9ba70`](https://github.com/Python-roborock/python-roborock/commit/4d9ba70a9b18d56abd8583ae4f8c6ca33b833e2c)) - -### Chores - -- Add snapshot tests for parsing device wire formats - ([#457](https://github.com/Python-roborock/python-roborock/pull/457), - [`d966b84`](https://github.com/Python-roborock/python-roborock/commit/d966b845d5c73ab6a15128e65785ee1306c8986b)) - -- Sort imports ([#457](https://github.com/Python-roborock/python-roborock/pull/457), - [`d966b84`](https://github.com/Python-roborock/python-roborock/commit/d966b845d5c73ab6a15128e65785ee1306c8986b)) - - -## v2.39.0 (2025-08-24) - -### Bug Fixes - -- Add more containers information - ([#449](https://github.com/Python-roborock/python-roborock/pull/449), - [`5ef1cd8`](https://github.com/Python-roborock/python-roborock/commit/5ef1cd833ea027b1dcd02b66694b37e404a63dc1)) - -- Get RoborockBase working for other files - ([#449](https://github.com/Python-roborock/python-roborock/pull/449), - [`5ef1cd8`](https://github.com/Python-roborock/python-roborock/commit/5ef1cd833ea027b1dcd02b66694b37e404a63dc1)) - -- Make code dynamic ([#449](https://github.com/Python-roborock/python-roborock/pull/449), - [`5ef1cd8`](https://github.com/Python-roborock/python-roborock/commit/5ef1cd833ea027b1dcd02b66694b37e404a63dc1)) - -- Version check ([#449](https://github.com/Python-roborock/python-roborock/pull/449), - [`5ef1cd8`](https://github.com/Python-roborock/python-roborock/commit/5ef1cd833ea027b1dcd02b66694b37e404a63dc1)) - -### Chores - -- Fix style and comments ([#456](https://github.com/Python-roborock/python-roborock/pull/456), - [`57d82e2`](https://github.com/Python-roborock/python-roborock/commit/57d82e2485fcf1cf63bd651427dd56b17f8cb694)) - -- Move imports ([#449](https://github.com/Python-roborock/python-roborock/pull/449), - [`5ef1cd8`](https://github.com/Python-roborock/python-roborock/commit/5ef1cd833ea027b1dcd02b66694b37e404a63dc1)) - -- Remove registry ([#449](https://github.com/Python-roborock/python-roborock/pull/449), - [`5ef1cd8`](https://github.com/Python-roborock/python-roborock/commit/5ef1cd833ea027b1dcd02b66694b37e404a63dc1)) - -- Unify callback handling recipes across mqtt and local channels - ([#456](https://github.com/Python-roborock/python-roborock/pull/456), - [`57d82e2`](https://github.com/Python-roborock/python-roborock/commit/57d82e2485fcf1cf63bd651427dd56b17f8cb694)) - -### Features - -- Improve B01 support ([#449](https://github.com/Python-roborock/python-roborock/pull/449), - [`5ef1cd8`](https://github.com/Python-roborock/python-roborock/commit/5ef1cd833ea027b1dcd02b66694b37e404a63dc1)) - - -## v2.38.0 (2025-08-21) - -### Bug Fixes - -- Change to store info in a yaml file - ([#428](https://github.com/Python-roborock/python-roborock/pull/428), - [`41d5433`](https://github.com/Python-roborock/python-roborock/commit/41d543362c8163d565feffd2fd48425480159087)) - -### Chores - -- Fix lint errors from merge ([#428](https://github.com/Python-roborock/python-roborock/pull/428), - [`41d5433`](https://github.com/Python-roborock/python-roborock/commit/41d543362c8163d565feffd2fd48425480159087)) - -- Update doc ([#428](https://github.com/Python-roborock/python-roborock/pull/428), - [`41d5433`](https://github.com/Python-roborock/python-roborock/commit/41d543362c8163d565feffd2fd48425480159087)) - -- **deps**: Bump actions/checkout from 4 to 5 - ([#454](https://github.com/Python-roborock/python-roborock/pull/454), - [`2020f33`](https://github.com/Python-roborock/python-roborock/commit/2020f3386a8d69f94a01d433220b3081b661c86e)) - -- **deps-dev**: Bump ruff from 0.12.8 to 0.12.9 - ([#455](https://github.com/Python-roborock/python-roborock/pull/455), - [`aec476c`](https://github.com/Python-roborock/python-roborock/commit/aec476c1c9b09e04f788a9825ed0ec590a205c30)) - -### Features - -- Add the ability to update supported_features via cli - ([#428](https://github.com/Python-roborock/python-roborock/pull/428), - [`41d5433`](https://github.com/Python-roborock/python-roborock/commit/41d543362c8163d565feffd2fd48425480159087)) - - -## v2.37.0 (2025-08-19) - -### Bug Fixes - -- Remove query_values response ([#453](https://github.com/Python-roborock/python-roborock/pull/453), - [`0004721`](https://github.com/Python-roborock/python-roborock/commit/0004721d5264a13261d8485dd487de512d7c310e)) - -- Update mqtt channel to correctly handle multiple subscribers - ([#453](https://github.com/Python-roborock/python-roborock/pull/453), - [`0004721`](https://github.com/Python-roborock/python-roborock/commit/0004721d5264a13261d8485dd487de512d7c310e)) - -### Chores - -- Remove dependencies on `get_request_id` in RequestMessage - ([#452](https://github.com/Python-roborock/python-roborock/pull/452), - [`f4dcea5`](https://github.com/Python-roborock/python-roborock/commit/f4dcea542477b1208591c2d316048d86080c48af)) - -- Remove pending rpcs object ([#453](https://github.com/Python-roborock/python-roborock/pull/453), - [`0004721`](https://github.com/Python-roborock/python-roborock/commit/0004721d5264a13261d8485dd487de512d7c310e)) - -- Remove unnecessary whitespace - ([#453](https://github.com/Python-roborock/python-roborock/pull/453), - [`0004721`](https://github.com/Python-roborock/python-roborock/commit/0004721d5264a13261d8485dd487de512d7c310e)) - -- Update logging and comments ([#453](https://github.com/Python-roborock/python-roborock/pull/453), - [`0004721`](https://github.com/Python-roborock/python-roborock/commit/0004721d5264a13261d8485dd487de512d7c310e)) - -- **deps**: Bump aiohttp from 3.12.13 to 3.12.15 - ([#446](https://github.com/Python-roborock/python-roborock/pull/446), - [`b6bcb2a`](https://github.com/Python-roborock/python-roborock/commit/b6bcb2ab2cdebb07b540a573299520675257a1c9)) - -- **deps**: Bump pyrate-limiter from 3.7.0 to 3.9.0 - ([#445](https://github.com/Python-roborock/python-roborock/pull/445), - [`8ac85da`](https://github.com/Python-roborock/python-roborock/commit/8ac85da5ecdbda5ef374b0cc492e505041cf8f4e)) - -- **deps-dev**: Bump freezegun from 1.5.4 to 1.5.5 - ([#444](https://github.com/Python-roborock/python-roborock/pull/444), - [`e62168a`](https://github.com/Python-roborock/python-roborock/commit/e62168af067501fae2f853fb5924f787470fdd69)) - -- **deps-dev**: Bump mypy from 1.15.0 to 1.17.1 - ([#443](https://github.com/Python-roborock/python-roborock/pull/443), - [`241b166`](https://github.com/Python-roborock/python-roborock/commit/241b1661063083b2685c420a8d931325106b341d)) - -### Features - -- Fix a01 and b01 response handling in new api - ([#453](https://github.com/Python-roborock/python-roborock/pull/453), - [`0004721`](https://github.com/Python-roborock/python-roborock/commit/0004721d5264a13261d8485dd487de512d7c310e)) - - -## v2.36.0 (2025-08-18) - -### Chores - -- Extract common module for manaing pending RPCs - ([#451](https://github.com/Python-roborock/python-roborock/pull/451), - [`d8ce60f`](https://github.com/Python-roborock/python-roborock/commit/d8ce60fe985f152c9f3485cbc12f8c04aaf041b1)) - -- Extract map parser into a separate function to share with new api - ([#440](https://github.com/Python-roborock/python-roborock/pull/440), - [`2a800c2`](https://github.com/Python-roborock/python-roborock/commit/2a800c2943bf0bb6389349798d26dab65411ae40)) - -- Remove docstrings ([#450](https://github.com/Python-roborock/python-roborock/pull/450), - [`1addf95`](https://github.com/Python-roborock/python-roborock/commit/1addf95d5502dde8900bb4bceca418eaad179733)) - -- **deps-dev**: Bump pre-commit from 4.2.0 to 4.3.0 - ([#442](https://github.com/Python-roborock/python-roborock/pull/442), - [`d59d6e3`](https://github.com/Python-roborock/python-roborock/commit/d59d6e331b4a03082d8f494117b28e04766e0e7b)) - -- **deps-dev**: Bump ruff from 0.12.0 to 0.12.8 - ([#441](https://github.com/Python-roborock/python-roborock/pull/441), - [`e58bd95`](https://github.com/Python-roborock/python-roborock/commit/e58bd95d631bf0d85a66686fd0fab82528958458)) - -### Features - -- Add container and function for app_init_status - ([#450](https://github.com/Python-roborock/python-roborock/pull/450), - [`1addf95`](https://github.com/Python-roborock/python-roborock/commit/1addf95d5502dde8900bb4bceca418eaad179733)) - - -## v2.35.0 (2025-08-11) - -### Chores - -- Avoid re-parsing RoborockMessages and replace with passing explicit arguments - ([#439](https://github.com/Python-roborock/python-roborock/pull/439), - [`251b3f9`](https://github.com/Python-roborock/python-roborock/commit/251b3f9fbc245a606279dd4a00603efbf93daa26)) - -### Features - -- Add dynamic clean modes ([#437](https://github.com/Python-roborock/python-roborock/pull/437), - [`af17544`](https://github.com/Python-roborock/python-roborock/commit/af175440a3e754dc198f9026a4bcfd24b891f5ee)) - - -## v2.34.2 (2025-08-11) - -### Bug Fixes - -- Merge the local api with the local v1 api - ([#438](https://github.com/Python-roborock/python-roborock/pull/438), - [`450e35e`](https://github.com/Python-roborock/python-roborock/commit/450e35e23ca591dcf75b916dd3be3daeb4a09e84)) - - -## v2.34.1 (2025-08-10) - -### Bug Fixes - -- Fix "retry" error handling ([#436](https://github.com/Python-roborock/python-roborock/pull/436), - [`eb6da93`](https://github.com/Python-roborock/python-roborock/commit/eb6da93478f89625ca71a381d5a104653d8888f4)) - - -## v2.34.0 (2025-08-10) - -### Chores - -- Fix lint whitespace ([#435](https://github.com/Python-roborock/python-roborock/pull/435), - [`a385a14`](https://github.com/Python-roborock/python-roborock/commit/a385a14816e835ad0d53de1afcd58036877a47ed)) - -- Fix merge with cache data rename - ([#418](https://github.com/Python-roborock/python-roborock/pull/418), - [`98ea911`](https://github.com/Python-roborock/python-roborock/commit/98ea911a313c71b65508b7c934b21c8379b3846e)) - -- Speed up mqtt session shutdown by avoiding a sleep - ([#435](https://github.com/Python-roborock/python-roborock/pull/435), - [`a385a14`](https://github.com/Python-roborock/python-roborock/commit/a385a14816e835ad0d53de1afcd58036877a47ed)) - -### Features - -- Add some basic B01 support ([#429](https://github.com/Python-roborock/python-roborock/pull/429), - [`72274e9`](https://github.com/Python-roborock/python-roborock/commit/72274e9aa23ed31327cd44200fd8c2f0bd26daff)) - -- Get_home_data_v3 for new devices - ([#418](https://github.com/Python-roborock/python-roborock/pull/418), - [`98ea911`](https://github.com/Python-roborock/python-roborock/commit/98ea911a313c71b65508b7c934b21c8379b3846e)) - -- Update cli.py and device_manager.py to use get_home_data_v3 - ([#418](https://github.com/Python-roborock/python-roborock/pull/418), - [`98ea911`](https://github.com/Python-roborock/python-roborock/commit/98ea911a313c71b65508b7c934b21c8379b3846e)) - -- Use get_home_data_v3 for tests - ([#418](https://github.com/Python-roborock/python-roborock/pull/418), - [`98ea911`](https://github.com/Python-roborock/python-roborock/commit/98ea911a313c71b65508b7c934b21c8379b3846e)) - - -## v2.33.0 (2025-08-10) - -### Bug Fixes - -- Adjust cache implementation defaults - ([#432](https://github.com/Python-roborock/python-roborock/pull/432), - [`f076a51`](https://github.com/Python-roborock/python-roborock/commit/f076a516b4569aa00ff767f19eab66eddba0b0b9)) - -### Chores - -- Add back generator exception handling - ([#434](https://github.com/Python-roborock/python-roborock/pull/434), - [`c0f28da`](https://github.com/Python-roborock/python-roborock/commit/c0f28da1e5fbc707c5092baf179c8daa2d97db75)) - -- Fix lint errors ([#434](https://github.com/Python-roborock/python-roborock/pull/434), - [`c0f28da`](https://github.com/Python-roborock/python-roborock/commit/c0f28da1e5fbc707c5092baf179c8daa2d97db75)) - -- Fix lint errors ([#432](https://github.com/Python-roborock/python-roborock/pull/432), - [`f076a51`](https://github.com/Python-roborock/python-roborock/commit/f076a516b4569aa00ff767f19eab66eddba0b0b9)) - -- Update pytest-asyncio and fix clean shutdown - ([#434](https://github.com/Python-roborock/python-roborock/pull/434), - [`c0f28da`](https://github.com/Python-roborock/python-roborock/commit/c0f28da1e5fbc707c5092baf179c8daa2d97db75)) - -### Features - -- Add an explicit module for caching - ([#432](https://github.com/Python-roborock/python-roborock/pull/432), - [`f076a51`](https://github.com/Python-roborock/python-roborock/commit/f076a516b4569aa00ff767f19eab66eddba0b0b9)) - -- Add explicit cache module ([#432](https://github.com/Python-roborock/python-roborock/pull/432), - [`f076a51`](https://github.com/Python-roborock/python-roborock/commit/f076a516b4569aa00ff767f19eab66eddba0b0b9)) - -- Update the cli cache to also store network info - ([#432](https://github.com/Python-roborock/python-roborock/pull/432), - [`f076a51`](https://github.com/Python-roborock/python-roborock/commit/f076a516b4569aa00ff767f19eab66eddba0b0b9)) - - -## v2.32.0 (2025-08-10) - -### Bug Fixes - -- Add test where current_map is none - ([#433](https://github.com/Python-roborock/python-roborock/pull/433), - [`0e28988`](https://github.com/Python-roborock/python-roborock/commit/0e289881e88632c1093827cf4f7d6b9076405c0b)) - -### Chores - -- **deps**: Bump pycryptodome from 3.22.0 to 3.23.0 - ([#403](https://github.com/Python-roborock/python-roborock/pull/403), - [`011631c`](https://github.com/Python-roborock/python-roborock/commit/011631ccdd5313bc5de9d72066fd7b255c8368e8)) - -- **deps**: Bump pycryptodomex from 3.22.0 to 3.23.0 - ([#404](https://github.com/Python-roborock/python-roborock/pull/404), - [`c87d40b`](https://github.com/Python-roborock/python-roborock/commit/c87d40b446e5ab091465f2911e0470a9042f43cc)) - -- **deps**: Bump python-semantic-release/python-semantic-release - ([#421](https://github.com/Python-roborock/python-roborock/pull/421), - [`381acf6`](https://github.com/Python-roborock/python-roborock/commit/381acf64b9c5208950c555a92797c4c0cc0eb5ed)) - -- **deps-dev**: Bump freezegun from 1.5.1 to 1.5.4 - ([#423](https://github.com/Python-roborock/python-roborock/pull/423), - [`1d3fe5c`](https://github.com/Python-roborock/python-roborock/commit/1d3fe5c7ca6ea215b3051759068b8a7843f87f4d)) - -- **deps-dev**: Bump pytest from 8.3.5 to 8.4.1 - ([#405](https://github.com/Python-roborock/python-roborock/pull/405), - [`65e961b`](https://github.com/Python-roborock/python-roborock/commit/65e961b62bc6e248c966565da2470ae482aeafbd)) - -### Features - -- Add property for accessing the current map from the status object - ([#433](https://github.com/Python-roborock/python-roborock/pull/433), - [`0e28988`](https://github.com/Python-roborock/python-roborock/commit/0e289881e88632c1093827cf4f7d6b9076405c0b)) - - -## v2.31.0 (2025-08-10) - -### Chores - -- Fix lint errors ([#427](https://github.com/Python-roborock/python-roborock/pull/427), - [`b4e3693`](https://github.com/Python-roborock/python-roborock/commit/b4e3693caad062ffaa20dd907a53eb5b15e5bd96)) - -### Features - -- Update the cli cache to also store network info - ([#427](https://github.com/Python-roborock/python-roborock/pull/427), - [`b4e3693`](https://github.com/Python-roborock/python-roborock/commit/b4e3693caad062ffaa20dd907a53eb5b15e5bd96)) - - -## v2.30.0 (2025-08-10) - -### Chores - -- Remove command info ([#430](https://github.com/Python-roborock/python-roborock/pull/430), - [`04a83e8`](https://github.com/Python-roborock/python-roborock/commit/04a83e8485e297f329750e41fe663fe90819152e)) - -### Features - -- Add a new type for supported features - ([#431](https://github.com/Python-roborock/python-roborock/pull/431), - [`b23c358`](https://github.com/Python-roborock/python-roborock/commit/b23c358b2cbc9642a8be908fa0864592f64df0fc)) - - -## v2.29.1 (2025-08-09) - -### Bug Fixes - -- Add test coverage for extra keys - ([#426](https://github.com/Python-roborock/python-roborock/pull/426), - [`97dfd16`](https://github.com/Python-roborock/python-roborock/commit/97dfd1647ac16900875f1e77aadfbd7921a9fadc)) - -### Chores - -- Cleanup whitespace ([#426](https://github.com/Python-roborock/python-roborock/pull/426), - [`97dfd16`](https://github.com/Python-roborock/python-roborock/commit/97dfd1647ac16900875f1e77aadfbd7921a9fadc)) - -- Fix typing ([#426](https://github.com/Python-roborock/python-roborock/pull/426), - [`97dfd16`](https://github.com/Python-roborock/python-roborock/commit/97dfd1647ac16900875f1e77aadfbd7921a9fadc)) - -- Remove container ([#426](https://github.com/Python-roborock/python-roborock/pull/426), - [`97dfd16`](https://github.com/Python-roborock/python-roborock/commit/97dfd1647ac16900875f1e77aadfbd7921a9fadc)) - -- Remove unnecessary container ([#426](https://github.com/Python-roborock/python-roborock/pull/426), - [`97dfd16`](https://github.com/Python-roborock/python-roborock/commit/97dfd1647ac16900875f1e77aadfbd7921a9fadc)) - -- Update container parsing using native typing and dataclass - ([#426](https://github.com/Python-roborock/python-roborock/pull/426), - [`97dfd16`](https://github.com/Python-roborock/python-roborock/commit/97dfd1647ac16900875f1e77aadfbd7921a9fadc)) - -- Update unknown key test to use simple object - ([#426](https://github.com/Python-roborock/python-roborock/pull/426), - [`97dfd16`](https://github.com/Python-roborock/python-roborock/commit/97dfd1647ac16900875f1e77aadfbd7921a9fadc)) - - -## v2.29.0 (2025-08-09) - -### Bug Fixes - -- Add safety check for trait creation - ([#425](https://github.com/Python-roborock/python-roborock/pull/425), - [`f7d1a55`](https://github.com/Python-roborock/python-roborock/commit/f7d1a553677fd988c24891648410c144565c658b)) - -- Update mqtt payload encoding signature - ([#425](https://github.com/Python-roborock/python-roborock/pull/425), - [`f7d1a55`](https://github.com/Python-roborock/python-roborock/commit/f7d1a553677fd988c24891648410c144565c658b)) - -### Chores - -- Address code review feedback ([#425](https://github.com/Python-roborock/python-roborock/pull/425), - [`f7d1a55`](https://github.com/Python-roborock/python-roborock/commit/f7d1a553677fd988c24891648410c144565c658b)) - -- Revert encode_mqtt_payload typing change - ([#425](https://github.com/Python-roborock/python-roborock/pull/425), - [`f7d1a55`](https://github.com/Python-roborock/python-roborock/commit/f7d1a553677fd988c24891648410c144565c658b)) - -- Update roborock/devices/v1_channel.py - ([#425](https://github.com/Python-roborock/python-roborock/pull/425), - [`f7d1a55`](https://github.com/Python-roborock/python-roborock/commit/f7d1a553677fd988c24891648410c144565c658b)) - -### Features - -- Support both a01 and v1 device types with traits - ([#425](https://github.com/Python-roborock/python-roborock/pull/425), - [`f7d1a55`](https://github.com/Python-roborock/python-roborock/commit/f7d1a553677fd988c24891648410c144565c658b)) - -- Update cli with v1 status trait - ([#425](https://github.com/Python-roborock/python-roborock/pull/425), - [`f7d1a55`](https://github.com/Python-roborock/python-roborock/commit/f7d1a553677fd988c24891648410c144565c658b)) - - -## v2.28.0 (2025-08-09) - -### Chores - -- Add timeout to queue request to diagnose - ([#420](https://github.com/Python-roborock/python-roborock/pull/420), - [`717654a`](https://github.com/Python-roborock/python-roborock/commit/717654a648a86c1323048fb6cfdb022aef3097ec)) - -- Attempt to reduce a01 test flakiness by fixing shutdown to reduce number of active threads - ([#420](https://github.com/Python-roborock/python-roborock/pull/420), - [`717654a`](https://github.com/Python-roborock/python-roborock/commit/717654a648a86c1323048fb6cfdb022aef3097ec)) - -- Fix a01 client ([#420](https://github.com/Python-roborock/python-roborock/pull/420), - [`717654a`](https://github.com/Python-roborock/python-roborock/commit/717654a648a86c1323048fb6cfdb022aef3097ec)) - -- Fix lint errors ([#420](https://github.com/Python-roborock/python-roborock/pull/420), - [`717654a`](https://github.com/Python-roborock/python-roborock/commit/717654a648a86c1323048fb6cfdb022aef3097ec)) - -- Move device_features to seperate file and add some tests and rework device_features - ([#365](https://github.com/Python-roborock/python-roborock/pull/365), - [`c6ba0d6`](https://github.com/Python-roborock/python-roborock/commit/c6ba0d669f259744176821927c8606172c5c345d)) - -- Refactor some of the internal channel details used by the device. - ([#424](https://github.com/Python-roborock/python-roborock/pull/424), - [`cbd6df2`](https://github.com/Python-roborock/python-roborock/commit/cbd6df23da93681b72d47a68c1d64dcb25b27db5)) - -- Remove unnecessary command ([#424](https://github.com/Python-roborock/python-roborock/pull/424), - [`cbd6df2`](https://github.com/Python-roborock/python-roborock/commit/cbd6df23da93681b72d47a68c1d64dcb25b27db5)) - -- Rename rpc channels to have v1 in the name - ([#424](https://github.com/Python-roborock/python-roborock/pull/424), - [`cbd6df2`](https://github.com/Python-roborock/python-roborock/commit/cbd6df23da93681b72d47a68c1d64dcb25b27db5)) - -- Separate V1 API connection logic from encoding logic - ([#424](https://github.com/Python-roborock/python-roborock/pull/424), - [`cbd6df2`](https://github.com/Python-roborock/python-roborock/commit/cbd6df23da93681b72d47a68c1d64dcb25b27db5)) - -- Update to the version from the other PR - ([#365](https://github.com/Python-roborock/python-roborock/pull/365), - [`c6ba0d6`](https://github.com/Python-roborock/python-roborock/commit/c6ba0d669f259744176821927c8606172c5c345d)) - -### Features - -- Add device_features to automatically determine what is supported - ([#365](https://github.com/Python-roborock/python-roborock/pull/365), - [`c6ba0d6`](https://github.com/Python-roborock/python-roborock/commit/c6ba0d669f259744176821927c8606172c5c345d)) - - -## v2.27.0 (2025-08-03) - -### Bug Fixes - -- Simplify local connection handling - ([#416](https://github.com/Python-roborock/python-roborock/pull/416), - [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) - -- Update error message and add pydoc for exception handling on subscribe - ([#416](https://github.com/Python-roborock/python-roborock/pull/416), - [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) - -- Update pydoc for sending a raw command - ([#416](https://github.com/Python-roborock/python-roborock/pull/416), - [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) - -### Chores - -- Remove whitespace ([#416](https://github.com/Python-roborock/python-roborock/pull/416), - [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) - -- **deps**: Bump click from 8.1.8 to 8.2.1 - ([#416](https://github.com/Python-roborock/python-roborock/pull/416), - [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) - -### Features - -- Add a v1 protocol channel bridging across MQTT/Local channels - ([#416](https://github.com/Python-roborock/python-roborock/pull/416), - [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) - -- Add a v1 protocol channel that can send messages across MQTT or Local connections, preferring - local ([#416](https://github.com/Python-roborock/python-roborock/pull/416), - [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) - -- Fix tests referencing RoborockStateCode - ([#416](https://github.com/Python-roborock/python-roborock/pull/416), - [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) - -- Fix tests reverted by co-pilot - ([#416](https://github.com/Python-roborock/python-roborock/pull/416), - [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) - - -## v2.26.0 (2025-08-03) - -### Chores - -- Move a01 encoding and decoding to a separate module - ([#417](https://github.com/Python-roborock/python-roborock/pull/417), - [`5a2dac0`](https://github.com/Python-roborock/python-roborock/commit/5a2dac0ae39d05fd71efa753fc860009d0a07428)) - -- Remove logging code ([#417](https://github.com/Python-roborock/python-roborock/pull/417), - [`5a2dac0`](https://github.com/Python-roborock/python-roborock/commit/5a2dac0ae39d05fd71efa753fc860009d0a07428)) - -- Remove stale comment in roborock_client_a01.py - ([#417](https://github.com/Python-roborock/python-roborock/pull/417), - [`5a2dac0`](https://github.com/Python-roborock/python-roborock/commit/5a2dac0ae39d05fd71efa753fc860009d0a07428)) - -- Revert some logging changes ([#417](https://github.com/Python-roborock/python-roborock/pull/417), - [`5a2dac0`](https://github.com/Python-roborock/python-roborock/commit/5a2dac0ae39d05fd71efa753fc860009d0a07428)) - -### Features - -- Add Saros 10 code mappings ([#419](https://github.com/Python-roborock/python-roborock/pull/419), - [`54a7e53`](https://github.com/Python-roborock/python-roborock/commit/54a7e53da7a482cd293243dd752bbe3ce77cbda3)) - - -## v2.25.1 (2025-07-27) - -### Bug Fixes - -- Add saros 10r modes ([#415](https://github.com/Python-roborock/python-roborock/pull/415), - [`7ebcde9`](https://github.com/Python-roborock/python-roborock/commit/7ebcde942587ab3de81783b4b6006080cd715466)) - -### Chores - -- **deps**: Bump click from 8.1.8 to 8.2.1 - ([#401](https://github.com/Python-roborock/python-roborock/pull/401), - [`36f5f2b`](https://github.com/Python-roborock/python-roborock/commit/36f5f2b76aee7d21da63e3f222cffa01d7e303b8)) - -- **deps**: Bump python-semantic-release/python-semantic-release - ([#400](https://github.com/Python-roborock/python-roborock/pull/400), - [`fd17a30`](https://github.com/Python-roborock/python-roborock/commit/fd17a307a74ab10550ac129590542528a8bac3ca)) - - -## v2.25.0 (2025-07-15) - -### Chores - -- Change return type of caplog ([#411](https://github.com/Python-roborock/python-roborock/pull/411), - [`f1dd1fe`](https://github.com/Python-roborock/python-roborock/commit/f1dd1fec36629cffb01e1a44ce96e36566bb4246)) - -- Create module for v1 request encoding - ([#413](https://github.com/Python-roborock/python-roborock/pull/413), - [`7507423`](https://github.com/Python-roborock/python-roborock/commit/7507423478c0a35375cc51fbffa043f015d73755)) - -- Delete tests/devices/test_v1_protocol.py - ([#413](https://github.com/Python-roborock/python-roborock/pull/413), - [`7507423`](https://github.com/Python-roborock/python-roborock/commit/7507423478c0a35375cc51fbffa043f015d73755)) - -- Enable verbose logging in CI ([#411](https://github.com/Python-roborock/python-roborock/pull/411), - [`f1dd1fe`](https://github.com/Python-roborock/python-roborock/commit/f1dd1fec36629cffb01e1a44ce96e36566bb4246)) - -- Fix CI logging ([#411](https://github.com/Python-roborock/python-roborock/pull/411), - [`f1dd1fe`](https://github.com/Python-roborock/python-roborock/commit/f1dd1fec36629cffb01e1a44ce96e36566bb4246)) - -- Fix lint ([#411](https://github.com/Python-roborock/python-roborock/pull/411), - [`f1dd1fe`](https://github.com/Python-roborock/python-roborock/commit/f1dd1fec36629cffb01e1a44ce96e36566bb4246)) - -- Fix lint in test ([#412](https://github.com/Python-roborock/python-roborock/pull/412), - [`ec780c9`](https://github.com/Python-roborock/python-roborock/commit/ec780c94c2de89fc565b24dc02fbaa3a5b531422)) - -- Fix warning in tests/devices/test_device_manager.py - ([#412](https://github.com/Python-roborock/python-roborock/pull/412), - [`ec780c9`](https://github.com/Python-roborock/python-roborock/commit/ec780c94c2de89fc565b24dc02fbaa3a5b531422)) - -- Remove incorrect caplog package - ([#411](https://github.com/Python-roborock/python-roborock/pull/411), - [`f1dd1fe`](https://github.com/Python-roborock/python-roborock/commit/f1dd1fec36629cffb01e1a44ce96e36566bb4246)) - -- Remove tests that timeout on CI - ([#411](https://github.com/Python-roborock/python-roborock/pull/411), - [`f1dd1fe`](https://github.com/Python-roborock/python-roborock/commit/f1dd1fec36629cffb01e1a44ce96e36566bb4246)) - -- Update log format to include timining information and thread names - ([#411](https://github.com/Python-roborock/python-roborock/pull/411), - [`f1dd1fe`](https://github.com/Python-roborock/python-roborock/commit/f1dd1fec36629cffb01e1a44ce96e36566bb4246)) - -### Features - -- Simplify local payload encoding by rejecting any cloud commands sent locally - ([#413](https://github.com/Python-roborock/python-roborock/pull/413), - [`7507423`](https://github.com/Python-roborock/python-roborock/commit/7507423478c0a35375cc51fbffa043f015d73755)) - - -## v2.24.0 (2025-07-05) - -### Features - -- Add a local channel, similar to the MQTT channel - ([#410](https://github.com/Python-roborock/python-roborock/pull/410), - [`1fb135b`](https://github.com/Python-roborock/python-roborock/commit/1fb135b763b8abe88d799fc609bdfc07077dee0a)) - -- Add debug lines ([#409](https://github.com/Python-roborock/python-roborock/pull/409), - [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) - -- Add support for sending/recieving messages - ([#409](https://github.com/Python-roborock/python-roborock/pull/409), - [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) - -- Add test coverage for device manager close - ([#409](https://github.com/Python-roborock/python-roborock/pull/409), - [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) - -- Add test coverage to device modules - ([#409](https://github.com/Python-roborock/python-roborock/pull/409), - [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) - -- Apply suggestions from code review - ([#409](https://github.com/Python-roborock/python-roborock/pull/409), - [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) - -- Gather tasks ([#409](https://github.com/Python-roborock/python-roborock/pull/409), - [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) - -- Log a warning when transport is already closed - ([#410](https://github.com/Python-roborock/python-roborock/pull/410), - [`1fb135b`](https://github.com/Python-roborock/python-roborock/commit/1fb135b763b8abe88d799fc609bdfc07077dee0a)) - -- Simplify rpc handling and tests - ([#409](https://github.com/Python-roborock/python-roborock/pull/409), - [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) - -- Update device manager and device to establish an MQTT subscription - ([#409](https://github.com/Python-roborock/python-roborock/pull/409), - [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) - -- Update roborock/devices/mqtt_channel.py - ([#409](https://github.com/Python-roborock/python-roborock/pull/409), - [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) - - -## v2.23.0 (2025-07-01) - -### Features - -- Implement set_value method for a01 device protocols - ([#408](https://github.com/Python-roborock/python-roborock/pull/408), - [`011b253`](https://github.com/Python-roborock/python-roborock/commit/011b2538fc6c0876f2b40465f9a6474bd03d21c6)) - - -## v2.22.0 (2025-07-01) - -### Chores - -- Increase test timeout to 30 seconds - ([#407](https://github.com/Python-roborock/python-roborock/pull/407), - [`e59c0b5`](https://github.com/Python-roborock/python-roborock/commit/e59c0b5948a83081a4a248fa2108fed81aa6f036)) - -### Features - -- Add a CLI for exercising the asyncio MQTT session - ([#396](https://github.com/Python-roborock/python-roborock/pull/396), - [`54547d8`](https://github.com/Python-roborock/python-roborock/commit/54547d87bef080fe3ce03672509ba179bf7feafb)) - -- Fix lint error ([#396](https://github.com/Python-roborock/python-roborock/pull/396), - [`54547d8`](https://github.com/Python-roborock/python-roborock/commit/54547d87bef080fe3ce03672509ba179bf7feafb)) - -- Remove unused import ([#396](https://github.com/Python-roborock/python-roborock/pull/396), - [`54547d8`](https://github.com/Python-roborock/python-roborock/commit/54547d87bef080fe3ce03672509ba179bf7feafb)) - -- Share mqtt url parsing code with original client - ([#396](https://github.com/Python-roborock/python-roborock/pull/396), - [`54547d8`](https://github.com/Python-roborock/python-roborock/commit/54547d87bef080fe3ce03672509ba179bf7feafb)) - -- Update bytes dump ([#396](https://github.com/Python-roborock/python-roborock/pull/396), - [`54547d8`](https://github.com/Python-roborock/python-roborock/commit/54547d87bef080fe3ce03672509ba179bf7feafb)) - - -## v2.21.0 (2025-07-01) - -### Chores - -- Minor refactoring creating functions for transforming bytes - ([#397](https://github.com/Python-roborock/python-roborock/pull/397), - [`b19dbaa`](https://github.com/Python-roborock/python-roborock/commit/b19dbaac894a9fec8953e782cfb51433f19b2b90)) - -- Refactor authorization header - ([#398](https://github.com/Python-roborock/python-roborock/pull/398), - [`9e0ddf8`](https://github.com/Python-roborock/python-roborock/commit/9e0ddf89dfb18774b757ad07270de0be3af14561)) - -- **deps**: Bump vacuum-map-parser-roborock from 0.1.2 to 0.1.4 - ([#373](https://github.com/Python-roborock/python-roborock/pull/373), - [`05966aa`](https://github.com/Python-roborock/python-roborock/commit/05966aa474227bbb1d58192d68b44f3003f97e86)) - -### Features - -- Add a DeviceManager to perform discovery - ([#399](https://github.com/Python-roborock/python-roborock/pull/399), - [`e04a215`](https://github.com/Python-roborock/python-roborock/commit/e04a215bcadce6e582d92dce81f58e902391ec57)) - -- Fix lint error ([#399](https://github.com/Python-roborock/python-roborock/pull/399), - [`e04a215`](https://github.com/Python-roborock/python-roborock/commit/e04a215bcadce6e582d92dce81f58e902391ec57)) - -- Update CLI to allow logging in with a code - ([#395](https://github.com/Python-roborock/python-roborock/pull/395), - [`e1a9e69`](https://github.com/Python-roborock/python-roborock/commit/e1a9e695362677d82abf1693bb8790537e38d2d1)) - -- Update review feedback ([#399](https://github.com/Python-roborock/python-roborock/pull/399), - [`e04a215`](https://github.com/Python-roborock/python-roborock/commit/e04a215bcadce6e582d92dce81f58e902391ec57)) - -- Update tests with additional feedback - ([#399](https://github.com/Python-roborock/python-roborock/pull/399), - [`e04a215`](https://github.com/Python-roborock/python-roborock/commit/e04a215bcadce6e582d92dce81f58e902391ec57)) - - -## v2.20.0 (2025-06-30) - -### Bug Fixes - -- Correct keepalive log message - ([#385](https://github.com/Python-roborock/python-roborock/pull/385), - [`8d4902b`](https://github.com/Python-roborock/python-roborock/commit/8d4902b408cba89daad7eb46d85ef7bdb4b8c8c7)) - -- Correct typos in log messages - ([#385](https://github.com/Python-roborock/python-roborock/pull/385), - [`8d4902b`](https://github.com/Python-roborock/python-roborock/commit/8d4902b408cba89daad7eb46d85ef7bdb4b8c8c7)) - -### Chores - -- **deps**: Bump aiohttp from 3.11.16 to 3.12.13 - ([#390](https://github.com/Python-roborock/python-roborock/pull/390), - [`e10b464`](https://github.com/Python-roborock/python-roborock/commit/e10b464b895fcbb8340fcf11ea7b5f2a2f33b676)) - -- **deps**: Bump python-semantic-release/python-semantic-release - ([#391](https://github.com/Python-roborock/python-roborock/pull/391), - [`6536700`](https://github.com/Python-roborock/python-roborock/commit/653670031bb366ed0e08d3daadb63d511795929c)) - -- **deps-dev**: Bump pre-commit from 4.1.0 to 4.2.0 - ([#358](https://github.com/Python-roborock/python-roborock/pull/358), - [`9653abc`](https://github.com/Python-roborock/python-roborock/commit/9653abc2451d8b2d2f8c68232777d1419a194efb)) - -- **deps-dev**: Bump pytest-timeout from 2.3.1 to 2.4.0 - ([#379](https://github.com/Python-roborock/python-roborock/pull/379), - [`150de05`](https://github.com/Python-roborock/python-roborock/commit/150de05390ce7e31862a202e99017932da3529a5)) - -- **deps-dev**: Bump ruff from 0.11.4 to 0.12.0 - ([#394](https://github.com/Python-roborock/python-roborock/pull/394), - [`6ce7af8`](https://github.com/Python-roborock/python-roborock/commit/6ce7af82c847f7cdfa7107bae3505088437a9e66)) - -### Features - -- Add Qrevo MaxV code mappings ([#385](https://github.com/Python-roborock/python-roborock/pull/385), - [`8d4902b`](https://github.com/Python-roborock/python-roborock/commit/8d4902b408cba89daad7eb46d85ef7bdb4b8c8c7)) - -- Add support for roborock qrevo maxv code mappings - ([#385](https://github.com/Python-roborock/python-roborock/pull/385), - [`8d4902b`](https://github.com/Python-roborock/python-roborock/commit/8d4902b408cba89daad7eb46d85ef7bdb4b8c8c7)) - ## v2.19.0 (2025-05-13) diff --git a/pyproject.toml b/pyproject.toml index 20d1b5e7..93774281 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,16 +1,12 @@ -[project] +[tool.poetry] name = "python-roborock" -version = "4.10.0" +version = "2.25.0" description = "A package to control Roborock vacuums." -authors = [{ name = "humbertogontijo", email = "humbertogontijo@users.noreply.github.com" }, {name="Lash-L"}, {name="allenporter"}] -requires-python = ">=3.11, <4" -readme = "README.md" +authors = ["humbertogontijo "] license = "GPL-3.0-only" -keywords = [ - "roborock", - "vacuum", - "homeassistant", -] +readme = "README.md" +repository = "https://github.com/humbertogontijo/python-roborock" +documentation = "https://python-roborock.readthedocs.io/" classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", @@ -18,71 +14,46 @@ classifiers = [ "Operating System :: OS Independent", "Topic :: Software Development :: Libraries", ] -dependencies = [ - "click>=8", - "aiohttp>=3.8.2,<4", - "pycryptodome~=3.18", - "pycryptodomex~=3.18 ; sys_platform == 'darwin'", - "paho-mqtt>=1.6.1,<3.0.0", - "construct>=2.10.57,<3", - "vacuum-map-parser-roborock", - "pyrate-limiter>=3.7.0,<4", - "aiomqtt>=2.5.0,<3", - "click-shell~=2.1", -] - -[project.urls] -Repository = "https://github.com/humbertogontijo/python-roborock" -Documentation = "https://python-roborock.readthedocs.io/" +packages = [{include = "roborock"}] +keywords = ["roborock", "vacuum", "homeassistant"] -[project.scripts] +[tool.poetry.scripts] roborock = "roborock.cli:main" -[dependency-groups] -dev = [ - "pytest-asyncio>=1.1.0", - "pytest", - "pre-commit>=3.5,<5.0", - "mypy", - "ruff==0.14.11", - "codespell", - "pyshark>=0.6,<0.7", - "aioresponses>=0.7.7,<0.8", - "freezegun>=1.5.1,<2", - "pytest-timeout>=2.3.1,<3", - "syrupy>=4.9.1,<6", - "pdoc>=15.0.4,<17", - "pyyaml>=6.0.3", - "pyshark>=0.6", - "pytest-cov>=7.0.0", -] - -[tool.hatch.build.targets.sdist] -include = ["roborock"] +[tool.poetry.dependencies] +python = "^3.11" +click = ">=8" +aiohttp = "^3.8.2" +async-timeout = "*" +pycryptodome = "^3.18" +pycryptodomex = {version = "^3.18", markers = "sys_platform == 'darwin'"} +paho-mqtt = ">=1.6.1,<3.0.0" +construct = "^2.10.57" +vacuum-map-parser-roborock = "*" +pyrate-limiter = "^3.7.0" +aiomqtt = "^2.3.2" -[tool.hatch.build.targets.wheel] -include = ["roborock"] [build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" +requires = ["poetry-core==1.8.0"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry.group.dev.dependencies] +pytest-asyncio = "*" +pytest = "*" +pre-commit = ">=3.5,<5.0" +mypy = "*" +ruff = "*" +codespell = "*" +pyshark = "^0.6" +aioresponses = "^0.7.7" +freezegun = "^1.5.1" +pytest-timeout = "^2.3.1" [tool.semantic_release] branch = "main" -version_toml = ["pyproject.toml:project.version"] -build_command = "pip install uv && uv lock --upgrade-package python-roborock && git add uv.lock && uv build" -changelog_file = 'CHANGELOG.md' -commit = true - -[tool.semantic_release.branches.main] -match = "main" -prerelease = false - -[tool.semantic_release.branches.temp-main-branch] -match = "temp-main-branch" -prerelease = false - - +version_toml = ["pyproject.toml:tool.poetry.version"] +build_command = "pip install poetry && poetry build" [tool.semantic_release.commit_parser_options] allowed_tags = [ "chore", @@ -94,9 +65,9 @@ allowed_tags = [ major_tags= ["refactor"] [tool.ruff] -lint.ignore = ["F403", "E741"] -lint.select=["E", "F", "UP", "I"] +ignore = ["F403", "E741"] line-length = 120 +select=["E", "F", "UP", "I"] [tool.ruff.lint.per-file-ignores] "*/__init__.py" = ["F401"] From 8c3345d6314d7a71122a54ecda6e4852d4aadcbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Mon, 2 Feb 2026 00:21:41 +0100 Subject: [PATCH 13/14] fix: changelog --- CHANGELOG.md | 3600 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3600 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d008c93..91cc392d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,3605 @@ # CHANGELOG + + +## v4.10.0 (2026-02-01) + +### Features + +- Add clean record for Q7 ([#745](https://github.com/Python-roborock/python-roborock/pull/745), + [`329e52b`](https://github.com/Python-roborock/python-roborock/commit/329e52bc34b1a5de2685b94002deae025eb0bd1c)) + + +## v4.9.1 (2026-02-01) + +### Bug Fixes + +- Correctly handle unknown categories + ([#755](https://github.com/Python-roborock/python-roborock/pull/755), + [`742a382`](https://github.com/Python-roborock/python-roborock/commit/742a38200e943a987285cc6979c7e7d5ca729117)) + + +## v4.9.0 (2026-02-01) + +### Features + +- Add VacuumTrait to q10 devices + ([#754](https://github.com/Python-roborock/python-roborock/pull/754), + [`69b6e0f`](https://github.com/Python-roborock/python-roborock/commit/69b6e0f58ce470f59a3d57756e6b4f760f3fd5a0)) + + +## v4.8.0 (2026-01-27) + +### Features + +- Add the ability to set q7 mode + ([#748](https://github.com/Python-roborock/python-roborock/pull/748), + [`bf1f8af`](https://github.com/Python-roborock/python-roborock/commit/bf1f8af7bf39a15d546fbd420ff3979f7014042c)) + + +## v4.7.2 (2026-01-20) + +### Bug Fixes + +- Handle different error format for map status + ([#744](https://github.com/Python-roborock/python-roborock/pull/744), + [`9897379`](https://github.com/Python-roborock/python-roborock/commit/98973795af550ed7940c9c637c85adc84ec5a511)) + + +## v4.7.1 (2026-01-19) + +### Bug Fixes + +- Add rooms from map_info which is occassionally available + ([#750](https://github.com/Python-roborock/python-roborock/pull/750), + [`814054e`](https://github.com/Python-roborock/python-roborock/commit/814054ee4200c5f172d3f658843a9c8ee99c7f52)) + + +## v4.7.0 (2026-01-18) + +### Chores + +- Address PR comments ([#747](https://github.com/Python-roborock/python-roborock/pull/747), + [`a97e90a`](https://github.com/Python-roborock/python-roborock/commit/a97e90aa11b4e60732014d8d65265a334568f32c)) + +- Include snapshots ([#747](https://github.com/Python-roborock/python-roborock/pull/747), + [`a97e90a`](https://github.com/Python-roborock/python-roborock/commit/a97e90aa11b4e60732014d8d65265a334568f32c)) + +- **deps-dev**: Bump ruff from 0.14.10 to 0.14.11 + ([#742](https://github.com/Python-roborock/python-roborock/pull/742), + [`9274642`](https://github.com/Python-roborock/python-roborock/commit/92746429ddb029e20073dab127598645a223c856)) + +### Features + +- Add from diagnostics ([#747](https://github.com/Python-roborock/python-roborock/pull/747), + [`a97e90a`](https://github.com/Python-roborock/python-roborock/commit/a97e90aa11b4e60732014d8d65265a334568f32c)) + +- Improve device_info ([#747](https://github.com/Python-roborock/python-roborock/pull/747), + [`a97e90a`](https://github.com/Python-roborock/python-roborock/commit/a97e90aa11b4e60732014d8d65265a334568f32c)) + + +## v4.6.0 (2026-01-18) + +### Chores + +- **deps**: Bump aiohttp from 3.13.2 to 3.13.3 + ([#732](https://github.com/Python-roborock/python-roborock/pull/732), + [`e438364`](https://github.com/Python-roborock/python-roborock/commit/e438364e7619b2e9658cdffeace9b2b6e4e19269)) + +### Features + +- Add 2 new states for zeostate in zeo_code_mappings + ([#689](https://github.com/Python-roborock/python-roborock/pull/689), + [`3482e4e`](https://github.com/Python-roborock/python-roborock/commit/3482e4eaafcea7dbc004c28e094e260cdf822e79)) + + +## v4.5.0 (2026-01-14) + +### Chores + +- Add test ([#743](https://github.com/Python-roborock/python-roborock/pull/743), + [`e26e351`](https://github.com/Python-roborock/python-roborock/commit/e26e351474a006485c6a7b5a5dcdbbe9fab8572e)) + +### Features + +- Raise no account error when bad login + ([#743](https://github.com/Python-roborock/python-roborock/pull/743), + [`e26e351`](https://github.com/Python-roborock/python-roborock/commit/e26e351474a006485c6a7b5a5dcdbbe9fab8572e)) + + +## v4.4.0 (2026-01-12) + +### Features + +- Iterate possible iot domains on 3030 error + ([#733](https://github.com/Python-roborock/python-roborock/pull/733), + [`f2e1d51`](https://github.com/Python-roborock/python-roborock/commit/f2e1d5156dd905e296d5ed38605d4fd6f97bfbb4)) + + +## v4.3.0 (2026-01-10) + +### Chores + +- Add function to create field metadata + ([#740](https://github.com/Python-roborock/python-roborock/pull/740), + [`bdc1591`](https://github.com/Python-roborock/python-roborock/commit/bdc159192cfb2afa02199171288a20b228abb7f6)) + +- Simplify supported_schema_codes + ([#740](https://github.com/Python-roborock/python-roborock/pull/740), + [`bdc1591`](https://github.com/Python-roborock/python-roborock/commit/bdc159192cfb2afa02199171288a20b228abb7f6)) + +- Update pydoc for DeviceFeaturesTrait + ([#740](https://github.com/Python-roborock/python-roborock/pull/740), + [`bdc1591`](https://github.com/Python-roborock/python-roborock/commit/bdc159192cfb2afa02199171288a20b228abb7f6)) + +- Update test descrition ([#740](https://github.com/Python-roborock/python-roborock/pull/740), + [`bdc1591`](https://github.com/Python-roborock/python-roborock/commit/bdc159192cfb2afa02199171288a20b228abb7f6)) + +- Update to use StrEnum ([#740](https://github.com/Python-roborock/python-roborock/pull/740), + [`bdc1591`](https://github.com/Python-roborock/python-roborock/commit/bdc159192cfb2afa02199171288a20b228abb7f6)) + +### Features + +- Add an approach for determining if a dataclass field is supported + ([#740](https://github.com/Python-roborock/python-roborock/pull/740), + [`bdc1591`](https://github.com/Python-roborock/python-roborock/commit/bdc159192cfb2afa02199171288a20b228abb7f6)) + + +## v4.2.2 (2026-01-09) + +### Bug Fixes + +- Decrease home data rate limits + ([#741](https://github.com/Python-roborock/python-roborock/pull/741), + [`29eb984`](https://github.com/Python-roborock/python-roborock/commit/29eb984d22494b08f26ec6e220b7c823b67d3242)) + +### Chores + +- Add additional Home data to diagnostics + ([#723](https://github.com/Python-roborock/python-roborock/pull/723), + [`c29dfc8`](https://github.com/Python-roborock/python-roborock/commit/c29dfc81f4de1bb293b2918482cf681197ef3698)) + +- Add CONTRIBUTING.md ([#734](https://github.com/Python-roborock/python-roborock/pull/734), + [`881b7d6`](https://github.com/Python-roborock/python-roborock/commit/881b7d687789c57eec20bf9011a195b4befff129)) + +- Add CONTRIBUTINGmd ([#734](https://github.com/Python-roborock/python-roborock/pull/734), + [`881b7d6`](https://github.com/Python-roborock/python-roborock/commit/881b7d687789c57eec20bf9011a195b4befff129)) + +- Add s5e device and product data examples + ([#737](https://github.com/Python-roborock/python-roborock/pull/737), + [`586bb3f`](https://github.com/Python-roborock/python-roborock/commit/586bb3f77e4655d4aae2d201746980b1c227160d)) + +- Add Saros 10R API response data + ([#726](https://github.com/Python-roborock/python-roborock/pull/726), + [`fafc8d8`](https://github.com/Python-roborock/python-roborock/commit/fafc8d86833a2aac3ee69c7a1f353f83551eeb6f)) + +- Fix diagnostic lint issues ([#723](https://github.com/Python-roborock/python-roborock/pull/723), + [`c29dfc8`](https://github.com/Python-roborock/python-roborock/commit/c29dfc81f4de1bb293b2918482cf681197ef3698)) + +- Fix mock data lint ([#726](https://github.com/Python-roborock/python-roborock/pull/726), + [`fafc8d8`](https://github.com/Python-roborock/python-roborock/commit/fafc8d86833a2aac3ee69c7a1f353f83551eeb6f)) + +- Fix schema redaction ([#723](https://github.com/Python-roborock/python-roborock/pull/723), + [`c29dfc8`](https://github.com/Python-roborock/python-roborock/commit/c29dfc81f4de1bb293b2918482cf681197ef3698)) + +- Improve redaction logic to support more complex paths + ([#723](https://github.com/Python-roborock/python-roborock/pull/723), + [`c29dfc8`](https://github.com/Python-roborock/python-roborock/commit/c29dfc81f4de1bb293b2918482cf681197ef3698)) + +- Remove duplicate data in test_q7_device + ([#736](https://github.com/Python-roborock/python-roborock/pull/736), + [`cd6cbbe`](https://github.com/Python-roborock/python-roborock/commit/cd6cbbe1be22a619a88d76783c60c936dbbc744d)) + +- Update device snapshots and lint errors + ([#723](https://github.com/Python-roborock/python-roborock/pull/723), + [`c29dfc8`](https://github.com/Python-roborock/python-roborock/commit/c29dfc81f4de1bb293b2918482cf681197ef3698)) + +- Update e2e tests for q7 to use different product data + ([#736](https://github.com/Python-roborock/python-roborock/pull/736), + [`cd6cbbe`](https://github.com/Python-roborock/python-roborock/commit/cd6cbbe1be22a619a88d76783c60c936dbbc744d)) + +- Update end to end q7 tests ([#736](https://github.com/Python-roborock/python-roborock/pull/736), + [`cd6cbbe`](https://github.com/Python-roborock/python-roborock/commit/cd6cbbe1be22a619a88d76783c60c936dbbc744d)) + +- Update steps to activate virtual environment + ([#734](https://github.com/Python-roborock/python-roborock/pull/734), + [`881b7d6`](https://github.com/Python-roborock/python-roborock/commit/881b7d687789c57eec20bf9011a195b4befff129)) + +- Use built-in as_dict method for creating diagnostic data + ([#723](https://github.com/Python-roborock/python-roborock/pull/723), + [`c29dfc8`](https://github.com/Python-roborock/python-roborock/commit/c29dfc81f4de1bb293b2918482cf681197ef3698)) + + +## v4.2.1 (2026-01-05) + +### Bug Fixes + +- Bump aiomqtt ([#730](https://github.com/Python-roborock/python-roborock/pull/730), + [`21af4f3`](https://github.com/Python-roborock/python-roborock/commit/21af4f30412d96eb5ac53f372b74b0e03ca6580e)) + +### Chores + +- Add a01 and b01 q7 byte level tests + ([#724](https://github.com/Python-roborock/python-roborock/pull/724), + [`f20ade9`](https://github.com/Python-roborock/python-roborock/commit/f20ade97843241aa286405c4eacbb9f1939cbdf3)) + +- Add docs for v1 device features + ([#727](https://github.com/Python-roborock/python-roborock/pull/727), + [`f031acf`](https://github.com/Python-roborock/python-roborock/commit/f031acffa2381c2eb9e4af6fbf7967ae22b1d7dc)) + +- Documentation cleanup and updates + ([#725](https://github.com/Python-roborock/python-roborock/pull/725), + [`bbeb0d9`](https://github.com/Python-roborock/python-roborock/commit/bbeb0d95e11274bd024cfac23988f01acf814888)) + +- Remove empty line in device features documentation + ([#727](https://github.com/Python-roborock/python-roborock/pull/727), + [`f031acf`](https://github.com/Python-roborock/python-roborock/commit/f031acffa2381c2eb9e4af6fbf7967ae22b1d7dc)) + +- Remove some information from the summart + ([#727](https://github.com/Python-roborock/python-roborock/pull/727), + [`f031acf`](https://github.com/Python-roborock/python-roborock/commit/f031acffa2381c2eb9e4af6fbf7967ae22b1d7dc)) + +- Restructure the channel modules + ([#728](https://github.com/Python-roborock/python-roborock/pull/728), + [`9fcc0a8`](https://github.com/Python-roborock/python-roborock/commit/9fcc0a8ca075097b7d903a57cc0fc33ed149bd97)) + + +## v4.2.0 (2025-12-30) + +### Chores + +- Add end to end tests for Q10 devices + ([#721](https://github.com/Python-roborock/python-roborock/pull/721), + [`8d76119`](https://github.com/Python-roborock/python-roborock/commit/8d761194bc1daaa82564fc49e3ef63f85a209dba)) + +- Remove unused timeout field ([#721](https://github.com/Python-roborock/python-roborock/pull/721), + [`8d76119`](https://github.com/Python-roborock/python-roborock/commit/8d761194bc1daaa82564fc49e3ef63f85a209dba)) + +### Features + +- Recognize Q10 devices and add a command trait + ([#721](https://github.com/Python-roborock/python-roborock/pull/721), + [`8d76119`](https://github.com/Python-roborock/python-roborock/commit/8d761194bc1daaa82564fc49e3ef63f85a209dba)) + + +## v4.1.1 (2025-12-29) + +### Bug Fixes + +- Fix CLI to no longer depend on old API + ([#717](https://github.com/Python-roborock/python-roborock/pull/717), + [`a4fde4a`](https://github.com/Python-roborock/python-roborock/commit/a4fde4a1756dee6d631a1eab24e0a57bf68af6e6)) + +### Chores + +- Fix cli lint errors ([#717](https://github.com/Python-roborock/python-roborock/pull/717), + [`a4fde4a`](https://github.com/Python-roborock/python-roborock/commit/a4fde4a1756dee6d631a1eab24e0a57bf68af6e6)) + + +## v4.1.0 (2025-12-29) + +### Bug Fixes + +- Return self for classmethods of roborockmodeenum + ([#720](https://github.com/Python-roborock/python-roborock/pull/720), + [`0cc41e8`](https://github.com/Python-roborock/python-roborock/commit/0cc41e8127740b5f763d7dd2735e7427e4ae9afe)) + +### Features + +- Expose prefer-cache to create_device_manager caller + ([#719](https://github.com/Python-roborock/python-roborock/pull/719), + [`1d098d6`](https://github.com/Python-roborock/python-roborock/commit/1d098d6775d86a8ffd425d42bf2a6f8cd8bcc9a7)) + + +## v4.0.2 (2025-12-29) + +### Bug Fixes + +- Add b01 q10 protocol encoding/decoding and tests + ([#718](https://github.com/Python-roborock/python-roborock/pull/718), + [`656f715`](https://github.com/Python-roborock/python-roborock/commit/656f715807c7605e9b0ce674c12b4fd0ad4a549f)) + +- Support unknown q10 DPS enum codes + ([#718](https://github.com/Python-roborock/python-roborock/pull/718), + [`656f715`](https://github.com/Python-roborock/python-roborock/commit/656f715807c7605e9b0ce674c12b4fd0ad4a549f)) + + +## v4.0.1 (2025-12-29) + +### Bug Fixes + +- Fix wind and water mappings for Q7 + ([#716](https://github.com/Python-roborock/python-roborock/pull/716), + [`421a9c4`](https://github.com/Python-roborock/python-roborock/commit/421a9c4970e8dc8e30552025ad37326d318476fe)) + +- Fix wind and water mappings for Q7 (#715) + ([#716](https://github.com/Python-roborock/python-roborock/pull/716), + [`421a9c4`](https://github.com/Python-roborock/python-roborock/commit/421a9c4970e8dc8e30552025ad37326d318476fe)) + +- Improve device startup connection reliability for L01 devices + ([#708](https://github.com/Python-roborock/python-roborock/pull/708), + [`9cf83a4`](https://github.com/Python-roborock/python-roborock/commit/9cf83a4a762e03e70ed59fb5b1c1982ff52b43b2)) + +- Update device startup connection behavior + ([#708](https://github.com/Python-roborock/python-roborock/pull/708), + [`9cf83a4`](https://github.com/Python-roborock/python-roborock/commit/9cf83a4a762e03e70ed59fb5b1c1982ff52b43b2)) + +### Chores + +- Update tests/e2e/test_device_manager.py + ([#708](https://github.com/Python-roborock/python-roborock/pull/708), + [`9cf83a4`](https://github.com/Python-roborock/python-roborock/commit/9cf83a4a762e03e70ed59fb5b1c1982ff52b43b2)) + + +## v4.0.0 (2025-12-29) + +### Bug Fixes + +- Allow startup with unsupported devices + ([#707](https://github.com/Python-roborock/python-roborock/pull/707), + [`7e40857`](https://github.com/Python-roborock/python-roborock/commit/7e40857d0e723f73e4501e7be6068ffa12ebd086)) + +- Properly shutdown the context in the CLI + ([#710](https://github.com/Python-roborock/python-roborock/pull/710), + [`bf31b9b`](https://github.com/Python-roborock/python-roborock/commit/bf31b9b5e7bc22b04e15791cbbcca47e08bcef34)) + +### Chores + +- Add an end to end device manager test + ([#705](https://github.com/Python-roborock/python-roborock/pull/705), + [`5e5b9d3`](https://github.com/Python-roborock/python-roborock/commit/5e5b9d38a542a34b486edd21a0fc27fbea9221ef)) + +- Add end to end tests of the device cache + ([#705](https://github.com/Python-roborock/python-roborock/pull/705), + [`5e5b9d3`](https://github.com/Python-roborock/python-roborock/commit/5e5b9d38a542a34b486edd21a0fc27fbea9221ef)) + +- Add explicit Q7 request message handling code + ([#712](https://github.com/Python-roborock/python-roborock/pull/712), + [`a0aee33`](https://github.com/Python-roborock/python-roborock/commit/a0aee338539a060b31b156d607afa9d476e31f95)) + +- Apply suggestions from code review + ([#707](https://github.com/Python-roborock/python-roborock/pull/707), + [`7e40857`](https://github.com/Python-roborock/python-roborock/commit/7e40857d0e723f73e4501e7be6068ffa12ebd086)) + +- Fix exception catching ([#710](https://github.com/Python-roborock/python-roborock/pull/710), + [`bf31b9b`](https://github.com/Python-roborock/python-roborock/commit/bf31b9b5e7bc22b04e15791cbbcca47e08bcef34)) + +- Fix formatting in tests. ([#714](https://github.com/Python-roborock/python-roborock/pull/714), + [`e00ce88`](https://github.com/Python-roborock/python-roborock/commit/e00ce886ba8012189c88e3f3a01b8f5d8cb4124e)) + +- Fix lint errors in code mappings test + ([#711](https://github.com/Python-roborock/python-roborock/pull/711), + [`4725574`](https://github.com/Python-roborock/python-roborock/commit/4725574cb8f14c13e5b66e5051da83d6f2670456)) + +- Fix lint errors in q7 protocol tests + ([#712](https://github.com/Python-roborock/python-roborock/pull/712), + [`a0aee33`](https://github.com/Python-roborock/python-roborock/commit/a0aee338539a060b31b156d607afa9d476e31f95)) + +- Fix lint formatting ([#707](https://github.com/Python-roborock/python-roborock/pull/707), + [`7e40857`](https://github.com/Python-roborock/python-roborock/commit/7e40857d0e723f73e4501e7be6068ffa12ebd086)) + +- Fix protocol test paths ([#712](https://github.com/Python-roborock/python-roborock/pull/712), + [`a0aee33`](https://github.com/Python-roborock/python-roborock/commit/a0aee338539a060b31b156d607afa9d476e31f95)) + +- Improve error handling for session loop + ([#710](https://github.com/Python-roborock/python-roborock/pull/710), + [`bf31b9b`](https://github.com/Python-roborock/python-roborock/commit/bf31b9b5e7bc22b04e15791cbbcca47e08bcef34)) + +- Split up test_containers.py into data subdirectories + ([#714](https://github.com/Python-roborock/python-roborock/pull/714), + [`e00ce88`](https://github.com/Python-roborock/python-roborock/commit/e00ce886ba8012189c88e3f3a01b8f5d8cb4124e)) + +- Update diagnostics counters ([#707](https://github.com/Python-roborock/python-roborock/pull/707), + [`7e40857`](https://github.com/Python-roborock/python-roborock/commit/7e40857d0e723f73e4501e7be6068ffa12ebd086)) + +- Update error building tests ([#712](https://github.com/Python-roborock/python-roborock/pull/712), + [`a0aee33`](https://github.com/Python-roborock/python-roborock/commit/a0aee338539a060b31b156d607afa9d476e31f95)) + +### Features + +- Allow RoborockModeEnum parsing by either enum name, value name, or code + ([#711](https://github.com/Python-roborock/python-roborock/pull/711), + [`4725574`](https://github.com/Python-roborock/python-roborock/commit/4725574cb8f14c13e5b66e5051da83d6f2670456)) + +- Allow RoborockModeEnum parsing by either enum name, value name, or code. + ([#711](https://github.com/Python-roborock/python-roborock/pull/711), + [`4725574`](https://github.com/Python-roborock/python-roborock/commit/4725574cb8f14c13e5b66e5051da83d6f2670456)) + +- **api**: Remove original Cloud and Local APIs + ([#713](https://github.com/Python-roborock/python-roborock/pull/713), + [`557810f`](https://github.com/Python-roborock/python-roborock/commit/557810f2d7ad4f56c94d6a981223f90bafdd0b5a)) + +### Breaking Changes + +- **api**: Removes older cloud and local APIs. + + +## v3.21.1 (2025-12-24) + +### Bug Fixes + +- Fix typing for send() for q7 ([#706](https://github.com/Python-roborock/python-roborock/pull/706), + [`1d32f2e`](https://github.com/Python-roborock/python-roborock/commit/1d32f2ef438f34286bb0ed1714d0e7479851a8a8)) + + +## v3.21.0 (2025-12-23) + +### Bug Fixes + +- Add a hook for handling background rate limit errors + ([#695](https://github.com/Python-roborock/python-roborock/pull/695), + [`e38bc9f`](https://github.com/Python-roborock/python-roborock/commit/e38bc9f10bad27b9622d1f6216339426e00d239d)) + +### Chores + +- Add protocol snapshot tests for the mqtt and local e2e tests + ([#697](https://github.com/Python-roborock/python-roborock/pull/697), + [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) + +- Add protocol snapshot tests for the mqtt and local e2e tests. + ([#697](https://github.com/Python-roborock/python-roborock/pull/697), + [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) + +- Address co-pilot review feedback + ([#699](https://github.com/Python-roborock/python-roborock/pull/699), + [`c317f8e`](https://github.com/Python-roborock/python-roborock/commit/c317f8e4e6d4deda755b511f0c382db7fd68b911)) + +- Fix lint ([#697](https://github.com/Python-roborock/python-roborock/pull/697), + [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) + +- Fix lint errors ([#704](https://github.com/Python-roborock/python-roborock/pull/704), + [`b9a241c`](https://github.com/Python-roborock/python-roborock/commit/b9a241c9274a9a204ac5e7c3854e239f64c819c0)) + +- Fix lint errors ([#697](https://github.com/Python-roborock/python-roborock/pull/697), + [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) + +- Fix lint errors ([#695](https://github.com/Python-roborock/python-roborock/pull/695), + [`e38bc9f`](https://github.com/Python-roborock/python-roborock/commit/e38bc9f10bad27b9622d1f6216339426e00d239d)) + +- Fix lint errors ([#699](https://github.com/Python-roborock/python-roborock/pull/699), + [`c317f8e`](https://github.com/Python-roborock/python-roborock/commit/c317f8e4e6d4deda755b511f0c382db7fd68b911)) + +- Fix merge conflicts ([#697](https://github.com/Python-roborock/python-roborock/pull/697), + [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) + +- Organize test fixtures ([#699](https://github.com/Python-roborock/python-roborock/pull/699), + [`c317f8e`](https://github.com/Python-roborock/python-roborock/commit/c317f8e4e6d4deda755b511f0c382db7fd68b911)) + +- Remove duplicate captured request log + ([#699](https://github.com/Python-roborock/python-roborock/pull/699), + [`c317f8e`](https://github.com/Python-roborock/python-roborock/commit/c317f8e4e6d4deda755b511f0c382db7fd68b911)) + +- Remove duplicate params ([#697](https://github.com/Python-roborock/python-roborock/pull/697), + [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) + +- Remove unnecessary whitespace + ([#697](https://github.com/Python-roborock/python-roborock/pull/697), + [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) + +- Resolving merge conflict ([#697](https://github.com/Python-roborock/python-roborock/pull/697), + [`6293a67`](https://github.com/Python-roborock/python-roborock/commit/6293a676e508cb42acf17852c37bf6f69547636a)) + +- Small tweaks to test fixtures + ([#704](https://github.com/Python-roborock/python-roborock/pull/704), + [`b9a241c`](https://github.com/Python-roborock/python-roborock/commit/b9a241c9274a9a204ac5e7c3854e239f64c819c0)) + +- Update device test snapshots ([#704](https://github.com/Python-roborock/python-roborock/pull/704), + [`b9a241c`](https://github.com/Python-roborock/python-roborock/commit/b9a241c9274a9a204ac5e7c3854e239f64c819c0)) + +- Update test fixtures ([#704](https://github.com/Python-roborock/python-roborock/pull/704), + [`b9a241c`](https://github.com/Python-roborock/python-roborock/commit/b9a241c9274a9a204ac5e7c3854e239f64c819c0)) + +- **deps-dev**: Bump pre-commit from 4.5.0 to 4.5.1 + ([#701](https://github.com/Python-roborock/python-roborock/pull/701), + [`8cd51cc`](https://github.com/Python-roborock/python-roborock/commit/8cd51cce07a244813f26b169f6f97b457c6a629f)) + +- **deps-dev**: Bump ruff from 0.14.9 to 0.14.10 + ([#700](https://github.com/Python-roborock/python-roborock/pull/700), + [`942d3a1`](https://github.com/Python-roborock/python-roborock/commit/942d3a1acc335726405decc3a7fc7b7b2fd6e698)) + +### Features + +- Revert whitespace change. ([#704](https://github.com/Python-roborock/python-roborock/pull/704), + [`b9a241c`](https://github.com/Python-roborock/python-roborock/commit/b9a241c9274a9a204ac5e7c3854e239f64c819c0)) + +- Small tweaks to test fixtures + ([#704](https://github.com/Python-roborock/python-roborock/pull/704), + [`b9a241c`](https://github.com/Python-roborock/python-roborock/commit/b9a241c9274a9a204ac5e7c3854e239f64c819c0)) + + +## v3.20.1 (2025-12-22) + +### Bug Fixes + +- Improve debug logs redaction ([#698](https://github.com/Python-roborock/python-roborock/pull/698), + [`067794c`](https://github.com/Python-roborock/python-roborock/commit/067794c0b24847520b423fdaacda679aab550cbd)) + +### Chores + +- Address co-pilot readability comments + ([#698](https://github.com/Python-roborock/python-roborock/pull/698), + [`067794c`](https://github.com/Python-roborock/python-roborock/commit/067794c0b24847520b423fdaacda679aab550cbd)) + + +## v3.20.0 (2025-12-22) + +### Bug Fixes + +- Catch broad exception ([#690](https://github.com/Python-roborock/python-roborock/pull/690), + [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) + +- Lower log level for mqtt channel publish exceptions + ([#696](https://github.com/Python-roborock/python-roborock/pull/696), + [`642004a`](https://github.com/Python-roborock/python-roborock/commit/642004a3d7f439f7d614aa439e6705377c626a11)) + +- Reduce log level of decode errors + ([#691](https://github.com/Python-roborock/python-roborock/pull/691), + [`98d89f0`](https://github.com/Python-roborock/python-roborock/commit/98d89f027c57195869b65123c8396a20e7a7d648)) + +- Try to fix fan setting ([#690](https://github.com/Python-roborock/python-roborock/pull/690), + [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) + +### Chores + +- Add self.send ([#690](https://github.com/Python-roborock/python-roborock/pull/690), + [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) + +- Add testing ([#690](https://github.com/Python-roborock/python-roborock/pull/690), + [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) + +- Address PR comments ([#690](https://github.com/Python-roborock/python-roborock/pull/690), + [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) + +- Change typing ([#690](https://github.com/Python-roborock/python-roborock/pull/690), + [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) + +- Fix tests ([#691](https://github.com/Python-roborock/python-roborock/pull/691), + [`98d89f0`](https://github.com/Python-roborock/python-roborock/commit/98d89f027c57195869b65123c8396a20e7a7d648)) + +- More debug logs and error handling + ([#690](https://github.com/Python-roborock/python-roborock/pull/690), + [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) + +- Move send and add docs ([#690](https://github.com/Python-roborock/python-roborock/pull/690), + [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) + +- Update tests ([#691](https://github.com/Python-roborock/python-roborock/pull/691), + [`98d89f0`](https://github.com/Python-roborock/python-roborock/commit/98d89f027c57195869b65123c8396a20e7a7d648)) + +### Features + +- Add some basic setters for q7 + ([#690](https://github.com/Python-roborock/python-roborock/pull/690), + [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) + +- Add some more actions ([#690](https://github.com/Python-roborock/python-roborock/pull/690), + [`f9f8e43`](https://github.com/Python-roborock/python-roborock/commit/f9f8e43ca97f1136191db92174e937fc1906822d)) + + +## v3.19.1 (2025-12-20) + +### Bug Fixes + +- Revert A01 padding ([#694](https://github.com/Python-roborock/python-roborock/pull/694), + [`ac622cc`](https://github.com/Python-roborock/python-roborock/commit/ac622cc07b497b03981fadd97c039555c31a0bae)) + +### Chores + +- Update snapshot ([#694](https://github.com/Python-roborock/python-roborock/pull/694), + [`ac622cc`](https://github.com/Python-roborock/python-roborock/commit/ac622cc07b497b03981fadd97c039555c31a0bae)) + + +## v3.19.0 (2025-12-17) + +### Bug Fixes + +- Handle AppInitStatus with omitted new_feature_info_str + ([#688](https://github.com/Python-roborock/python-roborock/pull/688), + [`aaeee22`](https://github.com/Python-roborock/python-roborock/commit/aaeee224bc2a715f04ef05b20ef75eb0d2aaa0b9)) + +### Chores + +- Add additional test coverage for default string value + ([#688](https://github.com/Python-roborock/python-roborock/pull/688), + [`aaeee22`](https://github.com/Python-roborock/python-roborock/commit/aaeee224bc2a715f04ef05b20ef75eb0d2aaa0b9)) + +- Add snapshot tests for device payloads + ([#676](https://github.com/Python-roborock/python-roborock/pull/676), + [`cd7ef7c`](https://github.com/Python-roborock/python-roborock/commit/cd7ef7c96a16568efd14e29013cbbfded8fe7d86)) + +- Add socket based tests for the new APIs + ([#677](https://github.com/Python-roborock/python-roborock/pull/677), + [`7d113db`](https://github.com/Python-roborock/python-roborock/commit/7d113db6ea75b4864b7edb1657535ad4dc2b9f8f)) + +- Apply co-pilot suggestion for dataclass initialization + ([#673](https://github.com/Python-roborock/python-roborock/pull/673), + [`33c174b`](https://github.com/Python-roborock/python-roborock/commit/33c174b0685c4dc00df6a81437e9b9995934eb61)) + +- Clean up tests from previous pr + ([#687](https://github.com/Python-roborock/python-roborock/pull/687), + [`211429b`](https://github.com/Python-roborock/python-roborock/commit/211429bdcf188bf248d1f28f123c6297016b458b)) + +- Fix lint errors ([#676](https://github.com/Python-roborock/python-roborock/pull/676), + [`cd7ef7c`](https://github.com/Python-roborock/python-roborock/commit/cd7ef7c96a16568efd14e29013cbbfded8fe7d86)) + +- Fix lint errors in test_device_manager.py + ([#673](https://github.com/Python-roborock/python-roborock/pull/673), + [`33c174b`](https://github.com/Python-roborock/python-roborock/commit/33c174b0685c4dc00df6a81437e9b9995934eb61)) + +- Fix local session ([#677](https://github.com/Python-roborock/python-roborock/pull/677), + [`7d113db`](https://github.com/Python-roborock/python-roborock/commit/7d113db6ea75b4864b7edb1657535ad4dc2b9f8f)) + +- Remove duplicate test ([#673](https://github.com/Python-roborock/python-roborock/pull/673), + [`33c174b`](https://github.com/Python-roborock/python-roborock/commit/33c174b0685c4dc00df6a81437e9b9995934eb61)) + +- Remove unnecessary whitespace + ([#676](https://github.com/Python-roborock/python-roborock/pull/676), + [`cd7ef7c`](https://github.com/Python-roborock/python-roborock/commit/cd7ef7c96a16568efd14e29013cbbfded8fe7d86)) + +- Update default value for new feature string to empty string + ([#688](https://github.com/Python-roborock/python-roborock/pull/688), + [`aaeee22`](https://github.com/Python-roborock/python-roborock/commit/aaeee224bc2a715f04ef05b20ef75eb0d2aaa0b9)) + +- Update roborock/diagnostics.py + ([#673](https://github.com/Python-roborock/python-roborock/pull/673), + [`33c174b`](https://github.com/Python-roborock/python-roborock/commit/33c174b0685c4dc00df6a81437e9b9995934eb61)) + +- Update tests/conftest.py ([#676](https://github.com/Python-roborock/python-roborock/pull/676), + [`cd7ef7c`](https://github.com/Python-roborock/python-roborock/commit/cd7ef7c96a16568efd14e29013cbbfded8fe7d86)) + +### Features + +- Add diagnostics library for tracking stats/counters + ([#673](https://github.com/Python-roborock/python-roborock/pull/673), + [`33c174b`](https://github.com/Python-roborock/python-roborock/commit/33c174b0685c4dc00df6a81437e9b9995934eb61)) + + +## v3.18.0 (2025-12-17) + +### Bug Fixes + +- Use value instead of name to get lower cased + ([#686](https://github.com/Python-roborock/python-roborock/pull/686), + [`728e53a`](https://github.com/Python-roborock/python-roborock/commit/728e53a44949c9044fc64e53725fe0103b43b4a8)) + +### Chores + +- Fix pydoc string ([#674](https://github.com/Python-roborock/python-roborock/pull/674), + [`c576d5f`](https://github.com/Python-roborock/python-roborock/commit/c576d5ff1e1247c20a1b1c0f4895b8870f929734)) + +- Fix typo in README.md ([#685](https://github.com/Python-roborock/python-roborock/pull/685), + [`d01287a`](https://github.com/Python-roborock/python-roborock/commit/d01287a3a9883ee9698fbe6ad9bd95e4e8779b5e)) + +- Improve library user documentation + ([#685](https://github.com/Python-roborock/python-roborock/pull/685), + [`d01287a`](https://github.com/Python-roborock/python-roborock/commit/d01287a3a9883ee9698fbe6ad9bd95e4e8779b5e)) + +- Remove unnecessary assert in test + ([#674](https://github.com/Python-roborock/python-roborock/pull/674), + [`c576d5f`](https://github.com/Python-roborock/python-roborock/commit/c576d5ff1e1247c20a1b1c0f4895b8870f929734)) + +- Style cleanup re-raising a bare exception + ([#674](https://github.com/Python-roborock/python-roborock/pull/674), + [`c576d5f`](https://github.com/Python-roborock/python-roborock/commit/c576d5ff1e1247c20a1b1c0f4895b8870f929734)) + +- Update roborock/data/code_mappings.py + ([#686](https://github.com/Python-roborock/python-roborock/pull/686), + [`728e53a`](https://github.com/Python-roborock/python-roborock/commit/728e53a44949c9044fc64e53725fe0103b43b4a8)) + +- **deps-dev**: Bump pytest from 8.4.2 to 9.0.2 + ([#681](https://github.com/Python-roborock/python-roborock/pull/681), + [`5520a56`](https://github.com/Python-roborock/python-roborock/commit/5520a562f1913e11dea6a007b4b2accb3d30d222)) + +### Features + +- Allow device manager to perform rediscovery of devices + ([#674](https://github.com/Python-roborock/python-roborock/pull/674), + [`c576d5f`](https://github.com/Python-roborock/python-roborock/commit/c576d5ff1e1247c20a1b1c0f4895b8870f929734)) + +- Improvements to B01 for HA integration + ([#686](https://github.com/Python-roborock/python-roborock/pull/686), + [`728e53a`](https://github.com/Python-roborock/python-roborock/commit/728e53a44949c9044fc64e53725fe0103b43b4a8)) + + +## v3.17.0 (2025-12-15) + +### Chores + +- **deps**: Bump python-semantic-release/publish-action + ([#679](https://github.com/Python-roborock/python-roborock/pull/679), + [`3cf1a9a`](https://github.com/Python-roborock/python-roborock/commit/3cf1a9af0d65482c65a14b2d266ff3b134dcb6f8)) + +- **deps**: Bump python-semantic-release/python-semantic-release + ([#680](https://github.com/Python-roborock/python-roborock/pull/680), + [`2afa86c`](https://github.com/Python-roborock/python-roborock/commit/2afa86cdf234ef5626dbf9f2f778d0a3b23ac5a7)) + +- **deps-dev**: Bump mypy from 1.19.0 to 1.19.1 + ([#683](https://github.com/Python-roborock/python-roborock/pull/683), + [`bfb2c63`](https://github.com/Python-roborock/python-roborock/commit/bfb2c63e85d96c2c663686e05c598d0e724685a9)) + +- **deps-dev**: Bump ruff from 0.14.6 to 0.14.9 + ([#682](https://github.com/Python-roborock/python-roborock/pull/682), + [`cfd51e4`](https://github.com/Python-roborock/python-roborock/commit/cfd51e4a75eecb66f60ac137ece36b2fa7583ea9)) + +### Features + +- Improvements to B01 for HA integration + ([#678](https://github.com/Python-roborock/python-roborock/pull/678), + [`97fb0b7`](https://github.com/Python-roborock/python-roborock/commit/97fb0b75ff4aa164d81340d276991537e0c9662e)) + + +## v3.16.1 (2025-12-14) + +### Bug Fixes + +- Share a HealthManager instance across all mqtt channels + ([#672](https://github.com/Python-roborock/python-roborock/pull/672), + [`4ad95dd`](https://github.com/Python-roborock/python-roborock/commit/4ad95ddee4d4d4cd64c7908f150c71d81f45e705)) + + +## v3.16.0 (2025-12-14) + +### Bug Fixes + +- Fix bugs in the subscription idle timeout + ([#665](https://github.com/Python-roborock/python-roborock/pull/665), + [`85b7bee`](https://github.com/Python-roborock/python-roborock/commit/85b7beeb810cfb3d501658cd44f06b2c0052ca33)) + +- Harden the device connection logic used in startup + ([#666](https://github.com/Python-roborock/python-roborock/pull/666), + [`19703f4`](https://github.com/Python-roborock/python-roborock/commit/19703f42fe692a38f8f8639b1136a7585eae76fc)) + +- Harden the initial startup logic + ([#666](https://github.com/Python-roborock/python-roborock/pull/666), + [`19703f4`](https://github.com/Python-roborock/python-roborock/commit/19703f42fe692a38f8f8639b1136a7585eae76fc)) + +### Chores + +- Apply suggestions from code review + ([#675](https://github.com/Python-roborock/python-roborock/pull/675), + [`ab2de5b`](https://github.com/Python-roborock/python-roborock/commit/ab2de5bda7b8e1ff1ad46c7f2bf3b39dc9af4ace)) + +- Clarify comments and docstrings + ([#666](https://github.com/Python-roborock/python-roborock/pull/666), + [`19703f4`](https://github.com/Python-roborock/python-roborock/commit/19703f42fe692a38f8f8639b1136a7585eae76fc)) + +- Fix logging ([#666](https://github.com/Python-roborock/python-roborock/pull/666), + [`19703f4`](https://github.com/Python-roborock/python-roborock/commit/19703f42fe692a38f8f8639b1136a7585eae76fc)) + +- Reduce whitespace changes ([#666](https://github.com/Python-roborock/python-roborock/pull/666), + [`19703f4`](https://github.com/Python-roborock/python-roborock/commit/19703f42fe692a38f8f8639b1136a7585eae76fc)) + +- Revert whitespace change ([#666](https://github.com/Python-roborock/python-roborock/pull/666), + [`19703f4`](https://github.com/Python-roborock/python-roborock/commit/19703f42fe692a38f8f8639b1136a7585eae76fc)) + +### Features + +- Add basic schedule getting ([#675](https://github.com/Python-roborock/python-roborock/pull/675), + [`ab2de5b`](https://github.com/Python-roborock/python-roborock/commit/ab2de5bda7b8e1ff1ad46c7f2bf3b39dc9af4ace)) + + +## v3.15.0 (2025-12-14) + +### Chores + +- Address some comments ([#662](https://github.com/Python-roborock/python-roborock/pull/662), + [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) + +- Apply suggestions from code review + ([#662](https://github.com/Python-roborock/python-roborock/pull/662), + [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) + +- Fix test naming ([#662](https://github.com/Python-roborock/python-roborock/pull/662), + [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) + +- Small tweaks ([#662](https://github.com/Python-roborock/python-roborock/pull/662), + [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) + +- Update roborock/devices/b01_channel.py + ([#662](https://github.com/Python-roborock/python-roborock/pull/662), + [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) + +- Update snapshot ([#662](https://github.com/Python-roborock/python-roborock/pull/662), + [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) + +### Features + +- Add b01 Q7 basic getter support + ([#662](https://github.com/Python-roborock/python-roborock/pull/662), + [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) + +- Add b01 Q7 support ([#662](https://github.com/Python-roborock/python-roborock/pull/662), + [`b3664bc`](https://github.com/Python-roborock/python-roborock/commit/b3664bcc0764d1dfbde2af9588dc0821c3ca1317)) + + +## v3.14.3 (2025-12-14) + +### Bug Fixes + +- Allow firmware version as an optional field + ([#670](https://github.com/Python-roborock/python-roborock/pull/670), + [`0f70bf9`](https://github.com/Python-roborock/python-roborock/commit/0f70bf9dd2010c2c72b3b9543d891a1071dc22c4)) + +### Chores + +- Add test for example offline device + ([#670](https://github.com/Python-roborock/python-roborock/pull/670), + [`0f70bf9`](https://github.com/Python-roborock/python-roborock/commit/0f70bf9dd2010c2c72b3b9543d891a1071dc22c4)) + + +## v3.14.2 (2025-12-14) + +### Bug Fixes + +- Additional device logging improvements + ([#668](https://github.com/Python-roborock/python-roborock/pull/668), + [`a86db71`](https://github.com/Python-roborock/python-roborock/commit/a86db717a07d24b0e6ab471ee814b0853b523918)) + +- Improve device logging ([#668](https://github.com/Python-roborock/python-roborock/pull/668), + [`a86db71`](https://github.com/Python-roborock/python-roborock/commit/a86db717a07d24b0e6ab471ee814b0853b523918)) + +### Chores + +- Further readability improvements to device logging + ([#668](https://github.com/Python-roborock/python-roborock/pull/668), + [`a86db71`](https://github.com/Python-roborock/python-roborock/commit/a86db717a07d24b0e6ab471ee814b0853b523918)) + +- Improve device logging container summary string + ([#668](https://github.com/Python-roborock/python-roborock/pull/668), + [`a86db71`](https://github.com/Python-roborock/python-roborock/commit/a86db717a07d24b0e6ab471ee814b0853b523918)) + + +## v3.14.1 (2025-12-14) + +### Bug Fixes + +- Fix diagnostic data redaction to use camelized keys + ([#669](https://github.com/Python-roborock/python-roborock/pull/669), + [`6a20e27`](https://github.com/Python-roborock/python-roborock/commit/6a20e27506d01fbb30683c2d74d26ab073aa3036)) + +### Chores + +- Remove redundant/broken part of the readme + ([#667](https://github.com/Python-roborock/python-roborock/pull/667), + [`b629a61`](https://github.com/Python-roborock/python-roborock/commit/b629a61f28f3bb64914a9bc461ce9f7a27a30c35)) + +- **deps**: Bump pdoc from 15.0.4 to 16.0.0 + ([#652](https://github.com/Python-roborock/python-roborock/pull/652), + [`5f4c14e`](https://github.com/Python-roborock/python-roborock/commit/5f4c14ead4eda21cd6954e3898d79a6eaa983f62)) + + +## v3.14.0 (2025-12-14) + +### Bug Fixes + +- Add device logger ([#663](https://github.com/Python-roborock/python-roborock/pull/663), + [`06d051c`](https://github.com/Python-roborock/python-roborock/commit/06d051c7b8203e23970d52d65abec88a2757227f)) + +- Update roborock/devices/device.py + ([#664](https://github.com/Python-roborock/python-roborock/pull/664), + [`494c5b4`](https://github.com/Python-roborock/python-roborock/commit/494c5b4f2b447f12f5ef90167cad16e08a8230ac)) + +### Chores + +- Add details about test structure + ([#633](https://github.com/Python-roborock/python-roborock/pull/633), + [`109d05b`](https://github.com/Python-roborock/python-roborock/commit/109d05ba86275f2cdd65c5cda12fc423cbfb5850)) + +- Add more tests for already connected devices + ([#664](https://github.com/Python-roborock/python-roborock/pull/664), + [`494c5b4`](https://github.com/Python-roborock/python-roborock/commit/494c5b4f2b447f12f5ef90167cad16e08a8230ac)) + +- Apply suggestions from code review + ([#663](https://github.com/Python-roborock/python-roborock/pull/663), + [`06d051c`](https://github.com/Python-roborock/python-roborock/commit/06d051c7b8203e23970d52d65abec88a2757227f)) + +- Document combined mqtt channels + ([#633](https://github.com/Python-roborock/python-roborock/pull/633), + [`109d05b`](https://github.com/Python-roborock/python-roborock/commit/109d05ba86275f2cdd65c5cda12fc423cbfb5850)) + +- Fix lint errors ([#664](https://github.com/Python-roborock/python-roborock/pull/664), + [`494c5b4`](https://github.com/Python-roborock/python-roborock/commit/494c5b4f2b447f12f5ef90167cad16e08a8230ac)) + +- Fix lint errors ([#633](https://github.com/Python-roborock/python-roborock/pull/633), + [`109d05b`](https://github.com/Python-roborock/python-roborock/commit/109d05ba86275f2cdd65c5cda12fc423cbfb5850)) + +- Fix lint errors in readme ([#633](https://github.com/Python-roborock/python-roborock/pull/633), + [`109d05b`](https://github.com/Python-roborock/python-roborock/commit/109d05ba86275f2cdd65c5cda12fc423cbfb5850)) + +- Fix typo ([#633](https://github.com/Python-roborock/python-roborock/pull/633), + [`109d05b`](https://github.com/Python-roborock/python-roborock/commit/109d05ba86275f2cdd65c5cda12fc423cbfb5850)) + +- Update device traits by protocol + ([#633](https://github.com/Python-roborock/python-roborock/pull/633), + [`109d05b`](https://github.com/Python-roborock/python-roborock/commit/109d05ba86275f2cdd65c5cda12fc423cbfb5850)) + +- Update devices documentation with design details + ([#633](https://github.com/Python-roborock/python-roborock/pull/633), + [`109d05b`](https://github.com/Python-roborock/python-roborock/commit/109d05ba86275f2cdd65c5cda12fc423cbfb5850)) + +- Use the existing device logger + ([#663](https://github.com/Python-roborock/python-roborock/pull/663), + [`06d051c`](https://github.com/Python-roborock/python-roborock/commit/06d051c7b8203e23970d52d65abec88a2757227f)) + +### Features + +- Add ability to listen for ready devices + ([#664](https://github.com/Python-roborock/python-roborock/pull/664), + [`494c5b4`](https://github.com/Python-roborock/python-roborock/commit/494c5b4f2b447f12f5ef90167cad16e08a8230ac)) + + +## v3.13.1 (2025-12-12) + +### Bug Fixes + +- Clean up some naming ([#635](https://github.com/Python-roborock/python-roborock/pull/635), + [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) + +- Update roborock/devices/traits/b01/__init__.py + ([#635](https://github.com/Python-roborock/python-roborock/pull/635), + [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) + +- Use strip not split ([#635](https://github.com/Python-roborock/python-roborock/pull/635), + [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) + +### Chores + +- Refactor to separate b01 q7 and q10 logic + ([#635](https://github.com/Python-roborock/python-roborock/pull/635), + [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) + +- Refactor to seperate b01 ss and sc logic + ([#635](https://github.com/Python-roborock/python-roborock/pull/635), + [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) + +- Share duplicated code ([#635](https://github.com/Python-roborock/python-roborock/pull/635), + [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) + +- Update roborock/devices/device_manager.py + ([#635](https://github.com/Python-roborock/python-roborock/pull/635), + [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) + +- Update roborock/devices/traits/b01/q7/__init__.py + ([#635](https://github.com/Python-roborock/python-roborock/pull/635), + [`9a1a360`](https://github.com/Python-roborock/python-roborock/commit/9a1a3600fb3eff612088e9203a04f795678e9da7)) + + +## v3.13.0 (2025-12-12) + +### Bug Fixes + +- Update device cache handling in cli + ([#660](https://github.com/Python-roborock/python-roborock/pull/660), + [`405a4fb`](https://github.com/Python-roborock/python-roborock/commit/405a4fba281b09269c0a065f79dedfd9dc9b5a8b)) + +- Update device cache handling in cli. + ([#660](https://github.com/Python-roborock/python-roborock/pull/660), + [`405a4fb`](https://github.com/Python-roborock/python-roborock/commit/405a4fba281b09269c0a065f79dedfd9dc9b5a8b)) + +### Features + +- Add additional fields to HomeDataDevice class + ([#660](https://github.com/Python-roborock/python-roborock/pull/660), + [`405a4fb`](https://github.com/Python-roborock/python-roborock/commit/405a4fba281b09269c0a065f79dedfd9dc9b5a8b)) + + +## v3.12.2 (2025-12-10) + +### Bug Fixes + +- Filter tests to be warnings only + ([#656](https://github.com/Python-roborock/python-roborock/pull/656), + [`e725eab`](https://github.com/Python-roborock/python-roborock/commit/e725eabab7c498569c5e17be9a7b435c917745f1)) + +- Handle random length bytes before version bytes + ([#656](https://github.com/Python-roborock/python-roborock/pull/656), + [`e725eab`](https://github.com/Python-roborock/python-roborock/commit/e725eabab7c498569c5e17be9a7b435c917745f1)) + +### Chores + +- Add debug to help us determine if buffer is source of problem + ([#656](https://github.com/Python-roborock/python-roborock/pull/656), + [`e725eab`](https://github.com/Python-roborock/python-roborock/commit/e725eabab7c498569c5e17be9a7b435c917745f1)) + +- Apply suggestions from code review + ([#656](https://github.com/Python-roborock/python-roborock/pull/656), + [`e725eab`](https://github.com/Python-roborock/python-roborock/commit/e725eabab7c498569c5e17be9a7b435c917745f1)) + +- Only log if remaining ([#656](https://github.com/Python-roborock/python-roborock/pull/656), + [`e725eab`](https://github.com/Python-roborock/python-roborock/commit/e725eabab7c498569c5e17be9a7b435c917745f1)) + +- Update roborock/protocol.py ([#656](https://github.com/Python-roborock/python-roborock/pull/656), + [`e725eab`](https://github.com/Python-roborock/python-roborock/commit/e725eabab7c498569c5e17be9a7b435c917745f1)) + + +## v3.12.1 (2025-12-10) + +### Bug Fixes + +- Redact additional keys from diagnostic data + ([#659](https://github.com/Python-roborock/python-roborock/pull/659), + [`0330755`](https://github.com/Python-roborock/python-roborock/commit/033075559fb63f696073e235d36f4a906c324881)) + +### Chores + +- Update comments on redaction ([#659](https://github.com/Python-roborock/python-roborock/pull/659), + [`0330755`](https://github.com/Python-roborock/python-roborock/commit/033075559fb63f696073e235d36f4a906c324881)) + + +## v3.12.0 (2025-12-10) + +### Bug Fixes + +- Align V4 code login with app ([#657](https://github.com/Python-roborock/python-roborock/pull/657), + [`2328d45`](https://github.com/Python-roborock/python-roborock/commit/2328d4596c6bda35686944880b601c35b390ac9c)) + +### Chores + +- **deps**: Bump mypy from 1.18.2 to 1.19.0 + ([#654](https://github.com/Python-roborock/python-roborock/pull/654), + [`2799a19`](https://github.com/Python-roborock/python-roborock/commit/2799a19263a511a2d141a97cdb6e9814961a4b0f)) + +- **deps**: Bump syrupy from 4.9.1 to 5.0.0 + ([#655](https://github.com/Python-roborock/python-roborock/pull/655), + [`cc2d00f`](https://github.com/Python-roborock/python-roborock/commit/cc2d00fdd21968c0cfe8da8704644dc2c7ff8091)) + +### Features + +- Log when we see a new key we have never seen before for easier reverse engineering + ([#658](https://github.com/Python-roborock/python-roborock/pull/658), + [`81dde05`](https://github.com/Python-roborock/python-roborock/commit/81dde05eac61e7dc6e0fdb9eb0b7e0ffc97cf9d8)) + + +## v3.11.1 (2025-12-10) + +### Bug Fixes + +- Throw MQTT authentication errors as authentication related exceptions + ([#634](https://github.com/Python-roborock/python-roborock/pull/634), + [`4ad9bcd`](https://github.com/Python-roborock/python-roborock/commit/4ad9bcdc1eddc3a0698056fce19f33d0ea0a119b)) + +- Update the exception handling behavior to account for ambiguity + ([#634](https://github.com/Python-roborock/python-roborock/pull/634), + [`4ad9bcd`](https://github.com/Python-roborock/python-roborock/commit/4ad9bcdc1eddc3a0698056fce19f33d0ea0a119b)) + + +## v3.11.0 (2025-12-10) + +### Features + +- Add mappings for cleaning fluid states + ([#636](https://github.com/Python-roborock/python-roborock/pull/636), + [`32c717e`](https://github.com/Python-roborock/python-roborock/commit/32c717ebdcc963af691398d176b7175c59d7616c)) + + +## v3.10.10 (2025-12-08) + +### Bug Fixes + +- Fix exception when sending dyad/zeo requests + ([#651](https://github.com/Python-roborock/python-roborock/pull/651), + [`a1014a6`](https://github.com/Python-roborock/python-roborock/commit/a1014a60320c45d82c80c2c47f2cb7cc6f242252)) + +### Chores + +- Fix lint ([#651](https://github.com/Python-roborock/python-roborock/pull/651), + [`a1014a6`](https://github.com/Python-roborock/python-roborock/commit/a1014a60320c45d82c80c2c47f2cb7cc6f242252)) + +- Fix tests to be focused on value encoder + ([#651](https://github.com/Python-roborock/python-roborock/pull/651), + [`a1014a6`](https://github.com/Python-roborock/python-roborock/commit/a1014a60320c45d82c80c2c47f2cb7cc6f242252)) + + +## v3.10.9 (2025-12-07) + +### Bug Fixes + +- Convert a01 values ([#647](https://github.com/Python-roborock/python-roborock/pull/647), + [`f875e7a`](https://github.com/Python-roborock/python-roborock/commit/f875e7a65f5f422da97d0f2881956ec077c8a7df)) + +- Update tests and conversion logic + ([#647](https://github.com/Python-roborock/python-roborock/pull/647), + [`f875e7a`](https://github.com/Python-roborock/python-roborock/commit/f875e7a65f5f422da97d0f2881956ec077c8a7df)) + +### Chores + +- Small changes to comments ([#647](https://github.com/Python-roborock/python-roborock/pull/647), + [`f875e7a`](https://github.com/Python-roborock/python-roborock/commit/f875e7a65f5f422da97d0f2881956ec077c8a7df)) + + +## v3.10.8 (2025-12-07) + +### Bug Fixes + +- Encode a01 values as json strings + ([#645](https://github.com/Python-roborock/python-roborock/pull/645), + [`7301a2a`](https://github.com/Python-roborock/python-roborock/commit/7301a2a7145b3ffa862b5ae83f2961b1b28b2867)) + +- Update where the string conversion happens + ([#645](https://github.com/Python-roborock/python-roborock/pull/645), + [`7301a2a`](https://github.com/Python-roborock/python-roborock/commit/7301a2a7145b3ffa862b5ae83f2961b1b28b2867)) + +### Chores + +- Remove unnecessary imports ([#645](https://github.com/Python-roborock/python-roborock/pull/645), + [`7301a2a`](https://github.com/Python-roborock/python-roborock/commit/7301a2a7145b3ffa862b5ae83f2961b1b28b2867)) + +- Update tests to capture bug fix + ([#645](https://github.com/Python-roborock/python-roborock/pull/645), + [`7301a2a`](https://github.com/Python-roborock/python-roborock/commit/7301a2a7145b3ffa862b5ae83f2961b1b28b2867)) + + +## v3.10.7 (2025-12-07) + +### Bug Fixes + +- Add test coverage for a01 traits + ([#649](https://github.com/Python-roborock/python-roborock/pull/649), + [`89874cb`](https://github.com/Python-roborock/python-roborock/commit/89874cb5de97362c29d31f50916b2355e1d3f90f)) + +### Chores + +- Add codecov support ([#646](https://github.com/Python-roborock/python-roborock/pull/646), + [`3928280`](https://github.com/Python-roborock/python-roborock/commit/39282809217ec6d4b6e0c4f4f7729fbfd48ecadb)) + +- Add more test coverage for a01 API and fix `False` value handling + ([#648](https://github.com/Python-roborock/python-roborock/pull/648), + [`4bd9b18`](https://github.com/Python-roborock/python-roborock/commit/4bd9b18fddf4df6e05c185ff23d8be2d8fa90763)) + +- Fix lint errors in tests ([#648](https://github.com/Python-roborock/python-roborock/pull/648), + [`4bd9b18`](https://github.com/Python-roborock/python-roborock/commit/4bd9b18fddf4df6e05c185ff23d8be2d8fa90763)) + +- Use raw return values ([#649](https://github.com/Python-roborock/python-roborock/pull/649), + [`89874cb`](https://github.com/Python-roborock/python-roborock/commit/89874cb5de97362c29d31f50916b2355e1d3f90f)) + + +## v3.10.6 (2025-12-07) + +### Bug Fixes + +- Handle base64 serializing wrong + ([#643](https://github.com/Python-roborock/python-roborock/pull/643), + [`d933ec8`](https://github.com/Python-roborock/python-roborock/commit/d933ec82f470fec47339f938065ab70a635112fd)) + + +## v3.10.5 (2025-12-07) + +### Bug Fixes + +- Consider RPC channel health based on MQTT session + ([#642](https://github.com/Python-roborock/python-roborock/pull/642), + [`b1738fe`](https://github.com/Python-roborock/python-roborock/commit/b1738fec4edde302c5f0fb478146faaa3d864ee8)) + + +## v3.10.4 (2025-12-07) + +### Bug Fixes + +- Lower log level for internal protocol connection details + ([#637](https://github.com/Python-roborock/python-roborock/pull/637), + [`6945c6a`](https://github.com/Python-roborock/python-roborock/commit/6945c6ad25f39930cdea23d2f7004824f681a6e7)) + +- Revert CLIENT_KEEPALIVE back to 60 + ([#641](https://github.com/Python-roborock/python-roborock/pull/641), + [`632b88b`](https://github.com/Python-roborock/python-roborock/commit/632b88b22e2ac722c5c4849b7b217fa4a88f757c)) + +### Chores + +- Fix lint erors ([#637](https://github.com/Python-roborock/python-roborock/pull/637), + [`6945c6a`](https://github.com/Python-roborock/python-roborock/commit/6945c6ad25f39930cdea23d2f7004824f681a6e7)) + +- Remove tests for logging ([#637](https://github.com/Python-roborock/python-roborock/pull/637), + [`6945c6a`](https://github.com/Python-roborock/python-roborock/commit/6945c6ad25f39930cdea23d2f7004824f681a6e7)) + + +## v3.10.3 (2025-12-06) + +### Bug Fixes + +- Ensure immediate local connection is attempted + ([#640](https://github.com/Python-roborock/python-roborock/pull/640), + [`3c918ae`](https://github.com/Python-roborock/python-roborock/commit/3c918aec33483b93ae9d632cc4ada286b6761b70)) + +- Fix mqtt rate limiting and broken local connections + ([#638](https://github.com/Python-roborock/python-roborock/pull/638), + [`4249769`](https://github.com/Python-roborock/python-roborock/commit/42497696e92dad79147e404be96e73b9e408bd0b)) + +### Chores + +- Add back test case and add test ids + ([#638](https://github.com/Python-roborock/python-roborock/pull/638), + [`4249769`](https://github.com/Python-roborock/python-roborock/commit/42497696e92dad79147e404be96e73b9e408bd0b)) + +- Fix lint errors ([#640](https://github.com/Python-roborock/python-roborock/pull/640), + [`3c918ae`](https://github.com/Python-roborock/python-roborock/commit/3c918aec33483b93ae9d632cc4ada286b6761b70)) + +- Fix lint errors ([#638](https://github.com/Python-roborock/python-roborock/pull/638), + [`4249769`](https://github.com/Python-roborock/python-roborock/commit/42497696e92dad79147e404be96e73b9e408bd0b)) + +- Update roborock/devices/v1_channel.py + ([#638](https://github.com/Python-roborock/python-roborock/pull/638), + [`4249769`](https://github.com/Python-roborock/python-roborock/commit/42497696e92dad79147e404be96e73b9e408bd0b)) + + +## v3.10.2 (2025-12-05) + +### Bug Fixes + +- Keep MQTT topic subscriptions alive with an idle timeout + ([#632](https://github.com/Python-roborock/python-roborock/pull/632), + [`d0d2e42`](https://github.com/Python-roborock/python-roborock/commit/d0d2e425e3005f3f83f4a57079fcef4736171b7a)) + +### Chores + +- Add tests that reproduce key parsing bugs + ([#631](https://github.com/Python-roborock/python-roborock/pull/631), + [`87e14a2`](https://github.com/Python-roborock/python-roborock/commit/87e14a265a6c6bbe18fbe63f360ca57ca63db9c3)) + +- Fix lint errors ([#631](https://github.com/Python-roborock/python-roborock/pull/631), + [`87e14a2`](https://github.com/Python-roborock/python-roborock/commit/87e14a265a6c6bbe18fbe63f360ca57ca63db9c3)) + + +## v3.10.1 (2025-12-05) + +### Bug Fixes + +- Add fallback ([#630](https://github.com/Python-roborock/python-roborock/pull/630), + [`e4fa8c6`](https://github.com/Python-roborock/python-roborock/commit/e4fa8c60bb29978b06704ce22dc4a2cda0e28875)) + +- Ensure keys are correct type when serializing from data + ([#630](https://github.com/Python-roborock/python-roborock/pull/630), + [`e4fa8c6`](https://github.com/Python-roborock/python-roborock/commit/e4fa8c60bb29978b06704ce22dc4a2cda0e28875)) + +- Ensure keys are valid type when serializing from data + ([#630](https://github.com/Python-roborock/python-roborock/pull/630), + [`e4fa8c6`](https://github.com/Python-roborock/python-roborock/commit/e4fa8c60bb29978b06704ce22dc4a2cda0e28875)) + + +## v3.10.0 (2025-12-04) + +### Bug Fixes + +- Catch UnicodeDecodeError when parsing messages + ([#629](https://github.com/Python-roborock/python-roborock/pull/629), + [`e8c3b75`](https://github.com/Python-roborock/python-roborock/commit/e8c3b75a9d3efb8ff79a6d4e8544549a5abe766a)) + +- Reset keep_alive_task to None + ([#627](https://github.com/Python-roborock/python-roborock/pull/627), + [`a802f66`](https://github.com/Python-roborock/python-roborock/commit/a802f66fec913be82a25ae45d96555c2d328964b)) + +### Chores + +- Copilot test ([#627](https://github.com/Python-roborock/python-roborock/pull/627), + [`a802f66`](https://github.com/Python-roborock/python-roborock/commit/a802f66fec913be82a25ae45d96555c2d328964b)) + +### Features + +- Add comprehensive test coverage for keep-alive functionality + ([#627](https://github.com/Python-roborock/python-roborock/pull/627), + [`a802f66`](https://github.com/Python-roborock/python-roborock/commit/a802f66fec913be82a25ae45d96555c2d328964b)) + +- Add pinging to local client ([#627](https://github.com/Python-roborock/python-roborock/pull/627), + [`a802f66`](https://github.com/Python-roborock/python-roborock/commit/a802f66fec913be82a25ae45d96555c2d328964b)) + +### Refactoring + +- Address code review feedback on keep-alive tests + ([#627](https://github.com/Python-roborock/python-roborock/pull/627), + [`a802f66`](https://github.com/Python-roborock/python-roborock/commit/a802f66fec913be82a25ae45d96555c2d328964b)) + + +## v3.9.3 (2025-12-03) + +### Bug Fixes + +- Use correct index for clean records + ([#620](https://github.com/Python-roborock/python-roborock/pull/620), + [`f129603`](https://github.com/Python-roborock/python-roborock/commit/f1296032e7b8c8c1348882d58e9da5ecc8287eee)) + + +## v3.9.2 (2025-12-03) + +### Bug Fixes + +- Add device info getters and setters + ([#614](https://github.com/Python-roborock/python-roborock/pull/614), + [`ee02a71`](https://github.com/Python-roborock/python-roborock/commit/ee02a71a8d99848256f2bb69533e9d1827f52585)) + +- Fix issues with the cache clobbering information for each device + ([#614](https://github.com/Python-roborock/python-roborock/pull/614), + [`ee02a71`](https://github.com/Python-roborock/python-roborock/commit/ee02a71a8d99848256f2bb69533e9d1827f52585)) + +- Update DeviceCache interface ([#614](https://github.com/Python-roborock/python-roborock/pull/614), + [`ee02a71`](https://github.com/Python-roborock/python-roborock/commit/ee02a71a8d99848256f2bb69533e9d1827f52585)) + +### Chores + +- Fix test snapshots ([#614](https://github.com/Python-roborock/python-roborock/pull/614), + [`ee02a71`](https://github.com/Python-roborock/python-roborock/commit/ee02a71a8d99848256f2bb69533e9d1827f52585)) + +- Remove unnecessary imports ([#614](https://github.com/Python-roborock/python-roborock/pull/614), + [`ee02a71`](https://github.com/Python-roborock/python-roborock/commit/ee02a71a8d99848256f2bb69533e9d1827f52585)) + + +## v3.9.1 (2025-12-03) + +### Bug Fixes + +- Fix DeviceFeatures so that it can be serialized and deserialized properly. + ([#615](https://github.com/Python-roborock/python-roborock/pull/615), + [`88b2055`](https://github.com/Python-roborock/python-roborock/commit/88b2055a7aea50d8b45bfb07c3a937b6d8d267d0)) + + +## v3.9.0 (2025-12-03) + +### Bug Fixes + +- Set default arugments to store/load value functions + ([#613](https://github.com/Python-roborock/python-roborock/pull/613), + [`ce3d88d`](https://github.com/Python-roborock/python-roborock/commit/ce3d88dd52e78adccf7f705d4076cc963bbe9724)) + +### Chores + +- Remove unncessary logging ([#613](https://github.com/Python-roborock/python-roborock/pull/613), + [`ce3d88d`](https://github.com/Python-roborock/python-roborock/commit/ce3d88dd52e78adccf7f705d4076cc963bbe9724)) + +- Remove unnecessary snapshot files + ([#613](https://github.com/Python-roborock/python-roborock/pull/613), + [`ce3d88d`](https://github.com/Python-roborock/python-roborock/commit/ce3d88dd52e78adccf7f705d4076cc963bbe9724)) + +- Remove unused import ([#613](https://github.com/Python-roborock/python-roborock/pull/613), + [`ce3d88d`](https://github.com/Python-roborock/python-roborock/commit/ce3d88dd52e78adccf7f705d4076cc963bbe9724)) + +### Features + +- Make CacheData serializable ([#613](https://github.com/Python-roborock/python-roborock/pull/613), + [`ce3d88d`](https://github.com/Python-roborock/python-roborock/commit/ce3d88dd52e78adccf7f705d4076cc963bbe9724)) + + +## v3.8.5 (2025-11-29) + +### Bug Fixes + +- Remove python 3.11 incompatibility + ([#609](https://github.com/Python-roborock/python-roborock/pull/609), + [`f3487e8`](https://github.com/Python-roborock/python-roborock/commit/f3487e8ec478e000d1330745dff178125796bfb5)) + +### Chores + +- Fix v1 channel typing and improve readability + ([#609](https://github.com/Python-roborock/python-roborock/pull/609), + [`f3487e8`](https://github.com/Python-roborock/python-roborock/commit/f3487e8ec478e000d1330745dff178125796bfb5)) + +- Improve doc string readability and grammar + ([#609](https://github.com/Python-roborock/python-roborock/pull/609), + [`f3487e8`](https://github.com/Python-roborock/python-roborock/commit/f3487e8ec478e000d1330745dff178125796bfb5)) + +- Refactor v1 rpc channels ([#609](https://github.com/Python-roborock/python-roborock/pull/609), + [`f3487e8`](https://github.com/Python-roborock/python-roborock/commit/f3487e8ec478e000d1330745dff178125796bfb5)) + +- Remove unnecessary docstrings + ([#609](https://github.com/Python-roborock/python-roborock/pull/609), + [`f3487e8`](https://github.com/Python-roborock/python-roborock/commit/f3487e8ec478e000d1330745dff178125796bfb5)) + +- Remove unnecessary pydoc on private members + ([#609](https://github.com/Python-roborock/python-roborock/pull/609), + [`f3487e8`](https://github.com/Python-roborock/python-roborock/commit/f3487e8ec478e000d1330745dff178125796bfb5)) + +- Remove unnecessary pydoc to make the code more compact + ([#609](https://github.com/Python-roborock/python-roborock/pull/609), + [`f3487e8`](https://github.com/Python-roborock/python-roborock/commit/f3487e8ec478e000d1330745dff178125796bfb5)) + + +## v3.8.4 (2025-11-29) + +### Bug Fixes + +- Encode map content bytes as base64 + ([#608](https://github.com/Python-roborock/python-roborock/pull/608), + [`27c61f9`](https://github.com/Python-roborock/python-roborock/commit/27c61f9b7958edb5b4ca374e60898eb966163802)) + +- Fallback to the cached network information on failure + ([#606](https://github.com/Python-roborock/python-roborock/pull/606), + [`80d7d5a`](https://github.com/Python-roborock/python-roborock/commit/80d7d5af72629e83fbc7f2bf418ccecd793dbd58)) + +- Fallback to the cached network information when failing to lookup network info + ([#606](https://github.com/Python-roborock/python-roborock/pull/606), + [`80d7d5a`](https://github.com/Python-roborock/python-roborock/commit/80d7d5af72629e83fbc7f2bf418ccecd793dbd58)) + +- Improve partial update code ([#608](https://github.com/Python-roborock/python-roborock/pull/608), + [`27c61f9`](https://github.com/Python-roborock/python-roborock/commit/27c61f9b7958edb5b4ca374e60898eb966163802)) + +### Chores + +- Update roborock/devices/v1_channel.py + ([#606](https://github.com/Python-roborock/python-roborock/pull/606), + [`80d7d5a`](https://github.com/Python-roborock/python-roborock/commit/80d7d5af72629e83fbc7f2bf418ccecd793dbd58)) + + +## v3.8.3 (2025-11-29) + +### Bug Fixes + +- Add a health manager for restarting unhealthy mqtt connections + ([#605](https://github.com/Python-roborock/python-roborock/pull/605), + [`879a641`](https://github.com/Python-roborock/python-roborock/commit/879a6412aafe8e7d0ba7a16e867ff3028873fd02)) + +- Add ability to restart the mqtt session + ([#605](https://github.com/Python-roborock/python-roborock/pull/605), + [`879a641`](https://github.com/Python-roborock/python-roborock/commit/879a6412aafe8e7d0ba7a16e867ff3028873fd02)) + +- Reset start_future each loop ([#605](https://github.com/Python-roborock/python-roborock/pull/605), + [`879a641`](https://github.com/Python-roborock/python-roborock/commit/879a6412aafe8e7d0ba7a16e867ff3028873fd02)) + +### Chores + +- Always use utc for now ([#605](https://github.com/Python-roborock/python-roborock/pull/605), + [`879a641`](https://github.com/Python-roborock/python-roborock/commit/879a6412aafe8e7d0ba7a16e867ff3028873fd02)) + +- Cancel the connection and reconnect tasks + ([#605](https://github.com/Python-roborock/python-roborock/pull/605), + [`879a641`](https://github.com/Python-roborock/python-roborock/commit/879a6412aafe8e7d0ba7a16e867ff3028873fd02)) + +- Fix async tests ([#605](https://github.com/Python-roborock/python-roborock/pull/605), + [`879a641`](https://github.com/Python-roborock/python-roborock/commit/879a6412aafe8e7d0ba7a16e867ff3028873fd02)) + + +## v3.8.2 (2025-11-28) + +### Bug Fixes + +- Fix device feature discovery ([#603](https://github.com/Python-roborock/python-roborock/pull/603), + [`d048001`](https://github.com/Python-roborock/python-roborock/commit/d0480015550edbe3e978902e141563e9c537fad1)) + +### Chores + +- Revert requires_feature ([#603](https://github.com/Python-roborock/python-roborock/pull/603), + [`d048001`](https://github.com/Python-roborock/python-roborock/commit/d0480015550edbe3e978902e141563e9c537fad1)) + + +## v3.8.1 (2025-11-26) + +### Bug Fixes + +- Attempt to fix l01 ([#593](https://github.com/Python-roborock/python-roborock/pull/593), + [`87e60d9`](https://github.com/Python-roborock/python-roborock/commit/87e60d9a9cb99ef9ddf99b1691baa2573db4221d)) + +- Decoding l01 ([#593](https://github.com/Python-roborock/python-roborock/pull/593), + [`87e60d9`](https://github.com/Python-roborock/python-roborock/commit/87e60d9a9cb99ef9ddf99b1691baa2573db4221d)) + +- Ensure traits to always reflect the the status of commands + ([#592](https://github.com/Python-roborock/python-roborock/pull/592), + [`3d0ad74`](https://github.com/Python-roborock/python-roborock/commit/3d0ad74954948ebf0ea5c1a144aff3f9d111b1f7)) + +- Fix L01 encoding and decoding + ([#593](https://github.com/Python-roborock/python-roborock/pull/593), + [`87e60d9`](https://github.com/Python-roborock/python-roborock/commit/87e60d9a9cb99ef9ddf99b1691baa2573db4221d)) + +- Temp cache of protocol version until restart + ([#593](https://github.com/Python-roborock/python-roborock/pull/593), + [`87e60d9`](https://github.com/Python-roborock/python-roborock/commit/87e60d9a9cb99ef9ddf99b1691baa2573db4221d)) + +- Update bad asserts found by co-pilot + ([#592](https://github.com/Python-roborock/python-roborock/pull/592), + [`3d0ad74`](https://github.com/Python-roborock/python-roborock/commit/3d0ad74954948ebf0ea5c1a144aff3f9d111b1f7)) + +- Update the messages callback to not mutate the protocol once created. + ([#593](https://github.com/Python-roborock/python-roborock/pull/593), + [`87e60d9`](https://github.com/Python-roborock/python-roborock/commit/87e60d9a9cb99ef9ddf99b1691baa2573db4221d)) + +### Chores + +- Add comments everywhere on implicit refreshes + ([#592](https://github.com/Python-roborock/python-roborock/pull/592), + [`3d0ad74`](https://github.com/Python-roborock/python-roborock/commit/3d0ad74954948ebf0ea5c1a144aff3f9d111b1f7)) + +- Fix lint errors ([#593](https://github.com/Python-roborock/python-roborock/pull/593), + [`87e60d9`](https://github.com/Python-roborock/python-roborock/commit/87e60d9a9cb99ef9ddf99b1691baa2573db4221d)) + +- Fix typos ([#592](https://github.com/Python-roborock/python-roborock/pull/592), + [`3d0ad74`](https://github.com/Python-roborock/python-roborock/commit/3d0ad74954948ebf0ea5c1a144aff3f9d111b1f7)) + +- Remove unnecessary whitespace + ([#592](https://github.com/Python-roborock/python-roborock/pull/592), + [`3d0ad74`](https://github.com/Python-roborock/python-roborock/commit/3d0ad74954948ebf0ea5c1a144aff3f9d111b1f7)) + +- Update roborock/devices/traits/v1/common.py + ([#592](https://github.com/Python-roborock/python-roborock/pull/592), + [`3d0ad74`](https://github.com/Python-roborock/python-roborock/commit/3d0ad74954948ebf0ea5c1a144aff3f9d111b1f7)) + +- Update working for the CommandTrait + ([#592](https://github.com/Python-roborock/python-roborock/pull/592), + [`3d0ad74`](https://github.com/Python-roborock/python-roborock/commit/3d0ad74954948ebf0ea5c1a144aff3f9d111b1f7)) + +- **deps**: Bump actions/checkout from 5 to 6 + ([#598](https://github.com/Python-roborock/python-roborock/pull/598), + [`a9e91ae`](https://github.com/Python-roborock/python-roborock/commit/a9e91aedaed142f433d52c8b21b3fda3a1f62450)) + +- **deps**: Bump click from 8.3.0 to 8.3.1 + ([#594](https://github.com/Python-roborock/python-roborock/pull/594), + [`4b5d6bb`](https://github.com/Python-roborock/python-roborock/commit/4b5d6bb0044deef158484b712f75ef3ab76f1cef)) + +- **deps**: Bump pre-commit from 4.4.0 to 4.5.0 + ([#602](https://github.com/Python-roborock/python-roborock/pull/602), + [`50b70a4`](https://github.com/Python-roborock/python-roborock/commit/50b70a454dd80c1b41df855496c72818ecf30cea)) + +- **deps**: Bump pytest-asyncio from 1.2.0 to 1.3.0 + ([#596](https://github.com/Python-roborock/python-roborock/pull/596), + [`ee85762`](https://github.com/Python-roborock/python-roborock/commit/ee85762ebe34663c25c3c05509a265f2d624b3ab)) + +- **deps**: Bump python-semantic-release/publish-action + ([#599](https://github.com/Python-roborock/python-roborock/pull/599), + [`bcfe314`](https://github.com/Python-roborock/python-roborock/commit/bcfe3141fde31b1930c54ac1ce8f0a3aef9adea7)) + +- **deps**: Bump python-semantic-release/python-semantic-release + ([#600](https://github.com/Python-roborock/python-roborock/pull/600), + [`f8061ff`](https://github.com/Python-roborock/python-roborock/commit/f8061ffcf416bd2618ac5b6f4b056650599bcbe8)) + +- **deps**: Bump ruff from 0.14.4 to 0.14.5 + ([#595](https://github.com/Python-roborock/python-roborock/pull/595), + [`e561838`](https://github.com/Python-roborock/python-roborock/commit/e561838449be48abebf6ea94ff944222eea4d0ec)) + +- **deps**: Bump ruff from 0.14.5 to 0.14.6 + ([#601](https://github.com/Python-roborock/python-roborock/pull/601), + [`c16c529`](https://github.com/Python-roborock/python-roborock/commit/c16c529881d84f370f99a7c5b31255a24a74da3a)) + + +## v3.8.0 (2025-11-15) + +### Bug Fixes + +- Update roborock/devices/device.py + ([#588](https://github.com/Python-roborock/python-roborock/pull/588), + [`3994110`](https://github.com/Python-roborock/python-roborock/commit/39941103fe5247a9764d38db5ee0915dd39e043d)) + +### Chores + +- Fix lint ([#589](https://github.com/Python-roborock/python-roborock/pull/589), + [`fa69bf2`](https://github.com/Python-roborock/python-roborock/commit/fa69bf2d9d090bf8bc6cf89ead6ab122d5dbcd00)) + +- Fix lint errors ([#588](https://github.com/Python-roborock/python-roborock/pull/588), + [`3994110`](https://github.com/Python-roborock/python-roborock/commit/39941103fe5247a9764d38db5ee0915dd39e043d)) + +- Update comments to clarify close call + ([#588](https://github.com/Python-roborock/python-roborock/pull/588), + [`3994110`](https://github.com/Python-roborock/python-roborock/commit/39941103fe5247a9764d38db5ee0915dd39e043d)) + +- Update documentation to point to the newer device APIs + ([#589](https://github.com/Python-roborock/python-roborock/pull/589), + [`fa69bf2`](https://github.com/Python-roborock/python-roborock/commit/fa69bf2d9d090bf8bc6cf89ead6ab122d5dbcd00)) + +- Update pydoc and formatting ([#588](https://github.com/Python-roborock/python-roborock/pull/588), + [`3994110`](https://github.com/Python-roborock/python-roborock/commit/39941103fe5247a9764d38db5ee0915dd39e043d)) + +- Update README.md ([#589](https://github.com/Python-roborock/python-roborock/pull/589), + [`fa69bf2`](https://github.com/Python-roborock/python-roborock/commit/fa69bf2d9d090bf8bc6cf89ead6ab122d5dbcd00)) + +- Update roborock/devices/device.py + ([#588](https://github.com/Python-roborock/python-roborock/pull/588), + [`3994110`](https://github.com/Python-roborock/python-roborock/commit/39941103fe5247a9764d38db5ee0915dd39e043d)) + +- Update roborock/devices/traits/b01/__init__.py + ([#589](https://github.com/Python-roborock/python-roborock/pull/589), + [`fa69bf2`](https://github.com/Python-roborock/python-roborock/commit/fa69bf2d9d090bf8bc6cf89ead6ab122d5dbcd00)) + +- Update roborock/devices/traits/v1/__init__.py + ([#589](https://github.com/Python-roborock/python-roborock/pull/589), + [`fa69bf2`](https://github.com/Python-roborock/python-roborock/commit/fa69bf2d9d090bf8bc6cf89ead6ab122d5dbcd00)) + +- Update typing ([#588](https://github.com/Python-roborock/python-roborock/pull/588), + [`3994110`](https://github.com/Python-roborock/python-roborock/commit/39941103fe5247a9764d38db5ee0915dd39e043d)) + +### Features + +- Add examples that show how to use the cache and implement a file cache + ([#589](https://github.com/Python-roborock/python-roborock/pull/589), + [`fa69bf2`](https://github.com/Python-roborock/python-roborock/commit/fa69bf2d9d090bf8bc6cf89ead6ab122d5dbcd00)) + +- Connect to devices asynchronously + ([#588](https://github.com/Python-roborock/python-roborock/pull/588), + [`3994110`](https://github.com/Python-roborock/python-roborock/commit/39941103fe5247a9764d38db5ee0915dd39e043d)) + + +## v3.7.4 (2025-11-15) + +### Bug Fixes + +- Update trait `refresh` method to return `None` + ([#586](https://github.com/Python-roborock/python-roborock/pull/586), + [`86ec1a7`](https://github.com/Python-roborock/python-roborock/commit/86ec1a7377159ed9bdceb339804b61c73532f441)) + +### Chores + +- Fix lint errors ([#586](https://github.com/Python-roborock/python-roborock/pull/586), + [`86ec1a7`](https://github.com/Python-roborock/python-roborock/commit/86ec1a7377159ed9bdceb339804b61c73532f441)) + +- Remove unnecessary whitespace + ([#586](https://github.com/Python-roborock/python-roborock/pull/586), + [`86ec1a7`](https://github.com/Python-roborock/python-roborock/commit/86ec1a7377159ed9bdceb339804b61c73532f441)) + +- Revert accidental CleanSummary changes + ([#586](https://github.com/Python-roborock/python-roborock/pull/586), + [`86ec1a7`](https://github.com/Python-roborock/python-roborock/commit/86ec1a7377159ed9bdceb339804b61c73532f441)) + +- Revert unnecessary change to Clean Summary Trait + ([#586](https://github.com/Python-roborock/python-roborock/pull/586), + [`86ec1a7`](https://github.com/Python-roborock/python-roborock/commit/86ec1a7377159ed9bdceb339804b61c73532f441)) + + +## v3.7.3 (2025-11-14) + +### Bug Fixes + +- Switches commands were incorrect + ([#591](https://github.com/Python-roborock/python-roborock/pull/591), + [`40aa6b6`](https://github.com/Python-roborock/python-roborock/commit/40aa6b67a6e43e273d6e4512ccdc8df11dd4dc8a)) + +### Chores + +- Add device info for roborock.vacuum.s5e + ([#587](https://github.com/Python-roborock/python-roborock/pull/587), + [`20afa92`](https://github.com/Python-roborock/python-roborock/commit/20afa925e298f9fb36fc3e1ac79bf8cba90fcdf5)) + +- **deps**: Bump ruff from 0.14.1 to 0.14.4 + ([#585](https://github.com/Python-roborock/python-roborock/pull/585), + [`324c816`](https://github.com/Python-roborock/python-roborock/commit/324c8165bacfdd7abbc1561c3f4f5768cd9c331c)) + + +## v3.7.2 (2025-11-11) + +### Bug Fixes + +- Improve Home trait discovery process. + ([#580](https://github.com/Python-roborock/python-roborock/pull/580), + [`44680e3`](https://github.com/Python-roborock/python-roborock/commit/44680e367991b6eafef0267f6b4209a09929973a)) + +### Chores + +- Refactor test by removing redundant assertion + ([#580](https://github.com/Python-roborock/python-roborock/pull/580), + [`44680e3`](https://github.com/Python-roborock/python-roborock/commit/44680e367991b6eafef0267f6b4209a09929973a)) + +- Update tests/devices/traits/v1/test_home.py + ([#580](https://github.com/Python-roborock/python-roborock/pull/580), + [`44680e3`](https://github.com/Python-roborock/python-roborock/commit/44680e367991b6eafef0267f6b4209a09929973a)) + +- **deps**: Bump aiohttp from 3.13.0 to 3.13.2 + ([#583](https://github.com/Python-roborock/python-roborock/pull/583), + [`c7bacad`](https://github.com/Python-roborock/python-roborock/commit/c7bacad32ede1290fbaea261538e1b90476d61c6)) + +- **deps**: Bump pre-commit from 4.3.0 to 4.4.0 + ([#584](https://github.com/Python-roborock/python-roborock/pull/584), + [`3adc76b`](https://github.com/Python-roborock/python-roborock/commit/3adc76bdd21c16fcb25d9d3dee9c5857eccea960)) + +- **deps**: Bump python-semantic-release/publish-action + ([#582](https://github.com/Python-roborock/python-roborock/pull/582), + [`c76bf06`](https://github.com/Python-roborock/python-roborock/commit/c76bf069191bf221a848c4dfa34104e8b93b81b8)) + + +## v3.7.1 (2025-11-05) + +### Bug Fixes + +- Fix typing issues in new device traits + ([#577](https://github.com/Python-roborock/python-roborock/pull/577), + [`3266ae6`](https://github.com/Python-roborock/python-roborock/commit/3266ae6aa9d799c398542c95463d63a8cb77dd4e)) + + +## v3.7.0 (2025-10-27) + +### Chores + +- Change imports for typing ([#574](https://github.com/Python-roborock/python-roborock/pull/574), + [`05c8e94`](https://github.com/Python-roborock/python-roborock/commit/05c8e9458e44a6ca61977cc0d26c2776bb1fcae5)) + +- Update tests/devices/traits/v1/fixtures.py + ([#574](https://github.com/Python-roborock/python-roborock/pull/574), + [`05c8e94`](https://github.com/Python-roborock/python-roborock/commit/05c8e9458e44a6ca61977cc0d26c2776bb1fcae5)) + +### Features + +- Add a trait for working with routines + ([#574](https://github.com/Python-roborock/python-roborock/pull/574), + [`05c8e94`](https://github.com/Python-roborock/python-roborock/commit/05c8e9458e44a6ca61977cc0d26c2776bb1fcae5)) + + +## v3.6.0 (2025-10-27) + +### Chores + +- Add test coverage for failing to parse bytes + ([#572](https://github.com/Python-roborock/python-roborock/pull/572), + [`e524d31`](https://github.com/Python-roborock/python-roborock/commit/e524d31fa63cc6c97c10bf890dbde91e7e5d3840)) + +- Update tests/devices/traits/v1/test_home.py + ([#572](https://github.com/Python-roborock/python-roborock/pull/572), + [`e524d31`](https://github.com/Python-roborock/python-roborock/commit/e524d31fa63cc6c97c10bf890dbde91e7e5d3840)) + +### Features + +- Add map content to the Home trait + ([#572](https://github.com/Python-roborock/python-roborock/pull/572), + [`e524d31`](https://github.com/Python-roborock/python-roborock/commit/e524d31fa63cc6c97c10bf890dbde91e7e5d3840)) + + +## v3.5.0 (2025-10-27) + +### Chores + +- Disable body-max-line-length ([#573](https://github.com/Python-roborock/python-roborock/pull/573), + [`6a5db1d`](https://github.com/Python-roborock/python-roborock/commit/6a5db1d9aac274bbfa46624250def64ada2b507b)) + +- Go back to old web API name ([#570](https://github.com/Python-roborock/python-roborock/pull/570), + [`4e7e776`](https://github.com/Python-roborock/python-roborock/commit/4e7e776fed4cae17636659b9e3365ac26347e86b)) + +### Features + +- Simplify device manager creation + ([#570](https://github.com/Python-roborock/python-roborock/pull/570), + [`4e7e776`](https://github.com/Python-roborock/python-roborock/commit/4e7e776fed4cae17636659b9e3365ac26347e86b)) + + +## v3.4.0 (2025-10-26) + +### Bug Fixes + +- Only validate connection when sending commands + ([#571](https://github.com/Python-roborock/python-roborock/pull/571), + [`efa48e9`](https://github.com/Python-roborock/python-roborock/commit/efa48e96a1554b7a7358f9f22873b847d93d663d)) + +### Features + +- Rename home_cache to home_map_info + ([#569](https://github.com/Python-roborock/python-roborock/pull/569), + [`9aff1cf`](https://github.com/Python-roborock/python-roborock/commit/9aff1cf01aa8e1a56d594cd2be20400cbf1eb324)) + + +## v3.3.3 (2025-10-25) + +### Bug Fixes + +- FIx bug in clean record parsing + ([#567](https://github.com/Python-roborock/python-roborock/pull/567), + [`8196bcc`](https://github.com/Python-roborock/python-roborock/commit/8196bccdf5239ef540291bf55fa2bd270a4544ed)) + + +## v3.3.2 (2025-10-25) + +### Bug Fixes + +- Ensure that result is not none + ([#565](https://github.com/Python-roborock/python-roborock/pull/565), + [`c0a84eb`](https://github.com/Python-roborock/python-roborock/commit/c0a84eb434ea1b8e15adea7adeba28b7fb1853f6)) + +- Set to empty dict ([#565](https://github.com/Python-roborock/python-roborock/pull/565), + [`c0a84eb`](https://github.com/Python-roborock/python-roborock/commit/c0a84eb434ea1b8e15adea7adeba28b7fb1853f6)) + +### Chores + +- Fix typing for InMemoryCache ([#566](https://github.com/Python-roborock/python-roborock/pull/566), + [`904494d`](https://github.com/Python-roborock/python-roborock/commit/904494da3dcf899d9a4d5d4ab589d543dcea1fe2)) + +- Go back to the other way ([#565](https://github.com/Python-roborock/python-roborock/pull/565), + [`c0a84eb`](https://github.com/Python-roborock/python-roborock/commit/c0a84eb434ea1b8e15adea7adeba28b7fb1853f6)) + +- Update roborock/protocols/v1_protocol.py + ([#565](https://github.com/Python-roborock/python-roborock/pull/565), + [`c0a84eb`](https://github.com/Python-roborock/python-roborock/commit/c0a84eb434ea1b8e15adea7adeba28b7fb1853f6)) + + +## v3.3.1 (2025-10-25) + +### Bug Fixes + +- Truncate debug strings for MapContent + ([#564](https://github.com/Python-roborock/python-roborock/pull/564), + [`5a377de`](https://github.com/Python-roborock/python-roborock/commit/5a377ded245f6948f86775287eb7d70c12ec7740)) + +### Chores + +- Apply github co-pilot recommendation + ([#564](https://github.com/Python-roborock/python-roborock/pull/564), + [`5a377de`](https://github.com/Python-roborock/python-roborock/commit/5a377ded245f6948f86775287eb7d70c12ec7740)) + + +## v3.3.0 (2025-10-25) + +### Bug Fixes + +- Lower local timeout ([#559](https://github.com/Python-roborock/python-roborock/pull/559), + [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) + +- Remove unneeded params setting + ([#559](https://github.com/Python-roborock/python-roborock/pull/559), + [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) + +### Chores + +- Add some tests and adress comments + ([#559](https://github.com/Python-roborock/python-roborock/pull/559), + [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) + +- Fix comments ([#559](https://github.com/Python-roborock/python-roborock/pull/559), + [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) + +- Handle failed hello ([#559](https://github.com/Python-roborock/python-roborock/pull/559), + [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) + +- Remove unneeded code ([#559](https://github.com/Python-roborock/python-roborock/pull/559), + [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) + +- Switch to more specific exception + ([#559](https://github.com/Python-roborock/python-roborock/pull/559), + [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) + +- Update roborock/devices/local_channel.py + ([#559](https://github.com/Python-roborock/python-roborock/pull/559), + [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) + +### Features + +- Add l01 to the new device format + ([#559](https://github.com/Python-roborock/python-roborock/pull/559), + [`8514461`](https://github.com/Python-roborock/python-roborock/commit/8514461a0d5e69b7c1fc1466ac5f19cb8bd5cbd5)) + + +## v3.2.0 (2025-10-25) + +### Bug Fixes + +- Update redacted values to remove sensitive values + ([#560](https://github.com/Python-roborock/python-roborock/pull/560), + [`0fc7200`](https://github.com/Python-roborock/python-roborock/commit/0fc720034f9da988fe0ba981128b7d66c4998e60)) + +- Update shapshots ([#560](https://github.com/Python-roborock/python-roborock/pull/560), + [`0fc7200`](https://github.com/Python-roborock/python-roborock/commit/0fc720034f9da988fe0ba981128b7d66c4998e60)) + +### Chores + +- Cleanup lint ([#560](https://github.com/Python-roborock/python-roborock/pull/560), + [`0fc7200`](https://github.com/Python-roborock/python-roborock/commit/0fc720034f9da988fe0ba981128b7d66c4998e60)) + +- Only emit traits that have any values set + ([#560](https://github.com/Python-roborock/python-roborock/pull/560), + [`0fc7200`](https://github.com/Python-roborock/python-roborock/commit/0fc720034f9da988fe0ba981128b7d66c4998e60)) + +- Revert mqtt channel changes ([#560](https://github.com/Python-roborock/python-roborock/pull/560), + [`0fc7200`](https://github.com/Python-roborock/python-roborock/commit/0fc720034f9da988fe0ba981128b7d66c4998e60)) + +### Features + +- Add diagnostic information to the device + ([#560](https://github.com/Python-roborock/python-roborock/pull/560), + [`0fc7200`](https://github.com/Python-roborock/python-roborock/commit/0fc720034f9da988fe0ba981128b7d66c4998e60)) + + +## v3.1.2 (2025-10-25) + +### Bug Fixes + +- Move semantic release build command + ([`8ed178d`](https://github.com/Python-roborock/python-roborock/commit/8ed178d9f75245bde3ffcebbf8ef18e171ba563d)) + + +## v3.1.1 (2025-10-25) + +### Bug Fixes + +- Explicitly pip install uv in release + ([`4409ee9`](https://github.com/Python-roborock/python-roborock/commit/4409ee90694e9b3389342692f30fbf3706f2f00c)) + +### Chores + +- Add pre commit step for commitlint + ([#563](https://github.com/Python-roborock/python-roborock/pull/563), + [`14c811f`](https://github.com/Python-roborock/python-roborock/commit/14c811f30f0bb1f574be59e759aecab5ca61cd65)) + + +## v3.1.0 (2025-10-25) + +### Bug Fixes + +- Fix enum names to include `none` states + ([#561](https://github.com/Python-roborock/python-roborock/pull/561), + [`82f6dc2`](https://github.com/Python-roborock/python-roborock/commit/82f6dc29d55fd4f8565312af3cf60abf8abba56c)) + +### Chores + +- Add a temp main branch for testing + ([#562](https://github.com/Python-roborock/python-roborock/pull/562), + [`7592255`](https://github.com/Python-roborock/python-roborock/commit/75922550bad8f5fc4ece1f2f4a6be74ebb3849c2)) + +- Build system to make sure it doesn't break + ([#562](https://github.com/Python-roborock/python-roborock/pull/562), + [`7592255`](https://github.com/Python-roborock/python-roborock/commit/75922550bad8f5fc4ece1f2f4a6be74ebb3849c2)) + +- Fix branches ([#562](https://github.com/Python-roborock/python-roborock/pull/562), + [`7592255`](https://github.com/Python-roborock/python-roborock/commit/75922550bad8f5fc4ece1f2f4a6be74ebb3849c2)) + +- Fix changelog ([#552](https://github.com/Python-roborock/python-roborock/pull/552), + [`e2073ed`](https://github.com/Python-roborock/python-roborock/commit/e2073edc655c1a91caae5f05e1377aebfad2938e)) + +- Fix test release ([#562](https://github.com/Python-roborock/python-roborock/pull/562), + [`7592255`](https://github.com/Python-roborock/python-roborock/commit/75922550bad8f5fc4ece1f2f4a6be74ebb3849c2)) + +- Get uv release to work properly + ([#562](https://github.com/Python-roborock/python-roborock/pull/562), + [`7592255`](https://github.com/Python-roborock/python-roborock/commit/75922550bad8f5fc4ece1f2f4a6be74ebb3849c2)) + +- Switch dependabot from pip to uv + ([#554](https://github.com/Python-roborock/python-roborock/pull/554), + [`9377e9a`](https://github.com/Python-roborock/python-roborock/commit/9377e9ac305f45339b022b5ef8f0c16b58732300)) + +- Try running a test release on every PR + ([#562](https://github.com/Python-roborock/python-roborock/pull/562), + [`7592255`](https://github.com/Python-roborock/python-roborock/commit/75922550bad8f5fc4ece1f2f4a6be74ebb3849c2)) + +- Update snapshot ([#555](https://github.com/Python-roborock/python-roborock/pull/555), + [`b45ad3c`](https://github.com/Python-roborock/python-roborock/commit/b45ad3c487b21639a1f2ba148fe69836b11024c4)) + +- Update spelling from co-pilot suggestion + ([#555](https://github.com/Python-roborock/python-roborock/pull/555), + [`b45ad3c`](https://github.com/Python-roborock/python-roborock/commit/b45ad3c487b21639a1f2ba148fe69836b11024c4)) + +- Update test assertion for network info + ([#558](https://github.com/Python-roborock/python-roborock/pull/558), + [`b34abde`](https://github.com/Python-roborock/python-roborock/commit/b34abde2e3401c463e7fb821bae1cf20a325ec6d)) + +- **deps**: Bump ruff from 0.14.0 to 0.14.1 + ([#553](https://github.com/Python-roborock/python-roborock/pull/553), + [`df438f7`](https://github.com/Python-roborock/python-roborock/commit/df438f7a293fb0c1f1b3cfaf3691eafaa8a3fd8b)) + +### Features + +- Add a trait for reading NetworkInfo from the device + ([#558](https://github.com/Python-roborock/python-roborock/pull/558), + [`b34abde`](https://github.com/Python-roborock/python-roborock/commit/b34abde2e3401c463e7fb821bae1cf20a325ec6d)) + +- Combine the clean record trait with the clean summary + ([#555](https://github.com/Python-roborock/python-roborock/pull/555), + [`b45ad3c`](https://github.com/Python-roborock/python-roborock/commit/b45ad3c487b21639a1f2ba148fe69836b11024c4)) + + +## v3.0.0 (2025-10-20) + +### Features + +- Add data subpackage ([#551](https://github.com/Python-roborock/python-roborock/pull/551), + [`c4d3b86`](https://github.com/Python-roborock/python-roborock/commit/c4d3b86e9862847c0dd47add13e70542141ab214)) + + +## v2.61.0 (2025-10-19) + +### Bug Fixes + +- Remove DockSummary and make dust collection mode optional based on dock type + ([#550](https://github.com/Python-roborock/python-roborock/pull/550), + [`03d0f37`](https://github.com/Python-roborock/python-roborock/commit/03d0f37cfca41ed5943e81b6ac30e061d4f4bd3f)) + +### Chores + +- Fix semantic release using poetry + ([#549](https://github.com/Python-roborock/python-roborock/pull/549), + [`4bf5396`](https://github.com/Python-roborock/python-roborock/commit/4bf5396ac270e864ed433d96baf1c6c5d613106b)) + +### Features + +- Add clean record and dock related traits + ([#550](https://github.com/Python-roborock/python-roborock/pull/550), + [`03d0f37`](https://github.com/Python-roborock/python-roborock/commit/03d0f37cfca41ed5943e81b6ac30e061d4f4bd3f)) + +- Add dock summary and clean record traits + ([#550](https://github.com/Python-roborock/python-roborock/pull/550), + [`03d0f37`](https://github.com/Python-roborock/python-roborock/commit/03d0f37cfca41ed5943e81b6ac30e061d4f4bd3f)) + + +## v2.60.1 (2025-10-19) + +### Bug Fixes + +- Add a common base type for all switches + ([#548](https://github.com/Python-roborock/python-roborock/pull/548), + [`767e118`](https://github.com/Python-roborock/python-roborock/commit/767e118ed193cd16cecb61989614b50dab432aab)) + +### Chores + +- Fix lint ([#544](https://github.com/Python-roborock/python-roborock/pull/544), + [`fe463c3`](https://github.com/Python-roborock/python-roborock/commit/fe463c36d6862864d03b8040475d57e917c310ce)) + +- Update pydoc for V1 subscribe + ([#544](https://github.com/Python-roborock/python-roborock/pull/544), + [`fe463c3`](https://github.com/Python-roborock/python-roborock/commit/fe463c36d6862864d03b8040475d57e917c310ce)) + + +## v2.60.0 (2025-10-18) + +### Chores + +- Match pyproject version + ([`80f9149`](https://github.com/Python-roborock/python-roborock/commit/80f91498359e81c97d4e0666a9d85d52ee6f315a)) + +### Features + +- Add a device property to determine local connection status + ([#547](https://github.com/Python-roborock/python-roborock/pull/547), + [`962ffe2`](https://github.com/Python-roborock/python-roborock/commit/962ffe2b94da26a6879f1006cb585dcaac36c798)) + + +## v2.59.0 (2025-10-18) + +### Chores + +- Match version and do chore so it doesn't bump + ([#546](https://github.com/Python-roborock/python-roborock/pull/546), + [`140de50`](https://github.com/Python-roborock/python-roborock/commit/140de50bda73901ee43b864603cd42802de1570d)) + +- Match version and do chore so it doesn't bump hopefully + ([#546](https://github.com/Python-roborock/python-roborock/pull/546), + [`140de50`](https://github.com/Python-roborock/python-roborock/commit/140de50bda73901ee43b864603cd42802de1570d)) + +- Switch to the non-depreciated action + ([#546](https://github.com/Python-roborock/python-roborock/pull/546), + [`140de50`](https://github.com/Python-roborock/python-roborock/commit/140de50bda73901ee43b864603cd42802de1570d)) + +### Features + +- Update command trait to allow string commands + ([#543](https://github.com/Python-roborock/python-roborock/pull/543), + [`1fdddaf`](https://github.com/Python-roborock/python-roborock/commit/1fdddafc8b0ad490beff3f08c5118e826ab8169f)) + + +## v2.58.1 (2025-10-18) + +### Bug Fixes + +- Re-align version for semantic release + ([#545](https://github.com/Python-roborock/python-roborock/pull/545), + [`b724a5b`](https://github.com/Python-roborock/python-roborock/commit/b724a5bec52ce7fe723710f28f9f63c3b9fa6673)) + +### Chores + +- Re-align version ([#545](https://github.com/Python-roborock/python-roborock/pull/545), + [`b724a5b`](https://github.com/Python-roborock/python-roborock/commit/b724a5bec52ce7fe723710f28f9f63c3b9fa6673)) + +- Use github_token for release ([#545](https://github.com/Python-roborock/python-roborock/pull/545), + [`b724a5b`](https://github.com/Python-roborock/python-roborock/commit/b724a5bec52ce7fe723710f28f9f63c3b9fa6673)) + + +## v2.58.0 (2025-10-18) + +### Bug Fixes + +- Add everything else back ([#542](https://github.com/Python-roborock/python-roborock/pull/542), + [`84c4c48`](https://github.com/Python-roborock/python-roborock/commit/84c4c48fe1c6268db8ceb6dbe8f1ed3318ed78aa)) + +- Correctly run pdocs on github action + ([#542](https://github.com/Python-roborock/python-roborock/pull/542), + [`84c4c48`](https://github.com/Python-roborock/python-roborock/commit/84c4c48fe1c6268db8ceb6dbe8f1ed3318ed78aa)) + +### Features + +- Create a home data API client from an existing RoborockApiClient + ([#541](https://github.com/Python-roborock/python-roborock/pull/541), + [`e7f8e43`](https://github.com/Python-roborock/python-roborock/commit/e7f8e432cb063765f89223332b5994b0ddb639bc)) + + +## v2.57.1 (2025-10-18) + +### Bug Fixes + +- Bug and add test ([#537](https://github.com/Python-roborock/python-roborock/pull/537), + [`6a3d28c`](https://github.com/Python-roborock/python-roborock/commit/6a3d28c24f7444fc5e3cc73392509aca0d5ddd6e)) + +- Fallback to old version of login + ([#537](https://github.com/Python-roborock/python-roborock/pull/537), + [`6a3d28c`](https://github.com/Python-roborock/python-roborock/commit/6a3d28c24f7444fc5e3cc73392509aca0d5ddd6e)) + +### Chores + +- **deps-dev**: Bump ruff from 0.13.2 to 0.14.0 + ([#530](https://github.com/Python-roborock/python-roborock/pull/530), + [`538504d`](https://github.com/Python-roborock/python-roborock/commit/538504dbe66e5edb82a2bb7bfb78272752e0802f)) + + +## v2.57.0 (2025-10-18) + +### Chores + +- Fix lint ([#540](https://github.com/Python-roborock/python-roborock/pull/540), + [`24a0660`](https://github.com/Python-roborock/python-roborock/commit/24a06600633b16a0228876184125e3c5ffe16d02)) + +- Fix lint errors ([#539](https://github.com/Python-roborock/python-roborock/pull/539), + [`fbf1434`](https://github.com/Python-roborock/python-roborock/commit/fbf1434be05103401b2f53c77737a5bfcc719102)) + +- Fix syntax and lint errors ([#539](https://github.com/Python-roborock/python-roborock/pull/539), + [`fbf1434`](https://github.com/Python-roborock/python-roborock/commit/fbf1434be05103401b2f53c77737a5bfcc719102)) + +- Fix tests ([#539](https://github.com/Python-roborock/python-roborock/pull/539), + [`fbf1434`](https://github.com/Python-roborock/python-roborock/commit/fbf1434be05103401b2f53c77737a5bfcc719102)) + +### Features + +- Add a trait for sending commands + ([#539](https://github.com/Python-roborock/python-roborock/pull/539), + [`fbf1434`](https://github.com/Python-roborock/python-roborock/commit/fbf1434be05103401b2f53c77737a5bfcc719102)) + +- Expose device and product information on the new Device API + ([#540](https://github.com/Python-roborock/python-roborock/pull/540), + [`24a0660`](https://github.com/Python-roborock/python-roborock/commit/24a06600633b16a0228876184125e3c5ffe16d02)) + +- Update cli to use new command interface + ([#539](https://github.com/Python-roborock/python-roborock/pull/539), + [`fbf1434`](https://github.com/Python-roborock/python-roborock/commit/fbf1434be05103401b2f53c77737a5bfcc719102)) + + +## v2.56.0 (2025-10-17) + +### Bug Fixes + +- Revert changes to dnd ([#538](https://github.com/Python-roborock/python-roborock/pull/538), + [`aaf3636`](https://github.com/Python-roborock/python-roborock/commit/aaf3636553d68c31e89a763fb6da77d83842b6b8)) + +### Chores + +- Add comment about firmware updates + ([#538](https://github.com/Python-roborock/python-roborock/pull/538), + [`aaf3636`](https://github.com/Python-roborock/python-roborock/commit/aaf3636553d68c31e89a763fb6da77d83842b6b8)) + +- Add python 3.14 for tests ([#524](https://github.com/Python-roborock/python-roborock/pull/524), + [`a6f889d`](https://github.com/Python-roborock/python-roborock/commit/a6f889db0229d5821b04e70514ad5e7f8d5a25df)) + +- Explicitly install pdoc ([#531](https://github.com/Python-roborock/python-roborock/pull/531), + [`5e4c913`](https://github.com/Python-roborock/python-roborock/commit/5e4c9138838eace5c010aa736c61565930520172)) + +- Fix lint errors ([#538](https://github.com/Python-roborock/python-roborock/pull/538), + [`aaf3636`](https://github.com/Python-roborock/python-roborock/commit/aaf3636553d68c31e89a763fb6da77d83842b6b8)) + +- Fix typing on refresh ([#538](https://github.com/Python-roborock/python-roborock/pull/538), + [`aaf3636`](https://github.com/Python-roborock/python-roborock/commit/aaf3636553d68c31e89a763fb6da77d83842b6b8)) + +- Just install pdoc ([#535](https://github.com/Python-roborock/python-roborock/pull/535), + [`ef974cd`](https://github.com/Python-roborock/python-roborock/commit/ef974cd8fe5039aab55adea6d84375236c6a7072)) + +- Make roborock future test async + ([#524](https://github.com/Python-roborock/python-roborock/pull/524), + [`a6f889d`](https://github.com/Python-roborock/python-roborock/commit/a6f889db0229d5821b04e70514ad5e7f8d5a25df)) + +- Remove extra checkout ([#531](https://github.com/Python-roborock/python-roborock/pull/531), + [`5e4c913`](https://github.com/Python-roborock/python-roborock/commit/5e4c9138838eace5c010aa736c61565930520172)) + +- Remove use of decorator and replace with class attribute + ([#538](https://github.com/Python-roborock/python-roborock/pull/538), + [`aaf3636`](https://github.com/Python-roborock/python-roborock/commit/aaf3636553d68c31e89a763fb6da77d83842b6b8)) + +- Switch pages to use uv ([#531](https://github.com/Python-roborock/python-roborock/pull/531), + [`5e4c913`](https://github.com/Python-roborock/python-roborock/commit/5e4c9138838eace5c010aa736c61565930520172)) + +### Features + +- Add various optional features with support for checking device features + ([#538](https://github.com/Python-roborock/python-roborock/pull/538), + [`aaf3636`](https://github.com/Python-roborock/python-roborock/commit/aaf3636553d68c31e89a763fb6da77d83842b6b8)) + + +## v2.55.0 (2025-10-16) + +### Bug Fixes + +- Don't perform discovery when the device is cleaning + ([#526](https://github.com/Python-roborock/python-roborock/pull/526), + [`8ae82d1`](https://github.com/Python-roborock/python-roborock/commit/8ae82d1437ab60a09b828b399c69d56ced759b03)) + +- Require both country code and country + ([#533](https://github.com/Python-roborock/python-roborock/pull/533), + [`f827cbc`](https://github.com/Python-roborock/python-roborock/commit/f827cbccbb5b2204d614a95bf9ae82687c611325)) + +### Chores + +- Add common routine for updating the cache + ([#526](https://github.com/Python-roborock/python-roborock/pull/526), + [`8ae82d1`](https://github.com/Python-roborock/python-roborock/commit/8ae82d1437ab60a09b828b399c69d56ced759b03)) + +- Fix lint error found by ruff on type comparison + ([#528](https://github.com/Python-roborock/python-roborock/pull/528), + [`5a4a03b`](https://github.com/Python-roborock/python-roborock/commit/5a4a03b05db97d7ce02f16b17de61f88daa1ee3d)) + +- Fix lint errors ([#528](https://github.com/Python-roborock/python-roborock/pull/528), + [`5a4a03b`](https://github.com/Python-roborock/python-roborock/commit/5a4a03b05db97d7ce02f16b17de61f88daa1ee3d)) + +- Hook up the trait to the device and CLI + ([#526](https://github.com/Python-roborock/python-roborock/pull/526), + [`8ae82d1`](https://github.com/Python-roborock/python-roborock/commit/8ae82d1437ab60a09b828b399c69d56ced759b03)) + +- Migrate to uv ([#525](https://github.com/Python-roborock/python-roborock/pull/525), + [`ec78beb`](https://github.com/Python-roborock/python-roborock/commit/ec78beb57a088d75ac9400c15cc15994f9978852)) + +- Replace async-timeout with asyncio.timeout + ([#527](https://github.com/Python-roborock/python-roborock/pull/527), + [`f376027`](https://github.com/Python-roborock/python-roborock/commit/f376027f5933e163441cf1815b820056731a3632)) + +- Upgrade ruff and apply ruff-format to all files + ([#528](https://github.com/Python-roborock/python-roborock/pull/528), + [`5a4a03b`](https://github.com/Python-roborock/python-roborock/commit/5a4a03b05db97d7ce02f16b17de61f88daa1ee3d)) + +### Features + +- Add a Home trait that for caching information about maps and rooms + ([#526](https://github.com/Python-roborock/python-roborock/pull/526), + [`8ae82d1`](https://github.com/Python-roborock/python-roborock/commit/8ae82d1437ab60a09b828b399c69d56ced759b03)) + +- Add a trait for device features + ([#534](https://github.com/Python-roborock/python-roborock/pull/534), + [`8539fe4`](https://github.com/Python-roborock/python-roborock/commit/8539fe4b0ab72c388a55300a4724ca42bde83e38)) + + +## v2.54.0 (2025-10-10) + +### Features + +- Add some extra status attributes + ([#514](https://github.com/Python-roborock/python-roborock/pull/514), + [`660e929`](https://github.com/Python-roborock/python-roborock/commit/660e9290659b27fb32a9e6dd1b82f6c608b1949e)) + +- Add support for detecting issues with the dock holders + ([#514](https://github.com/Python-roborock/python-roborock/pull/514), + [`660e929`](https://github.com/Python-roborock/python-roborock/commit/660e9290659b27fb32a9e6dd1b82f6c608b1949e)) + +- Get the latest clean info ([#522](https://github.com/Python-roborock/python-roborock/pull/522), + [`3ac8f2d`](https://github.com/Python-roborock/python-roborock/commit/3ac8f2dd5490788dbe7f5ee74a1449eff42f802b)) + + +## v2.53.1 (2025-10-06) + +### Bug Fixes + +- Cli on windows ([#520](https://github.com/Python-roborock/python-roborock/pull/520), + [`4127db8`](https://github.com/Python-roborock/python-roborock/commit/4127db857e38db57ee5c84a27e7a6b64fdf40cbf)) + + +## v2.53.0 (2025-10-05) + +### Chores + +- Fix formatting ([#517](https://github.com/Python-roborock/python-roborock/pull/517), + [`e49b3ea`](https://github.com/Python-roborock/python-roborock/commit/e49b3ea1c2cc29a6c41562c3e937659ed9c0816a)) + +- Fix lint and typing errors ([#517](https://github.com/Python-roborock/python-roborock/pull/517), + [`e49b3ea`](https://github.com/Python-roborock/python-roborock/commit/e49b3ea1c2cc29a6c41562c3e937659ed9c0816a)) + +- Fix lint error ([#517](https://github.com/Python-roborock/python-roborock/pull/517), + [`e49b3ea`](https://github.com/Python-roborock/python-roborock/commit/e49b3ea1c2cc29a6c41562c3e937659ed9c0816a)) + +- Fix test wording ([#517](https://github.com/Python-roborock/python-roborock/pull/517), + [`e49b3ea`](https://github.com/Python-roborock/python-roborock/commit/e49b3ea1c2cc29a6c41562c3e937659ed9c0816a)) + +- Refactor to reuse the same payload functions + ([#517](https://github.com/Python-roborock/python-roborock/pull/517), + [`e49b3ea`](https://github.com/Python-roborock/python-roborock/commit/e49b3ea1c2cc29a6c41562c3e937659ed9c0816a)) + +- Remove duplicate code ([#517](https://github.com/Python-roborock/python-roborock/pull/517), + [`e49b3ea`](https://github.com/Python-roborock/python-roborock/commit/e49b3ea1c2cc29a6c41562c3e937659ed9c0816a)) + +### Features + +- Add a v1 device trait for map contents + ([#517](https://github.com/Python-roborock/python-roborock/pull/517), + [`e49b3ea`](https://github.com/Python-roborock/python-roborock/commit/e49b3ea1c2cc29a6c41562c3e937659ed9c0816a)) + + +## v2.52.0 (2025-10-05) + +### Bug Fixes + +- Fix room mapping parsing bug and add addtiional format samples + ([#516](https://github.com/Python-roborock/python-roborock/pull/516), + [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) + +- Update test ([#516](https://github.com/Python-roborock/python-roborock/pull/516), + [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) + +### Chores + +- Abort bad merges ([#516](https://github.com/Python-roborock/python-roborock/pull/516), + [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) + +- Add additional example room mapping + ([#516](https://github.com/Python-roborock/python-roborock/pull/516), + [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) + +- Adjust test case ([#519](https://github.com/Python-roborock/python-roborock/pull/519), + [`df6c674`](https://github.com/Python-roborock/python-roborock/commit/df6c6740431d75f06868979aed5e07bfa8887ed6)) + +- Fix lint errors ([#516](https://github.com/Python-roborock/python-roborock/pull/516), + [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) + +- Fix test warning ([#519](https://github.com/Python-roborock/python-roborock/pull/519), + [`df6c674`](https://github.com/Python-roborock/python-roborock/commit/df6c6740431d75f06868979aed5e07bfa8887ed6)) + +- Fix typing ([#516](https://github.com/Python-roborock/python-roborock/pull/516), + [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) + +- Switch the rooms trait back to the local API + ([#516](https://github.com/Python-roborock/python-roborock/pull/516), + [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) + +### Features + +- Add v1 rooms support to the device traits API + ([#516](https://github.com/Python-roborock/python-roborock/pull/516), + [`a68fbf1`](https://github.com/Python-roborock/python-roborock/commit/a68fbf197a0abd9aaa0418eec21949e65b53b88c)) + + +## v2.51.0 (2025-10-05) + +### Chores + +- Add a class comment about availability + ([#502](https://github.com/Python-roborock/python-roborock/pull/502), + [`6bc3458`](https://github.com/Python-roborock/python-roborock/commit/6bc3458f49fc1072798ce8bfbcdea0d512e19bfd)) + +- Remove whitespace ([#502](https://github.com/Python-roborock/python-roborock/pull/502), + [`6bc3458`](https://github.com/Python-roborock/python-roborock/commit/6bc3458f49fc1072798ce8bfbcdea0d512e19bfd)) + +### Features + +- Add support for getting and reseting consumables + ([#502](https://github.com/Python-roborock/python-roborock/pull/502), + [`6bc3458`](https://github.com/Python-roborock/python-roborock/commit/6bc3458f49fc1072798ce8bfbcdea0d512e19bfd)) + + +## v2.50.4 (2025-10-05) + +### Bug Fixes + +- Return in finally ([#518](https://github.com/Python-roborock/python-roborock/pull/518), + [`9d400d5`](https://github.com/Python-roborock/python-roborock/commit/9d400d5a20a09395f93c0370718c4589d8155814)) + +### Chores + +- **deps**: Bump actions/upload-pages-artifact from 3 to 4 + ([#505](https://github.com/Python-roborock/python-roborock/pull/505), + [`e505791`](https://github.com/Python-roborock/python-roborock/commit/e5057919c9d0d90c85f29df35a628a209508121c)) + +- **deps**: Bump click from 8.2.1 to 8.3.0 + ([#495](https://github.com/Python-roborock/python-roborock/pull/495), + [`9e12170`](https://github.com/Python-roborock/python-roborock/commit/9e121704267dea8c8bbac0e799dcfa8462bc7de7)) + +- **deps-dev**: Bump mypy from 1.18.1 to 1.18.2 + ([#496](https://github.com/Python-roborock/python-roborock/pull/496), + [`31cbf41`](https://github.com/Python-roborock/python-roborock/commit/31cbf41caf1485dcebe5c6590d634e36392c6b3b)) + +- **deps-dev**: Bump ruff from 0.13.0 to 0.13.2 + ([#509](https://github.com/Python-roborock/python-roborock/pull/509), + [`3ba07ad`](https://github.com/Python-roborock/python-roborock/commit/3ba07ad572aa28735828c78dd339308e3cb0340d)) + + +## v2.50.3 (2025-10-03) + +### Bug Fixes + +- Update containers that __post_init__ to use properties + ([#503](https://github.com/Python-roborock/python-roborock/pull/503), + [`f87f55c`](https://github.com/Python-roborock/python-roborock/commit/f87f55ce2d62f90dd945a283def927b9fca70dab)) + +### Chores + +- Fix lint errors ([#503](https://github.com/Python-roborock/python-roborock/pull/503), + [`f87f55c`](https://github.com/Python-roborock/python-roborock/commit/f87f55ce2d62f90dd945a283def927b9fca70dab)) + +- Fix typo ([#503](https://github.com/Python-roborock/python-roborock/pull/503), + [`f87f55c`](https://github.com/Python-roborock/python-roborock/commit/f87f55ce2d62f90dd945a283def927b9fca70dab)) + +- Include atributes in repr computation + ([#503](https://github.com/Python-roborock/python-roborock/pull/503), + [`f87f55c`](https://github.com/Python-roborock/python-roborock/commit/f87f55ce2d62f90dd945a283def927b9fca70dab)) + +- Update to get all properties at runtime + ([#503](https://github.com/Python-roborock/python-roborock/pull/503), + [`f87f55c`](https://github.com/Python-roborock/python-roborock/commit/f87f55ce2d62f90dd945a283def927b9fca70dab)) + + +## v2.50.2 (2025-10-03) + +### Bug Fixes + +- Cycle through iot urls ([#490](https://github.com/Python-roborock/python-roborock/pull/490), + [`2cee9dd`](https://github.com/Python-roborock/python-roborock/commit/2cee9ddcfb2c608967499405992c6e42f6124855)) + +### Chores + +- Add tests ([#490](https://github.com/Python-roborock/python-roborock/pull/490), + [`2cee9dd`](https://github.com/Python-roborock/python-roborock/commit/2cee9ddcfb2c608967499405992c6e42f6124855)) + +- Convert to store all iot login info together + ([#490](https://github.com/Python-roborock/python-roborock/pull/490), + [`2cee9dd`](https://github.com/Python-roborock/python-roborock/commit/2cee9ddcfb2c608967499405992c6e42f6124855)) + +- Remove gemini ([#512](https://github.com/Python-roborock/python-roborock/pull/512), + [`632f0f4`](https://github.com/Python-roborock/python-roborock/commit/632f0f4031fe38c621a50e4bf6a7d2097f560aa9)) + + +## v2.50.1 (2025-10-03) + +### Bug Fixes + +- Use correct replace times ([#513](https://github.com/Python-roborock/python-roborock/pull/513), + [`a6ac92c`](https://github.com/Python-roborock/python-roborock/commit/a6ac92c5443833fe19a1d184495171904e04cbe2)) + + +## v2.50.0 (2025-10-03) + +### Bug Fixes + +- Add a decorator to mark traits as mqtt only + ([#499](https://github.com/Python-roborock/python-roborock/pull/499), + [`87d9aa6`](https://github.com/Python-roborock/python-roborock/commit/87d9aa61676e11fd0ca56f5fc6c998fbff48645b)) + +### Chores + +- Add additional test coverage ([#499](https://github.com/Python-roborock/python-roborock/pull/499), + [`87d9aa6`](https://github.com/Python-roborock/python-roborock/commit/87d9aa61676e11fd0ca56f5fc6c998fbff48645b)) + +- Add comment describing the decorator check + ([#499](https://github.com/Python-roborock/python-roborock/pull/499), + [`87d9aa6`](https://github.com/Python-roborock/python-roborock/commit/87d9aa61676e11fd0ca56f5fc6c998fbff48645b)) + +- Fix lint errors ([#499](https://github.com/Python-roborock/python-roborock/pull/499), + [`87d9aa6`](https://github.com/Python-roborock/python-roborock/commit/87d9aa61676e11fd0ca56f5fc6c998fbff48645b)) + +### Features + +- Add v1 api support for the list of maps + ([#499](https://github.com/Python-roborock/python-roborock/pull/499), + [`87d9aa6`](https://github.com/Python-roborock/python-roborock/commit/87d9aa61676e11fd0ca56f5fc6c998fbff48645b)) + + +## v2.49.1 (2025-09-29) + +### Bug Fixes + +- Broken current map logic ([#497](https://github.com/Python-roborock/python-roborock/pull/497), + [`d7d0a3b`](https://github.com/Python-roborock/python-roborock/commit/d7d0a3b5f4066aab54be5736e01eb2b437c920de)) + +- The map id ([#497](https://github.com/Python-roborock/python-roborock/pull/497), + [`d7d0a3b`](https://github.com/Python-roborock/python-roborock/commit/d7d0a3b5f4066aab54be5736e01eb2b437c920de)) + +### Chores + +- Add no_map constant ([#497](https://github.com/Python-roborock/python-roborock/pull/497), + [`d7d0a3b`](https://github.com/Python-roborock/python-roborock/commit/d7d0a3b5f4066aab54be5736e01eb2b437c920de)) + +- Add test ([#497](https://github.com/Python-roborock/python-roborock/pull/497), + [`d7d0a3b`](https://github.com/Python-roborock/python-roborock/commit/d7d0a3b5f4066aab54be5736e01eb2b437c920de)) + +- Try `poetry run pdoc` to fix CI + ([#504](https://github.com/Python-roborock/python-roborock/pull/504), + [`da5d80f`](https://github.com/Python-roborock/python-roborock/commit/da5d80fb5c9e425317c3ade3065b2158af0a830f)) + + +## v2.49.0 (2025-09-29) + +### Bug Fixes + +- Remove functon ([#448](https://github.com/Python-roborock/python-roborock/pull/448), + [`27fb9fc`](https://github.com/Python-roborock/python-roborock/commit/27fb9fc00c9c16235a983db0df4cc0d2cfb5f7b3)) + +- Tchange name of cleanmodesold + ([#448](https://github.com/Python-roborock/python-roborock/pull/448), + [`27fb9fc`](https://github.com/Python-roborock/python-roborock/commit/27fb9fc00c9c16235a983db0df4cc0d2cfb5f7b3)) + +### Chores + +- Cap product feature map ([#448](https://github.com/Python-roborock/python-roborock/pull/448), + [`27fb9fc`](https://github.com/Python-roborock/python-roborock/commit/27fb9fc00c9c16235a983db0df4cc0d2cfb5f7b3)) + +- Fix lint ([#500](https://github.com/Python-roborock/python-roborock/pull/500), + [`d5bb862`](https://github.com/Python-roborock/python-roborock/commit/d5bb8625ba6eb46a13b79df78a02f7e5e25cfd9f)) + +- Remove more complicated changes + ([#448](https://github.com/Python-roborock/python-roborock/pull/448), + [`27fb9fc`](https://github.com/Python-roborock/python-roborock/commit/27fb9fc00c9c16235a983db0df4cc0d2cfb5f7b3)) + +### Features + +- Add dynamic clean modes ([#448](https://github.com/Python-roborock/python-roborock/pull/448), + [`27fb9fc`](https://github.com/Python-roborock/python-roborock/commit/27fb9fc00c9c16235a983db0df4cc0d2cfb5f7b3)) + +- Add module for parsing map content + ([#500](https://github.com/Python-roborock/python-roborock/pull/500), + [`d5bb862`](https://github.com/Python-roborock/python-roborock/commit/d5bb8625ba6eb46a13b79df78a02f7e5e25cfd9f)) + +- Improve dynamic clean ([#448](https://github.com/Python-roborock/python-roborock/pull/448), + [`27fb9fc`](https://github.com/Python-roborock/python-roborock/commit/27fb9fc00c9c16235a983db0df4cc0d2cfb5f7b3)) + +- Improve dynamic clean modes ([#448](https://github.com/Python-roborock/python-roborock/pull/448), + [`27fb9fc`](https://github.com/Python-roborock/python-roborock/commit/27fb9fc00c9c16235a983db0df4cc0d2cfb5f7b3)) + + +## v2.48.0 (2025-09-29) + +### Chores + +- Add gemini default ci actions + ([#493](https://github.com/Python-roborock/python-roborock/pull/493), + [`20e3c3d`](https://github.com/Python-roborock/python-roborock/commit/20e3c3da8100dd5e7b4a0b6418b41bb40a2efc36)) + +- Add imports for public APIs ([#501](https://github.com/Python-roborock/python-roborock/pull/501), + [`21c83c0`](https://github.com/Python-roborock/python-roborock/commit/21c83c06116ef0c36dc7069cb2a3b822406de866)) + +### Features + +- Add pdoc for leveraging python docstrings for documentation + ([#501](https://github.com/Python-roborock/python-roborock/pull/501), + [`21c83c0`](https://github.com/Python-roborock/python-roborock/commit/21c83c06116ef0c36dc7069cb2a3b822406de866)) + + +## v2.47.1 (2025-09-22) + +### Bug Fixes + +- Improve new v1 apis to use mqtt lazily and work entirely locally + ([#491](https://github.com/Python-roborock/python-roborock/pull/491), + [`d0212e5`](https://github.com/Python-roborock/python-roborock/commit/d0212e58b032de2cce7c99691bdcec49ac8dfce2)) + +### Chores + +- Extract caching logic to one place + ([#491](https://github.com/Python-roborock/python-roborock/pull/491), + [`d0212e5`](https://github.com/Python-roborock/python-roborock/commit/d0212e58b032de2cce7c99691bdcec49ac8dfce2)) + +- Remove unnecessary logging ([#491](https://github.com/Python-roborock/python-roborock/pull/491), + [`d0212e5`](https://github.com/Python-roborock/python-roborock/commit/d0212e58b032de2cce7c99691bdcec49ac8dfce2)) + +- Remove whitespace ([#491](https://github.com/Python-roborock/python-roborock/pull/491), + [`d0212e5`](https://github.com/Python-roborock/python-roborock/commit/d0212e58b032de2cce7c99691bdcec49ac8dfce2)) + +- Update comments ([#491](https://github.com/Python-roborock/python-roborock/pull/491), + [`d0212e5`](https://github.com/Python-roborock/python-roborock/commit/d0212e58b032de2cce7c99691bdcec49ac8dfce2)) + + +## v2.47.0 (2025-09-21) + +### Bug Fixes + +- Add version to ping ([#487](https://github.com/Python-roborock/python-roborock/pull/487), + [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) + +- Bug fixes for 1.0 ([#487](https://github.com/Python-roborock/python-roborock/pull/487), + [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) + +- Make sure we are connected on message send + ([#487](https://github.com/Python-roborock/python-roborock/pull/487), + [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) + +- Potentially fix ping? ([#487](https://github.com/Python-roborock/python-roborock/pull/487), + [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) + +- Remove excluding ping from id check + ([#487](https://github.com/Python-roborock/python-roborock/pull/487), + [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) + +- Some misc bug changes ([#487](https://github.com/Python-roborock/python-roborock/pull/487), + [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) + +- Some small changes ([#487](https://github.com/Python-roborock/python-roborock/pull/487), + [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) + +### Chores + +- Add comment about rpc channel hacks and separate property files + ([#489](https://github.com/Python-roborock/python-roborock/pull/489), + [`362ec1d`](https://github.com/Python-roborock/python-roborock/commit/362ec1d3360e56cc4b98151b9c001bcdad64ffd2)) + +- Fix return types in CleanSummaryTrait + ([#489](https://github.com/Python-roborock/python-roborock/pull/489), + [`362ec1d`](https://github.com/Python-roborock/python-roborock/commit/362ec1d3360e56cc4b98151b9c001bcdad64ffd2)) + +- Init try based on Homey logic + ([#487](https://github.com/Python-roborock/python-roborock/pull/487), + [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) + +- Only allow a single trait ([#489](https://github.com/Python-roborock/python-roborock/pull/489), + [`362ec1d`](https://github.com/Python-roborock/python-roborock/commit/362ec1d3360e56cc4b98151b9c001bcdad64ffd2)) + +- Overhaul new device trait interfaces + ([#489](https://github.com/Python-roborock/python-roborock/pull/489), + [`362ec1d`](https://github.com/Python-roborock/python-roborock/commit/362ec1d3360e56cc4b98151b9c001bcdad64ffd2)) + +- Remove debug ([#487](https://github.com/Python-roborock/python-roborock/pull/487), + [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) + +- Remove unnecessarily local variables + ([#489](https://github.com/Python-roborock/python-roborock/pull/489), + [`362ec1d`](https://github.com/Python-roborock/python-roborock/commit/362ec1d3360e56cc4b98151b9c001bcdad64ffd2)) + +- Rename b01 properties to match v1 + ([#489](https://github.com/Python-roborock/python-roborock/pull/489), + [`362ec1d`](https://github.com/Python-roborock/python-roborock/commit/362ec1d3360e56cc4b98151b9c001bcdad64ffd2)) + +- Set sign_key to private ([#488](https://github.com/Python-roborock/python-roborock/pull/488), + [`ed46bce`](https://github.com/Python-roborock/python-roborock/commit/ed46bce0db7201c0416cdf6076b3403f5b1fad5e)) + +- Some potential clean up ([#487](https://github.com/Python-roborock/python-roborock/pull/487), + [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) + +### Features + +- Implement L01 protocol ([#487](https://github.com/Python-roborock/python-roborock/pull/487), + [`bff0e9c`](https://github.com/Python-roborock/python-roborock/commit/bff0e9c96b32d7a5c28e56488a7a92c57b098a46)) + +- Update CLI with new properties + ([#489](https://github.com/Python-roborock/python-roborock/pull/489), + [`362ec1d`](https://github.com/Python-roborock/python-roborock/commit/362ec1d3360e56cc4b98151b9c001bcdad64ffd2)) + + +## v2.46.0 (2025-09-21) + +### Bug Fixes + +- Address some comments ([#460](https://github.com/Python-roborock/python-roborock/pull/460), + [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) + +- Handle auth expiring ([#460](https://github.com/Python-roborock/python-roborock/pull/460), + [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) + +- Mqtt error handling ([#460](https://github.com/Python-roborock/python-roborock/pull/460), + [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) + +- Str some other rcs ([#460](https://github.com/Python-roborock/python-roborock/pull/460), + [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) + +### Chores + +- Add else back ([#460](https://github.com/Python-roborock/python-roborock/pull/460), + [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) + +- Clean up ([#460](https://github.com/Python-roborock/python-roborock/pull/460), + [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) + +- Inverse boolean logic to match variable naming + ([#460](https://github.com/Python-roborock/python-roborock/pull/460), + [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) + +- Remove extra exception ([#460](https://github.com/Python-roborock/python-roborock/pull/460), + [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) + +### Features + +- Add seperate validate connection for the cloud api and bump keepalive + ([#460](https://github.com/Python-roborock/python-roborock/pull/460), + [`599da6c`](https://github.com/Python-roborock/python-roborock/commit/599da6c044ba897b5005a2e1536ddc53af84cd4d)) + + +## v2.45.0 (2025-09-21) + +### Chores + +- Add tests ([#486](https://github.com/Python-roborock/python-roborock/pull/486), + [`1eebd29`](https://github.com/Python-roborock/python-roborock/commit/1eebd29231534d187699dfaaa7d6f5721a31b5c8)) + +- **deps**: Bump python-semantic-release/python-semantic-release + ([#479](https://github.com/Python-roborock/python-roborock/pull/479), + [`68f52ab`](https://github.com/Python-roborock/python-roborock/commit/68f52ab40f782766a73df7640df2b0a92f7d360f)) + +- **deps-dev**: Bump mypy from 1.17.1 to 1.18.1 + ([#478](https://github.com/Python-roborock/python-roborock/pull/478), + [`efe460b`](https://github.com/Python-roborock/python-roborock/commit/efe460b2f8150fa34e33129854f6c2abb7ae1c4c)) + +- **deps-dev**: Bump pytest from 8.4.1 to 8.4.2 + ([#466](https://github.com/Python-roborock/python-roborock/pull/466), + [`efa2922`](https://github.com/Python-roborock/python-roborock/commit/efa2922cb76e9716ff2ed0bd9edd92fbbcac36ce)) + +### Features + +- Add v4 for code login ([#486](https://github.com/Python-roborock/python-roborock/pull/486), + [`1eebd29`](https://github.com/Python-roborock/python-roborock/commit/1eebd29231534d187699dfaaa7d6f5721a31b5c8)) + + +## v2.44.1 (2025-09-18) + +### Bug Fixes + +- Pass through additional fields to the home data fetcher + ([#484](https://github.com/Python-roborock/python-roborock/pull/484), + [`6fd180a`](https://github.com/Python-roborock/python-roborock/commit/6fd180a3277fe7d92f44e6af6575edeb6a682a45)) + +### Chores + +- Add test coverage of end to end trait parsin from raw responses + ([#482](https://github.com/Python-roborock/python-roborock/pull/482), + [`0fac328`](https://github.com/Python-roborock/python-roborock/commit/0fac32824bb7edc71171a6ad6e44c61a298a9d11)) + +- Add test coverage of end to end trait parsing from raw responses + ([#482](https://github.com/Python-roborock/python-roborock/pull/482), + [`0fac328`](https://github.com/Python-roborock/python-roborock/commit/0fac32824bb7edc71171a6ad6e44c61a298a9d11)) + +- Fix lint errors ([#482](https://github.com/Python-roborock/python-roborock/pull/482), + [`0fac328`](https://github.com/Python-roborock/python-roborock/commit/0fac32824bb7edc71171a6ad6e44c61a298a9d11)) + + +## v2.44.0 (2025-09-15) + +### Chores + +- Fix imports ([#477](https://github.com/Python-roborock/python-roborock/pull/477), + [`a391c17`](https://github.com/Python-roborock/python-roborock/commit/a391c1765e4b62004a290e1f63d46f7e722d4c49)) + +- Remove duplicate api_error from bad merge + ([#477](https://github.com/Python-roborock/python-roborock/pull/477), + [`a391c17`](https://github.com/Python-roborock/python-roborock/commit/a391c1765e4b62004a290e1f63d46f7e722d4c49)) + +- **deps-dev**: Bump pytest-asyncio from 1.1.0 to 1.2.0 + ([#480](https://github.com/Python-roborock/python-roborock/pull/480), + [`772a829`](https://github.com/Python-roborock/python-roborock/commit/772a829f115138f9e99e26d3fb6950b743b1e8fe)) + +- **deps-dev**: Bump ruff from 0.12.9 to 0.13.0 + ([#481](https://github.com/Python-roborock/python-roborock/pull/481), + [`c56252e`](https://github.com/Python-roborock/python-roborock/commit/c56252eb3882b4a1b4b3bc517206e34f5dcd4657)) + +### Features + +- Add a sound volume trait ([#477](https://github.com/Python-roborock/python-roborock/pull/477), + [`a391c17`](https://github.com/Python-roborock/python-roborock/commit/a391c1765e4b62004a290e1f63d46f7e722d4c49)) + +- Add volume trait ([#477](https://github.com/Python-roborock/python-roborock/pull/477), + [`a391c17`](https://github.com/Python-roborock/python-roborock/commit/a391c1765e4b62004a290e1f63d46f7e722d4c49)) + + +## v2.43.0 (2025-09-15) + +### Features + +- Add a clean summary trait ([#476](https://github.com/Python-roborock/python-roborock/pull/476), + [`1585e1c`](https://github.com/Python-roborock/python-roborock/commit/1585e1ccd8cda8008a701e4289f4b2e3febb84f5)) + + +## v2.42.0 (2025-09-14) + +### Chores + +- **deps**: Bump actions/setup-python from 5 to 6 + ([#465](https://github.com/Python-roborock/python-roborock/pull/465), + [`7333643`](https://github.com/Python-roborock/python-roborock/commit/7333643417b57890a6fd18bc63929c2c48f45dbe)) + +- **deps**: Bump pypa/gh-action-pypi-publish from 1.12.4 to 1.13.0 + ([#463](https://github.com/Python-roborock/python-roborock/pull/463), + [`ff44b2d`](https://github.com/Python-roborock/python-roborock/commit/ff44b2d1a2d5f70ed7b1ac10abe8295f39376180)) + +### Features + +- Add ability to encrypt and decrypt L01 + ([#468](https://github.com/Python-roborock/python-roborock/pull/468), + [`50aef42`](https://github.com/Python-roborock/python-roborock/commit/50aef42fa130f696fe367b3696547865bc7a690a)) + +- Add session to CLI ([#473](https://github.com/Python-roborock/python-roborock/pull/473), + [`d58072e`](https://github.com/Python-roborock/python-roborock/commit/d58072eb12be15d5e1fcbd171e5434897497544c)) + + +## v2.41.1 (2025-09-14) + +### Bug Fixes + +- Fix a bug with local / mqtt fallback + ([#475](https://github.com/Python-roborock/python-roborock/pull/475), + [`9f97a2b`](https://github.com/Python-roborock/python-roborock/commit/9f97a2bcf5189f515e9cd07629b65be7762c19ff)) + + +## v2.41.0 (2025-09-14) + +### Bug Fixes + +- Fix bug parsing MultiMapsListMapInfo + ([#474](https://github.com/Python-roborock/python-roborock/pull/474), + [`d79ea3b`](https://github.com/Python-roborock/python-roborock/commit/d79ea3b76d9e1fedbb5fecd7edd21fcf07b29b80)) + +### Chores + +- Revert changes to rpc channel + ([#471](https://github.com/Python-roborock/python-roborock/pull/471), + [`cce1c1b`](https://github.com/Python-roborock/python-roborock/commit/cce1c1b0a5db4a02be949a310ccd4356126bc229)) + +- Simplify command sending ([#471](https://github.com/Python-roborock/python-roborock/pull/471), + [`cce1c1b`](https://github.com/Python-roborock/python-roborock/commit/cce1c1b0a5db4a02be949a310ccd4356126bc229)) + +### Features + +- Add a DnD trait and fix bugs in the rpc channels + ([#471](https://github.com/Python-roborock/python-roborock/pull/471), + [`cce1c1b`](https://github.com/Python-roborock/python-roborock/commit/cce1c1b0a5db4a02be949a310ccd4356126bc229)) + + +## v2.40.1 (2025-09-13) + +### Bug Fixes + +- Bug where the map requested from the app confuses our system + ([#469](https://github.com/Python-roborock/python-roborock/pull/469), + [`4ddfce0`](https://github.com/Python-roborock/python-roborock/commit/4ddfce0e0abcc21b97285aa7a5e585d5076c4f30)) + + +## v2.40.0 (2025-09-07) + +### Bug Fixes + +- Missing code ([#462](https://github.com/Python-roborock/python-roborock/pull/462), + [`99dd479`](https://github.com/Python-roborock/python-roborock/commit/99dd479029758186d5ad6efcc7420c18b1690dde)) + +- Wrong package ([#462](https://github.com/Python-roborock/python-roborock/pull/462), + [`99dd479`](https://github.com/Python-roborock/python-roborock/commit/99dd479029758186d5ad6efcc7420c18b1690dde)) + +### Features + +- Add l01 discovery ([#462](https://github.com/Python-roborock/python-roborock/pull/462), + [`99dd479`](https://github.com/Python-roborock/python-roborock/commit/99dd479029758186d5ad6efcc7420c18b1690dde)) + + +## v2.39.2 (2025-09-07) + +### Bug Fixes + +- Remove __del__ ([#459](https://github.com/Python-roborock/python-roborock/pull/459), + [`62f19ca`](https://github.com/Python-roborock/python-roborock/commit/62f19ca37ee84a817e1e5444619b1bd1031d6626)) + +### Chores + +- Move broadcast_protocol to its own file + ([#459](https://github.com/Python-roborock/python-roborock/pull/459), + [`62f19ca`](https://github.com/Python-roborock/python-roborock/commit/62f19ca37ee84a817e1e5444619b1bd1031d6626)) + +- Move broadcast_protocol to t's own file + ([#459](https://github.com/Python-roborock/python-roborock/pull/459), + [`62f19ca`](https://github.com/Python-roborock/python-roborock/commit/62f19ca37ee84a817e1e5444619b1bd1031d6626)) + + +## v2.39.1 (2025-09-07) + +### Bug Fixes + +- Add missing finish reason ([#461](https://github.com/Python-roborock/python-roborock/pull/461), + [`4d9ba70`](https://github.com/Python-roborock/python-roborock/commit/4d9ba70a9b18d56abd8583ae4f8c6ca33b833e2c)) + +### Chores + +- Add snapshot tests for parsing device wire formats + ([#457](https://github.com/Python-roborock/python-roborock/pull/457), + [`d966b84`](https://github.com/Python-roborock/python-roborock/commit/d966b845d5c73ab6a15128e65785ee1306c8986b)) + +- Sort imports ([#457](https://github.com/Python-roborock/python-roborock/pull/457), + [`d966b84`](https://github.com/Python-roborock/python-roborock/commit/d966b845d5c73ab6a15128e65785ee1306c8986b)) + + +## v2.39.0 (2025-08-24) + +### Bug Fixes + +- Add more containers information + ([#449](https://github.com/Python-roborock/python-roborock/pull/449), + [`5ef1cd8`](https://github.com/Python-roborock/python-roborock/commit/5ef1cd833ea027b1dcd02b66694b37e404a63dc1)) + +- Get RoborockBase working for other files + ([#449](https://github.com/Python-roborock/python-roborock/pull/449), + [`5ef1cd8`](https://github.com/Python-roborock/python-roborock/commit/5ef1cd833ea027b1dcd02b66694b37e404a63dc1)) + +- Make code dynamic ([#449](https://github.com/Python-roborock/python-roborock/pull/449), + [`5ef1cd8`](https://github.com/Python-roborock/python-roborock/commit/5ef1cd833ea027b1dcd02b66694b37e404a63dc1)) + +- Version check ([#449](https://github.com/Python-roborock/python-roborock/pull/449), + [`5ef1cd8`](https://github.com/Python-roborock/python-roborock/commit/5ef1cd833ea027b1dcd02b66694b37e404a63dc1)) + +### Chores + +- Fix style and comments ([#456](https://github.com/Python-roborock/python-roborock/pull/456), + [`57d82e2`](https://github.com/Python-roborock/python-roborock/commit/57d82e2485fcf1cf63bd651427dd56b17f8cb694)) + +- Move imports ([#449](https://github.com/Python-roborock/python-roborock/pull/449), + [`5ef1cd8`](https://github.com/Python-roborock/python-roborock/commit/5ef1cd833ea027b1dcd02b66694b37e404a63dc1)) + +- Remove registry ([#449](https://github.com/Python-roborock/python-roborock/pull/449), + [`5ef1cd8`](https://github.com/Python-roborock/python-roborock/commit/5ef1cd833ea027b1dcd02b66694b37e404a63dc1)) + +- Unify callback handling recipes across mqtt and local channels + ([#456](https://github.com/Python-roborock/python-roborock/pull/456), + [`57d82e2`](https://github.com/Python-roborock/python-roborock/commit/57d82e2485fcf1cf63bd651427dd56b17f8cb694)) + +### Features + +- Improve B01 support ([#449](https://github.com/Python-roborock/python-roborock/pull/449), + [`5ef1cd8`](https://github.com/Python-roborock/python-roborock/commit/5ef1cd833ea027b1dcd02b66694b37e404a63dc1)) + + +## v2.38.0 (2025-08-21) + +### Bug Fixes + +- Change to store info in a yaml file + ([#428](https://github.com/Python-roborock/python-roborock/pull/428), + [`41d5433`](https://github.com/Python-roborock/python-roborock/commit/41d543362c8163d565feffd2fd48425480159087)) + +### Chores + +- Fix lint errors from merge ([#428](https://github.com/Python-roborock/python-roborock/pull/428), + [`41d5433`](https://github.com/Python-roborock/python-roborock/commit/41d543362c8163d565feffd2fd48425480159087)) + +- Update doc ([#428](https://github.com/Python-roborock/python-roborock/pull/428), + [`41d5433`](https://github.com/Python-roborock/python-roborock/commit/41d543362c8163d565feffd2fd48425480159087)) + +- **deps**: Bump actions/checkout from 4 to 5 + ([#454](https://github.com/Python-roborock/python-roborock/pull/454), + [`2020f33`](https://github.com/Python-roborock/python-roborock/commit/2020f3386a8d69f94a01d433220b3081b661c86e)) + +- **deps-dev**: Bump ruff from 0.12.8 to 0.12.9 + ([#455](https://github.com/Python-roborock/python-roborock/pull/455), + [`aec476c`](https://github.com/Python-roborock/python-roborock/commit/aec476c1c9b09e04f788a9825ed0ec590a205c30)) + +### Features + +- Add the ability to update supported_features via cli + ([#428](https://github.com/Python-roborock/python-roborock/pull/428), + [`41d5433`](https://github.com/Python-roborock/python-roborock/commit/41d543362c8163d565feffd2fd48425480159087)) + + +## v2.37.0 (2025-08-19) + +### Bug Fixes + +- Remove query_values response ([#453](https://github.com/Python-roborock/python-roborock/pull/453), + [`0004721`](https://github.com/Python-roborock/python-roborock/commit/0004721d5264a13261d8485dd487de512d7c310e)) + +- Update mqtt channel to correctly handle multiple subscribers + ([#453](https://github.com/Python-roborock/python-roborock/pull/453), + [`0004721`](https://github.com/Python-roborock/python-roborock/commit/0004721d5264a13261d8485dd487de512d7c310e)) + +### Chores + +- Remove dependencies on `get_request_id` in RequestMessage + ([#452](https://github.com/Python-roborock/python-roborock/pull/452), + [`f4dcea5`](https://github.com/Python-roborock/python-roborock/commit/f4dcea542477b1208591c2d316048d86080c48af)) + +- Remove pending rpcs object ([#453](https://github.com/Python-roborock/python-roborock/pull/453), + [`0004721`](https://github.com/Python-roborock/python-roborock/commit/0004721d5264a13261d8485dd487de512d7c310e)) + +- Remove unnecessary whitespace + ([#453](https://github.com/Python-roborock/python-roborock/pull/453), + [`0004721`](https://github.com/Python-roborock/python-roborock/commit/0004721d5264a13261d8485dd487de512d7c310e)) + +- Update logging and comments ([#453](https://github.com/Python-roborock/python-roborock/pull/453), + [`0004721`](https://github.com/Python-roborock/python-roborock/commit/0004721d5264a13261d8485dd487de512d7c310e)) + +- **deps**: Bump aiohttp from 3.12.13 to 3.12.15 + ([#446](https://github.com/Python-roborock/python-roborock/pull/446), + [`b6bcb2a`](https://github.com/Python-roborock/python-roborock/commit/b6bcb2ab2cdebb07b540a573299520675257a1c9)) + +- **deps**: Bump pyrate-limiter from 3.7.0 to 3.9.0 + ([#445](https://github.com/Python-roborock/python-roborock/pull/445), + [`8ac85da`](https://github.com/Python-roborock/python-roborock/commit/8ac85da5ecdbda5ef374b0cc492e505041cf8f4e)) + +- **deps-dev**: Bump freezegun from 1.5.4 to 1.5.5 + ([#444](https://github.com/Python-roborock/python-roborock/pull/444), + [`e62168a`](https://github.com/Python-roborock/python-roborock/commit/e62168af067501fae2f853fb5924f787470fdd69)) + +- **deps-dev**: Bump mypy from 1.15.0 to 1.17.1 + ([#443](https://github.com/Python-roborock/python-roborock/pull/443), + [`241b166`](https://github.com/Python-roborock/python-roborock/commit/241b1661063083b2685c420a8d931325106b341d)) + +### Features + +- Fix a01 and b01 response handling in new api + ([#453](https://github.com/Python-roborock/python-roborock/pull/453), + [`0004721`](https://github.com/Python-roborock/python-roborock/commit/0004721d5264a13261d8485dd487de512d7c310e)) + + +## v2.36.0 (2025-08-18) + +### Chores + +- Extract common module for manaing pending RPCs + ([#451](https://github.com/Python-roborock/python-roborock/pull/451), + [`d8ce60f`](https://github.com/Python-roborock/python-roborock/commit/d8ce60fe985f152c9f3485cbc12f8c04aaf041b1)) + +- Extract map parser into a separate function to share with new api + ([#440](https://github.com/Python-roborock/python-roborock/pull/440), + [`2a800c2`](https://github.com/Python-roborock/python-roborock/commit/2a800c2943bf0bb6389349798d26dab65411ae40)) + +- Remove docstrings ([#450](https://github.com/Python-roborock/python-roborock/pull/450), + [`1addf95`](https://github.com/Python-roborock/python-roborock/commit/1addf95d5502dde8900bb4bceca418eaad179733)) + +- **deps-dev**: Bump pre-commit from 4.2.0 to 4.3.0 + ([#442](https://github.com/Python-roborock/python-roborock/pull/442), + [`d59d6e3`](https://github.com/Python-roborock/python-roborock/commit/d59d6e331b4a03082d8f494117b28e04766e0e7b)) + +- **deps-dev**: Bump ruff from 0.12.0 to 0.12.8 + ([#441](https://github.com/Python-roborock/python-roborock/pull/441), + [`e58bd95`](https://github.com/Python-roborock/python-roborock/commit/e58bd95d631bf0d85a66686fd0fab82528958458)) + +### Features + +- Add container and function for app_init_status + ([#450](https://github.com/Python-roborock/python-roborock/pull/450), + [`1addf95`](https://github.com/Python-roborock/python-roborock/commit/1addf95d5502dde8900bb4bceca418eaad179733)) + + +## v2.35.0 (2025-08-11) + +### Chores + +- Avoid re-parsing RoborockMessages and replace with passing explicit arguments + ([#439](https://github.com/Python-roborock/python-roborock/pull/439), + [`251b3f9`](https://github.com/Python-roborock/python-roborock/commit/251b3f9fbc245a606279dd4a00603efbf93daa26)) + +### Features + +- Add dynamic clean modes ([#437](https://github.com/Python-roborock/python-roborock/pull/437), + [`af17544`](https://github.com/Python-roborock/python-roborock/commit/af175440a3e754dc198f9026a4bcfd24b891f5ee)) + + +## v2.34.2 (2025-08-11) + +### Bug Fixes + +- Merge the local api with the local v1 api + ([#438](https://github.com/Python-roborock/python-roborock/pull/438), + [`450e35e`](https://github.com/Python-roborock/python-roborock/commit/450e35e23ca591dcf75b916dd3be3daeb4a09e84)) + + +## v2.34.1 (2025-08-10) + +### Bug Fixes + +- Fix "retry" error handling ([#436](https://github.com/Python-roborock/python-roborock/pull/436), + [`eb6da93`](https://github.com/Python-roborock/python-roborock/commit/eb6da93478f89625ca71a381d5a104653d8888f4)) + + +## v2.34.0 (2025-08-10) + +### Chores + +- Fix lint whitespace ([#435](https://github.com/Python-roborock/python-roborock/pull/435), + [`a385a14`](https://github.com/Python-roborock/python-roborock/commit/a385a14816e835ad0d53de1afcd58036877a47ed)) + +- Fix merge with cache data rename + ([#418](https://github.com/Python-roborock/python-roborock/pull/418), + [`98ea911`](https://github.com/Python-roborock/python-roborock/commit/98ea911a313c71b65508b7c934b21c8379b3846e)) + +- Speed up mqtt session shutdown by avoiding a sleep + ([#435](https://github.com/Python-roborock/python-roborock/pull/435), + [`a385a14`](https://github.com/Python-roborock/python-roborock/commit/a385a14816e835ad0d53de1afcd58036877a47ed)) + +### Features + +- Add some basic B01 support ([#429](https://github.com/Python-roborock/python-roborock/pull/429), + [`72274e9`](https://github.com/Python-roborock/python-roborock/commit/72274e9aa23ed31327cd44200fd8c2f0bd26daff)) + +- Get_home_data_v3 for new devices + ([#418](https://github.com/Python-roborock/python-roborock/pull/418), + [`98ea911`](https://github.com/Python-roborock/python-roborock/commit/98ea911a313c71b65508b7c934b21c8379b3846e)) + +- Update cli.py and device_manager.py to use get_home_data_v3 + ([#418](https://github.com/Python-roborock/python-roborock/pull/418), + [`98ea911`](https://github.com/Python-roborock/python-roborock/commit/98ea911a313c71b65508b7c934b21c8379b3846e)) + +- Use get_home_data_v3 for tests + ([#418](https://github.com/Python-roborock/python-roborock/pull/418), + [`98ea911`](https://github.com/Python-roborock/python-roborock/commit/98ea911a313c71b65508b7c934b21c8379b3846e)) + + +## v2.33.0 (2025-08-10) + +### Bug Fixes + +- Adjust cache implementation defaults + ([#432](https://github.com/Python-roborock/python-roborock/pull/432), + [`f076a51`](https://github.com/Python-roborock/python-roborock/commit/f076a516b4569aa00ff767f19eab66eddba0b0b9)) + +### Chores + +- Add back generator exception handling + ([#434](https://github.com/Python-roborock/python-roborock/pull/434), + [`c0f28da`](https://github.com/Python-roborock/python-roborock/commit/c0f28da1e5fbc707c5092baf179c8daa2d97db75)) + +- Fix lint errors ([#434](https://github.com/Python-roborock/python-roborock/pull/434), + [`c0f28da`](https://github.com/Python-roborock/python-roborock/commit/c0f28da1e5fbc707c5092baf179c8daa2d97db75)) + +- Fix lint errors ([#432](https://github.com/Python-roborock/python-roborock/pull/432), + [`f076a51`](https://github.com/Python-roborock/python-roborock/commit/f076a516b4569aa00ff767f19eab66eddba0b0b9)) + +- Update pytest-asyncio and fix clean shutdown + ([#434](https://github.com/Python-roborock/python-roborock/pull/434), + [`c0f28da`](https://github.com/Python-roborock/python-roborock/commit/c0f28da1e5fbc707c5092baf179c8daa2d97db75)) + +### Features + +- Add an explicit module for caching + ([#432](https://github.com/Python-roborock/python-roborock/pull/432), + [`f076a51`](https://github.com/Python-roborock/python-roborock/commit/f076a516b4569aa00ff767f19eab66eddba0b0b9)) + +- Add explicit cache module ([#432](https://github.com/Python-roborock/python-roborock/pull/432), + [`f076a51`](https://github.com/Python-roborock/python-roborock/commit/f076a516b4569aa00ff767f19eab66eddba0b0b9)) + +- Update the cli cache to also store network info + ([#432](https://github.com/Python-roborock/python-roborock/pull/432), + [`f076a51`](https://github.com/Python-roborock/python-roborock/commit/f076a516b4569aa00ff767f19eab66eddba0b0b9)) + + +## v2.32.0 (2025-08-10) + +### Bug Fixes + +- Add test where current_map is none + ([#433](https://github.com/Python-roborock/python-roborock/pull/433), + [`0e28988`](https://github.com/Python-roborock/python-roborock/commit/0e289881e88632c1093827cf4f7d6b9076405c0b)) + +### Chores + +- **deps**: Bump pycryptodome from 3.22.0 to 3.23.0 + ([#403](https://github.com/Python-roborock/python-roborock/pull/403), + [`011631c`](https://github.com/Python-roborock/python-roborock/commit/011631ccdd5313bc5de9d72066fd7b255c8368e8)) + +- **deps**: Bump pycryptodomex from 3.22.0 to 3.23.0 + ([#404](https://github.com/Python-roborock/python-roborock/pull/404), + [`c87d40b`](https://github.com/Python-roborock/python-roborock/commit/c87d40b446e5ab091465f2911e0470a9042f43cc)) + +- **deps**: Bump python-semantic-release/python-semantic-release + ([#421](https://github.com/Python-roborock/python-roborock/pull/421), + [`381acf6`](https://github.com/Python-roborock/python-roborock/commit/381acf64b9c5208950c555a92797c4c0cc0eb5ed)) + +- **deps-dev**: Bump freezegun from 1.5.1 to 1.5.4 + ([#423](https://github.com/Python-roborock/python-roborock/pull/423), + [`1d3fe5c`](https://github.com/Python-roborock/python-roborock/commit/1d3fe5c7ca6ea215b3051759068b8a7843f87f4d)) + +- **deps-dev**: Bump pytest from 8.3.5 to 8.4.1 + ([#405](https://github.com/Python-roborock/python-roborock/pull/405), + [`65e961b`](https://github.com/Python-roborock/python-roborock/commit/65e961b62bc6e248c966565da2470ae482aeafbd)) + +### Features + +- Add property for accessing the current map from the status object + ([#433](https://github.com/Python-roborock/python-roborock/pull/433), + [`0e28988`](https://github.com/Python-roborock/python-roborock/commit/0e289881e88632c1093827cf4f7d6b9076405c0b)) + + +## v2.31.0 (2025-08-10) + +### Chores + +- Fix lint errors ([#427](https://github.com/Python-roborock/python-roborock/pull/427), + [`b4e3693`](https://github.com/Python-roborock/python-roborock/commit/b4e3693caad062ffaa20dd907a53eb5b15e5bd96)) + +### Features + +- Update the cli cache to also store network info + ([#427](https://github.com/Python-roborock/python-roborock/pull/427), + [`b4e3693`](https://github.com/Python-roborock/python-roborock/commit/b4e3693caad062ffaa20dd907a53eb5b15e5bd96)) + + +## v2.30.0 (2025-08-10) + +### Chores + +- Remove command info ([#430](https://github.com/Python-roborock/python-roborock/pull/430), + [`04a83e8`](https://github.com/Python-roborock/python-roborock/commit/04a83e8485e297f329750e41fe663fe90819152e)) + +### Features + +- Add a new type for supported features + ([#431](https://github.com/Python-roborock/python-roborock/pull/431), + [`b23c358`](https://github.com/Python-roborock/python-roborock/commit/b23c358b2cbc9642a8be908fa0864592f64df0fc)) + + +## v2.29.1 (2025-08-09) + +### Bug Fixes + +- Add test coverage for extra keys + ([#426](https://github.com/Python-roborock/python-roborock/pull/426), + [`97dfd16`](https://github.com/Python-roborock/python-roborock/commit/97dfd1647ac16900875f1e77aadfbd7921a9fadc)) + +### Chores + +- Cleanup whitespace ([#426](https://github.com/Python-roborock/python-roborock/pull/426), + [`97dfd16`](https://github.com/Python-roborock/python-roborock/commit/97dfd1647ac16900875f1e77aadfbd7921a9fadc)) + +- Fix typing ([#426](https://github.com/Python-roborock/python-roborock/pull/426), + [`97dfd16`](https://github.com/Python-roborock/python-roborock/commit/97dfd1647ac16900875f1e77aadfbd7921a9fadc)) + +- Remove container ([#426](https://github.com/Python-roborock/python-roborock/pull/426), + [`97dfd16`](https://github.com/Python-roborock/python-roborock/commit/97dfd1647ac16900875f1e77aadfbd7921a9fadc)) + +- Remove unnecessary container ([#426](https://github.com/Python-roborock/python-roborock/pull/426), + [`97dfd16`](https://github.com/Python-roborock/python-roborock/commit/97dfd1647ac16900875f1e77aadfbd7921a9fadc)) + +- Update container parsing using native typing and dataclass + ([#426](https://github.com/Python-roborock/python-roborock/pull/426), + [`97dfd16`](https://github.com/Python-roborock/python-roborock/commit/97dfd1647ac16900875f1e77aadfbd7921a9fadc)) + +- Update unknown key test to use simple object + ([#426](https://github.com/Python-roborock/python-roborock/pull/426), + [`97dfd16`](https://github.com/Python-roborock/python-roborock/commit/97dfd1647ac16900875f1e77aadfbd7921a9fadc)) + + +## v2.29.0 (2025-08-09) + +### Bug Fixes + +- Add safety check for trait creation + ([#425](https://github.com/Python-roborock/python-roborock/pull/425), + [`f7d1a55`](https://github.com/Python-roborock/python-roborock/commit/f7d1a553677fd988c24891648410c144565c658b)) + +- Update mqtt payload encoding signature + ([#425](https://github.com/Python-roborock/python-roborock/pull/425), + [`f7d1a55`](https://github.com/Python-roborock/python-roborock/commit/f7d1a553677fd988c24891648410c144565c658b)) + +### Chores + +- Address code review feedback ([#425](https://github.com/Python-roborock/python-roborock/pull/425), + [`f7d1a55`](https://github.com/Python-roborock/python-roborock/commit/f7d1a553677fd988c24891648410c144565c658b)) + +- Revert encode_mqtt_payload typing change + ([#425](https://github.com/Python-roborock/python-roborock/pull/425), + [`f7d1a55`](https://github.com/Python-roborock/python-roborock/commit/f7d1a553677fd988c24891648410c144565c658b)) + +- Update roborock/devices/v1_channel.py + ([#425](https://github.com/Python-roborock/python-roborock/pull/425), + [`f7d1a55`](https://github.com/Python-roborock/python-roborock/commit/f7d1a553677fd988c24891648410c144565c658b)) + +### Features + +- Support both a01 and v1 device types with traits + ([#425](https://github.com/Python-roborock/python-roborock/pull/425), + [`f7d1a55`](https://github.com/Python-roborock/python-roborock/commit/f7d1a553677fd988c24891648410c144565c658b)) + +- Update cli with v1 status trait + ([#425](https://github.com/Python-roborock/python-roborock/pull/425), + [`f7d1a55`](https://github.com/Python-roborock/python-roborock/commit/f7d1a553677fd988c24891648410c144565c658b)) + + +## v2.28.0 (2025-08-09) + +### Chores + +- Add timeout to queue request to diagnose + ([#420](https://github.com/Python-roborock/python-roborock/pull/420), + [`717654a`](https://github.com/Python-roborock/python-roborock/commit/717654a648a86c1323048fb6cfdb022aef3097ec)) + +- Attempt to reduce a01 test flakiness by fixing shutdown to reduce number of active threads + ([#420](https://github.com/Python-roborock/python-roborock/pull/420), + [`717654a`](https://github.com/Python-roborock/python-roborock/commit/717654a648a86c1323048fb6cfdb022aef3097ec)) + +- Fix a01 client ([#420](https://github.com/Python-roborock/python-roborock/pull/420), + [`717654a`](https://github.com/Python-roborock/python-roborock/commit/717654a648a86c1323048fb6cfdb022aef3097ec)) + +- Fix lint errors ([#420](https://github.com/Python-roborock/python-roborock/pull/420), + [`717654a`](https://github.com/Python-roborock/python-roborock/commit/717654a648a86c1323048fb6cfdb022aef3097ec)) + +- Move device_features to seperate file and add some tests and rework device_features + ([#365](https://github.com/Python-roborock/python-roborock/pull/365), + [`c6ba0d6`](https://github.com/Python-roborock/python-roborock/commit/c6ba0d669f259744176821927c8606172c5c345d)) + +- Refactor some of the internal channel details used by the device. + ([#424](https://github.com/Python-roborock/python-roborock/pull/424), + [`cbd6df2`](https://github.com/Python-roborock/python-roborock/commit/cbd6df23da93681b72d47a68c1d64dcb25b27db5)) + +- Remove unnecessary command ([#424](https://github.com/Python-roborock/python-roborock/pull/424), + [`cbd6df2`](https://github.com/Python-roborock/python-roborock/commit/cbd6df23da93681b72d47a68c1d64dcb25b27db5)) + +- Rename rpc channels to have v1 in the name + ([#424](https://github.com/Python-roborock/python-roborock/pull/424), + [`cbd6df2`](https://github.com/Python-roborock/python-roborock/commit/cbd6df23da93681b72d47a68c1d64dcb25b27db5)) + +- Separate V1 API connection logic from encoding logic + ([#424](https://github.com/Python-roborock/python-roborock/pull/424), + [`cbd6df2`](https://github.com/Python-roborock/python-roborock/commit/cbd6df23da93681b72d47a68c1d64dcb25b27db5)) + +- Update to the version from the other PR + ([#365](https://github.com/Python-roborock/python-roborock/pull/365), + [`c6ba0d6`](https://github.com/Python-roborock/python-roborock/commit/c6ba0d669f259744176821927c8606172c5c345d)) + +### Features + +- Add device_features to automatically determine what is supported + ([#365](https://github.com/Python-roborock/python-roborock/pull/365), + [`c6ba0d6`](https://github.com/Python-roborock/python-roborock/commit/c6ba0d669f259744176821927c8606172c5c345d)) + + +## v2.27.0 (2025-08-03) + +### Bug Fixes + +- Simplify local connection handling + ([#416](https://github.com/Python-roborock/python-roborock/pull/416), + [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) + +- Update error message and add pydoc for exception handling on subscribe + ([#416](https://github.com/Python-roborock/python-roborock/pull/416), + [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) + +- Update pydoc for sending a raw command + ([#416](https://github.com/Python-roborock/python-roborock/pull/416), + [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) + +### Chores + +- Remove whitespace ([#416](https://github.com/Python-roborock/python-roborock/pull/416), + [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) + +- **deps**: Bump click from 8.1.8 to 8.2.1 + ([#416](https://github.com/Python-roborock/python-roborock/pull/416), + [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) + +### Features + +- Add a v1 protocol channel bridging across MQTT/Local channels + ([#416](https://github.com/Python-roborock/python-roborock/pull/416), + [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) + +- Add a v1 protocol channel that can send messages across MQTT or Local connections, preferring + local ([#416](https://github.com/Python-roborock/python-roborock/pull/416), + [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) + +- Fix tests referencing RoborockStateCode + ([#416](https://github.com/Python-roborock/python-roborock/pull/416), + [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) + +- Fix tests reverted by co-pilot + ([#416](https://github.com/Python-roborock/python-roborock/pull/416), + [`c1bdac0`](https://github.com/Python-roborock/python-roborock/commit/c1bdac0ac56a9b86c33fb89c84c9eae92c9ed682)) + + +## v2.26.0 (2025-08-03) + +### Chores + +- Move a01 encoding and decoding to a separate module + ([#417](https://github.com/Python-roborock/python-roborock/pull/417), + [`5a2dac0`](https://github.com/Python-roborock/python-roborock/commit/5a2dac0ae39d05fd71efa753fc860009d0a07428)) + +- Remove logging code ([#417](https://github.com/Python-roborock/python-roborock/pull/417), + [`5a2dac0`](https://github.com/Python-roborock/python-roborock/commit/5a2dac0ae39d05fd71efa753fc860009d0a07428)) + +- Remove stale comment in roborock_client_a01.py + ([#417](https://github.com/Python-roborock/python-roborock/pull/417), + [`5a2dac0`](https://github.com/Python-roborock/python-roborock/commit/5a2dac0ae39d05fd71efa753fc860009d0a07428)) + +- Revert some logging changes ([#417](https://github.com/Python-roborock/python-roborock/pull/417), + [`5a2dac0`](https://github.com/Python-roborock/python-roborock/commit/5a2dac0ae39d05fd71efa753fc860009d0a07428)) + +### Features + +- Add Saros 10 code mappings ([#419](https://github.com/Python-roborock/python-roborock/pull/419), + [`54a7e53`](https://github.com/Python-roborock/python-roborock/commit/54a7e53da7a482cd293243dd752bbe3ce77cbda3)) + + +## v2.25.1 (2025-07-27) + +### Bug Fixes + +- Add saros 10r modes ([#415](https://github.com/Python-roborock/python-roborock/pull/415), + [`7ebcde9`](https://github.com/Python-roborock/python-roborock/commit/7ebcde942587ab3de81783b4b6006080cd715466)) + +### Chores + +- **deps**: Bump click from 8.1.8 to 8.2.1 + ([#401](https://github.com/Python-roborock/python-roborock/pull/401), + [`36f5f2b`](https://github.com/Python-roborock/python-roborock/commit/36f5f2b76aee7d21da63e3f222cffa01d7e303b8)) + +- **deps**: Bump python-semantic-release/python-semantic-release + ([#400](https://github.com/Python-roborock/python-roborock/pull/400), + [`fd17a30`](https://github.com/Python-roborock/python-roborock/commit/fd17a307a74ab10550ac129590542528a8bac3ca)) + + +## v2.25.0 (2025-07-15) + +### Chores + +- Change return type of caplog ([#411](https://github.com/Python-roborock/python-roborock/pull/411), + [`f1dd1fe`](https://github.com/Python-roborock/python-roborock/commit/f1dd1fec36629cffb01e1a44ce96e36566bb4246)) + +- Create module for v1 request encoding + ([#413](https://github.com/Python-roborock/python-roborock/pull/413), + [`7507423`](https://github.com/Python-roborock/python-roborock/commit/7507423478c0a35375cc51fbffa043f015d73755)) + +- Delete tests/devices/test_v1_protocol.py + ([#413](https://github.com/Python-roborock/python-roborock/pull/413), + [`7507423`](https://github.com/Python-roborock/python-roborock/commit/7507423478c0a35375cc51fbffa043f015d73755)) + +- Enable verbose logging in CI ([#411](https://github.com/Python-roborock/python-roborock/pull/411), + [`f1dd1fe`](https://github.com/Python-roborock/python-roborock/commit/f1dd1fec36629cffb01e1a44ce96e36566bb4246)) + +- Fix CI logging ([#411](https://github.com/Python-roborock/python-roborock/pull/411), + [`f1dd1fe`](https://github.com/Python-roborock/python-roborock/commit/f1dd1fec36629cffb01e1a44ce96e36566bb4246)) + +- Fix lint ([#411](https://github.com/Python-roborock/python-roborock/pull/411), + [`f1dd1fe`](https://github.com/Python-roborock/python-roborock/commit/f1dd1fec36629cffb01e1a44ce96e36566bb4246)) + +- Fix lint in test ([#412](https://github.com/Python-roborock/python-roborock/pull/412), + [`ec780c9`](https://github.com/Python-roborock/python-roborock/commit/ec780c94c2de89fc565b24dc02fbaa3a5b531422)) + +- Fix warning in tests/devices/test_device_manager.py + ([#412](https://github.com/Python-roborock/python-roborock/pull/412), + [`ec780c9`](https://github.com/Python-roborock/python-roborock/commit/ec780c94c2de89fc565b24dc02fbaa3a5b531422)) + +- Remove incorrect caplog package + ([#411](https://github.com/Python-roborock/python-roborock/pull/411), + [`f1dd1fe`](https://github.com/Python-roborock/python-roborock/commit/f1dd1fec36629cffb01e1a44ce96e36566bb4246)) + +- Remove tests that timeout on CI + ([#411](https://github.com/Python-roborock/python-roborock/pull/411), + [`f1dd1fe`](https://github.com/Python-roborock/python-roborock/commit/f1dd1fec36629cffb01e1a44ce96e36566bb4246)) + +- Update log format to include timining information and thread names + ([#411](https://github.com/Python-roborock/python-roborock/pull/411), + [`f1dd1fe`](https://github.com/Python-roborock/python-roborock/commit/f1dd1fec36629cffb01e1a44ce96e36566bb4246)) + +### Features + +- Simplify local payload encoding by rejecting any cloud commands sent locally + ([#413](https://github.com/Python-roborock/python-roborock/pull/413), + [`7507423`](https://github.com/Python-roborock/python-roborock/commit/7507423478c0a35375cc51fbffa043f015d73755)) + + +## v2.24.0 (2025-07-05) + +### Features + +- Add a local channel, similar to the MQTT channel + ([#410](https://github.com/Python-roborock/python-roborock/pull/410), + [`1fb135b`](https://github.com/Python-roborock/python-roborock/commit/1fb135b763b8abe88d799fc609bdfc07077dee0a)) + +- Add debug lines ([#409](https://github.com/Python-roborock/python-roborock/pull/409), + [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) + +- Add support for sending/recieving messages + ([#409](https://github.com/Python-roborock/python-roborock/pull/409), + [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) + +- Add test coverage for device manager close + ([#409](https://github.com/Python-roborock/python-roborock/pull/409), + [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) + +- Add test coverage to device modules + ([#409](https://github.com/Python-roborock/python-roborock/pull/409), + [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) + +- Apply suggestions from code review + ([#409](https://github.com/Python-roborock/python-roborock/pull/409), + [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) + +- Gather tasks ([#409](https://github.com/Python-roborock/python-roborock/pull/409), + [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) + +- Log a warning when transport is already closed + ([#410](https://github.com/Python-roborock/python-roborock/pull/410), + [`1fb135b`](https://github.com/Python-roborock/python-roborock/commit/1fb135b763b8abe88d799fc609bdfc07077dee0a)) + +- Simplify rpc handling and tests + ([#409](https://github.com/Python-roborock/python-roborock/pull/409), + [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) + +- Update device manager and device to establish an MQTT subscription + ([#409](https://github.com/Python-roborock/python-roborock/pull/409), + [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) + +- Update roborock/devices/mqtt_channel.py + ([#409](https://github.com/Python-roborock/python-roborock/pull/409), + [`509ff6a`](https://github.com/Python-roborock/python-roborock/commit/509ff6aa223b4e49de1fe4fd70c8e2a2afbcb501)) + + +## v2.23.0 (2025-07-01) + +### Features + +- Implement set_value method for a01 device protocols + ([#408](https://github.com/Python-roborock/python-roborock/pull/408), + [`011b253`](https://github.com/Python-roborock/python-roborock/commit/011b2538fc6c0876f2b40465f9a6474bd03d21c6)) + + +## v2.22.0 (2025-07-01) + +### Chores + +- Increase test timeout to 30 seconds + ([#407](https://github.com/Python-roborock/python-roborock/pull/407), + [`e59c0b5`](https://github.com/Python-roborock/python-roborock/commit/e59c0b5948a83081a4a248fa2108fed81aa6f036)) + +### Features + +- Add a CLI for exercising the asyncio MQTT session + ([#396](https://github.com/Python-roborock/python-roborock/pull/396), + [`54547d8`](https://github.com/Python-roborock/python-roborock/commit/54547d87bef080fe3ce03672509ba179bf7feafb)) + +- Fix lint error ([#396](https://github.com/Python-roborock/python-roborock/pull/396), + [`54547d8`](https://github.com/Python-roborock/python-roborock/commit/54547d87bef080fe3ce03672509ba179bf7feafb)) + +- Remove unused import ([#396](https://github.com/Python-roborock/python-roborock/pull/396), + [`54547d8`](https://github.com/Python-roborock/python-roborock/commit/54547d87bef080fe3ce03672509ba179bf7feafb)) + +- Share mqtt url parsing code with original client + ([#396](https://github.com/Python-roborock/python-roborock/pull/396), + [`54547d8`](https://github.com/Python-roborock/python-roborock/commit/54547d87bef080fe3ce03672509ba179bf7feafb)) + +- Update bytes dump ([#396](https://github.com/Python-roborock/python-roborock/pull/396), + [`54547d8`](https://github.com/Python-roborock/python-roborock/commit/54547d87bef080fe3ce03672509ba179bf7feafb)) + + +## v2.21.0 (2025-07-01) + +### Chores + +- Minor refactoring creating functions for transforming bytes + ([#397](https://github.com/Python-roborock/python-roborock/pull/397), + [`b19dbaa`](https://github.com/Python-roborock/python-roborock/commit/b19dbaac894a9fec8953e782cfb51433f19b2b90)) + +- Refactor authorization header + ([#398](https://github.com/Python-roborock/python-roborock/pull/398), + [`9e0ddf8`](https://github.com/Python-roborock/python-roborock/commit/9e0ddf89dfb18774b757ad07270de0be3af14561)) + +- **deps**: Bump vacuum-map-parser-roborock from 0.1.2 to 0.1.4 + ([#373](https://github.com/Python-roborock/python-roborock/pull/373), + [`05966aa`](https://github.com/Python-roborock/python-roborock/commit/05966aa474227bbb1d58192d68b44f3003f97e86)) + +### Features + +- Add a DeviceManager to perform discovery + ([#399](https://github.com/Python-roborock/python-roborock/pull/399), + [`e04a215`](https://github.com/Python-roborock/python-roborock/commit/e04a215bcadce6e582d92dce81f58e902391ec57)) + +- Fix lint error ([#399](https://github.com/Python-roborock/python-roborock/pull/399), + [`e04a215`](https://github.com/Python-roborock/python-roborock/commit/e04a215bcadce6e582d92dce81f58e902391ec57)) + +- Update CLI to allow logging in with a code + ([#395](https://github.com/Python-roborock/python-roborock/pull/395), + [`e1a9e69`](https://github.com/Python-roborock/python-roborock/commit/e1a9e695362677d82abf1693bb8790537e38d2d1)) + +- Update review feedback ([#399](https://github.com/Python-roborock/python-roborock/pull/399), + [`e04a215`](https://github.com/Python-roborock/python-roborock/commit/e04a215bcadce6e582d92dce81f58e902391ec57)) + +- Update tests with additional feedback + ([#399](https://github.com/Python-roborock/python-roborock/pull/399), + [`e04a215`](https://github.com/Python-roborock/python-roborock/commit/e04a215bcadce6e582d92dce81f58e902391ec57)) + + +## v2.20.0 (2025-06-30) + +### Bug Fixes + +- Correct keepalive log message + ([#385](https://github.com/Python-roborock/python-roborock/pull/385), + [`8d4902b`](https://github.com/Python-roborock/python-roborock/commit/8d4902b408cba89daad7eb46d85ef7bdb4b8c8c7)) + +- Correct typos in log messages + ([#385](https://github.com/Python-roborock/python-roborock/pull/385), + [`8d4902b`](https://github.com/Python-roborock/python-roborock/commit/8d4902b408cba89daad7eb46d85ef7bdb4b8c8c7)) + +### Chores + +- **deps**: Bump aiohttp from 3.11.16 to 3.12.13 + ([#390](https://github.com/Python-roborock/python-roborock/pull/390), + [`e10b464`](https://github.com/Python-roborock/python-roborock/commit/e10b464b895fcbb8340fcf11ea7b5f2a2f33b676)) + +- **deps**: Bump python-semantic-release/python-semantic-release + ([#391](https://github.com/Python-roborock/python-roborock/pull/391), + [`6536700`](https://github.com/Python-roborock/python-roborock/commit/653670031bb366ed0e08d3daadb63d511795929c)) + +- **deps-dev**: Bump pre-commit from 4.1.0 to 4.2.0 + ([#358](https://github.com/Python-roborock/python-roborock/pull/358), + [`9653abc`](https://github.com/Python-roborock/python-roborock/commit/9653abc2451d8b2d2f8c68232777d1419a194efb)) + +- **deps-dev**: Bump pytest-timeout from 2.3.1 to 2.4.0 + ([#379](https://github.com/Python-roborock/python-roborock/pull/379), + [`150de05`](https://github.com/Python-roborock/python-roborock/commit/150de05390ce7e31862a202e99017932da3529a5)) + +- **deps-dev**: Bump ruff from 0.11.4 to 0.12.0 + ([#394](https://github.com/Python-roborock/python-roborock/pull/394), + [`6ce7af8`](https://github.com/Python-roborock/python-roborock/commit/6ce7af82c847f7cdfa7107bae3505088437a9e66)) + +### Features + +- Add Qrevo MaxV code mappings ([#385](https://github.com/Python-roborock/python-roborock/pull/385), + [`8d4902b`](https://github.com/Python-roborock/python-roborock/commit/8d4902b408cba89daad7eb46d85ef7bdb4b8c8c7)) + +- Add support for roborock qrevo maxv code mappings + ([#385](https://github.com/Python-roborock/python-roborock/pull/385), + [`8d4902b`](https://github.com/Python-roborock/python-roborock/commit/8d4902b408cba89daad7eb46d85ef7bdb4b8c8c7)) + ## v2.19.0 (2025-05-13) From 76605acf2bea56eb7494068dfe323be58b9ace69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Mon, 2 Feb 2026 00:22:34 +0100 Subject: [PATCH 14/14] fix: restore pyproject.toml --- pyproject.toml | 107 +++++++++++++++++++++++++++++++------------------ 1 file changed, 68 insertions(+), 39 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 93774281..20d1b5e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,16 @@ -[tool.poetry] +[project] name = "python-roborock" -version = "2.25.0" +version = "4.10.0" description = "A package to control Roborock vacuums." -authors = ["humbertogontijo "] -license = "GPL-3.0-only" +authors = [{ name = "humbertogontijo", email = "humbertogontijo@users.noreply.github.com" }, {name="Lash-L"}, {name="allenporter"}] +requires-python = ">=3.11, <4" readme = "README.md" -repository = "https://github.com/humbertogontijo/python-roborock" -documentation = "https://python-roborock.readthedocs.io/" +license = "GPL-3.0-only" +keywords = [ + "roborock", + "vacuum", + "homeassistant", +] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", @@ -14,46 +18,71 @@ classifiers = [ "Operating System :: OS Independent", "Topic :: Software Development :: Libraries", ] -packages = [{include = "roborock"}] -keywords = ["roborock", "vacuum", "homeassistant"] +dependencies = [ + "click>=8", + "aiohttp>=3.8.2,<4", + "pycryptodome~=3.18", + "pycryptodomex~=3.18 ; sys_platform == 'darwin'", + "paho-mqtt>=1.6.1,<3.0.0", + "construct>=2.10.57,<3", + "vacuum-map-parser-roborock", + "pyrate-limiter>=3.7.0,<4", + "aiomqtt>=2.5.0,<3", + "click-shell~=2.1", +] + +[project.urls] +Repository = "https://github.com/humbertogontijo/python-roborock" +Documentation = "https://python-roborock.readthedocs.io/" -[tool.poetry.scripts] +[project.scripts] roborock = "roborock.cli:main" -[tool.poetry.dependencies] -python = "^3.11" -click = ">=8" -aiohttp = "^3.8.2" -async-timeout = "*" -pycryptodome = "^3.18" -pycryptodomex = {version = "^3.18", markers = "sys_platform == 'darwin'"} -paho-mqtt = ">=1.6.1,<3.0.0" -construct = "^2.10.57" -vacuum-map-parser-roborock = "*" -pyrate-limiter = "^3.7.0" -aiomqtt = "^2.3.2" +[dependency-groups] +dev = [ + "pytest-asyncio>=1.1.0", + "pytest", + "pre-commit>=3.5,<5.0", + "mypy", + "ruff==0.14.11", + "codespell", + "pyshark>=0.6,<0.7", + "aioresponses>=0.7.7,<0.8", + "freezegun>=1.5.1,<2", + "pytest-timeout>=2.3.1,<3", + "syrupy>=4.9.1,<6", + "pdoc>=15.0.4,<17", + "pyyaml>=6.0.3", + "pyshark>=0.6", + "pytest-cov>=7.0.0", +] + +[tool.hatch.build.targets.sdist] +include = ["roborock"] +[tool.hatch.build.targets.wheel] +include = ["roborock"] [build-system] -requires = ["poetry-core==1.8.0"] -build-backend = "poetry.core.masonry.api" - -[tool.poetry.group.dev.dependencies] -pytest-asyncio = "*" -pytest = "*" -pre-commit = ">=3.5,<5.0" -mypy = "*" -ruff = "*" -codespell = "*" -pyshark = "^0.6" -aioresponses = "^0.7.7" -freezegun = "^1.5.1" -pytest-timeout = "^2.3.1" +requires = ["hatchling"] +build-backend = "hatchling.build" [tool.semantic_release] branch = "main" -version_toml = ["pyproject.toml:tool.poetry.version"] -build_command = "pip install poetry && poetry build" +version_toml = ["pyproject.toml:project.version"] +build_command = "pip install uv && uv lock --upgrade-package python-roborock && git add uv.lock && uv build" +changelog_file = 'CHANGELOG.md' +commit = true + +[tool.semantic_release.branches.main] +match = "main" +prerelease = false + +[tool.semantic_release.branches.temp-main-branch] +match = "temp-main-branch" +prerelease = false + + [tool.semantic_release.commit_parser_options] allowed_tags = [ "chore", @@ -65,9 +94,9 @@ allowed_tags = [ major_tags= ["refactor"] [tool.ruff] -ignore = ["F403", "E741"] +lint.ignore = ["F403", "E741"] +lint.select=["E", "F", "UP", "I"] line-length = 120 -select=["E", "F", "UP", "I"] [tool.ruff.lint.per-file-ignores] "*/__init__.py" = ["F401"]