Repository navigation
feat: add Q7 goto position - #1042
Open
ramon-angosto wants to merge 5 commits into
Open
ramon-angosto wants to merge 5 commits into
ramon-angosto wants to merge 5 commits into
Conversation
Add `clean_zone` and `clean_zones` to the Q7 properties API. Zones are given as two opposite corners in the common Roborock millimetre coordinate space through a new `Q7RoborockPoint`, which converts to and from the Q7 world coordinates (meters, origin next to the dock). The device expects the zone preference type to be selected first (`service.set_preference_type`), then the zone corners as a flat list (`service.set_zone_points`), and finally `service.set_zone_clean` to start. Several zones are concatenated into a single task.
Add a `RemoteTrait` to the Q7 properties API, mirroring the Q10 remote API. Manual mode is entered with `prop.set sweep_type=5` and the robot is driven with `service.set_direction` (1 forward, 2 left, 3 right, 0 exit). Each command moves the robot for a short burst, so callers repeat it while a direction is held. Leaving remote mode restores `sweep_type=0`.
Add `set_carpet_turbo` and `set_carpet_avoid` to the Q7 properties API. Both are written individually with `prop.set` (`carpet_turbo` / `carpet_avoid`) and reported back nested under `privacy`. Keep the user-visible `name` of each entry returned by `service.get_map_list`, which was previously dropped.
Add `MapContentTrait.robot_position` (common Roborock coordinates) for Q7 devices, kept up to date from two sources: - the current pose in live map frames (`currentPose`), ignoring the `(1100, 1100)` and `(0, 0)` placeholders the firmware reports when the pose is unknown or outside the map; - `cur_path` samples in unsolicited `prop.post` device pushes, which the device streams while a task is running. To receive those pushes, `B01Q7Channel` now implements a `Q7PushChannel` protocol that decodes `*.post` messages into `Q7DevicePush`, and `Q7PropertiesApi.start()` subscribes to them. Add `MapContentTrait.refresh_live()`, which requests the live map by type (`service.upload_by_maptype`). Unlike the saved map it carries the current pose and makes the device stream `cur_path` positions.
Add `Q7PropertiesApi.goto_position`. The Q7 firmware has no goto command, so (like the Q10) it is emulated with a small zone-clean task around the target that is stopped once the live position is within 30 cm, leaving the robot there. A `GotoAction` state machine decides when to stop, based on the robot position and the `work_mode` reported in device pushes: - near the target while the zone task runs: stop the task; - the zone finished and the robot heads home (`PLAN_AREA_GO_HOME`) before a close position arrived: stop, since it already reached the target; - the zone task ended or was replaced any other way: complete silently. While a goto is active the live map is requested every 3 s, because `cur_path` pushes are not always streamed. A 300 s safety timeout stops a zone task that is still running. Any other cleaning command cancels the goto.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds
Q7PropertiesApi.goto_position(target: Q7RoborockPoint). This is what Home Assistant needs forvacuum.set_vacuum_goto_position.The Q7 firmware has no goto command, so, as on the Q10, it is emulated:
cur_pathpushes are used too, but the device does not always stream them.set_zone_clean ctrl_value 0) and the robot stays there.If the robot is already within 30 cm of the target, nothing is sent.
State machine
The decisions live in a pure
GotoActionclass (goto.py), which owns no tasks and sends no commands. It is fed with the position and thework_modefrom device pushes:PLAN_AREA) and near the targetPLAN_AREA_GO_HOME) before a close position arrivedA failed stop is retried. Any other cleaning command (
start_clean,clean_segments,clean_zones,pause_clean,stop_clean,return_to_dock) cancels the goto, and so doesclose().Testing
roborock.vacuum.sc05, firmware 03.01.80). Two runs ended 15 cm and 12 cm from the target. The second run went through the "zone finished, heading home" path. In both, the robot stayed idle at the target.