Set it, read it back, then start.
Before a clean starts, the app sets the cleaning mode and the carpet mode, reads both back from the robot, and refuses to start if they don't match what you asked for.
A self-hosted web app for Roborock robot vacuums that runs multi-step cleans the official app can't. Each step waits for the robot to come home, and settings are read back from the robot before anything starts.
Fake mode is a simulated robot in a synthetic apartment. No Roborock account, no robot. It is the same thing the recording above shows.
You need uv, which fetches Python 3.12 if you don't have it. TIMEZONE is the only setting fake mode needs.
$ git clone https://github.com/zarifaziz/roborock-webapp.git $ cd roborock-webapp $ cp .env.example .env # set TIMEZONE to your IANA zone $ uv sync $ uv run uvicorn roborock_auto.adapters.web.server:app --host 127.0.0.1 --port 8000
Open http://127.0.0.1:8000, go to Sequences, pick “Vacuum then mop”, save and press Run. A two-step run takes a little over a minute. Going live with your own robot is a few more steps in the README.
A Sequence is an ordered list of Steps. Each Step is its own clean with its own rooms, mode and carpet behavior. The next Step starts only once the robot has left the dock, cleaned, and returned idle.
The official app has one global carpet setting. The built-in Two-Stage Clean switches it per Step: vacuum with carpet mode Rise, then mop with carpet mode Avoid.
Before a clean starts, the app sets the cleaning mode and the carpet mode, reads both back from the robot, and refuses to start if they don't match what you asked for.
Schedule Rules fire a clean or a saved Sequence on a weekly grid. Room Intervals say how often a room should be cleaned and list what is overdue. The scheduler runs inside the app process.
Describe a clean in plain words and get a plan to review. Nothing moves until you confirm it. The assistant has no robot, filesystem or shell tools.
The app uses python-roborock, the community library behind the Home Assistant integration. It logs in through Roborock's cloud with your account and sends commands over Roborock's MQTT broker, or over local TCP when the robot is on your LAN.
127.0.0.1, or put it behind something that authenticates: a VPN or tailnet, or a reverse proxy with auth.A small domain core with the vendor library kept at the edge. The fake adapter simulates depart, clean and return on a clock, which powers both the demo and a test suite that needs no account.
roborock.* is imported in exactly one package. A vendor type or firmware integer outside adapters/roborock_cloud/ is a bug.domain/policies.py, not adapter logic.Every feature on this page was built and run against this model.
Models supported by python-roborock should work, but none have been tested. If you try one, open an issue with what worked and what didn't. PRs for other devices are welcome.