Git Product home page Git Product logo

client.py's People

Contributors

and3rsl avatar augar avatar bitnimble avatar chaoslion avatar dependabot[bot] avatar dolneaz avatar edenhaus avatar floschl8 avatar flubshi avatar lukakama avatar marktdeng avatar markus99 avatar morg42 avatar mrbungle64 avatar mvladislav avatar nickw444 avatar pre-commit-ci[bot] avatar rany2 avatar rivendellstuff avatar schwatter avatar snyk-bot avatar ulfmerbold2000 avatar ymj0424 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

client.py's Issues

Missing "angle" in Position

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

The Position object is missing informations about the robot angle.

On which deebot device (vacuum) you have the issue?

Deebot N8

Which version of the deebot-client are you using?

7.2.0

Country

it

Continent

eu

Anything in the logs that might be useful for us?

Log for PositionsEvent (after a GetPos command).

Notify subscribers with PositionsEvent(positions=[Position(type=<PositionType.DEEBOT: 'deebotPos'>, x=-396, y=10), Position(type=<PositionType.CHARGER: 'chargePos'>, x=-396, y=10)])

The same request made with ecovacs-deebot.js (https://github.com/mrbungle64/ecovacs-deebot.js/blob/master/example/mapInfos.js) returns and object containg "x", "y" and "a" where "a" is bot orientation in degrees.

Additional information

The GetPos command is not documented but available in source code.

Map renderer crash due to off by one error

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

map.py has an off-by-one error when rendering dashed lines that end up causing a divide by zero:

start = position / length
. I guess this is just a rare case when somebody's map specifically has two points to be rendered that are on top of each other.

When length is 0, it'll still perform the loop and crash.

Updated it to while position < length: locally and it now works perfectly on my map.

On which deebot vacuum you have the issue?

Deebot T9

Which version of the deebot-client are you using?

2.0.1

Country

ww

Continent

au

Anything in the logs that might be useful for us?

No response

Additional information

No response

Command "getMapSubSet" was not successfully: {'ret': 'fail', 'errno': 500, 'debug': 'wait for response timed out'}

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

Map is blurry, not well defined. I have Ecovacs Deebot Omni X1

Command "getMapSubSet" was not successfully: {'ret': 'fail', 'errno': 500, 'debug': 'wait for response timed out'}

On which deebot vacuum you have the issue?

Deebot X1 Omni

Which version of the deebot-client are you using?

3.0.0

Country

it

Continent

eu

Anything in the logs that might be useful for us?

Command "getMapSubSet" was not successfully: {'ret': 'fail', 'errno': 500, 'debug': 'wait for response timed out'}

Additional information

Command "getMapSubSet" was not successfully: {'ret': 'fail', 'errno': 500, 'debug': 'wait for response timed out'}

Full support for Deebot T20 Omni

Is there an existing issue for this?

  • I have searched the existing issues and no issue is describing my feature request or idea

Is your feature request related to a problem?

No

Suggested solution

I'd like for the HA integration to support the "cleaning mode" option of the T20. (this is what is important for me)

However I extracted all options into files with corresponding jsons so it is possible to implement support for all the T20 options and actions.

All files contain options to define how all future cleanings will be performed.
One exception is the "Station start action" file where these jsons are command for the station to perform an action.

Update 2023-10-25 : Added action "Wash station sink" in file "Ecovacs T20 Station start action.txt"
Update 2023-11-03 : Added "Ecovacs T20 Reset dust bag life span.txt"
Update 2023-11-14 : Added get commands

Possible issue with example code on unsupported device

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

I started the example - login seem to work but got the following error.

bot = VacuumBot(session, devices_[0], api_client)
TypeError: VacuumBot.__init__() takes 3 positional arguments but 4 were given

I am filing it as a bug report rather than a feature request, as I don't know if the provided example code should work for that device or not.

On which deebot vacuum you have the issue?

Deebot Ozmo Slim10

Which version of the deebot-client are you using?

1.2.1

Country

de

Continent

eu

Anything in the logs that might be useful for us?

DEBUG:deebot_client.authentication:No cached credentials, performing login
DEBUG:deebot_client.authentication:Start login to EcovacsAPI
DEBUG:deebot_client.authentication:calling login api
DEBUG:deebot_client.authentication:got {'code': '0000', 'msg': '操作成功', 'time': 1645786538571, 'data': {'uid': '[REMOVED]', 'accessToken': '[REMOVED]', 'userName': '[REMOVED]', 'email': '[REMOVED]', 'mobile': '[REMOVED]', 'isNew': None, 'loginName': '[REMOVED]', 'ucUid': '[REMOVED]'}, 'success': True}
DEBUG:deebot_client.authentication:calling auth api
DEBUG:deebot_client.authentication:got {'code': '0000', 'msg': '操作成功', 'time': 1645786539229, 'data': {'authCode': '[REMOVED]', 'ecovacsUid': '[REMOVED]'}, 'success': True}
DEBUG:deebot_client._api_client:calling api users/user.do with {'edition': 'ECOGLOBLE', 'userId': '[REMOVED]', 'token': '[REMOVED]', 'realm': 'ecouser.net', 'resource': 'xxxxxxxxxxxx', 'org': 'ECOWW', 'last': '', 'country': 'DE', 'todo': 'loginByItToken'}
DEBUG:deebot_client._api_client:got {'todo': 'result', 'result': 'ok', 'userId': '[REMOVED]', 'resource': '7a6xxxxxxxxxxxxxxx', 'token': '[REMOVED]', 'last': 604800000}
DEBUG:deebot_client.authentication:Switching to shorter UID
DEBUG:deebot_client.authentication:Login to EcovacsAPI successfully
DEBUG:deebot_client._api_client:calling api appsvr/app.do with {'userid': '[REMOVED]', 'todo': 'GetGlobalDeviceList'}
DEBUG:deebot_client._api_client:got {'code': 0, 'todo': 'result', 'ret': 'ok', 'devices': [{'did': '[REMOVED]', 'name': 'e000119xxxxxxxxxxxx', 'class': '02uwxm', 'resource': 'Etq0', 'nick': 'Staubi', 'company': 'eco-ng', 'bindTs': 1623691430807, 'service': {'jmq': 'jmq-ngiot-eu.dc.ww.ecouser.net', 'mqs': 'api-ngiot.dc-as.ww.ecouser.net'}, 'deviceName': 'DEEBOT OZMO Slim10 Series', 'icon': 'https://portal-ww.ecouser.net/api/pim/file/get/608xxxxxxxxxxxxxxxxxx', 'ota': False, 'UILogicId': 'D_OZMO_SLIM10', 'materialNo': '110-1715-0201', 'pid': '5aexxxxxxxxxxxxxx', 'product_category': 'DEEBOT', 'model': 'SLIM10', 'updateInfo': {'needUpdate': False, 'changeLog': ''}, 'status': 1}]}
ERROR:asyncio:Task exception was never retrieved

future: <Task finished name='Task-1' coro=<main() done, defined at /github-deebot-api/example.py:22> exception=TypeError('VacuumBot.__init__() takes 3 positional arguments but 4 were given')>

Traceback (most recent call last):
  File "/github-deebot-api/example.py", line 33, in main
    bot = VacuumBot(session, devices_[0], api_client)
TypeError: VacuumBot.__init__() takes 3 positional arguments but 4 were given


### Additional information

I really want to get the deebot slim10 to work with home-assistant and seeing that it does work with the `ecovacs-deebot.js` makes me want it even more.
If you give me some insights on how the lib works and on which places I may need to convert the data to xml I can play around on my own.

Add support for ECOVACS DEEBOT TEO OMNI

cant seem to find a state or button for it. I have it running a few times a day in the same room where cats litter box is but I dont want it mopping 4 times a day. Would be nice to be able to dynamically control that.

ty

TypeError: 'type' object is not subscriptable

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

I have installed the library with pip install deebot-client .
When I start the sample code from the readme I get the following error:
File "/home/.../env/lib/python3.8/site-packages/.../logging_filter.py", line 12, in SanitizeFilter _SANITIZE_LOG_KEYS: set[str] = { TypeError: 'type' object is not subscriptable

On which deebot vacuum you have the issue?

Deebot Ozmo 920

Which version of the deebot-client are you using?

1.4.0

Country

de

Continent

eu

Anything in the logs that might be useful for us?

No response

Additional information

No response

Add support for Air Purification Robot Z1

Is there an existing issue for this?

  • I have searched the existing issues and no issue is describing my feature request or idea

Is your feature request related to a problem?

No response

Suggested solution

Add support for Air Purification Robot Z1, It should use the same server as Deebot and some of the instructions should be the same.

Api example request

No response

Alternatives you've considered

No response

Additional information

No response

AttributeError: 'ProactorEventLoop' object has no attribute 'add_reader'

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

Not working on Windows:

ERROR:deebot_client.mqtt_client:An exception occurred
Traceback (most recent call last):
File "XXX\Python311\Lib\site-packages\deebot_client\mqtt_client.py", line 160, in mqtt
async with (await self._get_client()) as client:
File "XXX\Python311\Lib\site-packages\aiomqtt\client.py", line 1070, in aenter
await loop.run_in_executor(
File "XXX\Python311\Lib\concurrent\futures\thread.py", line 58, in run
result = self.fn(*self.args, **self.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "XXX\Python311\Lib\site-packages\paho\mqtt\client.py", line 914, in connect
return self.reconnect()
^^^^^^^^^^^^^^^^
File "XXX\Python311\Lib\site-packages\paho\mqtt\client.py", line 1086, in reconnect
self._call_socket_open()
File "XXX\Python311\Lib\site-packages\paho\mqtt\client.py", line 2155, in _call_socket_open
on_socket_open(self, self._userdata, self._sock)
File "XXX\Python311\Lib\site-packages\aiomqtt\client.py", line 1021, in _on_socket_open
self._loop.call_soon_threadsafe(self._loop.add_reader, sock.fileno(), callback)
^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'ProactorEventLoop' object has no attribute 'add_reader'

On which deebot vacuum you have the issue?

Deebot X1 Omni

Which version of the deebot-client are you using?

3.0.0

Country

it

Continent

eu

Anything in the logs that might be useful for us?

AttributeError: 'ProactorEventLoop' object has no attribute 'add_reader'

Additional information

AttributeError: 'ProactorEventLoop' object has no attribute 'add_reader'

Clean / dirty water tanks levels

Is there an existing issue for this?

  • I have searched the existing issues and no issue is describing my feature request or idea

Is your feature request related to a problem?

Can be useful for refill planning

Suggested solution

A sensor for each tank with a percentage or levels (hi / mid / low)

Api example request

No response

Alternatives you've considered

No response

Additional information

No response

Could not handle getError message: {'code': []}

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

Following message is in the log:

Could not handle getError message: {'code': []}

I've lookied into the code and found under commands the corresponding error.py.
Looked fine so far, so i have no real clue why this message comes up.

I cant really find any difference from the log-body to the error.py.... codes = data.get("code", []) Should work, or not?

Means that there is an event.py under messages or events needed?
Or is something changed in the code of the ecovacs servers?

On which deebot device (vacuum) you have the issue?

Deebot X2 Omni

Which version of the deebot-client are you using?

7.2.0

Country

de

Continent

eu

Anything in the logs that might be useful for us?

2024-05-15 11:55:23.503 DEBUG (MainThread) [deebot_client.authentication] Success calling api url=https://portal-eu.ecouser.net/api/iot/devmanager.do, params={'mid': 'lf3bn4', 'did': '310b014d-e138-4268-b4f2-eea7bc4bebfa', 'td': 'q', 'u': 'idqmao8ec939fa29', 'cv': '1.67.3', 't': 'a', 'av': '1.3.1'}, json={'cmdName': 'getError', 'payload': {'header': {'pri': '1', 'ts': 1715766923.425819, 'tzm': 480, 'ver': '0.0.50'}}, 'payloadType': 'j', 'td': 'q', 'toId': '310b014d-e138-4268-b4f2-eea7bc4bebfa', 'toRes': 'hOdT', 'toType': 'lf3bn4'}, response={'ret': 'ok', 'resp': {'header': {'pri': 1, 'tzm': 120, 'ts': '1715766923079', 'ver': '0.0.1', 'fwVer': '1.76.0', 'hwVer': '0.1.1', 'wkVer': '0.1.54'}, 'body': {'code': 0, 'data': {'code': []}, 'msg': 'ok'}}, 'id': 'LmAp', 'payloadType': 'j'}
2024-05-15 11:55:23.504 DEBUG (MainThread) [deebot_client.message] Could not handle getError message: {'code': []}

Additional information

No response

rcp not supportet found in debug log

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

Try to get my X2 Omni fully working in Home assistant

Map and Rooms wont work, but rooms get parsed in debug log...so i'm a bit clueless

But found an error message code 20003 'rcp not support' and have no idea to deal with

On which deebot device (vacuum) you have the issue?

Deebot X2 Omni

Which version of the deebot-client are you using?

7.0.0

Country

de

Continent

eu

Anything in the logs that might be useful for us?

2024-05-02 11:43:16.687 WARNING (MainThread) [deebot_client.message] Could not parse getCleanInfo: {'code': 20003, 'msg': 'rcp not support'}
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/deebot_client/message.py", line 63, in wrapper
    if response.state == HandlingState.ANALYSE:
       ^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'state'
2024-05-02 11:43:16.689 WARNING (MainThread) [deebot_client.message] Could not parse getCleanInfo: {'header': {'pri': 1, 'tzm': 120, 'ts': '1714642996555', 'ver': '0.0.1', 'fwVer': '1.76.0', 'hwVer': '0.1.1', 'wkVer': '0.1.54'}, 'body': {'code': 20003, 'msg': 'rcp not support'}}
2024-05-02 11:43:16.689 WARNING (MainThread) [deebot_client.command] Could not parse getCleanInfo: {'ret': 'ok', 'resp': {'header': {'pri': 1, 'tzm': 120, 'ts': '1714642996555', 'ver': '0.0.1', 'fwVer': '1.76.0', 'hwVer': '0.1.1', 'wkVer': '0.1.54'}, 'body': {'code': 20003, 'msg': 'rcp not support'}}, 'id': 'CE18', 'payloadType': 'j'}

Additional information

No response

Advanced Mode not working with X2 Omni, maybe other types too

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

In HA Integration there is an "advanced mode" - setting switch

According to my ecovacs app this is the multimap feature setting for different environments.(and up to 3 maps saved in bot)

This is in my setting ACTIVATED in the app.

In my HA Integration the advanced mode is off and a test with toggling the switch didnt change anything,
not with set to ON nor OFF. (the setting in my app didnt correspond to that toggling)

In debug log there is no error for that action found...

Any hints to point down the problem?

On which deebot device (vacuum) you have the issue?

X2 Omni

Which version of the deebot-client are you using?

7.0.0

Country

de

Continent

eu

Anything in the logs that might be useful for us?

No response

Additional information

No response

Add Mopping Mode selection

Is there an existing issue for this?

  • I have searched the existing issues and no issue is describing my feature request or idea

Is your feature request related to a problem?

Hi,
thanks for your wonderful work.
I've an Ecovacs X10 OMNI and I've seen that there's no option for "Mopping Mode" (Standard/Deep) in your integration.
I would like to add this option.

Suggested solution

I've sniffed the traffic between Ecovacs app and Ecovacs servers and I've found the command sent. See Api example request.

Api example request

{
    "app": {
        "id": "ecovacs"
    },
    "auth": {
        "realm": "ecouser.net",
        "resource": "XXXXX",
        "token": "XXXXX",
        "userid": "XXXXX",
        "with": "users"
    },
    "cmdName": "setCustomAreaMode",
    "payload": {
        "body": {
            "data": {
                "sweepMode": 1
            }
        },
        "header": {
            "pri": 1,
            "ts": "1695644868714",
            "tzm": 120,
            "ver": "0.0.50"
        }
    },
    "payloadType": "j",
    "td": "q",
    "toId": "REDACTED",
    "toRes": "TNLD",
    "toType": "1vxt52"
}

Alternatives you've considered

No response

Additional information

Let me know if you need more informations to add this feature.
Thanks!

Port to official HA integration

Question

Does it make sense to start discussions about porting this custom integration to the official HA integration, so everyone can benefit from a better version, as official integration is using sucks, which is not well maintained and does not work properly.

Additional information

No response

Support of yeedi vacuums

Is there an existing issue for this?

  • I have searched the existing issues and no issue is describing my feature request or idea

Is your feature request related to a problem?

No response

Suggested solution

Hello,

As yeedi uses also the ecovacs api for the control it would be great if they could be added to.

I found this and thought about a implementation:
https://github.com/mrbungle64/ecovacs-deebot.js

But as there is already a plugin for hass it would be great if this could be extended.

Thanks.

Api example request

No response

Alternatives you've considered

No response

Additional information

No response

Map generation fails if virtual boundary lines created

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

Map generation fails if a virtual boundary line has been set rather than a box ( seems the API describes a line as a box with one side zero length )

On which deebot vacuum you have the issue?

Deebot t8 AIVI

Which version of the deebot-client are you using?

1.4.1

Country

uk

Continent

eu

Anything in the logs that might be useful for us?

Log Details (ERROR)


 
This error originated from a custom integration.
Logger: aiohttp.server
Source: custom_components/deebot/camera.py:53 
Integration: Deebot 4 Home Assistant (documentation, issues) 
First occurred: 09:29:51 (72 occurrences) 
Last logged: 09:43:31

Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/aiohttp/web_protocol.py", line 435, in _handle_request
    resp = await request_handler(request)
  File "/usr/local/lib/python3.9/site-packages/aiohttp/web_app.py", line 504, in _handle
    resp = await handler(request)
  File "/usr/local/lib/python3.9/site-packages/aiohttp/web_middlewares.py", line 117, in impl
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 60, in security_filter_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 100, in forwarded_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 28, in request_context_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 220, in auth_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 137, in handle
    result = await result
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 741, in get
    return await self.handle(request, camera)
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 759, in handle
    image = await _async_get_image(
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 179, in _async_get_image
    if image_bytes := await camera.async_camera_image(
  File "/config/custom_components/deebot/camera.py", line 53, in async_camera_image
    return base64.decodebytes(self._vacuum_bot.map.get_base64_map(width))
  File "/usr/local/lib/python3.9/site-packages/deebot_client/map.py", line 312, in get_base64_map
    _draw_subset(subset, draw, image_box)
  File "/usr/local/lib/python3.9/site-packages/deebot_client/map.py", line 126, in _draw_subset
    draw.dashed_line(points, dash=(3, 2), fill=_COLORS[subset.type], width=1)
  File "/usr/local/lib/python3.9/site-packages/deebot_client/map.py", line 490, in dashed_line
    start = position / length
ZeroDivisionError: float division by zero

Additional information

works fine with virtual boundary boxes.
Using via HACS on HASS, all at current versions as of 19th June 2022

In HA my X2 did'nt accept cleaning commands (rcp not support error)

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

Since Map generation works smoothly now i tried to program something in HA with my bot.

Poorly you can only command him to send his position and to return to station.
Cleaning commands are fully ignored...vacuum only, mop and all other variants same negative result

This is far over my skills :/

On which deebot device (vacuum) you have the issue?

Deebot X2 Omni

Which version of the deebot-client are you using?

7.2.0

Country

de

Continent

eu

Anything in the logs that might be useful for us?

2024-05-12 08:37:38.802 DEBUG (MainThread) [deebot_client.authentication] Calling api(1/3): url=https://portal-eu.ecouser.net/api/iot/devmanager.do, params={'mid': 'lf3bn4', 'did': '310b014d-e138-4268-b4f2-eea7bc4bebfa', 'td': 'q', 'u': 'idqmao8ec939fa29', 'cv': '1.67.3', 't': 'a', 'av': '1.3.1'}, json={'cmdName': 'clean', 'payload': {'header': {'pri': '1', 'ts': 1715495858.802571, 'tzm': 480, 'ver': '0.0.50'}, 'body': {'data': {'act': 'start', 'type': 'auto'}}}, 'payloadType': 'j', 'td': 'q', 'toId': '310b014d-e138-4268-b4f2-eea7bc4bebfa', 'toRes': 'hOdT', 'toType': 'lf3bn4'}
2024-05-12 08:37:38.909 DEBUG (MainThread) [deebot_client.mqtt_client.client] Received PUBLISH (d0, q0, r0, m0), 'iot/p2p/clean/HelperMQClientId-awseu-sts-ngiot-mqsjmq-10/ecosys/1234/310b014d-e138-4268-b4f2-eea7bc4bebfa/lf3bn4/hOdT/q/GZz2/j', ...  (116 bytes)
2024-05-12 08:37:38.909 DEBUG (MainThread) [deebot_client.mqtt_client] Got message: topic=iot/p2p/clean/HelperMQClientId-awseu-sts-ngiot-mqsjmq-10/ecosys/1234/310b014d-e138-4268-b4f2-eea7bc4bebfa/lf3bn4/hOdT/q/GZz2/j, payload=b'{"header":{"pri":"1","ts":1715495858.802571,"tzm":480,"ver":"0.0.50"},"body":{"data":{"act":"start","type":"auto"}}}'
2024-05-12 08:37:38.910 DEBUG (MainThread) [deebot_client.mqtt_client] Command clean does not support p2p handling (yet)
2024-05-12 08:37:39.333 DEBUG (MainThread) [deebot_client.authentication] Success calling api url=https://portal-eu.ecouser.net/api/iot/devmanager.do, params={'mid': 'lf3bn4', 'did': '310b014d-e138-4268-b4f2-eea7bc4bebfa', 'td': 'q', 'u': 'idqmao8ec939fa29', 'cv': '1.67.3', 't': 'a', 'av': '1.3.1'}, json={'cmdName': 'clean', 'payload': {'header': {'pri': '1', 'ts': 1715495858.802571, 'tzm': 480, 'ver': '0.0.50'}, 'body': {'data': {'act': 'start', 'type': 'auto'}}}, 'payloadType': 'j', 'td': 'q', 'toId': '310b014d-e138-4268-b4f2-eea7bc4bebfa', 'toRes': 'hOdT', 'toType': 'lf3bn4'}, response={'ret': 'ok', 'resp': {'header': {'pri': 1, 'tzm': 120, 'ts': '1715495858673', 'ver': '0.0.1', 'fwVer': '1.76.0', 'hwVer': '0.1.1', 'wkVer': '0.1.54'}, 'body': {'code': 20003, 'msg': 'rcp not support'}}, 'id': 'GZz2', 'payloadType': 'j'}
2024-05-12 08:37:39.334 WARNING (MainThread) [deebot_client.commands.json.common] Command "clean" was not successfully. body={'code': 20003, 'msg': 'rcp not support'}

Additional information

This happens in automations and directly by the vacuum entity over the integration of Ecovacs

Add support for Windows users

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

Since Python 3.8, the default asyncio event loop is the ProactorEventLoop. Said loop doesn't support the add_reader method that is required by aiomqtt. Please switch to an event loop that supports the add_reader method such as the built-in SelectorEventLoop:

Change to the "Selector" event loop if platform is Windows

if sys.platform.lower() == "win32" or os.name.lower() == "nt":
from asyncio import set_event_loop_policy, WindowsSelectorEventLoopPolicy
set_event_loop_policy(WindowsSelectorEventLoopPolicy())

Run your async application as usual

asyncio.run(main())

On which deebot device (vacuum) you have the issue?

Deebot X1 Omni

Which version of the deebot-client are you using?

4.1.0

Country

it

Continent

eu

Anything in the logs that might be useful for us?

# Change to the "Selector" event loop if platform is Windows
if sys.platform.lower() == "win32" or os.name.lower() == "nt":
    from asyncio import set_event_loop_policy, WindowsSelectorEventLoopPolicy
    set_event_loop_policy(WindowsSelectorEventLoopPolicy())
# Run your async application as usual
asyncio.run(main())

Additional information

No response

Add support for various "Event Messages"

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

I've some unknown messages in my logs. As i've learned they are missing in commands directory.

I could need an little "template" then i would try to write that down.
I do atm qualified paste and copy, python itself i need to learn a bit first.

Following commands i've found as missing:

Unknown message "onFwBuryPoint-batteryInfo-evt"

Unknown message "onFwBuryPoint-mop-evt"

Unknown message "onFwBuryPoint-alert-evt"

Unknown message "onFwBuryPoint-common-setting"

Unknown message "onFwBuryPoint-omniState-evt"

Unknown message "onFwBuryPoint-task-evt"

Unknown message "onFwBuryPoint-formulate-setting"

Unknown message "onFwBuryPoint-detectChargerSignal-evt"

Unknown message "onFwBuryPoint-bd_basicinfo"

Unknown message "onFwBuryPoint-mop-evt"

Unknown message "onQuickCommand"

Unknown message "onFurnitureInfo_V2"

Unknown message "onAIMap" ---> i belief this message was coming when i locked the map in app

Unknown message "onLastTimeStats"

Unknown message "onEvt"

Unknown message "onCleanDataUpdate_V2"

Unknown message "onStationState" --->This maybe trigger infos from Station like drying, mop washing etc.

Unknown message "onSleep" ---> this could trigger the "sleep" icon on the map (animated "z z z z z")

On which deebot device (vacuum) you have the issue?

Deebot X2 Omni

Which version of the deebot-client are you using?

7.2.0

Country

de

Continent

eu

Anything in the logs that might be useful for us?

2024-05-11 17:54:49.631 DEBUG (MainThread) [deebot_client.mqtt_client.client] Received PUBLISH (d0, q0, r0, m0), 'iot/atr/onFwBuryPoint-batteryInfo-evt/310b014d-e138-4268-b4f2-eea7bc4bebfa/lf3bn4/hOdT/j', ...  (535 bytes)
2024-05-11 17:54:49.632 DEBUG (MainThread) [deebot_client.mqtt_client] Got message: topic=iot/atr/onFwBuryPoint-batteryInfo-evt/310b014d-e138-4268-b4f2-eea7bc4bebfa/lf3bn4/hOdT/j, payload=b'{"header":{"pri":1,"tzm":120,"ts":"1715442888893","ver":"0.0.1","fwVer":"1.76.0","hwVer":"0.1.1","wkVer":"0.1.54"},"body":{"gid":"G1715423186951","index":"0000000673","info":null,"infoStr":"{\\"type\\":\\"BatteryInfo\\",\\"ischarging\\":1,\\"left_wheel_current\\":5,\\"right_wheel_current\\":0,\\"left_mop_current\\":0,\\"right_mop_current\\":0,\\"right_side_current\\":0,\\"roll_current\\":0,\\"battery_current\\":1275,\\"battery_voltage\\":16380,\\"battery_percent\\":94,\\"incarpet\\":0,\\"fan_speed\\":0,\\"battery_temperature\\":\\u0017}","ts":"1715442888873"}}'
2024-05-11 17:54:49.632 DEBUG (MainThread) [deebot_client.event_bus] Event is the same! Skipping (AvailabilityEvent(available=True))
2024-05-11 17:54:49.632 DEBUG (MainThread) [deebot_client.device] Try to handle message onFwBuryPoint-batteryInfo-evt: b'{"header":{"pri":1,"tzm":120,"ts":"1715442888893","ver":"0.0.1","fwVer":"1.76.0","hwVer":"0.1.1","wkVer":"0.1.54"},"body":{"gid":"G1715423186951","index":"0000000673","info":null,"infoStr":"{\\"type\\":\\"BatteryInfo\\",\\"ischarging\\":1,\\"left_wheel_current\\":5,\\"right_wheel_current\\":0,\\"left_mop_current\\":0,\\"right_mop_current\\":0,\\"right_side_current\\":0,\\"roll_current\\":0,\\"battery_current\\":1275,\\"battery_voltage\\":16380,\\"battery_percent\\":94,\\"incarpet\\":0,\\"fan_speed\\":0,\\"battery_temperature\\":\\u0017}","ts":"1715442888873"}}'
2024-05-11 17:54:49.633 DEBUG (MainThread) [deebot_client.messages] Unknown message "onFwBuryPoint-batteryInfo-evt"

Additional information

These burypoint messages seems to be an feedback from bot with interesting internal informations.

Trying to get data from GOAT G1 mower

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

example code in the readme does not work, cant import the required packages.

On which deebot vacuum you have the issue?

na

Which version of the deebot-client are you using?

1.6.1

Country

se

Continent

eu

Anything in the logs that might be useful for us?

python /code/main.py 
Traceback (most recent call last):
  File "/code/main.py", line 12, in <module>
    from deebot_client.mqtt_client import MqttClient, MqttConfiguration
ImportError: cannot import name 'MqttConfiguration' from 'deebot_client.mqtt_client' (/usr/local/lib/python3.10/site-packages/deebot_client/mqtt_client.py)
root@99dc47ae7630:/# pip list
Package            Version
------------------ -------
aiohttp            3.8.4
aiosignal          1.3.1
async-timeout      4.0.2
attrs              23.1.0
cachetools         5.3.1
charset-normalizer 3.1.0
deebot-client      1.6.1
frozenlist         1.3.3
gmqtt              0.6.12
idna               3.4
multidict          6.0.4
numpy              1.24.3
Pillow             9.5.0
pip                23.0.1
setuptools         65.5.1
wheel              0.40.0
yarl               1.9.2

[notice] A new release of pip is available: 23.0.1 -> 23.1.2
[notice] To update, run: pip install --upgrade pip
root@99dc47ae7630:/# python --version
Python 3.10.11

Additional information

No response

No sensors working for X1 Omni

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

None of the sensors work on the X1 Omni, and the log files indicate that the data can't be parsed when received via MQTT.

On which deebot vacuum you have the issue?

Deebot Omni X1 Turbo

Which version of the deebot-client are you using?

1.6.0

Country

UK

Continent

EU

Anything in the logs that might be useful for us?

2022-10-26 19:45:13.468 DEBUG (MainThread) [deebot_client.mqtt_client] Got message: topic=iot/atr/onFwBuryPoint-bd_sysinfo/f18e00c7-6f7a-4934-9750-c11be74177a8/1vxt52/mBBg/j; payload={"header":{"pri":1,"tzm":60,"ts":"1666809916291","ver":"0.0.1","fwVer":"1.14.7","hwVer":"0.1.1","wkVer":"0.1.54"},"body":[{"signal":-39,"uptime":" 18:31:16 up 26 days, 23:00,  0 users,  load average: 2.29, 2.26, 2.26, POWER_RESET","meminfo":"625348,385052","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"},{"signal":-39,"uptime":" 18:32:16 up 26 days, 23:01,  0 users,  load average: 2.07, 2.21, 2.24, POWER_RESET","meminfo":"626248,384152","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"},{"signal":-39,"uptime":" 18:33:16 up 26 days, 23:02,  0 users,  load average: 2.15, 2.19, 2.23, POWER_RESET","meminfo":"625396,385004","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"},{"signal":-39,"uptime":" 18:34:16 up 26 days, 23:03,  0 users,  load average: 2.40, 2.23, 2.24, POWER_RESET","meminfo":"625552,384848","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"},{"signal":-39,"uptime":" 18:35:16 up 26 days, 23:04,  0 users,  load average: 2.25, 2.23, 2.25, POWER_RESET","meminfo":"625620,384780","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"},{"signal":-39,"uptime":" 18:36:16 up 26 days, 23:05,  0 users,  load average: 2.05, 2.16, 2.22, POWER_RESET","meminfo":"625540,384860","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"},{"signal":-39,"uptime":" 18:37:16 up 26 days, 23:06,  0 users,  load average: 2.10, 2.16, 2.21, POWER_RESET","meminfo":"625532,384868","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"},{"signal":-39,"uptime":" 18:38:16 up 26 days, 23:07,  0 users,  load average: 2.18, 2.17, 2.21, POWER_RESET","meminfo":"625544,384856","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"},{"signal":-39,"uptime":" 18:39:16 up 26 days, 23:08,  0 users,  load average: 2.18, 2.18, 2.22, POWER_RESET","meminfo":"625496,384904","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"},{"signal":-39,"uptime":" 18:40:16 up 26 days, 23:09,  0 users,  load average: 2.30, 2.22, 2.23, POWER_RESET","meminfo":"625428,384972","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"},{"signal":-39,"uptime":" 18:41:16 up 26 days, 23:10,  0 users,  load average: 2.84, 2.38, 2.28, POWER_RESET","meminfo":"625192,385208","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"},{"signal":-39,"uptime":" 18:42:16 up 26 days, 23:11,  0 users,  load average: 2.47, 2.37, 2.28, POWER_RESET","meminfo":"625748,384652","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"},{"signal":-39,"uptime":" 18:43:16 up 26 days, 23:12,  0 users,  load average: 2.87, 2.50, 2.33, POWER_RESET","meminfo":"625576,384824","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"},{"signal":-39,"uptime":" 18:44:16 up 26 days, 23:13,  0 users,  load average: 2.66, 2.52, 2.35, POWER_RESET","meminfo":"625476,384924","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"},{"signal":-39,"uptime":" 18:45:16 up 26 days, 23:14,  0 users,  load average: 2.68, 2.53, 2.36, POWER_RESET","meminfo":"625352,385048","pos":"-400,-1699","isvalid":1,"mapid":"1636595110","ts":"1666809916281"}]};
2022-10-26 19:45:13.468 DEBUG (MainThread) [deebot_client.vacuum_bot] Handle message onFwBuryPoint-bd_sysinfo: {'header': {'pri': 1, 'tzm': 60, 'ts': '1666809916291', 'ver': '0.0.1', 'fwVer': '1.14.7', 'hwVer': '0.1.1', 'wkVer': '0.1.54'}, 'body': [{'signal': -39, 'uptime': ' 18:31:16 up 26 days, 23:00,  0 users,  load average: 2.29, 2.26, 2.26, POWER_RESET', 'meminfo': '625348,385052', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:32:16 up 26 days, 23:01,  0 users,  load average: 2.07, 2.21, 2.24, POWER_RESET', 'meminfo': '626248,384152', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:33:16 up 26 days, 23:02,  0 users,  load average: 2.15, 2.19, 2.23, POWER_RESET', 'meminfo': '625396,385004', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:34:16 up 26 days, 23:03,  0 users,  load average: 2.40, 2.23, 2.24, POWER_RESET', 'meminfo': '625552,384848', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:35:16 up 26 days, 23:04,  0 users,  load average: 2.25, 2.23, 2.25, POWER_RESET', 'meminfo': '625620,384780', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:36:16 up 26 days, 23:05,  0 users,  load average: 2.05, 2.16, 2.22, POWER_RESET', 'meminfo': '625540,384860', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:37:16 up 26 days, 23:06,  0 users,  load average: 2.10, 2.16, 2.21, POWER_RESET', 'meminfo': '625532,384868', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:38:16 up 26 days, 23:07,  0 users,  load average: 2.18, 2.17, 2.21, POWER_RESET', 'meminfo': '625544,384856', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:39:16 up 26 days, 23:08,  0 users,  load average: 2.18, 2.18, 2.22, POWER_RESET', 'meminfo': '625496,384904', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:40:16 up 26 days, 23:09,  0 users,  load average: 2.30, 2.22, 2.23, POWER_RESET', 'meminfo': '625428,384972', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:41:16 up 26 days, 23:10,  0 users,  load average: 2.84, 2.38, 2.28, POWER_RESET', 'meminfo': '625192,385208', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:42:16 up 26 days, 23:11,  0 users,  load average: 2.47, 2.37, 2.28, POWER_RESET', 'meminfo': '625748,384652', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:43:16 up 26 days, 23:12,  0 users,  load average: 2.87, 2.50, 2.33, POWER_RESET', 'meminfo': '625576,384824', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:44:16 up 26 days, 23:13,  0 users,  load average: 2.66, 2.52, 2.35, POWER_RESET', 'meminfo': '625476,384924', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:45:16 up 26 days, 23:14,  0 users,  load average: 2.68, 2.53, 2.36, POWER_RESET', 'meminfo': '625352,385048', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}]}
2022-10-26 19:45:13.470 DEBUG (MainThread) [deebot_client.vacuum_bot] Falling back to old handling way for onFwBuryPoint-bd_sysinfo
2022-10-26 19:45:13.470 DEBUG (MainThread) [deebot_client.vacuum_bot] Unknown message "getFwBuryPoint-bd_sysinfo" with {'header': {'pri': 1, 'tzm': 60, 'ts': '1666809916291', 'ver': '0.0.1', 'fwVer': '1.14.7', 'hwVer': '0.1.1', 'wkVer': '0.1.54'}, 'body': [{'signal': -39, 'uptime': ' 18:31:16 up 26 days, 23:00,  0 users,  load average: 2.29, 2.26, 2.26, POWER_RESET', 'meminfo': '625348,385052', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:32:16 up 26 days, 23:01,  0 users,  load average: 2.07, 2.21, 2.24, POWER_RESET', 'meminfo': '626248,384152', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:33:16 up 26 days, 23:02,  0 users,  load average: 2.15, 2.19, 2.23, POWER_RESET', 'meminfo': '625396,385004', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:34:16 up 26 days, 23:03,  0 users,  load average: 2.40, 2.23, 2.24, POWER_RESET', 'meminfo': '625552,384848', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:35:16 up 26 days, 23:04,  0 users,  load average: 2.25, 2.23, 2.25, POWER_RESET', 'meminfo': '625620,384780', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:36:16 up 26 days, 23:05,  0 users,  load average: 2.05, 2.16, 2.22, POWER_RESET', 'meminfo': '625540,384860', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:37:16 up 26 days, 23:06,  0 users,  load average: 2.10, 2.16, 2.21, POWER_RESET', 'meminfo': '625532,384868', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:38:16 up 26 days, 23:07,  0 users,  load average: 2.18, 2.17, 2.21, POWER_RESET', 'meminfo': '625544,384856', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:39:16 up 26 days, 23:08,  0 users,  load average: 2.18, 2.18, 2.22, POWER_RESET', 'meminfo': '625496,384904', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:40:16 up 26 days, 23:09,  0 users,  load average: 2.30, 2.22, 2.23, POWER_RESET', 'meminfo': '625428,384972', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:41:16 up 26 days, 23:10,  0 users,  load average: 2.84, 2.38, 2.28, POWER_RESET', 'meminfo': '625192,385208', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:42:16 up 26 days, 23:11,  0 users,  load average: 2.47, 2.37, 2.28, POWER_RESET', 'meminfo': '625748,384652', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:43:16 up 26 days, 23:12,  0 users,  load average: 2.87, 2.50, 2.33, POWER_RESET', 'meminfo': '625576,384824', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:44:16 up 26 days, 23:13,  0 users,  load average: 2.66, 2.52, 2.35, POWER_RESET', 'meminfo': '625476,384924', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}, {'signal': -39, 'uptime': ' 18:45:16 up 26 days, 23:14,  0 users,  load average: 2.68, 2.53, 2.36, POWER_RESET', 'meminfo': '625352,385048', 'pos': '-400,-1699', 'isvalid': 1, 'mapid': '1636595110', 'ts': '1666809916281'}]}

Additional information

{
  "code": 0,
  "todo": "result",
  "ret": "ok",
  "devices": [
    {
      "did": "[REMOVED]",
      "name": "E03P15612D09HN7C0332",
      "class": "1vxt52",
      "resource": "mBBg",
      "nick": "Buttercup",
      "company": "eco-ng",
      "bindTs": 1657780813727,
      "service": {
        "jmq": "jmq-ngiot-eu.dc.ww.ecouser.net",
        "mqs": "api-ngiot.dc-as.ww.ecouser.net"
      },
      "homeId": "62c5e5d22c176276a62f9002",
      "homeSort": 1,
      "deviceName": "DEEBOT X1 OMNI",
      "icon": "https://portal-ww.ecouser.net/api/pim/file/get/6225bd1c2af2127804f540e5",
      "ota": true,
      "UILogicId": "t10_ww_n_omni",
      "materialNo": "110-2102-0300",
      "pid": "6185e29610683da4d6a7a9cd",
      "product_category": "DEEBOT",
      "model": "EINSTEIN_INT",
      "updateInfo": {
        "needUpdate": false,
        "changeLog": ""
      },
      "status": 1,
      "offmap": true
    }
  ]
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.