Skip to main content

Tests PyPI version PyPI - Python Version

py-sucks

This is the successor of https://github.com/wpietri/sucks.

Overview

A simple command-line python script to drive a robot vacuum. Currently known to work with the Ecovacs Deebot N79, M80 Pro, M81, M88 Pro, and R95 MKII from both North America and Europe.

Does it work for your model as well? Join the discussion on the sucks-users mailing list.

If you're curious about the protocol, I have a rough doc started. I'll happily accept pull requests for it.

Why the project name? Well, a) it's ridiculous that I needed to MITM my own vacuum. This is not the future I signed up for. And b), it's a vacuum.

Installation

If you have a recent version of Python 3, you should be able to do pip install py-sucks to get the most recently released version of this. In order to use the command line (cli) tool, you need to install the additional cli requirements by pip install py-sucks[cli]

Usage

To get started, you'll need to have already set up an EcoVacs account using your smartphone.

With that ready, step one is to log in:

% sucks login
Ecovacs app email: [your email]
Ecovacs app password: [your password]
your two-letter country code: us
your two-letter continent code: na
Config saved.

That creates a config file in a platform-appropriate place. The password is hashed before saving, so it's reasonably safe. (If it doesn't appear to work for your continent, try "ww", their world-wide catchall.)

With that set up, you could have it clean in auto mode for 10 minutes and return to its charger:

% sucks clean 10

You could have it clean for 15 minutes and then do an extra 10 minutes of edging:

% sucks clean 15 edge 10

If you wanted it to clean for 5 minutes and then stop without charging:

% sucks clean 5 stop

If it's running amok and you'd just like it to stop where it is:

% sucks stop

To tell it to go plug in:

% sucks charge

I run mine from my crontab, but I didn't want it to clean every day, so it also has a mode where it randomly decides to run or not based on a frequency you give it. My crontab entry looks like this:

0 10 * * * /home/william/projects/sucks/sucks.sh clean -f 4/7 15 edge -f 1/14 10

This means that every day at 10 am, it might do something. 4 days out of 7, it will do 15 minutes of automatic cleaning. 1 day out of 14, it will do 10 minutes of edging. And afterward it will always go back to charge.

Library use

You are welcome to try using this as a python library for other efforts. The API is still experimental, so expect changes. Please join the mailing list to participate in shaping the API.

A simple usage might go something like this:

import sucks

config = ...

api = EcoVacsAPI(config['device_id'], config['email'], config['password_hash'],
                         config['country'], config['continent'])
my_vac = api.devices()[0]
vacbot = VacBot(api.uid, api.REALM, api.resource, api.user_access_token, my_vac, config['continent'])
vacbot.connect_and_wait_until_ready()

vacbot.run(Clean())  # start cleaning
time.sleep(900)      # clean for 15 minutes
vacbot.run(Charge()) # return to the charger

Developing

If you'd like to join in on developing, I recommend checking out the code, setting up a virtual environment, and installing this package in editable mode. You can confirm your environment works by running the tests. And please do join the mailing list to discuss your plans.

For more information see the development documentation.

See also

There are now similar libraries in Javascript and Go.

Thanks

My heartfelt thanks to:

  • xmpppeek, a great library for examining XMPP traffic flows (yes, your vacuum speaks Jabbber!),
  • mitmproxy, a fantastic tool for analyzing HTTPS,
  • click, a wonderfully complete and thoughtful library for making Python command-line interfaces,
  • requests, a polished Python library for HTTP requests,
  • Decompilers online, which was very helpful in figuring out what the Android app was up to,
  • Albert Louw, who was kind enough to post code from his own experiments with his device, and
  • All the users who have given useful feedback and contributed code!

Metadata

Release files for py-sucks 0.9.11

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for py-sucks 0.9.11
File Size Uploaded
py-sucks-0.9.11.tar.gz 25.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for py-sucks 0.9.11
File Interpreter ABI Platform
py_sucks-0.9.11-py3-none-any.whl Python 3 none any Details

Total release size: 51.6 kB

Release files / py-sucks-0.9.11.tar.gz

Download URL py-sucks-0.9.11.tar.gz
Size 25.8 kB
Tags Source
SHA-256 checksum
How to use checksums
41aea9873e7ff9898cfeb4393be83f3d324265dc675503a2f6e38d6cb4ac9e64
BLAKE2b-256 checksum
How to use checksums
3cadca4ac217679b18a84f26de62e6f1e9f24819ced5bbed35e4a0420ad42af6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / py_sucks-0.9.11-py3-none-any.whl

Download URL py_sucks-0.9.11-py3-none-any.whl
Size 25.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bb2ce6d4c4a83094d0878348eae90e8f321d297f43c74b0a7dba8bb1feb07e26
BLAKE2b-256 checksum
How to use checksums
6c191e350503585fdae733da518da41f55d34c62120f4da4e025a73842e3ce7c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release history Release notifications | RSS feed

This release

0.9.11 This release

2 release files

0.9.10

2 release files

0.9.9

2 release files

0.9.8

2 release files

0.9.7

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page