Browser-based control panel, map viewer, and API probe for Robart MyVacBot robot vacuums.
HUGE props to: https://github.com/vamposdecampos/robart-web-ui and https://github.com/worm-ee/robart-rest-api for kicking off this project and proving this is possible! I severely expanded on the code in the repos above.
This project has two parts:
- A small Flask app in
app.pythat serves the frontend and proxies requests to the robot's REST API to avoid browser CORS issues. - A standalone endpoint enumerator in
robart_enum.pythat brute-forces likely/get/...and/set/...paths and saves the results toendpoints_found.json.
- Interactive SVG map with pan, zoom, click selection, and layered rendering
- Cleaning grid overlay decoded from the robot's RLE map data
- Feature map rendering for walls/segments and docking station marker
- Area polygon rendering with clickable area selection
- No-navigation polygon overlay
- Robot identity panel with name, model, firmware, unique IDs
- Live status panel with mode, battery, charging state, voltage, selected cleaning profile, robot time, and startup time
- Wi-Fi panel with SSID, RSSI, IP, MAC address, and connection type
- Schedule panel
- Lifetime statistics panel
- Power status panel
- Network status panel
- Maps panel showing known map IDs and map metadata
- Event log panel
- Notifications panel
- Motion controls for start/continue cleaning, go home, and stop
- Cleaning profile selector for profiles 1 through 4
- Map management actions for saving the current map and deleting a map by ID
- Settings actions for renaming the robot, setting time, setting timezone, and sending Wi-Fi connect requests
- Command log with timestamps and success/error feedback
- Experimental API Explorer for arbitrary proxied GET requests with query parameters and formatted responses
- Offline-friendly endpoint enumeration using built-in robot-specific words plus local wordlists
- Optional SecLists wordlist download mode
- Concurrent probing with configurable timeout, thread count, target IP, port, and output file
- JSON export of discovered endpoints and sample responses
app.py
robart_enum.py
endpoints_found.json
static/
app.html
app.css
app.js
assets/
wordlists/
- Python 3.x
flaskrequests- A Robart robot reachable on your local network
Install dependencies:
pip install flask requestsConfigure the robot IP in app.py:
ROBOT_URL = "http://192.168.1.23:10009"The frontend assets referenced by the app are already present in static/assets/, so no extra downloads are needed for this repository snapshot.
python app.pyThen open http://localhost:5000.
Browser -> Flask proxy (localhost:5000) -> Robot REST API (:10009)
The Flask app exposes two catch-all proxy routes:
| Route | Forwarded to |
|---|---|
GET /get/<path> |
http://<ROBOT_URL>/get/<path> |
GET /set/<path> |
http://<ROBOT_URL>/set/<path> |
Query parameters are forwarded as-is. Requests use an 8 second timeout. Connection and timeout failures are returned as JSON errors.
All robot operations in this project use HTTP GET, including command-style /set/... requests.
These are implemented directly in static/app.js.
| Endpoint | Query params | Used for |
|---|---|---|
GET /get/robot_name |
none | Window title and robot title |
GET /get/robot_id |
none | Identity panel |
GET /get/status |
none | Live status panel |
GET /get/wifi_status |
none | Wi-Fi panel |
GET /get/schedule |
none | Schedule panel |
GET /get/statistics |
none | Lifetime statistics panel |
GET /get/power_status |
none | Power panel |
GET /get/network_status |
none | Network panel |
GET /get/maps |
none | Maps panel |
GET /get/event_log |
none | Event log panel |
GET /get/notifications |
none | Notifications panel |
GET /get/cleaning_grid_map |
none | Base map selection and cleaned-cell overlay |
GET /get/feature_map |
map_id |
Wall segments and docking pose |
GET /get/areas |
map_id |
Cleaning area polygons |
GET /get/n_n_polygons |
map_id |
No-navigation polygons |
| Endpoint | Query params | Used for |
|---|---|---|
GET /set/clean_start_or_continue |
cleaning_parameter_set=1..4 |
Start or continue cleaning |
GET /set/go_home |
none | Return to dock |
GET /set/stop |
none | Stop current action |
GET /set/save_map |
none | Save current map |
GET /set/delete_map |
map_id |
Delete a stored map |
GET /set/robot_name |
name |
Rename robot |
GET /set/time |
year, month, day, hour, min, sec, day_of_week |
Set robot clock |
GET /set/timezone |
timezone |
Set timezone |
GET /set/connect |
ssid, optional password |
Send Wi-Fi connect request |
These are present in endpoints_found.json but are not all surfaced as first-class UI panels or actions.
| Endpoint | Query params | Notes |
|---|---|---|
GET /get/cleaning_parameter_set |
none | Returns the currently configured cleaning parameter set |
GET /get/system_status |
none | Returns a deprecation error on the sampled robot/firmware |
GET /set/password |
unknown | Discovered, but returned not_implemented in the sample scan |
The bundled endpoints_found.json contains 27 discovered endpoints from a scan against http://192.168.1.23:10009.
get/mapsreturns amapsarray withmap_id,permanent_flag, and map statistics.get/cleaning_grid_mapreturnsmap_id, origin coordinates, grid size, resolution, timestamp, and an RLE-encodedcleanedarray.get/feature_mapreturnsmap.linesplusmap.docking_pose.get/areasreturnsmap_idand anareasarray with polygon points.get/n_n_polygonsreturnsmap.polygonsas segment lists.get/network_statusreturns a MAC address and anaddresseslist.get/event_logreturnsrobot_events.get/notificationsreturnsrobot_notifications.- Several
/set/...endpoints returnparameter_errorwhen called without the required query string, which is expected for endpoints likeset/time,set/timezone,set/connect,set/delete_map, andset/robot_name.
Because this is based on one robot and firmware version, treat the discovered endpoint list as firmware-dependent rather than universal.
Run the scanner:
python robart_enum.pyUseful options:
python robart_enum.py --ip 192.168.1.23 --port 10009 --threads 12 --timeout 6
python robart_enum.py --wordlists-dir wordlists
python robart_enum.py --download-wordlistsBy default the script writes results to endpoints_found.json.
- The UI determines the active
map_idfromget/cleaning_grid_map, then fetches the map-dependent geometry endpoints with that ID. - The map view shows the docking station location, not a live robot position. No current-position endpoint is used by this project.
app.pyruns Flask withdebug=True.- The API Explorer only issues GET requests through the same proxy used by the rest of the UI.