Repository navigation
Conversation
Add typed DyadApi commands for F25 Ultra settings that span several data points or need a value from the device: - set_drying_mode writes DP 225, while the mode is read from DP 272 - set_self_clean_intensity writes DPs 203, 223 and 239 together - set_suction and set_sponge_suction send the brush speed the app pairs with each level, because the device does not change it by itself - start_self_clean sends the current DP 203 with the start command, as the app does - stop_self_clean stops a running cycle
infy1995
marked this pull request as draft
November 8, 2026 23:02
Add the app's Dyad model table and accept only the models and values the app offers. Add set_clean_mode, set_water_level, pause_self_clean, resume_self_clean and feature bit support. Replace stop_drying and stop_self_clean with a single stop. Fix the remote control directions, the flat status states and unknown error codes being reported as no error.
infy1995
marked this pull request as ready for review
November 9, 2026 17:15
This was referenced Nov 10, 2026
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
Follow-up to #1019, based on the review comment suggesting a typed
set_drying_mode. While adding it I compared the Dyad data points with the Roborock app plugin (com.roborock.wetdryvac, plugin version 2674), so this also fixes mappings that were wrong and limits the new commands to the models the app enables them for.New
DyadApicommandsset_clean_mode(mode)205set_water_level(level)207set_drying_mode(mode)225set_self_clean_intensity(intensity)203,223, and239where smart existssmartonly on models that have itset_suction(suction)206,208set_sponge_suction(suction)244,245start_self_clean()200,203pause_self_clean()200resume_self_clean()200stop_drying()is renamed tostop(), because the device has one stop command for drying and self-clean. The method was added in #1019.DyadApi.supports(DyadFeatureBits)reads the feature bits from DP 235.DyadApinow receives the product model, asZeoApialready does. The newdyad_featuremodule holds the app's model table (78 models). A command used on a model the app does not enable it for, or on an unknown model, raisesRoborockUnsupportedFeatureand sends nothing.set_drying_modeneeds this because DP 225 is a duration in minutes on models without drying modes.These methods accept only the values the app offers.
set_valuestays a raw write, and its docstring now says that it checks nothing.Mapping fixes
These change values reported by the library:
POWERWHEEL_DIRECTION(249):3is left and4is right.5to8are the diagonals.5and6were wrongly namedleftandright.FLAT_STATUS(248) is nowstanding,flatorerrorinstead of a bool, which reported the error state as lying flat.DyadErrorhasunknown. An unknown code used to fall back tonone, so a real error looked like no error. Added20010.15(combination) and self-clean water temperatureslowandmid.Added the data points
251,256,273to276and10008. The names of statuses 4 and 14 do not match the app, but I kept them for compatibility and added comments.Verification
On a real F25 Ultra (
roborock.wdv.a194), reading values back after each call with the vacuum docked and restoring the settings afterwards:set_drying_mode: fast and silent both switched, and the app followed.set_self_clean_intensity: deep, standard and smart read back correctly, and the app followed.start_self_cleanreached status 4. The stop command (200: 0) returned to status 3 and the settings did not change.set_clean_mode: auto, steam, hot water and sponge read back correctly, and max and power saving were rejected without being sent.pause_self_cleanreached status 13,resume_self_cleanreturned to status 4, and the settings did not change.The model sets in
dyad_featurewere compared programmatically with the capability checks in the app plugin for all 78 models.Not verified
5and22come from the F25 Ultra. Other models using that list are expected to accept them.start_self_clean()was run on the device at smart only.Existing test changed
test_start_connect_failurefailed on CI on Python 3.11 for this PR. It waited foris_connectedand then expected the ready callback at once, but the callback only runs after the device has finished starting, so the test could check between the two. It now waits for the callback, with a limit of 1 s instead of 0.1 s, and still checks that the device is connected and that the callback ran exactly once.With a 50 ms pause added between the subscribe and the end of
connect, the old test failed 5 of 5 runs and the new one passed 5 of 5. With the full suite pinned to one busy CPU, the old test failed 1 of 4 runs with the same assertion as CI, and the new one passed 6 of 6. I could not establish why CI hit this on this PR and not on others.Tests
pytestunder WSL2 (Ubuntu) with the CI flags and dependency versions fromuv.lock, merged withmain: 2376 passed, 52 xfailed on Python 3.11 and 3.14pre-commiton the changed files: clean