sucks
sucks copied to clipboard
Add D900 (IOTMQ) and Ozmo930 Support
Add support for D900 series robots addressing #37
- Add EcoVacsIOTMQ class to support "IOTMQ" devices
- IOTMQ devices will be added manually via list for now, it seems limited to D900 currently
- Added tests to cover
- Updated protocol.md with additional details
Add support for Ozmo930 addressing #11
Hi! I keep seeing things added to this pull request, plus mailing list discussion. so I figure it's more WIP than an actual request to merge. Please let me know when you feel like it's getting close and I'll take a look.
Hi @wpietri ,
Apologies for the chatter and seemingly endless commits to this PR. After this morning's fix for the tests, I think this is good for review now - I was planning on commenting to request one as of today anyway. There are no further changes to be done in my fork for this, pending any requests from review.
The additions to support the D900 and Ozmo 930 have both been tested by at least two users with successful results. I think now having users with other models (M80/N79) test the changes for backward compatibility would be good.
I understand this is a massive addition, please let me know if I can help as you work through a review.
Glad to hear it. I've put this on my to-do list. My main dev machine is in for service, but I hope to have it back next week. Were there particular things in the code you thought could benefit from discussion?
No, nothing in particular. Obviously lots of changes to support MQTT for the D900, but I tried to mirror the XMPP class as much as possible and keep the API unchanged. There are tests to go with everything as well.
I would like to help with the ozmo 930 protocol. However I cannot figure out how to sniff the packets to my ozmo. I can get the http requests from the android app but don't see anything to and from my ozmo. How do you guys go about this exactly? I use debian and Windows 10 for my dev pcs.
Hi ktnrg,
Have you tried sucks with this PR or my branch? Did it not work for you?
The Ozmo930 uses XMPP for communication and you’ll have to use XMPPeek to MitM the traffic. Also check out the dev resources: https://github.com/wpietri/sucks/blob/master/developing.md
On Apr 13, 2019, at 7:48 PM, ktnrg45 [email protected] wrote:
I would like to help with the ozmo 930 protocol. However I cannot figure out how to sniff the packets to my ozmo. I can get the http requests from the android app but don't see anything to and from my ozmo. How do you guys go about this exactly? I use debian and Windows 10 for my dev pcs.
— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or mute the thread.
No I havent tried anything other than the latest pypi for sucks. Ill try your branch in a bit. I guess where I'm stuck at is redirecting traffic from the ecovacs server. My router is a Google Wifi and im not sure if I can redirect, so I was hoping there was a way to do that with debian or windowd that you know about.
Hi, thanks a lot for adding Ozmo 930 support. Any ETA for marging this pull request inside the @wpietri master branch? Considering also the @OverloadUT fix (https://github.com/wpietri/sucks/pull/67) we will benefit of a full support also inside Home Assistant / Hassio. Thanks for the hard work.
Hi awesome coders, just letting you know that this fork also works with the D600 series, just briefly tested it tonight.
How can I use this PR ? Can someone explain to me ?
@DFC1990
How can I use this PR ? Can someone explain to me ?
Until it is merged, it may be easiest to use my fork: https://github.com/bmartin5692/sucks/tree/master
@bmartin5692 Yes, I've tried that..... but I can't install it... I try it with python setup.py install and with ./sucks.sh.
with setup.py it installed on my system but says ssl error....
and with setup.sh it says module requests not found, but requests is installed....
i don't know how to installed it ^^
Sorry for my bad English :-D
@DFC1990 - Have you tried since this morning? I just merged the changes from #67 into my master this morning. That may address the ssl errors you are seeing.
@bmartin5692 I've tried it before 30 minutes...
I get this error:
root@raspberrypi:~/letzerversuch# sucks --debug login
Ecovacs app email: [email protected]
Ecovacs app password:
your two-letter country code [de]: de
your two-letter continent code [eu]: eu
Verify SSL for API requests [True]: True
sucks DEBUG Setting up EcoVacsAPI
sucks DEBUG calling main api user/login with (('account', 'n1gyDJ4f52Ql5yJwh/J37nX0/OBOQPAn53jsmGk/ePWdGBDS4V5UfOsX04NM6ImN1PavZdotIzpnU3VXj2i7s2+c4FazitS8zyWmqULLoWRGykuXXXITgUXwn/rSW0SMRpyJy8FuCRasWspHLzRBrJrLXXX='), ('password', 'ipD2yon+U6Vs9TicQ2An/BfYBjfIr3XXXN1xPzMIruhFooU0SMw8yY1bz9C+IO00RXxf2fCL1e1jNujL9d5HTFDEF7MFCw0BYgFJP5qVhik70a2u74rmFSZ23MafvOMojnDFP9hybDCQe26CFVS8PXXX='))
sucks DEBUG got {'time': 1560610476220, 'code': '0000', 'msg': '操作成功', 'data': {'accessToken': '248eebf4721687cdd4f28df525f4a554', 'country': 'de', 'username': 'XXX, 'uid': '20190613163804_1b4f3adaacaf3249653ab2de1fcf0483', 'email': '[email protected]'}}
sucks DEBUG calling main api user/getAuthCode with (('uid', '20190613163804_1b4f3adaacaf3249653ab2de1fcf0483'), ('accessToken', '248eebf4721687cdd4f28df525f4a554'))
sucks DEBUG got {'time': 1560610476726, 'code': '0000', 'msg': '操作成功', 'data': {'ecovacsUid': '20190613103804_131135544a747551353bb411495aXXX, 'authCode': 'de_8583f8d0c432281814040eXXX'}}
sucks DEBUG calling portal api users/user.do function loginByItToken with {'resource': 'c2478e32', 'userId': '20190613163804_1b4f3adaacaf3249653abXXXX', 'country': 'DE', 'realm': 'ecouser.net', 'token': 'de_8583f8d0c432281814040eaf68779ddf'}
sucks DEBUG got {'todo': 'result', 'errno': 0, 'result': 'fail', 'error': 'set token error.'}
sucks ERROR call to loginByItToken failed with {'todo': 'result', 'errno': 0, 'result': 'fail', 'error': 'set token error.'}
Traceback (most recent call last):
File "/usr/local/bin/sucks", line 11, in
@DFC1990 - The latest changes to this PR / my master should address the issue with logging in from Germany. This should address #71 as well for @christophstein
@bmartin5692
Am I doing something wrong? I have updated your repo and reinstalled with "python setup.py install". and then I tried to log in.
sucks --debug login
Ecovacs app email: [email protected]
Ecovacs app password:
your two-letter country code [de]: de
your two-letter continent code [eu]: eu
Verify SSL for API requests [True]: True
sucks DEBUG Setting up EcoVacsAPI
sucks DEBUG calling main api user/login with (('account', 'BXg6gGmUe9YkZQQQitROxIh6ughZpH8ukHtdpjvnIt4bScKjAb3MmZoja4wIgFGbIoGRPITs5JdlZHwMbmVDKY0lxuYTJ7dkEgRO8E5nI2ZvrpuSDKYg9FiZGHJ7CWp9DWCRURvhoQGvjNni+xdOaCpmOIGG4MHzAfc/v1S31Mk='), ('password', 'r8jdtXGU2uj9EjgQeNseDgViuMXMq2tKG1E/TEqkItChiFnsgkSmn7lePXWZUy9EDEpt5N91FiF3dlzEjsVXnlarJqNxah+NrGG6v8122Ixtl1eKZzRKmSB1vtVBQbWIz3CuoOPKPa5MJpm6QRKvGDHq0Oc0OHYEvb7Yj5tRveE='))
sucks DEBUG got {'msg': '操作成功', 'data': {'country': 'de', 'username': 'EAYU3NP2', 'email': '[email protected]', 'accessToken': '88b0670c8f2dea7c3a8667ba6e799701', 'uid': '20190613163804_1b4f3adaacaf3249653ab2de1fcf0483'}, 'time': 1560630723353, 'code': '0000'}
sucks DEBUG calling main api user/getAuthCode with (('uid', '20190613163804_1b4f3adaacaf3249653ab2de1fcf0483'), ('accessToken', '88b0670c8f2dea7c3a8667ba6e799701'))
sucks DEBUG got {'msg': '操作成功', 'data': {'authCode': 'de_d1cad5269bf0ebd017699cdb15f9a4ab', 'ecovacsUid': '20190613103804_131135544a747551353bb411495a543d'}, 'time': 1560630723878, 'code': '0000'}
sucks DEBUG calling portal api users/user.do function loginByItToken with {'country': 'DE', 'token': 'de_d1cad5269bf0ebd017699cdb15f9a4ab', 'resource': 'b1109eef', 'userId': '20190613163804_1b4f3adaacaf3249653ab2de1fcf0483', 'realm': 'ecouser.net'}
sucks DEBUG got {'errno': 0, 'result': 'fail', 'error': 'set token error.', 'todo': 'result'}
sucks ERROR call to loginByItToken failed with {'errno': 0, 'result': 'fail', 'error': 'set token error.', 'todo': 'result'}
Traceback (most recent call last):
File "/usr/local/bin/sucks", line 11, in
I've tried it with sucks.sh
./sucks.sh --debug login
Ecovacs app email: [email protected]
Ecovacs app password:
urllib3.connectionpool DEBUG Starting new HTTP connection (1): ipinfo.io:80
urllib3.connectionpool DEBUG http://ipinfo.io:80 "GET /json HTTP/1.1" 200 None
your two-letter country code [de]: de
your two-letter continent code [eu]: eu
Verify SSL for API requests [True]: True
sucks DEBUG Setting up EcoVacsAPI
sucks DEBUG calling main api user/login with (('account', 'TLUYEoGYrq/hkbZxCNJ0fu9GO9n+TEIDfWcZTauJVies8T7fcPyer/gq0BjUd7gDqnxfMATFdYx03aB/i3c6/ZV1Hm0id1ndyOKD7dnSYK/pLrqr2vs2ccBuPeXXX6R1HSgJuROHl88oPgxpovbzJbU67kt4PdaSAEA='), ('password', 'wA7rDXWuGXBIoNEWQ3SNfXXXlYYuIV0fS8t6dl1YJbgOecMA4gsX+4bVL0A+5hzjSv1LKNE77M8d06wCA4GAfHAERAFrQlc+ps1fARL8kfRfgk71NDvY7YdgjLMJfB7xI1XCWXXXmb0zpPB02k9c='))
urllib3.connectionpool DEBUG Starting new HTTPS connection (1): eco-de-api.ecovacs.com:443
urllib3.connectionpool DEBUG https://eco-de-api.ecovacs.com:443 "GET /v1/private/de/en/75c9eeaad11e65a80c88b6a64abc6a16/i_eco_e/1.3.5/c_googleplay/1/user/login?account=TLUYEoGYrq%2FhkbZxCNJ0fu9GO9n%2BTEIDfWcZTauJVies8T7fcPyer%2Fgq0BjUd7gDqnxfMATFdYx03aB%2FXXXHm0id1ndyOKD7dnSYK%2FpLrqr2vs2ccBuPe7eJkdFcoSr86R1HSgJuROHl88oPgxpovbzJbU67kt4PdaSAEA%3D&password=wA7rDXWuXXXcXXXJbgOecMA4gsX%2B4bVL0A%2B5hzjSv1LKNE77MXXXkfRfgk71NDvY7YdgjLMJfB7xI1XCWjxjdcwuaW0mb0zpPB02k9c%3D&requestId=e8560ad0372c16ce45XXXfb78f&authTimespan=1560633843525&authTimeZone=GMT-8&authAppkey=eJUWrzRv34qFSaYk&authSign=52c1fd87da7a35XXX4b75e19971 HTTP/1.1" 200 None
sucks DEBUG got {'code': '0000', 'msg': '操作成功', 'time': 1560633843773, 'data': {'accessToken': '9f7e7cXXXf0d6e0', 'country': 'de', 'username': 'EAYU3NP2', 'email': '[email protected]', 'uid': '20190613163XXX9653ab2de1fcf0483'}}
sucks DEBUG calling main api user/getAuthCode with (('uid', '2019061316380XXXfcf0483'), ('accessToken', '9f7e7c12278d2XXX20f0d6e0'))
urllib3.connectionpool DEBUG Starting new HTTPS connection (1): eco-de-api.ecovacs.com:443
urllib3.connectionpool DEBUG https://eco-de-api.ecovacs.com:443 "GET /v1/private/de/en/75c9eeaad11e6XXX64abc6a16/i_eco_e/1.3.5/c_googleplay/1/user/getAuthCode?uid=20190613163804_1b4f3adaacaf3249653ab2de1fcf0483&accessToken=9f7e7c122XXX62beab20f0d6e0&requestId=f4ea8489XXXc03f5a2b&authTimespan=1560633843939&authTimeZone=GMT-8&authAppkey=eJUWrzRv34qFSaYk&authSign=a306XXXa1c6f589870 HTTP/1.1" 200 None
sucks DEBUG got {'code': '0000', 'msg': '操作成功', 'time': 1560633844396, 'data': {'authCode': 'de_f99a52dfd68b1d1294d8f23cae46b179', 'ecovacsUid': '20190613103804_131135544a747551353bb411495a543d'}}
sucks DEBUG calling portal api users/user.do function loginByItToken with {'realm': 'ecouser.net', 'userId': '20190613XXX49653ab2de1fcf0483', 'resource': '75c9eeaa', 'country': 'DE', 'token': 'de_f99a52dfd6XXX23cae46b179'}
urllib3.connectionpool DEBUG Starting new HTTPS connection (1): portal-ww.ecouser.net:443
urllib3.connectionpool DEBUG https://portal-ww.ecouser.net:443 "POST /api/users/user.do HTTP/1.1" 200 70
sucks DEBUG got {'result': 'fail', 'errno': 0, 'error': 'set token error.', 'todo': 'result'}
sucks ERROR call to loginByItToken failed with {'result': 'fail', 'errno': 0, 'error': 'set token error.', 'todo': 'result'}
Traceback (most recent call last):
File "/usr/lib/python3.5/runpy.py", line 193, in _run_module_as_main
"main", mod_spec)
File "/usr/lib/python3.5/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/root/d901/sucks/cli.py", line 240, in
@scottyphillips can you Tell me how you got. the deebot D600 running?
Should this also work with the OZMO 630 which is a simpler version of the OZMO 930 (eg lacks geofencing / mapping)?
Should this also work with the OZMO 630 which is a simpler version of the OZMO 930 (eg lacks geofencing / mapping)?
Yes it should. I also have an Ozmo 601 which works fine with this. Until this is merged you can try my fork (https://github.com/bmartin5692/sucks).
I actually meant an OZMO 610 Series but I'm hoping that would also be covered.
Thanks for working on getting this solved. Do you have an indication that this will get merged soonish?
On further inspection it seems this PR has been waiting for a few months. Yikes.
I know you meant a 610, but they are very similar models and it should work fine. I'm not sure when this might be merged, it has been a long time since the PR was submitted for review.
@bmartin5692 I'm using Home-Assistant which uses sucks for its Ecovacs integration. Is there a uniform way that I could just overwrite the existing sucks with your version? I'm not too familiar with pip etc, but not a complete newb. Are there any files specific files that I could just copy from your repo and drop in to the existing library on my system?
I wish I could give you some good options, but I'm not familiar with Home-Assistant and how it is setup. Maybe someone on the sucks mailing list has an idea or could help?
Ok thanks. At least I know that there is a working library available. Thanks for your work on this.
EDIT: Please ignore my comment, I was able to make it work by installing python 3.7. Many thanks!
First of all thank you for your work, I'm really looking forward to integrate my D900 into openHab :) Unfortunately so far I wasn't able to install this from your repo. I'm running openhabianpi on my Raspberry, python3 version 3.5.3
If I do "sudo python3 setup.py install" the installation fails with an error and I have no idea how to fix this. Can anyone help with this?
` [14:03:46] openhabian@openHABianPi:~/sucks$ sudo python3 setup.py install can't find python README; skipping running install running bdist_egg running egg_info writing entry points to sucks.egg-info/entry_points.txt writing top-level names to sucks.egg-info/top_level.txt writing dependency_links to sucks.egg-info/dependency_links.txt writing requirements to sucks.egg-info/requires.txt writing sucks.egg-info/PKG-INFO reading manifest file 'sucks.egg-info/SOURCES.txt' writing manifest file 'sucks.egg-info/SOURCES.txt' installing library code to build/bdist.linux-armv7l/egg running install_lib running build_py creating build/bdist.linux-armv7l/egg creating build/bdist.linux-armv7l/egg/sucks copying build/lib/sucks/cli.py -> build/bdist.linux-armv7l/egg/sucks copying build/lib/sucks/init.py -> build/bdist.linux-armv7l/egg/sucks byte-compiling build/bdist.linux-armv7l/egg/sucks/cli.py to cli.cpython-35.pyc byte-compiling build/bdist.linux-armv7l/egg/sucks/init.py to init.cpython-35.pyc creating build/bdist.linux-armv7l/egg/EGG-INFO copying sucks.egg-info/PKG-INFO -> build/bdist.linux-armv7l/egg/EGG-INFO copying sucks.egg-info/SOURCES.txt -> build/bdist.linux-armv7l/egg/EGG-INFO copying sucks.egg-info/dependency_links.txt -> build/bdist.linux-armv7l/egg/EGG-INFO copying sucks.egg-info/entry_points.txt -> build/bdist.linux-armv7l/egg/EGG-INFO copying sucks.egg-info/requires.txt -> build/bdist.linux-armv7l/egg/EGG-INFO copying sucks.egg-info/top_level.txt -> build/bdist.linux-armv7l/egg/EGG-INFO zip_safe flag not set; analyzing archive contents... creating 'dist/sucks-0.9.3-py3.5.egg' and adding 'build/bdist.linux-armv7l/egg' to it removing 'build/bdist.linux-armv7l/egg' (and everything under it) Processing sucks-0.9.3-py3.5.egg Removing /usr/local/lib/python3.5/dist-packages/sucks-0.9.3-py3.5.egg Copying sucks-0.9.3-py3.5.egg to /usr/local/lib/python3.5/dist-packages sucks 0.9.3 is already the active version in easy-install.pth Installing sucks script to /usr/local/bin
Installed /usr/local/lib/python3.5/dist-packages/sucks-0.9.3-py3.5.egg Processing dependencies for sucks==0.9.3 Searching for importlib-metadata>=0.12 Reading https://pypi.python.org/simple/importlib-metadata/ Downloading https://files.pythonhosted.org/packages/fd/5c/9caf9fe3d92afc3c0296c97b0fd72cacfcaf20e8b2c42306840914e052fa/importlib_metadata-0.18.tar.gz#sha256=cb6ee23b46173539939964df59d3d72c3e0c1b5d54b84f1d8a7e912fe43612db Best match: importlib-metadata 0.18 Processing importlib_metadata-0.18.tar.gz Writing /tmp/easy_install-463d4k27/importlib_metadata-0.18/setup.cfg Running importlib_metadata-0.18/setup.py -q bdist_egg --dist-dir /tmp/easy_install-463d4k27/importlib_metadata-0.18/egg-dist-tmp-6f6qbe8s /usr/lib/python3.5/distutils/dist.py:261: UserWarning: Unknown distribution option: 'use_scm_version' warnings.warn(msg) warning: no previously-included files found matching '.gitignore' no previously-included directories found matching 'build' no previously-included directories found matching '.tox' zip_safe flag not set; analyzing archive contents... Removing /usr/local/lib/python3.5/dist-packages/importlib_metadata-0.0.0-py3.5.egg Moving importlib_metadata-0.0.0-py3.5.egg to /usr/local/lib/python3.5/dist-packages importlib-metadata 0.0.0 is already the active version in easy-install.pth
Installed /usr/local/lib/python3.5/dist-packages/importlib_metadata-0.0.0-py3.5.egg error: The 'importlib-metadata>=0.12' distribution was not found and is required by pytest, pluggy ` Many thanks in advance!
I tried this code with my Ecovacs Deebot Ozmo 900 and is working fine, with IT/EU country/continent. Thanks for your fix and I hope this PR will be merged soon. ;)
@wpietri Is there any schedule for when this will be merged or what needs resolving to get it merged? Thanks.
@wpietri Could you please merge that? Would be awesome especially for home assistant users for pip..
@wpietri I would love to have this one merged. I am using Home Assistant and this code works OK. Right Now I had to build a custom_component ecovacs home asssistant plugin pointing to this branch in order to make it work. It is not a very elegant solution. Thanks all for the hard work.
@boutch Could you please share info on how you did that?
P.s. I've emailed @wpietri via his website but its seems like he has gone AWOL from GitHub. His last actvitiy on any GitHub repo was back in April.