{ "info": { "author": "William Pietri", "author_email": "sucks-users@googlegroups.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Programming Language :: Python :: 3.5", "Topic :: Home Automation", "Topic :: Software Development :: Libraries" ], "description": "sucks\n=====\n\nA simple command-line python script to drive a robot vacuum. Currently\nknown to work with the Ecovacs Deebot N79, M80 Pro, M81, M88 Pro, and\nR95 MKII from both North America and Europe.\n\nDoes it work for your model as well? Join the discussion on the\n`sucks-users mailing\nlist `__.\n\nIf you're curious about the protocol, I have `a rough\ndoc `__\nstarted. I'll happily accept pull requests for it.\n\nWhy the project name? Well, a) it's ridiculous that I needed to MITM my\nown vacuum. This is not the future I signed up for. And b), it's a\nvacuum.\n\nInstallation\n------------\n\nIf you have a recent version of Python 3, you should be able to do\n``pip install sucks`` to get the most recently released version of this.\n\nUsage\n-----\n\nTo get started, you'll need to have already set up an EcoVacs account\nusing your smartphone.\n\nWith that ready, step one is to log in:\n\n::\n\n % sucks login\n Ecovacs app email: [your email]\n Ecovacs app password: [your password]\n your two-letter country code: us\n your two-letter continent code: na\n Config saved.\n\nThat creates a config file in a platform-appropriate place. The password\nis hashed before saving, so it's reasonably safe. (If it doesn't appear\nto work for your continent, try \"ww\", their world-wide catchall.)\n\nWith that set up, you could have it clean in auto mode for 10 minutes\nand return to its charger:\n\n::\n\n % sucks clean 10\n\nYou could have it clean for 15 minutes and then do an extra 10 minutes\nof edging:\n\n::\n\n % sucks clean 15 edge 10\n\nIf you wanted it to clean for 5 minutes and then stop without charging:\n\n::\n\n % sucks clean 5 stop\n\nIf it's running amok and you'd just like it to stop where it is:\n\n::\n\n % sucks stop\n\nTo tell it to go plug in:\n\n::\n\n % sucks charge\n\nI run mine from my crontab, but I didn't want it to clean every day, so\nit also has a mode where it randomly decides to run or not based on a\nfrequency you give it. My crontab entry looks like this:\n\n::\n\n 0 10 * * * /home/william/projects/sucks/sucks.sh clean -f 4/7 15 edge -f 1/14 10\n\nThis means that every day at 10 am, it might do something. 4 days out of\n7, it will do 15 minutes of automatic cleaning. 1 day out of 14, it will\ndo 10 minutes of edging. And afterward it will always go back to charge.\n\nLibrary use\n-----------\n\nYou are welcome to try using this as a python library for other efforts.\nThe API is still experimental, so expect changes. Please join the\n`mailing list `__\nto participate in shaping the API.\n\nA simple usage might go something like this:\n\n::\n\n import sucks\n\n config = ...\n\n api = EcoVacsAPI(config['device_id'], config['email'], config['password_hash'],\n config['country'], config['continent'])\n my_vac = api.devices()[0]\n vacbot = VacBot(api.uid, api.REALM, api.resource, api.user_access_token, my_vac, config['continent'])\n vacbot.connect_and_wait_until_ready()\n\n vacbot.run(Clean()) # start cleaning\n time.sleep(900) # clean for 15 minutes\n vacbot.run(Charge()) # return to the charger\n\nDeveloping\n----------\n\nIf you'd like to join in on developing, I recommend checking out the\ncode, setting up a virtual environment, and installing this package in\neditable mode. You can confirm your environment works by running the\ntests. And please do join the `mailing\nlist `__ to discuss\nyour plans.\n\nFor more information see `the development\ndocumentation `__.\n\nSee also\n--------\n\nThere are now similar libraries in\n`Javascript `__ and\n`Go `__.\n\nThanks\n------\n\nMy heartfelt thanks to:\n\n- `xmpppeek `__,\n a great library for examining XMPP traffic flows (yes, your vacuum\n speaks Jabbber!),\n- `mitmproxy `__, a fantastic tool for\n analyzing HTTPS,\n- `click `__, a wonderfully complete and\n thoughtful library for making Python command-line interfaces,\n- `requests `__, a polished\n Python library for HTTP requests,\n- `Decompilers online `__, which\n was very helpful in figuring out what the Android app was up to,\n- Albert Louw, who was kind enough to post code from `his own\n experiments `__\n with his device, and\n- All the users who have given useful feedback and contributed code!\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/wpietri/sucks", "keywords": "home automation vacuum robot", "license": "GPL-3.0", "maintainer": "", "maintainer_email": "", "name": "sucks", "package_url": "https://pypi.org/project/sucks/", "platform": "", "project_url": "https://pypi.org/project/sucks/", "project_urls": { "Homepage": "https://github.com/wpietri/sucks" }, "release_url": "https://pypi.org/project/sucks/0.9.4/", "requires_dist": [ "click (>=6)", "pycountry-convert (>=0.5)", "pycryptodome (>=3.4)", "requests (>=2.18)", "sleekxmppfs (>=1.3.4)", "stringcase (>=1.2)", "nose; extra == 'dev'", "requests-mock (>=1.3); extra == 'dev'" ], "requires_python": "", "summary": "a library for controlling certain robot vacuums", "version": "0.9.4" }, "last_serial": 5179873, "releases": { "0.8.2": [ { "comment_text": "", "digests": { "md5": "19cbd0eedeb22eab4bcc3cda3dc0fdea", "sha256": "06e252530c950d676dcd02eae536356dcd5c6534e3847d15da08e098809618a2" }, "downloads": -1, "filename": "sucks-0.8.2-py3-none-any.whl", "has_sig": false, "md5_digest": "19cbd0eedeb22eab4bcc3cda3dc0fdea", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12777, "upload_time": "2017-12-11T01:26:48", "url": "https://files.pythonhosted.org/packages/c2/59/4d0ba52530a6e03a2858cbcdc7f2103e263015be4487a3f668aa9dd49d63/sucks-0.8.2-py3-none-any.whl" } ], "0.8.2b1": [ { "comment_text": "", "digests": { "md5": "dea2c4d1d8cd78c02fd39287fcdc1603", "sha256": "56715f6a3d6ce14ef8544e48997ab8cffa49cc6da4bd4892898a9e193d962ac7" }, "downloads": -1, "filename": "sucks-0.8.2b1-py3-none-any.whl", "has_sig": false, "md5_digest": "dea2c4d1d8cd78c02fd39287fcdc1603", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12779, "upload_time": "2017-12-11T01:24:57", "url": "https://files.pythonhosted.org/packages/46/60/9443757edd0f409c35d5975f405cb1c52e70d39c423a4322677532047676/sucks-0.8.2b1-py3-none-any.whl" } ], "0.8.2b2": [ { "comment_text": "", "digests": { "md5": "9dbc4c1f4d98d5e6aaf9753e8bbe6213", "sha256": "7dfb2403a5b98e25fd20740c733f03c475bb4a6ffc8b21ec89e1d03b4d4af9be" }, "downloads": -1, "filename": "sucks-0.8.2b2-py3-none-any.whl", "has_sig": false, "md5_digest": "9dbc4c1f4d98d5e6aaf9753e8bbe6213", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12812, "upload_time": "2017-12-11T01:24:58", "url": "https://files.pythonhosted.org/packages/2b/3b/b73bd4944f5be216544b4cce34238619cc493bd64a3c6e83f2f7eae5679c/sucks-0.8.2b2-py3-none-any.whl" } ], "0.8.3": [ { "comment_text": "", "digests": { "md5": "49244f279bb5cda449ddbda1a28eaca8", "sha256": "cf42dcc38e98cf17a9baea58d3c06e542703bf724c8c0805ee49e4936699780b" }, "downloads": -1, "filename": "sucks-0.8.3-py3-none-any.whl", "has_sig": false, "md5_digest": "49244f279bb5cda449ddbda1a28eaca8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12776, "upload_time": "2017-12-11T02:04:26", "url": "https://files.pythonhosted.org/packages/37/b5/fc174bd726474cdd430a0c3904dc587d65de2a43fac943ca5329b8041517/sucks-0.8.3-py3-none-any.whl" } ], "0.8.4": [ { "comment_text": "", "digests": { "md5": "5e29c3fbefc36a3c96f9c5b11c8f6001", "sha256": "8f1fe47fe15f8b66b000d148096717c54f680dc7c0432bb0092277eb9f4e873c" }, "downloads": -1, "filename": "sucks-0.8.4-py3-none-any.whl", "has_sig": false, "md5_digest": "5e29c3fbefc36a3c96f9c5b11c8f6001", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13844, "upload_time": "2017-12-28T18:49:55", "url": "https://files.pythonhosted.org/packages/46/5b/a55b4f2e0b33f71f577cd9d442b6554b2f9ac10d08d593fe59826083a0c5/sucks-0.8.4-py3-none-any.whl" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "9db1326e8b70da0488b5d9b79eee43d8", "sha256": "edc22bc4596f796f52d94c05db6ee9d541346db2d194bba33b12d91a6b31da25" }, "downloads": -1, "filename": "sucks-0.9.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9db1326e8b70da0488b5d9b79eee43d8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15385, "upload_time": "2018-07-16T19:19:10", "url": "https://files.pythonhosted.org/packages/da/9a/9d04ec38090399f0fb5b802a73d219f465b7b4c15818fca9d7084f59c033/sucks-0.9.0-py3-none-any.whl" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "711361cd2771122ff116810dc408f7f4", "sha256": "a12e9c2423df87ccf222c61fbd809dc770e5b434cd61328d9ee443e869629d03" }, "downloads": -1, "filename": "sucks-0.9.1-py3-none-any.whl", "has_sig": false, "md5_digest": "711361cd2771122ff116810dc408f7f4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15869, "upload_time": "2018-07-21T15:21:33", "url": "https://files.pythonhosted.org/packages/4b/64/18a002e019b8ff6f450e464c3e6f260e0f1b81dc124a9ed2ff4fe805ee17/sucks-0.9.1-py3-none-any.whl" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "ab28fb32b05484447c0aaa30f6ae8bc4", "sha256": "c716ef6c22d4bd33e7aaba5ce639eb956faad2010c01ebe8d37e3e0409db8ac3" }, "downloads": -1, "filename": "sucks-0.9.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ab28fb32b05484447c0aaa30f6ae8bc4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15847, "upload_time": "2018-08-28T22:28:43", "url": "https://files.pythonhosted.org/packages/68/f9/76dedd81464e12c032fe2976c1aeabc8a2450101ab0c5428b89affc3e3f2/sucks-0.9.2-py3-none-any.whl" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "62f8fc77bd949dcf699550f76c1e5d15", "sha256": "a30ff284692afe3bd18d38e6fdee541f569f0f0c0f615c101b1e9ba5930254df" }, "downloads": -1, "filename": "sucks-0.9.3-py2-none-any.whl", "has_sig": false, "md5_digest": "62f8fc77bd949dcf699550f76c1e5d15", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 15909, "upload_time": "2018-09-23T00:57:33", "url": "https://files.pythonhosted.org/packages/ac/c9/f8f3781d1d19a43bcce5c8d549ad8ae277a138b119b235a001cea38a83c8/sucks-0.9.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "75ecdf33a446f7c915e0828319b0ec84", "sha256": "2b6de076eff94003a3efb85a9e7c9e281faef57bb9c643fbddda30855993ae8f" }, "downloads": -1, "filename": "sucks-0.9.3-py3-none-any.whl", "has_sig": false, "md5_digest": "75ecdf33a446f7c915e0828319b0ec84", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15871, "upload_time": "2018-09-23T04:16:07", "url": "https://files.pythonhosted.org/packages/c6/5d/e6f34241045088ab90f4dce1eb0af3e9a0a1eb044c4743bb61b505434799/sucks-0.9.3-py3-none-any.whl" } ], "0.9.4": [ { "comment_text": "", "digests": { "md5": "3d4b4ab4ac1e4caa84fbe5308460b61c", "sha256": "d33fd3b7a5f17b6749291a6e561f3616f4ef69098e3d291209f4e3c35bf899e7" }, "downloads": -1, "filename": "sucks-0.9.4-py3-none-any.whl", "has_sig": false, "md5_digest": "3d4b4ab4ac1e4caa84fbe5308460b61c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16043, "upload_time": "2019-04-24T01:35:43", "url": "https://files.pythonhosted.org/packages/6c/4f/372db0299f6d23430394777239f0fd7b7647b1c2ee44afbc9fbffe126403/sucks-0.9.4-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3d4b4ab4ac1e4caa84fbe5308460b61c", "sha256": "d33fd3b7a5f17b6749291a6e561f3616f4ef69098e3d291209f4e3c35bf899e7" }, "downloads": -1, "filename": "sucks-0.9.4-py3-none-any.whl", "has_sig": false, "md5_digest": "3d4b4ab4ac1e4caa84fbe5308460b61c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16043, "upload_time": "2019-04-24T01:35:43", "url": "https://files.pythonhosted.org/packages/6c/4f/372db0299f6d23430394777239f0fd7b7647b1c2ee44afbc9fbffe126403/sucks-0.9.4-py3-none-any.whl" } ] }