Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
299 changes: 299 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,305 @@

<!-- version list -->

## v5.28.0 (2026-07-08)

### Features

- Add better dock feature control
([#867](https://github.com/Python-roborock/python-roborock/pull/867),
[`73ba2bf`](https://github.com/Python-roborock/python-roborock/commit/73ba2bf152d1c43b4d46d1e7f397043dd195d046))


## v5.27.0 (2026-07-07)

### Documentation

- Add comment explaining dss field in v1_simulator
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

### Features

- Add roborock.testing module for stateful integration testing
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

- Expose dock_type configuration in V1VacuumSimulator
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

- Expose in_cleaning, in_returning, charge_status, and dss on V1VacuumSimulator
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

- Honor publish_side_effect in simulator and raise NotImplementedError in base _handle_publish
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

### Refactoring

- Decouple default product id from device duid and share DEFAULT_PRODUCT_ID constant
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

- Delete redundant properties from V1VacuumSimulator and update trigger_push_update
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

- Export and define all simulator state default constants at package level
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

- Expose raw status and app_init dataclasses on simulator for direct test manipulation
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

- Inherit FakeChannel from Channel Protocol
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

- Rename self.servers to self.simulated_devices and restore hardcoded qiCNieZa in mock_data
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

- Replace FakeUserState with library UserData dataclass on FakeRoborockCloud
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

- Type simulator consumables state using Consumable dataclass
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

- Type simulator dnd, clean summary and record using real dataclasses
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

- Type simulator status, network info and init status using real dataclasses
([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))

- Update _handle_app_get_init_status to serialize self.app_init and dynamically resolve status_info
fields from self.status ([#860](https://github.com/Python-roborock/python-roborock/pull/860),
[`c963ad7`](https://github.com/Python-roborock/python-roborock/commit/c963ad79b7d7206dd1b97cd7f377305a67f90364))


## v5.26.0 (2026-07-06)

### Documentation

- Add 569 back to the docstring's Q7-divergence list
([#863](https://github.com/Python-roborock/python-roborock/pull/863),
[`32f9747`](https://github.com/Python-roborock/python-roborock/commit/32f9747b368c4d58a78691a0106a8c9676a07e2c))

- Mark fault 12 hw-confirmed (fired at 14% battery, corpus recount)
([#863](https://github.com/Python-roborock/python-roborock/pull/863),
[`32f9747`](https://github.com/Python-roborock/python-roborock/commit/32f9747b368c4d58a78691a0106a8c9676a07e2c))

- Mark fault 2 hw-confirmed (bumper held during commanded motion)
([#863](https://github.com/Python-roborock/python-roborock/pull/863),
[`32f9747`](https://github.com/Python-roborock/python-roborock/commit/32f9747b368c4d58a78691a0106a8c9676a07e2c))

- Mark fault 407 hw-confirmed (deterministically reproduced: due schedule ignored mid-clean)
([#863](https://github.com/Python-roborock/python-roborock/pull/863),
[`32f9747`](https://github.com/Python-roborock/python-roborock/commit/32f9747b368c4d58a78691a0106a8c9676a07e2c))

- Mark fault 46 hw-confirmed (docked with dust bag removed)
([#863](https://github.com/Python-roborock/python-roborock/pull/863),
[`32f9747`](https://github.com/Python-roborock/python-roborock/commit/32f9747b368c4d58a78691a0106a8c9676a07e2c))

- Mark fault 5 hw-confirmed (physically ground-truthed brush jams)
([#863](https://github.com/Python-roborock/python-roborock/pull/863),
[`32f9747`](https://github.com/Python-roborock/python-roborock/commit/32f9747b368c4d58a78691a0106a8c9676a07e2c))

- Note fault 501 fires per completed task
([#863](https://github.com/Python-roborock/python-roborock/pull/863),
[`32f9747`](https://github.com/Python-roborock/python-roborock/commit/32f9747b368c4d58a78691a0106a8c9676a07e2c))

- Note the error state can carry no fault code (observed live)
([#863](https://github.com/Python-roborock/python-roborock/pull/863),
[`32f9747`](https://github.com/Python-roborock/python-roborock/commit/32f9747b368c4d58a78691a0106a8c9676a07e2c))

- Refer to the ss07 fault spec, not the app (review feedback)
([#863](https://github.com/Python-roborock/python-roborock/pull/863),
[`32f9747`](https://github.com/Python-roborock/python-roborock/commit/32f9747b368c4d58a78691a0106a8c9676a07e2c))

### Features

- Decode Q10 (B01/ss07) dpFault codes into a YXFault map
([#863](https://github.com/Python-roborock/python-roborock/pull/863),
[`32f9747`](https://github.com/Python-roborock/python-roborock/commit/32f9747b368c4d58a78691a0106a8c9676a07e2c))

- Decode Q10 (B01/ss07) dpFault codes with a YXFault enum
([#863](https://github.com/Python-roborock/python-roborock/pull/863),
[`32f9747`](https://github.com/Python-roborock/python-roborock/commit/32f9747b368c4d58a78691a0106a8c9676a07e2c))

- Re-add fault 569 as too_frequent_emptying, hw-confirmed (dock refuses a too-soon empty)
([#863](https://github.com/Python-roborock/python-roborock/pull/863),
[`32f9747`](https://github.com/Python-roborock/python-roborock/commit/32f9747b368c4d58a78691a0106a8c9676a07e2c))

### Refactoring

- Decouple B01 (Q7/Q10) protocol layer from transport layer
([#859](https://github.com/Python-roborock/python-roborock/pull/859),
[`b00d60b`](https://github.com/Python-roborock/python-roborock/commit/b00d60b9f70d6a5da9089e470db60b04437c0b14))

- Type Q10Status.fault as YXFault, mirroring the Q7 fault field
([#863](https://github.com/Python-roborock/python-roborock/pull/863),
[`32f9747`](https://github.com/Python-roborock/python-roborock/commit/32f9747b368c4d58a78691a0106a8c9676a07e2c))


## v5.25.0 (2026-07-03)

### Chores

- Add dataclasses for Roborock mower
([#862](https://github.com/Python-roborock/python-roborock/pull/862),
[`413d6e5`](https://github.com/Python-roborock/python-roborock/commit/413d6e57ae74d3d54f9f1d4c8918ffbe9d215b7b))

- Add some comments that better explain 'get_mop_only_vacuum_mode'
([#817](https://github.com/Python-roborock/python-roborock/pull/817),
[`9474bfa`](https://github.com/Python-roborock/python-roborock/commit/9474bfaa607f15c7b66f520af17d81c849651f68))

- Address comments ([#817](https://github.com/Python-roborock/python-roborock/pull/817),
[`9474bfa`](https://github.com/Python-roborock/python-roborock/commit/9474bfaa607f15c7b66f520af17d81c849651f68))

- Address comments from copilot
([#817](https://github.com/Python-roborock/python-roborock/pull/817),
[`9474bfa`](https://github.com/Python-roborock/python-roborock/commit/9474bfaa607f15c7b66f520af17d81c849651f68))

- Apply suggestions from code review
([#862](https://github.com/Python-roborock/python-roborock/pull/862),
[`413d6e5`](https://github.com/Python-roborock/python-roborock/commit/413d6e57ae74d3d54f9f1d4c8918ffbe9d215b7b))

- Drop int typing and improve comment
([#817](https://github.com/Python-roborock/python-roborock/pull/817),
[`9474bfa`](https://github.com/Python-roborock/python-roborock/commit/9474bfaa607f15c7b66f520af17d81c849651f68))

### Features

- Add better cleaning mode support
([#817](https://github.com/Python-roborock/python-roborock/pull/817),
[`9474bfa`](https://github.com/Python-roborock/python-roborock/commit/9474bfaa607f15c7b66f520af17d81c849651f68))


## v5.24.0 (2026-07-03)

### Features

- Implement dynamic map update listeners and filtering on HomeTrait
([#861](https://github.com/Python-roborock/python-roborock/pull/861),
[`a793c8e`](https://github.com/Python-roborock/python-roborock/commit/a793c8e0a3e0359027d491d406dd36f2d62d41f6))


## v5.23.1 (2026-07-03)

### Bug Fixes

- Verify MQTT connection requires successful subscription
([#858](https://github.com/Python-roborock/python-roborock/pull/858),
[`e3c97c6`](https://github.com/Python-roborock/python-roborock/commit/e3c97c68ce5cf38022241bf85d68977c223b8922))

### Documentation

- Clarify is_mqtt_connected docstring with motivation
([#858](https://github.com/Python-roborock/python-roborock/pull/858),
[`e3c97c6`](https://github.com/Python-roborock/python-roborock/commit/e3c97c68ce5cf38022241bf85d68977c223b8922))

### Refactoring

- Remove unused fixtures in tests
([#858](https://github.com/Python-roborock/python-roborock/pull/858),
[`e3c97c6`](https://github.com/Python-roborock/python-roborock/commit/e3c97c68ce5cf38022241bf85d68977c223b8922))


## v5.23.0 (2026-07-03)

### Features

- Add Q10 (B01/ss07) clean-record history trait
([#857](https://github.com/Python-roborock/python-roborock/pull/857),
[`79a996d`](https://github.com/Python-roborock/python-roborock/commit/79a996de463a59ff4de875579a417d157e8cc2e8))

- Q10 (B01/ss07) clean-record history trait
([#857](https://github.com/Python-roborock/python-roborock/pull/857),
[`79a996d`](https://github.com/Python-roborock/python-roborock/commit/79a996de463a59ff4de875579a417d157e8cc2e8))

### Refactoring

- Call the static parse_record via the class, not self
([#857](https://github.com/Python-roborock/python-roborock/pull/857),
[`79a996d`](https://github.com/Python-roborock/python-roborock/commit/79a996de463a59ff4de875579a417d157e8cc2e8))

- Widen parse_record's parameter type to Any | None
([#857](https://github.com/Python-roborock/python-roborock/pull/857),
[`79a996d`](https://github.com/Python-roborock/python-roborock/commit/79a996de463a59ff4de875579a417d157e8cc2e8))


## v5.22.0 (2026-06-28)

### Bug Fixes

- Avoid Q10 Consumable/NetworkInfo shadowing v1 in roborock.data
([#851](https://github.com/Python-roborock/python-roborock/pull/851),
[`e71611b`](https://github.com/Python-roborock/python-roborock/commit/e71611b2b57f2ca1dc1d2c42d6fce0d3f1b6169b))

- Correct Q10 vacuum command payloads, verified against ss07 hardware
([#851](https://github.com/Python-roborock/python-roborock/pull/851),
[`e71611b`](https://github.com/Python-roborock/python-roborock/commit/e71611b2b57f2ca1dc1d2c42d6fce0d3f1b6169b))

- Keep Q10 CLIFF_RESTRICTED_AREA_UP (103); ss07 pushes it
([#851](https://github.com/Python-roborock/python-roborock/pull/851),
[`e71611b`](https://github.com/Python-roborock/python-roborock/commit/e71611b2b57f2ca1dc1d2c42d6fce0d3f1b6169b))

- Show all Q10 read-model traits in status, wait for fresh push
([#851](https://github.com/Python-roborock/python-roborock/pull/851),
[`e71611b`](https://github.com/Python-roborock/python-roborock/commit/e71611b2b57f2ca1dc1d2c42d6fce0d3f1b6169b))

- Stop unmapped Q10 data points from logging "not a valid code" warnings
([#851](https://github.com/Python-roborock/python-roborock/pull/851),
[`e71611b`](https://github.com/Python-roborock/python-roborock/commit/e71611b2b57f2ca1dc1d2c42d6fce0d3f1b6169b))

### Features

- Add Q10 (B01/ss07) settings writers
([#851](https://github.com/Python-roborock/python-roborock/pull/851),
[`e71611b`](https://github.com/Python-roborock/python-roborock/commit/e71611b2b57f2ca1dc1d2c42d6fce0d3f1b6169b))

- Add Q10 dust-collection frequency writer
([#851](https://github.com/Python-roborock/python-roborock/pull/851),
[`e71611b`](https://github.com/Python-roborock/python-roborock/commit/e71611b2b57f2ca1dc1d2c42d6fce0d3f1b6169b))

- Decode Q10 add_clean_state as a bool
([#851](https://github.com/Python-roborock/python-roborock/pull/851),
[`e71611b`](https://github.com/Python-roborock/python-roborock/commit/e71611b2b57f2ca1dc1d2c42d6fce0d3f1b6169b))

- Decode Q10 carpet/area/mop/floor-direction status into enums+bools
([#851](https://github.com/Python-roborock/python-roborock/pull/851),
[`e71611b`](https://github.com/Python-roborock/python-roborock/commit/e71611b2b57f2ca1dc1d2c42d6fce0d3f1b6169b))

- Expand Q10 (B01/ss07) status support and add device info
([#851](https://github.com/Python-roborock/python-roborock/pull/851),
[`e71611b`](https://github.com/Python-roborock/python-roborock/commit/e71611b2b57f2ca1dc1d2c42d6fce0d3f1b6169b))

- Q10 (B01/ss07) room/segment cleaning
([#851](https://github.com/Python-roborock/python-roborock/pull/851),
[`e71611b`](https://github.com/Python-roborock/python-roborock/commit/e71611b2b57f2ca1dc1d2c42d6fce0d3f1b6169b))

- Q10 (B01/ss07) room/segment cleaning (clean_segments)
([#851](https://github.com/Python-roborock/python-roborock/pull/851),
[`e71611b`](https://github.com/Python-roborock/python-roborock/commit/e71611b2b57f2ca1dc1d2c42d6fce0d3f1b6169b))

### Refactoring

- Split Q10 status/settings into per-concern traits
([#851](https://github.com/Python-roborock/python-roborock/pull/851),
[`e71611b`](https://github.com/Python-roborock/python-roborock/commit/e71611b2b57f2ca1dc1d2c42d6fce0d3f1b6169b))

- Use YXDeviceCleanTask.ELECTORAL and inline misspelling note
([#851](https://github.com/Python-roborock/python-roborock/pull/851),
[`e71611b`](https://github.com/Python-roborock/python-roborock/commit/e71611b2b57f2ca1dc1d2c42d6fce0d3f1b6169b))


## v5.21.0 (2026-06-25)

### Bug Fixes
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "python-roborock"
version = "5.21.0"
version = "5.28.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"
Expand Down
33 changes: 33 additions & 0 deletions roborock/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -1482,6 +1482,39 @@ async def q10_vacuum_spot(ctx: click.Context, device_id: str) -> None:
click.echo(f"Error: {e}")


@session.command()
@click.option("--device_id", required=True, help="Device ID")
@click.option(
"--segments",
required=True,
help="Comma-separated room/segment ids to clean (see the `rooms` command), e.g. 9,2",
)
@click.pass_context
@async_command
async def q10_clean_segments(ctx: click.Context, device_id: str, segments: str) -> None:
"""Start a room / segment clean on a Q10 device.

Room ids come from the `rooms` command (the device's map rooms).
"""
context: RoborockContext = ctx.obj
try:
segment_ids = [int(s) for s in segments.split(",") if s.strip()]
except ValueError:
click.echo("--segments must be comma-separated integers, e.g. 9,2")
return
if not segment_ids:
click.echo("No segment ids provided")
return
try:
trait = await _q10_vacuum_trait(context, device_id)
await trait.clean_segments(segment_ids)
click.echo(f"Starting room clean of segments {segment_ids}...")
except RoborockUnsupportedFeature:
click.echo("Device does not support B01 Q10 protocol. Is it a Q10?")
except RoborockException as e:
click.echo(f"Error: {e}")


async def _q10_set(ctx: click.Context, device_id: str, apply: Callable[[Any], Any], message: str) -> None:
"""Run a Q10 settings write and report the result."""
context: RoborockContext = ctx.obj
Expand Down
1 change: 1 addition & 0 deletions roborock/data/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@
from .code_mappings import *
from .containers import *
from .dyad import *
from .mower import *
from .v1 import *
from .zeo import *
Loading
Loading