ligio / ozmo Goto Github PK
View Code? Open in Web Editor NEWLicense: GNU General Public License v3.0
License: GNU General Public License v3.0
hacc-ozmo
is currently failing to install. It looks like version 1.0.4 hasn't yet been published to PyPI.
Throws a collections related error.
More info here:
Ligio/hacc-ozmo#40
Hi,
I want to use the lib to write an integration plugin for a smarthome system.
I own myself a Deebot Ozmo 950 for testing.
Until now i have just a few lines of code to get a first POC. Sadly i fail miserably to get the bot t do anything because of timeouts. Here is an example code.
#!/usr/bin/env python3
import logging
from ozmo import *
logging.basicConfig(level=logging.DEBUG)
config = { 'device_id': 'my_devices_name',
'email':'[email protected]',
'password_hash':EcoVacsAPI.md5('XXXXXXX'),
'country':'lu',
'continent':'eu'};
logging.debug('Getting API')
api = EcoVacsAPI(config['device_id'], config['email'], config['password_hash'],config['country'], config['continent'])
my_vac = api.devices()[0]
logging.debug('Connecting to vacbot')
vacbot = VacBot(api.uid, api.REALM, api.resource, api.user_access_token, my_vac, config['continent'])
vacbot.connect_and_wait_until_ready()
logging.debug('Requesting statuses from vacbot')
vacbot.request_all_statuses()
And here is the result DEBUG log
DEBUG:root:Getting API
DEBUG:ozmo:Setting up EcoVacsAPI
DEBUG:ozmo:calling main api user/login with (('account',
'kDsMHtqkwo7p8XXXXXXXpb7RLdyQD8E/RSVWF639g6CzkoRKFVDCE4xVFmoqsbPDijJRCn4gudKW66bxkcNdwmOFLKitDeiVBsuWUZSDpUiVADInwewXXXXXXXgTnYBfuUCvVdavv80/OTj4tnukRT52PGo3vIv2/ehzSxyTPfw='), ('password', 'l+KMWRH59/36QGbsKa34lk4Dju3XlR2fZ+wKkDzY+T2liVPde2dpbE7Dgr/9d6Wjm7tBR56rd84bgM66zREAAMfc5eII7ydU0D//JfDQKIu1HKbdrh/E61CsCL2TItgXbsSxaDx8qJNdzq4XZ88BXXXXXXX5hBRlPjrHtIIEse8='))
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): eco-lu-api.ecovacs.com:443
DEBUG:urllib3.connectionpool:https://eco-lu-api.ecovacs.com:443 "GET /v1/private/lu/en/<robot_name>/i_eco_e/1.3.5/c_googleplay/1/user/login?account=kDsMHtqkwo7p8XXXXXXXpb7RLdyQD8E%2FRSVWF639g6CzkoRKFVDCE4xVFmoqsbPDijJRCn4gudKW66bxkcNdwmOFLKitDeiVBsuWUZSDpUiVADInwewXXXXXXXgTnYBfuUCvVdavv80%2FOTj4tnukRT52PGo3vIv2%2FehzSxyTPfw%3D&password=l%2BKMWRH59%2F36QGbsKa34lk4Dju3XlR2fZ%2BwKkDzY%2BT2liVPde2dpbE7Dgr%2F9d6Wjm7tBR56rd84bgM66zREAAMfc5eII7ydU0D%2F%2FJfDQKIu1HKbdrh%2FE61CsCL2TItgXbsSxaDx8qJNdzq4XZ88BFI%2Bdz905hBRlPjrHtIIEse8%3D&requestId=2e82bf1ffa02b8357a43ba53b05e0481&authTimespan=1589122212908&authTimeZone=GMT-8&authAppkey=eJUWrzRv34qFSaYk&authSign=0ddc0e81aa33c8c86a905c612c5c6d3b HTTP/1.1" 200 None
DEBUG:ozmo:got {'code': '0000', 'msg': '操作成功', 'time': 1589122212971, 'data': {'uid': '20200509120103_3f9876d102d5XXXXXXXe6ddec7baee7b', 'username': 'EXXXXAV8', 'email': '[email protected]', 'country': 'lu', 'accessToken': 'b70b1c9a7dfba7XXXXXXX67fb8e7bb49'}}
DEBUG:ozmo:calling main api user/getAuthCode with (('uid', '20200509120103_3f9876d102d5XXXXXXXe6ddec7baee7b'), ('accessToken', 'b70b1c9a7dfba7XXXXXXX67fb8e7bb49'))
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): eco-lu-api.ecovacs.com:443
DEBUG:urllib3.connectionpool:https://eco-lu-api.ecovacs.com:443 "GET /v1/private/lu/en/<robot_name>/i_eco_e/1.3.5/c_googleplay/1/user/getAuthCode?uid=20200509120103_3f9876d102d5XXXXXXXe6ddec7baee7b&accessToken=b70b1c9a7dfba7XXXXXXX67fb8e7bb49&requestId=607b5d1580c1c68df340ad125cbe9363&authTimespan=1589122213163&authTimeZone=GMT-8&authAppkey=eJUWrzRv34qFSaYk&authSign=f77a8b6efbaf808fa0785f1da61bcc19 HTTP/1.1" 200 None
DEBUG:ozmo:got {'code': '0000', 'msg': '操作成功', 'time': 1589122213213, 'data': {'authCode': 'lu_XXXXXXX77783bc93a4ab36fe1adbf33b', 'ecovacsUid': '20200507102953_4ab873b6b6a69a5555f4980d10e0f11b'}}
DEBUG:ozmo:calling portal api users/user.do function loginByItToken with {'todo': 'loginByItToken', 'country': 'LU', 'resource': '<robot_name>', 'realm': 'ecouser.net', 'userId': '20200509120103_3f9876d102d5XXXXXXXe6ddec7baee7b', 'token': 'lu_XXXXXXX77783bc93a4ab36fe1adbf33b'}
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): portal-eu.ecouser.net:443
DEBUG:urllib3.connectionpool:https://portal-eu.ecouser.net:443 "POST /api/users/user.do HTTP/1.1" 200 139
DEBUG:ozmo:got {'todo': 'result', 'result': 'ok', 'userId': 'eXXXXXXXd554ea99', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'last': 604800000}
DEBUG:root:Switching to shorter UID eXXXXXXXd554ea99
DEBUG:root:EcoVacsAPI connection complete
DEBUG:ozmo:calling portal api users/user.do function GetDeviceList with {'todo': 'GetDeviceList', 'userid': 'eXXXXXXXd554ea99', 'auth': {'with': 'users', 'userid': 'eXXXXXXXd554ea99', 'realm': 'ecouser.net', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'resource': '<robot_name>'}}
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): portal-eu.ecouser.net:443
DEBUG:urllib3.connectionpool:https://portal-eu.ecouser.net:443 "POST /api/users/user.do HTTP/1.1" 200 213
DEBUG:ozmo:got {'todo': 'result', 'result': 'ok', 'devices': [{'did': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'name': 'E0001279610066170069', 'class': 'yna5xi', 'resource': 'wilG', 'nick': '<robot_name>', 'company': 'eco-ng', 'bindTs': 1588862063839}]}
DEBUG:root:Connecting to vacbot
DEBUG:ozmo:EcoVacsMQTT - Connected with result code 0
DEBUG:ozmo:EcoVacsMQTT - Subscribing to all
DEBUG:root:Requesting statuses from vacbot
DEBUG:ozmo:Sending command {'auth': {'realm': 'ecouser.net', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'userid': 'eXXXXXXXd554ea99', 'with': 'users'}, 'cmdName': 'GetCleanState', 'payload': '<ctl />', 'payloadType': 'x', 'td': 'q', 'toId': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'toRes': 'wilG', 'toType': 'yna5xi'}
DEBUG:ozmo:calling iotdevmanager api with {'auth': {'realm': 'ecouser.net', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'userid': 'eXXXXXXXd554ea99', 'with': 'users'}, 'cmdName': 'GetCleanState', 'payload': '<ctl />', 'payloadType': 'x', 'td': 'q', 'toId': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'toRes': 'wilG', 'toType': 'yna5xi'}
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): portal-eu.ecouser.net:443
DEBUG:ozmo:call to iotdevmanager failed with ReadTimeout
DEBUG:ozmo:Sending command {'auth': {'realm': 'ecouser.net', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'userid': 'eXXXXXXXd554ea99', 'with': 'users'}, 'cmdName': 'GetChargeState', 'payload': '<ctl />', 'payloadType': 'x', 'td': 'q', 'toId': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'toRes': 'wilG', 'toType': 'yna5xi'}
DEBUG:ozmo:calling iotdevmanager api with {'auth': {'realm': 'ecouser.net', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'userid': 'eXXXXXXXd554ea99', 'with': 'users'}, 'cmdName': 'GetChargeState', 'payload': '<ctl />', 'payloadType': 'x', 'td': 'q', 'toId': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'toRes': 'wilG', 'toType': 'yna5xi'}
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): portal-eu.ecouser.net:443
DEBUG:ozmo:call to iotdevmanager failed with ReadTimeout
DEBUG:ozmo:Sending command {'auth': {'realm': 'ecouser.net', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'userid': 'eXXXXXXXd554ea99', 'with': 'users'}, 'cmdName': 'GetBatteryInfo', 'payload': '<ctl />', 'payloadType': 'x', 'td': 'q', 'toId': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'toRes': 'wilG', 'toType': 'yna5xi'}
DEBUG:ozmo:calling iotdevmanager api with {'auth': {'realm': 'ecouser.net', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'userid': 'eXXXXXXXd554ea99', 'with': 'users'}, 'cmdName': 'GetBatteryInfo', 'payload': '<ctl />', 'payloadType': 'x', 'td': 'q', 'toId': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'toRes': 'wilG', 'toType': 'yna5xi'}
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): portal-eu.ecouser.net:443
DEBUG:ozmo:call to iotdevmanager failed with ReadTimeout
DEBUG:ozmo:Sending command {'auth': {'realm': 'ecouser.net', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'userid': 'eXXXXXXXd554ea99', 'with': 'users'}, 'cmdName': 'GetCleanSpeed', 'payload': '<ctl />', 'payloadType': 'x', 'td': 'q', 'toId': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'toRes': 'wilG', 'toType': 'yna5xi'}
DEBUG:ozmo:calling iotdevmanager api with {'auth': {'realm': 'ecouser.net', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'userid': 'eXXXXXXXd554ea99', 'with': 'users'}, 'cmdName': 'GetCleanSpeed', 'payload': '<ctl />', 'payloadType': 'x', 'td': 'q', 'toId': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'toRes': 'wilG', 'toType': 'yna5xi'}
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): portal-eu.ecouser.net:443
DEBUG:ozmo:call to iotdevmanager failed with ReadTimeout
DEBUG:ozmo:Sending command {'auth': {'realm': 'ecouser.net', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'userid': 'eXXXXXXXd554ea99', 'with': 'users'}, 'cmdName': 'GetLifeSpan', 'payload': '<ctl type="Brush" />', 'payloadType': 'x', 'td': 'q', 'toId': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'toRes': 'wilG', 'toType': 'yna5xi'}
DEBUG:ozmo:calling iotdevmanager api with {'auth': {'realm': 'ecouser.net', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'userid': 'eXXXXXXXd554ea99', 'with': 'users'}, 'cmdName': 'GetLifeSpan', 'payload': '<ctl type="Brush" />', 'payloadType': 'x', 'td': 'q', 'toId': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'toRes': 'wilG', 'toType': 'yna5xi'}
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): portal-eu.ecouser.net:443
DEBUG:ozmo:call to iotdevmanager failed with ReadTimeout
DEBUG:ozmo:Sending command {'auth': {'realm': 'ecouser.net', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'userid': 'eXXXXXXXd554ea99', 'with': 'users'}, 'cmdName': 'GetLifeSpan', 'payload': '<ctl type="SideBrush" />', 'payloadType': 'x', 'td': 'q', 'toId': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'toRes': 'wilG', 'toType': 'yna5xi'}
DEBUG:ozmo:calling iotdevmanager api with {'auth': {'realm': 'ecouser.net', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'userid': 'eXXXXXXXd554ea99', 'with': 'users'}, 'cmdName': 'GetLifeSpan', 'payload': '<ctl type="SideBrush" />', 'payloadType': 'x', 'td': 'q', 'toId': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'toRes': 'wilG', 'toType': 'yna5xi'}
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): portal-eu.ecouser.net:443
DEBUG:ozmo:call to iotdevmanager failed with ReadTimeout
DEBUG:ozmo:Sending command {'auth': {'realm': 'ecouser.net', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'userid': 'eXXXXXXXd554ea99', 'with': 'users'}, 'cmdName': 'GetLifeSpan', 'payload': '<ctl type="DustCaseHeap" />', 'payloadType': 'x', 'td': 'q', 'toId': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'toRes': 'wilG', 'toType': 'yna5xi'}
DEBUG:ozmo:calling iotdevmanager api with {'auth': {'realm': 'ecouser.net', 'resource': '<robot_name>', 'token': 'pjnqNaWXXXXXXXTF6EZcIEh3hLhSsPEu', 'userid': 'eXXXXXXXd554ea99', 'with': 'users'}, 'cmdName': 'GetLifeSpan', 'payload': '<ctl type="DustCaseHeap" />', 'payloadType': 'x', 'td': 'q', 'toId': 'd3e7200e-XXXX-XXXX-ab21-27d299717698', 'toRes': 'wilG', 'toType': 'yna5xi'}
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): portal-eu.ecouser.net:443
DEBUG:ozmo:call to iotdevmanager failed with ReadTimeout
Using an ozmo 900/905. Im not sure exactly when it stopped working as my vacuum was offline for a little while waiting for a new battery.
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 304, in _async_setup_platform
await asyncio.shield(task)
File "/usr/local/lib/python3.10/concurrent/futures/thread.py", line 58, in run
result = self.fn(*self.args, **self.kwargs)
File "/config/custom_components/deebot/vacuum.py", line 46, in setup_platform
vacuums.append(EcovacsDeebotVacuum(device, hass.data[ECOVACS_CONFIG][0]))
File "/config/custom_components/deebot/vacuum.py", line 59, in __init__
self.device.connect_and_wait_until_ready()
File "/usr/local/lib/python3.10/site-packages/ozmo/__init__.py", line 461, in connect_and_wait_until_ready self.send_ping() File "/usr/local/lib/python3.10/site-packages/ozmo/__init__.py", line 628, in send_ping self.request_all_statuses() File "/usr/local/lib/python3.10/site-packages/ozmo/__init__.py", line 662, in request_all_statuses self.refresh_statuses() File "/usr/local/lib/python3.10/site-packages/ozmo/__init__.py", line 647, in refresh_statuses
self.run(GetCleanState()) File "/usr/local/lib/python3.10/site-packages/ozmo/__init__.py", line 673, in run
self.send_command(action)
File "/usr/local/lib/python3.10/site-packages/ozmo/__init__.py", line 670, in send_command
self.iotmq.send_command(action, self._vacuum_address()) #IOTMQ devices need the full action for additional parsing
File "/usr/local/lib/python3.10/site-packages/ozmo/__init__.py", line 789, in send_command
self._handle_ctl_api(
File "/usr/local/lib/python3.10/site-packages/ozmo/__init__.py", line 862, in _handle_ctl_api
if 'resp' in message:
TypeError: argument of type 'NoneType' is not iterable
Hi all,
I have a Deebot OZMO 920, with mop, that, due to special price on amazon it's very popular in Italy.
Unfortunately as you know the Ecovacs APP and mini integration in IFTTT lacks of a lot of thing (e.g. clean a specific room with Google Assistant).
So i found "sucks" but doesn't work wit 920. Then I have tried "ozmo" and it seems to work but doesn't perform any command and is stuck on the object of this issue. This is what I obtain. Any suggestion?
C:\Users\Lork>ozmo --debug charge
ozmo.cli DEBUG will run [<ozmo.cli.CliAction object at 0x03FE65E0>]
ozmo DEBUG Setting up EcoVacsAPI
ozmo DEBUG calling main api user/login with (('account', 'vDcsX8LgNOvpVYjF25VoL2eQV6v/HpoNY0HtvWZnwAa8oUOV7agXCzgPUNuigycHsI4+6v+wW9Mm0rLI2jMJ4Olib4B+b3YwcCDD7A9YkM8L0a9fy1j9PVf4VDbjHmH6HU66chpYVq1zAqBAeJV0379OhiHDJUbIDQb0ks/L1Pw='), ('password', 'PASSWORD'))
ozmo DEBUG got {'code': '0000', 'msg': '操作成功', 'time': 1597439759191, 'data': {'uid': '20200504082734_abf769c005c9cd8cdd9207af88c91877', 'username': 'EA4EF9GV', 'email': 'MYEMAIL', 'country': 'it', 'accessToken': '20cacc0b300b68f1e5a79a8d15f48add'}}
ozmo DEBUG calling main api user/getAuthCode with (('uid', '20200504082734_abf769c005c9cd8cdd9207af88c91877'), ('accessToken', '20cacc0b300b68f1e5a79a8d15f48add'))
ozmo DEBUG got {'code': '0000', 'msg': '操作成功', 'time': 1597439759548, 'data': {'authCode': 'it_33b9cc79db1479b0669272dd2fbc9461', 'ecovacsUid': '20200422160431_e6d576211a316c42b1b9472e99f09e03'}}
ozmo DEBUG calling portal api users/user.do function loginByItToken with {'todo': 'loginByItToken', 'country': 'IT', 'resource': '52e969d5', 'realm': 'ecouser.net', 'userId': 'USERID_DIFFERENT FROM OTHER', 'token': 'it_33b9cc79db1479b0669272dd2fbc9461'}
ozmo DEBUG got {'todo': 'result', 'result': 'ok', 'userId': 'USERID', 'resource': '52e969d5', 'token': 'c7a55aa84b224be9b4f60806e1323d90', 'last': 604800000}
ozmo DEBUG calling portal api users/user.do function GetDeviceList with {'todo': 'GetDeviceList', 'userid': 'edwue6o28ace5945', 'auth': {'with': 'users', 'userid': 'USERID', 'realm': 'ecouser.net', 'token': 'c7a55aa84b224be9b4f60806e1323d90', 'resource': '52e969d5'}}
ozmo DEBUG got {'todo': 'result', 'result': 'ok', 'devices': [{'did': 'f82a9642-cb40-495f-ba99-82a93003c977', 'name': 'E0001278919603320623', 'class': 'vi829v', 'resource': 'TwRK', 'nick': None, 'company': 'eco-ng', 'bindTs': 1587625479827}]}
ozmo DEBUG EcoVacsMQTT - Connected with result code 0
ozmo DEBUG EcoVacsMQTT - Subscribing to all
performing charge command
ozmo DEBUG Sending command {'auth': {'realm': 'ecouser.net', 'resource': '52e969d5', 'token': 'c7a55aa84b224be9b4f60806e1323d90', 'userid': 'USERID', 'with': 'users'}, 'cmdName': 'Charge', 'payload': '', 'payloadType': 'x', 'td': 'q', 'toId': 'f82a9642-cb40-495f-ba99-82a93003c977', 'toRes': 'TwRK', 'toType': 'vi829v'}
ozmo DEBUG calling iotdevmanager api with {'auth': {'realm': 'ecouser.net', 'resource': '52e969d5', 'token': 'c7a55aa84b224be9b4f60806e1323d90', 'userid': 'USERID', 'with': 'users'}, 'cmdName': 'Charge', 'payload': '', 'payloadType': 'x', 'td': 'q', 'toId': 'f82a9642-cb40-495f-ba99-82a93003c977', 'toRes': 'TwRK', 'toType': 'vi829v'}
ozmo DEBUG call to iotdevmanager failed with ReadTimeout
ozmo.cli DEBUG waiting on charge_status for value charging
ozmo DEBUG *** MQTT sending ping ***
ozmo DEBUG *** MQTT sending ping ***
ozmo DEBUG *** MQTT sending ping ***
ozmo DEBUG *** MQTT sending ping ***
ozmo DEBUG *** MQTT sending ping ***
ozmo DEBUG *** MQTT sending ping ***
ozmo DEBUG *** MQTT sending ping ***
ozmo DEBUG *** MQTT sending ping ***
ozmo DEBUG *** MQTT sending ping ***
ozmo DEBUG EcoVacsMQTT - Connected with result code 0
ozmo DEBUG EcoVacsMQTT - Subscribing to all
ozmo DEBUG *** MQTT sending ping ***
ozmo DEBUG *** MQTT sending ping ***
ozmo DEBUG *** MQTT sending ping ***
ozmo DEBUG *** MQTT sending ping ***
ozmo DEBUG *** MQTT sending ping ***
and so on...
Line 750 in bd2eb2d
isAlive
can be safely replaced with is_alive
here
Hi @Ligio,
what do you think to add your "xml" code into deebot-client, so we can support with one library more different models?
As I don't have a "xml" based robot, I cannot debug it, so it's hard to support it on my own.
Cheers and thanks in advance
Robert
nevermind, it was "sudo pip3 install ozmo" and not "sudo pip3 install ozmos"... :)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.