Giter Club home page Giter Club logo

pyezviz's Introduction

Ezviz PyPi

Upload Python Package

Pilot your Ezviz cameras (and light bulbs) with this module.

Installing

pip install pyezviz

Playing with it

pyezviz -u em@il -p PASS devices status
                         name  status device_category device_sub_category  sleep  privacy  audio  ir_led  state_led       local_ip local_rtsp_port detection_sensibility battery_level  alarm_schedules_enabled  alarm_notify  Motion_Trigger
D444444   backyard camera 1       1   BatteryCamera                 C3A   True    False   True    True      False  192.168.1.167             554             Hibernate           100                    False          True           False
D444444   Front door camera       1   BatteryCamera                 C3A   True    False   True    True      False  192.168.1.192             554             Hibernate            99                    False          True           False
D444444    courtyard camera       1   BatteryCamera                 C3A   True    False   True    True       True  192.168.1.133             554             Hibernate           100                    False         False           False
D444444  Living room camera       1             IPC                C6CN  False     True   True    True       True   192.168.1.39             554                     3          None                    False          True           False
D444444   Backyard camera 2       1             IPC           Husky Air  False    False   True    True      False  192.168.1.149             554                     1          None                    False          True            True

pyezviz -u em@il -p PASS camera --serial D44444 status
{
  "serial": "D44444",
  "name": "backyard camera 1",
  "version": "V5.2.4 build 200812",
  "upgrade_available": false,
  "status": 1,
  "device_category": "BatteryCamera",
  "device_sub_category": "C3A",
  "sleep": true,
  "privacy": false,
  "audio": true,
  "ir_led": true,
  "state_led": false,
  "follow_move": null,
  "alarm_notify": true,
  "alarm_schedules_enabled": false,
  "alarm_sound_mod": "SILENT",
  "encrypted": false,
  "local_ip": "192.168.1.167",
  "wan_ip": "8.8.8.8",
  "local_rtsp_port": "554",
  "supported_channels": 1,
  "detection_sensibility": "Hibernate",
  "battery_level": "100",
  "PIR_Status": 0,
  "Motion_Trigger": false,
  "Seconds_Last_Trigger": 2376.0,
  "last_alarm_time": "2021-11-13 14:11:37",
  "last_alarm_pic": "https://ieu.ezvizlife.com/v3/alarms/pic/get?fileId=dfghjfghjfghujfghjf",
  "wifiInfos": {
    "netName": "w0",
    "netType": "wireless",
    "address": "192.168.1.167",
    "mask": "255.255.255.0",
    "gateway": "192.168.1.1",
    "signal": 100,
    "ssid": "HomeADSL"
  },
  "switches": {
    "1": true,
    "2": false,
    "3": false,
    "7": false,
    "10": true,
    "15": false,
    "21": false,
    "22": true,
    "29": false,
    "32": true,
    "38": false,
    "39": false,
    "202": false,
    "300": false,
    "301": false,
    "302": false
  }
}

Switch numbers to name mappings are stored in constants.py file.

Light bulbs

pyezviz -u em@il -p PASS devices_light status
                  name  status device_category device_sub_category      local_ip               productId  is_on  brightness  color_temperature
D55555     Office lamp       1        lighting                 LB1  192.168.1.168 9C22222222A22A2AAEEEE2   True          55               5540
D55555    Kitchen lamp       1        lighting                 LB1  192.168.1.169 9C33333333A22A2AAEEEE2   True         100               6000

# toggles on/off the light bulb with serial D55555

pyezviz -u em@il -p PASS light --serial D55555 toggle
# retrieves details of a specific light bulb

pyezviz -u em@il -p PASS light --serial D55555 status
Expand to see the response with the light bulb's details
{
  "serial": "D55555",
  "name": "Office lamp",
  "version": "V1.1.0 build 200814",
  "upgrade_available": false,
  "status": 1,
  "device_category": "lighting",
  "device_sub_category": "LB1",
  "upgrade_percent": 0,
  "upgrade_in_progress": false,
  "latest_firmware_info": null,
  "local_ip": "192.168.1.168",
  "wan_ip": null,
  "mac_address": "",
  "supported_channels": 0,
  "wifiInfos": {
    "netName": null,
    "netType": "wireless",
    "address": "192.168.1.168",
    "mask": "255.255.255.0",
    "gateway": "192.168.1.1",
    "signal": -56,
    "ssid": "HomeADSL"
  },
  "featureItems": [
    {
      "dataDesc": "[\"white\", \"color\", \"scene\",\"music\"]",
      "dataType": "enum",
      "dataValue": "white",
      "itemKey": "light_mode",
      "itemName": "亮灯模式",
      "transportType": "rw",
      "visible": 1
    },
    {
      "dataDesc": "{\"range_from\": 2700, \"range_to\": 6500, \"interval\": 10, \"multiple\": 0, \"unit\": \"k\"}",
      "dataType": "num",
      "dataValue": 5540,
      "itemKey": "color_temperature",
      "itemName": "色温",
      "transportType": "rw",
      "visible": 1
    },
    {
      "dataDesc": "{\"max_length\": 255}",
      "dataType": "char",
      "dataValue": "#52FF79",
      "itemKey": "color_rgb",
      "itemName": "彩光",
      "transportType": "rw",
      "visible": 1
    },
    {
      "dataDesc": "[{\"k\":\"sleep\",\"t\":\"color\",\"stat\":[{\"id\":1,\"b\":100,\"c\":\"#FFFFFF\",\"t\":4000}],\"trans\":{\"low\":1,\"dura\":1000},\"speed\":1000}]",
      "dataType": "json",
      "dataValue": [],
      "itemKey": "scene_conf",
      "itemName": "场景配置",
      "transportType": "rw",
      "visible": 1
    },
    {
      "dataDesc": "",
      "dataType": "bool",
      "dataValue": true,
      "itemKey": "light_switch",
      "itemName": "开关",
      "transportType": "rw",
      "visible": 1
    },
    {
      "dataDesc": "[\"e1\", \"e2\", \"e3\"]",
      "dataType": "fault",
      "itemKey": "common_fault",
      "itemName": "默认错误类型",
      "transportType": "rw",
      "visible": 0
    },
    {
      "dataDesc": "{\"range_from\": 1, \"range_to\": 100, \"interval\": 1, \"multiple\": 0, \"unit\": \"\"}",
      "dataType": "num",
      "dataValue": 55,
      "itemKey": "brightness",
      "itemName": "亮度",
      "transportType": "rw",
      "visible": 1
    },
    ...
  ],
  "productId": "9C22222222A22A2AAEEEE2",
  "switches": {},
  "optionals": {
    "latestUnbandTime": 1674813112997,
    "wanIp": "78.87.201.33",
    "updateCode": 0,
    "OnlineStatus": 1,
    "superState": 0,
    "latestUnbindTime": 1674813112997,
    "lastUpgradeTime": 1674815832305,
    "updateProcessExtend": ""
  },
  "supportExt": {
    "232": "0",
    "233": "0",
    "234": 0,
    "236": "1",
    "237": "1",
    "30": "0",
    "31": "0",
    "10": "1"
  },
  "ezDeviceCapability": "{\"232\":\"0\",\"233\":\"0\",\"234\":1,\"30\":\"0\",\"31\":\"0\",\"262\":\"0\",\"175\":\"1\",\"263\":\"0\"}",
  "is_on": true,
  "brightness": 55,
  "color_temperature": 5540
}

Running the tests

The tox configuration is already included. Simply launch:

$ tox

(Do not forget to 'pip install tox' if you do not have it.) Tests are written in the tests directory. tests/data folder contains samples of EzvizLife API for tests purposes.

Side notes

As there is no official documentation on the API, I had to reverse-engineer what is the one used in the Ezviz IOS APP. Some Regions might operate on an isolated platform and require a url to be entered. US for example:

pyezviz -u [email protected] -p PASS@123 -r apiius.ezvizlife.com devices status

Contributing

Any contribution is welcome, considering the number of features the API provides, there is room for improvement!

Versioning

We use SemVer for versioning. For the versions available, see the tags on this repository.

Authors

License

This project is licensed under the ASL 2.0 License - see the LICENSE.md file for details

For those wou would like to contribute to this library, this should help fast track you:

All credit towards @ollu69 and @zimmra for the instructions below. While it's catered for LG, the EZVIZ app works the same way (so just use EZVIZ when any references to LG/Thinq android app pops up.)

Obtaining API Information For troubleshooting issues, or investigating potential new devices, information can be intercepted from the API via a man-in-the-middle (MITM) http proxy interception method. Charles, mitmproxy, and Fiddler are examples of software that can be used to perform this mitm 'attack'/observation.

This can be done using a physical or virtual device that can run the EZVIZ API app. While it is possible with iOS, this instructions are for running Android on a modern Windows 11 PC.

Windows 11 enables the ability to run Android apps on most modern machines, making this process more accessible by eliminating the need for a physical device or separate emulation/virtualization software.

For information on how to do this with Windows Subsystem for Android (WSA) on Windows 11 using mitmproxy, please see the repo zimmra/frida-rootbypass-and-sslunpinning-lg-thinq.

0.0.x

Draft versions

pyezviz's People

Contributors

andrewcoo101 avatar baqs avatar choochmeque avatar citylife4 avatar dependabot[bot] avatar dtsolis avatar fab2713 avatar fabaff avatar grumpymeow avatar jojoxd avatar malaterre avatar regevbr avatar renierm26 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pyezviz's Issues

Support for two way authentication

There is some trick to maintain two way authentication on ezviz account and this library?
If not there is a plan to implement that in the future? Can i help in some way?

Thanks

How to access SD card on a device?

Hello,
I need to access video files on the storage of a device?
I'm not sure how to achieve that. Is it possible to access it over some internal FTP?

Support Ability for US or updating the API_BASE_URI

US Ezviz customers must use apiius.ezvizlife.com instead of eu.
The redirect activity is supported but there appears to be an issue during the login process much easier to just support changing the API_BASE_URI

Thanks!

Ezviz DB1 compatibility

Hi,

I was very much hoping to be able to integrate my Ezviz doorbell into Home Assistant. Unfortunatly i could only find a message about the component being setup.
I tried to run pyEzviz from the command-line, but that also doesn't show anything interesting:

> pyezviz -u [email protected] -p <password> --debug devices status 

DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): apiieu.ezvizlife.com:443
send: b'POST /v3/users/login HTTP/1.1\r\nHost: apiieu.ezvizlife.com\r\nUser-agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/44.0.2403.155 Safari/537.36\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Type: application/x-www-form-urlencoded\r\nclientType: 1\r\ncustomNo: 1000001\r\nContent-Length: 117\r\n\r\n'
send: b'account=....%40hotmail.com&password=..........&featureCode=93c579faa0902cbfcfcc4fc004ef67e7'
reply: 'HTTP/1.1 200 OK\r\n'
header: Content-Encoding: gzip
header: Content-Type: application/json;charset=UTF-8
header: Date: Thu, 19 Mar 2020 19:36:24 GMT
header: Server: Tengine
header: Vary: Accept-Encoding,Accept-Encoding
header: X-Application-Context: api-gateway:8080
header: Content-Length: 518
header: Connection: keep-alive
DEBUG:urllib3.connectionpool:https://apiieu.ezvizlife.com:443 "POST /v3/users/login HTTP/1.1" 200 518
send: b'GET /v3/userdevices/v1/devices/pagelist?filter=CLOUD HTTP/1.1\r\nHost: apiieu.ezvizlife.com\r\nUser-agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/44.0.2403.155 Safari/537.36\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nsessionId: ....\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Content-Encoding: gzip
header: Content-Type: application/json;charset=UTF-8
header: Date: Thu, 19 Mar 2020 19:36:24 GMT
header: ETag: "....."
header: Server: Tengine
header: Vary: Accept-Encoding,Accept-Encoding
header: X-Application-Context: api-gateway:8080
header: Content-Length: 955
header: Connection: keep-alive
DEBUG:urllib3.connectionpool:https://apiieu.ezvizlife.com:443 "GET /v3/userdevices/v1/devices/pagelist?filter=CLOUD HTTP/1.1" 200 955
Empty DataFrame
Columns: []
Index: []

Using Fiddler i was able to manually send: POST https://apiieu.ezvizlife.com/v3/users/login
This returned me a valid JSON-response with a sessionId token.

Using Fiddler i then send: https://apiieu.ezvizlife.com/v3/userdevices/v1/devices/pagelist
Providing the sessionId as header, which did give a valid response with information about my device.

One difference i see is that the library provides a filter-parameter with the value "CLOUD". It seems ok to not provide this parameter.

Could this filter maybe be made optional?

Privacy / Standby Mode for camera

Hello,

It a very good jobs.

As I prefer PHP (to create a plugin for jeedom), I rewrote your scripts.
During my tests, I found a little mistake :
On line 4 in camera.py, you set TYPE_PRIVACY_MODE = 21.
21 is for standby Mode on my CS-CV246 camera.
If I set TYPE_PRIVACY_MODE to 7, my camera switches to correct privacy mode (the eye of the camera turns completely).

Best regards

Pypi Workflow - Token error.

Hi @BaQs,

Looks like the repository setting is missing the token password.

Could you please have a look? You can add "Repository Secrets" under options. The secret "name" needs to match the portion in the workflow action. (Just like HA)

Invalid API Token: InvalidMacaroon('invalid macaroon signature')

No doorbell camera events on MQTT

Very cool project! I'm wondering if I need to do something special to get MQTT events for my DB1 ezviz doorbell. When polling MQTT with the CLI all I can see are the keepalive messages even though I'm getting various push notifications on my phone:

pyezviz --region us -u '[email protected]' -p 'xxxxxxxxxx' mqtt
connected OK Returned code= 0
Subscribed: 1 (2,)
connected OK Returned code= 0
connected OK Returned code= 0
connected OK Returned code= 0
connected OK Returned code= 0
...

pyEzviz-master>python pyezviz -u *** -p *** devices status

pyEzviz-master>python pyezviz -u *** -p *** devices status

Traceback (most recent call last):
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.1776.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.1776.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 86, in run_code
exec(code, run_globals)
File "C:\Users\korya\Downloads\pyEzviz-master\pyEzviz-master\pyezviz_main
.py", line 10, in
from .camera import EzvizCamera
ImportError: attempted relative import with no known parent package

???

Support switch on DeviceSwitchType.ALARM_LIGHT

i have the LC1 floodlight camera and I'd be interesting to automate the turrn on/off of the light.

i could see the floodlight status connected to "DeviceSwitchType.ALARM_LIGHT".

i tried to use the same client method "self._client.switch_status" to turn it on/off, but obviously not working..

i am not sure, which method should be used..

'NoneType' object has no attribute 'get'

Seeing this in the logs of Home Assistant. I'm raising here because the error is being thrown in this library rather than the add-on.

This error originated from a custom integration.

Logger: custom_components.ezviz_cloud.coordinator
Source: custom_components/ezviz_cloud/coordinator.py:32
Integration: Ezviz(Beta)
First occurred: 21:01:35 (1 occurrences)
Last logged: 21:01:35

Unexpected error fetching ezviz_cloud data: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 187, in _async_refresh
    self.data = await self._async_update_data()
  File "/config/custom_components/ezviz_cloud/coordinator.py", line 38, in _async_update_data
    return await self.hass.async_add_executor_job(self._update_data)
  File "/usr/local/lib/python3.9/concurrent/futures/thread.py", line 52, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/ezviz_cloud/coordinator.py", line 32, in _update_data
    return self.ezviz_client.load_cameras()
  File "/usr/local/lib/python3.9/site-packages/pyezviz/client.py", line 398, in load_cameras
    devices = self._get_all_device_infos()
  File "/usr/local/lib/python3.9/site-packages/pyezviz/client.py", line 470, in _get_all_device_infos
    result[device["deviceSerial"]]["cloudInfos"] = devices.get(
AttributeError: 'NoneType' object has no attribute 'get'

Any updates on pyezviz integration?

Hello,

To begin with, thanks for creating this integration. I know that this integration was disabled in HA 0.115. I'm wondering if there has been any movement in re-enabling this? I'm simply hoping to get a binary sensor working for when the doorbell button is pressed. Many thanks.

ben

UnboundLocalError: local variable 'json_result' referenced before assignment

021-01-30 12:35:39 ERROR (MainThread) [homeassistant.components.ezviz.coordinator] Unexpected error fetching ezviz data: local variable 'json_result' referenced before assignment
Traceback (most recent call last):
File "/workspaces/core/homeassistant/helpers/update_coordinator.py", line 149, in async_refresh
self.data = await self._async_update_data()
File "/workspaces/core/homeassistant/components/ezviz/coordinator.py", line 39, in _async_update_data
return await self.hass.async_add_executor_job(self._update_data)
File "/usr/local/lib/python3.8/concurrent/futures/thread.py", line 57, in run
result = self.fn(*self.args, **self.kwargs)
File "/workspaces/core/homeassistant/components/ezviz/coordinator.py", line 31, in _update_data
cameras = self.ezviz_client.load_cameras()
File "/usr/local/lib/python3.8/site-packages/pyezviz/client.py", line 270, in load_cameras
camera.load()
File "/usr/local/lib/python3.8/site-packages/pyezviz/camera.py", line 18, in load
self._device = self._client._get_deviceinfo(self._serial)
File "/usr/local/lib/python3.8/site-packages/pyezviz/client.py", line 181, in _get_deviceinfo
if not json_result:
UnboundLocalError: local variable 'json_result' referenced before assignment

Can be reproduced by launching:
pyezviz -u [email protected] -p "xxx" devices status

Support for EZVIZ DB1

Hi,

I own an EZVIZ DB1 doorbell. Although it's really good piece of hardware, it was only possible to integrate a simple RTSP stream into Home Assistant.
Your package gives an oppening to get more functionality into Home Assistant.

I did some debugging and found out that the following code is limitiing it to work:

  1. I commented out the "deviceCategory"-check. As the DB1 identifies itself as a "BDoorBell".
    #if devices[idx]['deviceCategory'] == CAMERA_DEVICE_CATEGORY:

  2. I commented out the "follow_move" switch as the Doorbell does not support this functionality.
    The error is: TypeError: 'NoneType' object is not subscriptable.
    #'follow_move': self._switch.get(TYPE_FOLLOW_MOVE)['enable'],

This is the response for my EZViz DB1 for: GET https://apiieu.ezvizlife.com/v3/userdevices/v1/devices/pagelist?filter=CLOUD
{"cameraInfos":[{"cameraId":"XXXXXXXXXX","cameraName":"Deurbel","channelNo":1,"cameraCover":"https://ieu.ezvizlife.com/assets/imgs/public/homeDevice.jpeg","deviceSerial":"CXXXXXXX","isShow":1,"videoLevel":1,"videoQualityInfos":[{"streamType":1,"videoLevel":2},{"streamType":1,"videoLevel":1},{"streamType":1,"videoLevel":3}],"streamBizUrl":"biz=1","vtmInfo":{"domain":"vtmuceu.ezvizlife.com","externalIp":"128.1.42.99","internalIp":null,"port":10554,"forceStreamType":0,"isBackup":0},"deviceChannelInfo":{"channelDeviceSerial":null,"channelNo":1,"privacyStatus":0,"powerStatus":0,"globalStatus":0,"signalStatus":1},"cameraShareInfo":null}],"meta":{"code":200,"message":"操作成功","moreInfo":null},"page":{"offset":0,"limit":8,"totalResults":0,"hasNext":false},"deviceInfos":[{"name":"Deurbel","deviceSerial":"CXXXXXX","fullSerial":"CS-DB1-A0-XXXXXXXXXXXXXXXXXXXXXXX","deviceType":"CS-DB1-A0-1B3WPFR","devicePicPrefix":"https://devpic.ezvizlife.com/device/image/CS-DB1-A0-1B3WPFR/","version":"V5.2.4 build 191211","supportExt":"{\"44\":\"0\",\"24\":\"1\",\"46\":\"1\",\"26\":\"0\",\"48\":\"1\",\"28\":\"1\",\"172\":\"1\",\"152\":\"1\",\"154\":\"0\",\"232\":\"1\",\"112\":\"1\",\"233\":\"1\",\"234\":1,\"115\":\"1\",\"118\":\"1\",\"51\":\"0\",\"30\":\"0\",\"31\":\"0\",\"10\":\"1\",\"11\":\"1\",\"12\":\"1\",\"13\":\"3\",\"14\":\"0\",\"15\":\"1\",\"59\":\"1\",\"16\":\"3-4\",\"380\":\"1\",\"141\":\"0\",\"164\":\"1\",\"1\":\"1\",\"2\":\"1\",\"101\":\"1\",\"3\":\"1\",\"4\":\"1\",\"5\":\"0\",\"6\":\"0\",\"7\":\"1\",\"106\":\"2\",\"8\":\"1\",\"9\":\"1\",\"61\":\"0\",\"63\":\"1\",\"42\":\"1\"}","status":1,"userDeviceCreateTime":"2019-09-05 05:07:48","casIp":"eucas.ezvizlife.com","casPort":6500,"channelNumber":1,"hik":false,"deviceCategory":"BDoorBell","deviceSubCategory":"DB1","ezDeviceCapability":"{\"232\":\"0\",\"233\":\"0\",\"234\":1,\"268\":\"1\",\"30\":\"0\",\"31\":\"0\",\"262\":\"0\",\"175\":\"1\"}","customType":"CS-DB1-A0-1B3WPFR","offlineTime":"2020-03-21 16:30:51","offlineNotify":0,"accessPlatform":true,"deviceDomain":"C89135984","instructionBook":"http://devpic.ezvizlife.com/device/image/CS-DB1-A0-1B3WPFR/instruction.jpeg","deviceShareInfo":null}]}

SSL Error

I get an SSL error when I try to make a request. I originally encountered it in the HASS integration
Command:
pyezviz -u <email> -p <pass> devices status
Error:
HTTPSConnectionPool(host='apiieu.ezvizlife.com', port=443): Max retries exceeded with url: /v3/userdevices/v1/resources/pagelist?filter=CLOUD%2C+TIME_PLAN%2C+CONNECTION%2C+SWITCH%2CSTATUS%2C+WIFI%2C+NODISTURB%2C+KMS%2CP2P%2C+TIME_PLAN%2C+CHANNEL%2C+VTM%2CDETECTOR%2C+FEATURE%2C+CUSTOM_TAG%2C+UPGRADE%2CVIDEO_QUALITY%2C+QOS%2C+PRODUCTS_INFO%2C+FEATURE_INFO (Caused by SSLError(SSLError(1, '[SSL: WRONG_SIGNATURE_TYPE] wrong signature type (_ssl.c:997)')))

I am also attaching a link to the issue in the home assistant repository – home-assistant/core#91701

Alarm picture

Hi all,

I use command : >pyezviz -u USER-p PW camera --serial SERIAL status
it'sworking like a charm.
but I'd like to get the image of the detection by using element : last_alarm_pic
but when I download the link, I get anythink (just a small white square in the web browser)
encrypted element is false.

How can I get the image linked to the alarm?

Thanks

Improvment function

Hi,
I have a CS-CV310 CAM
I discoverder a command for enable/disable the siren alarm. I have tested it with a rest tool.
Can you add this functionality, if you think is interesting?
Method POST
URL api/device/sendAlarm
Param
sessionId : session
enable : 2 on / 1 off
channelNo : 0
type : 1
deviceSerialNo : d123456789

The user is locked

i give that error "The user is locked", how to unlock the user? i put off 2fa, fingerprint, and get the same error.

Motion detection event

Hello,

is it possible to "listen" to the battery cam motion detection event and send another call to something else ?

360 degree view

They must have added a new endpoint for cameras with ptz controls, which provides the current angle of rotation and a way to set the new angle of rotation. If I have time I'll run wireshark to try to find details, but basically in the app you can now take a 360 degree picture, and click anywhere on it to send the camera to that specific spot.

Battery Cameras - Working Modes

Hi,

I recently purchased the BC1C camera. I noticed that this is picked up by the module with multiple sensors etc being created in Home Assistant. I'm looking to be able to change the mode that the camera works in. At first glance the sleep toggle does what I want, however, in the Android app this shows the camera as offline after a period of time (I'm assuming that sleeping the camera also sleeps the Wi-Fi and there for it can't connect again). I can bring the camera back online by changing the power state (plugging or unplugging the charger from it). Also, whilst in sleep mode I am unable to view and recorded videos from the device, or change any settings.

There are however Working Modes and one of those appears to do what I need. The following screenshot shows these in the app. Is it possible for these to be made available as selectable options in Home Assistant? Am happy to do some testing if need be.

Thanks in advance.

Setting Alarm Notify on or off is failing

I have 4 EzViz camera's. For each camera a status line is shown correctly after doing:
pyezviz -u em@il -p PASS devices status

Most allowed statements do work, but not setting Alarm Notify; on adding --debug it shows error as below:
pyezviz -u em@il -p PASS --debug camera --serial xxxxxxxxx alarm --notify 1
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): apiieu.ezvizlife.com:443
send: b'POST /v3/users/login HTTP/1.1\r\nHost: apiieu.ezvizlife.com\r\nUser-agent: Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36\r\nAccept-Encoding: gzip, deflate\r\nAccept: /\r\nConnection: keep-alive\r\nContent-Type: application/x-www-form-urlencoded\r\nclientType: 1\r\ncustomNo: 1000001\r\nContent-Length: 120\r\n\r\n'
send: b'account=em@il&password=xxxxxxxx&featureCode=92c579faa0902cbfcfcc4fc004ef67e7'
reply: 'HTTP/1.1 200 OK\r\n'
header: Content-Encoding: gzip
header: Content-Type: application/json;charset=UTF-8
header: Date: Sun, 18 Oct 2020 21:52:38 GMT
header: Server: Tengine
header: Vary: Accept-Encoding
header: Content-Length: 519
header: Connection: keep-alive
DEBUG:urllib3.connectionpool:https://apiieu.ezvizlife.com:443 "POST /v3/users/login HTTP/1.1" 200 519
DEBUG:root:Camera loaded
enable: 1, operationType: 1
send: b'POST /api/other/data/report HTTP/1.1\r\nHost: apiieu.ezvizlife.com\r\nUser-agent: Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36\r\nAccept-Encoding: gzip, deflate\r\nAccept: /\r\nConnection: keep-alive\r\nContent-Length: 202\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n'
send: b'clientType=1&infoDetail=%7B%22operationType%22%3A1%2C%22detail%22%3A%220%22%2C%22deviceSerial%22%3A%22E11264168%2C2%22%7D&infoType=3&netType=WIFI&requestType=0&sessionId=756ac850c2bd46268d4fa6c72fd6fdcf'
reply: 'HTTP/1.1 404 Not Found\r\n'
header: Content-Encoding: gzip
header: Content-Type: application/json;charset=UTF-8
header: Date: Sun, 18 Oct 2020 21:52:41 GMT
header: Server: Tengine
header: Vary: Accept-Encoding
header: Content-Length: 132
header: Connection: keep-alive
DEBUG:urllib3.connectionpool:https://apiieu.ezvizlife.com:443 "POST /api/other/data/report HTTP/1.1" 404 132
send: b'POST /api/device/configAlgorithm HTTP/1.1\r\nHost: apiieu.ezvizlife.com\r\nUser-agent: Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36\r\nAccept-Encoding: gzip, deflate\r\nAccept: /\r\nConnection: keep-alive\r\nContent-Length: 77\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n'
send: b'subSerial=E11264168&type=0&sessionId=756ac850c2bd46268d4fa6c72fd6fdcf&value=3'
reply: 'HTTP/1.1 400 Bad Request\r\n'
header: Access-Control-Allow-Headers: Content-Type, api_key, Authorization
header: Access-Control-Allow-Methods: GET, POST, DELETE, PUT, PATCH, OPTIONS
header: Access-Control-Allow-Origin: *
header: Cache-Control: no-cache, must-revalidate
header: Content-Encoding: gzip
header: Content-Language: en
header: Content-Type: text/html;charset=utf-8
header: Date: Sun, 18 Oct 2020 21:52:41 GMT
header: Server: Tengine
header: Vary: Accept-Encoding
header: Content-Length: 456
header: Connection: keep-alive
DEBUG:urllib3.connectionpool:https://apiieu.ezvizlife.com:443 "POST /api/device/configAlgorithm HTTP/1.1" 400 456

Ezviz smart plug - power consumption?

Hi,

I try to read the power consumption of a Ezviz smart plug (CS-T31-16B-EU).

Does someone know how/where I can read this?

For test I tried to adapt this like below without success:

pyEzviz/pyezviz/client.py

Lines 543 to 546 in 33261c9

result[_serial] = {
"CLOUD": {_res_id: devices.get("CLOUD", {}).get(_res_id, {})},
"VTM": {_res_id: devices.get("VTM", {}).get(_res_id, {})},
"P2P": devices.get("P2P", {}).get(_serial, {}),

result[_serial] = {
"POWER": {_res_id: devices.get("POWER", {}).get(_res_id, {})},
"POWER": devices.get("POWER", {}).get(_serial, {}),
"POWER_CONSUMPTION": {_res_id: devices.get("POWER_CONSUMPTION", {}).get(_res_id, {})},
"POWER_CONSUMPTION": devices.get("POWER_CONSUMPTION", {}).get(_serial, {}),

Best regards,
MattG40

MFA from command line?

Hi

Thanks for all the work you're doing on this project - it's good to see it back alive again.

I use the pyezviz command line, but have not found a way to pass the MFA security code to the client.

Have I missed something? or is this something that can be added?

Whilst trying to get MFA working, I received a verification code that began with a zero.

The sms_code is an integer; will this work well when the code has leading zeros?

If these are indeed issues, and you'd like me to implement changes to fix them, then I'm happy to take a look.

I'm an experienced software engineer, but am new to python, so wanted to double check before digging deeper.

Thanks again

Andrew

PS. I've tried mqtt and that works well for me.

Error with device status

Hi,

when execute command "pyezviz -u <email_adress> -p ********** devices status "I obtain below error:

Traceback (most recent call last):
File "/usr/local/bin/pyezviz", line 6, in
from pyezviz.main import main
File "/usr/local/lib/python2.7/dist-packages/pyezviz/init.py", line 1, in
from pyezviz.client import EzvizClient, PyEzvizError
File "/usr/local/lib/python2.7/dist-packages/pyezviz/client.py", line 8, in
from .camera import EzvizCamera
File "/usr/local/lib/python2.7/dist-packages/pyezviz/camera.py", line 2, in
import pyezviz.DeviceSwitchType
File "/usr/local/lib/python2.7/dist-packages/pyezviz/DeviceSwitchType.py", line 3, in
@unique
NameError: name 'unique' is not defined

Thanks for your support.

camera.move() method in a loop has different end points depending on the starting point of movement

My cam: c8c

My env:

Python 3.8.5 (default, Sep 3 2020, 21:29:08) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32

Name: pyezviz
Version: 0.2.0.5
Summary: Pilot your Ezviz cameras
Home-page: http://github.com/baqs/pyEzviz/
Author: Pierre Ourdouille
Author-email: [email protected]
License: Apache Software License 2.0
Location: d:\anaconda3\lib\site-packages
Requires: paho-mqtt, pandas, requests, xmltodict, pycryptodome
Required-by:

I am trying to make a calibrate method to make sure that my camera has correct coordinates when it is powered. As described in issue there is no way to use move_coords method to set the Y coordinate in absolute coordinates and that is why I am trying to implement calibration.

My calibration is intended to move camera to a fixed left location in a loop with move('left') method. If the camera looks to the rightest point (manually set in app) then nearly 100 moves with a sleep(0.4) is available and then camera stops moving. If it is not in the rightest state when I begin to move - it allows less moves but the final point of view is farther than from the rightest point. If I try to move further in the app - I see the red light indicating that there is no way to move further in both cases. But if I move to the left for a second in the app and long press the move to the right button - it moves to the end till it makes full 360 rotation. If I try to move the camera from the rightest point with the app long pressing the left button - it makes full 360 rotation without any problems.

That inspires me that there are differences between pressing and long pressing the movement buttin in the app and in the pyezviz only short pressing is implemented or there are some internal backend bugs of the local move coordinate counter which somehow stops me from moving in a loop too early.

Any help with my calibration needs would be nice.

Fuzzy Contact verification code?

Hi

I'm trying your pyEzviz project for the first time, but I am having problems logging in to EzViz.

After debugging I've found that _login() is failing because response_json is:
dict: {'meta': {'code': 6002, 'message': '用户在新的手机终端登录,需要输入验证码', 'moreInfo': None}, 'contact': {'type': 'EMAIL', 'fuzzyContact': '[email protected]'}}

Google translate interprets the Chinese characters as:
"The user logs in on the new mobile terminal and needs to enter the verification code"

Is this something you have seen before? or do you have any hints as to what could be done to fix the problem?

Thanks in advance and thanks for publishing this project - if I can get it to work then it will be very useful!

Cheers

Andrew

Local connection / API

I noticed that the app works perfectly fine when only in local lan mode (e.g. blocking connection to the camera via router).
Therefore my question: Did anyone (successfully) ran the library or any commands to the camera via local lan?

I am trying to get the light to work for my L1C using this command gives me "Connection reset" http error in Postman

http://localip?channelNo=1&deviceSerial=E5152222&enable=1 
or
http://localip/switchStatus?channelNo=1&deviceSerial=E5152222&enable=1 

Since the app works fine the camera should support direct connection / api calls?

Info taken from here: https://gist.github.com/BaQs/1c1a2be3e962073094def1e0cc26a14c

Support for C1C PIR

Hi,

I've installed HACS package ha-ezviz (v. 0.0.2.7, which uses pyezviz v. 0.1.6.1) in Home Assistant and noticed that attempting to connect to my Ezviz account with only one camera (C1C PIR) throws an exception.

It looks like that the library doesn't support this camera model or (any?) non-battery powered camera without sensibility adjustments. This option is not available in the official Ezviz app.

Home Assistant log:

2021-02-03 22:27:10 WARNING (MainThread) [homeassistant.config_entries] Config entry for ezviz_cloud not ready yet. Retrying in 80 seconds
2021-02-03 22:28:32 ERROR (MainThread) [custom_components.ezviz_cloud.coordinator] Unexpected error fetching ezviz_cloud data: 'support_sensibility_adjust'
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 144, in async_refresh
    self.data = await self._async_update_data()
  File "/config/custom_components/ezviz_cloud/coordinator.py", line 39, in _async_update_data
    return await self.hass.async_add_executor_job(self._update_data)
  File "/usr/local/lib/python3.8/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/ezviz_cloud/coordinator.py", line 31, in _update_data
    cameras = self.EzvizClient.load_cameras()
  File "/usr/local/lib/python3.8/site-packages/pyezviz/client.py", line 270, in load_cameras
    camera.load()
  File "/usr/local/lib/python3.8/site-packages/pyezviz/camera.py", line 34, in load
    if self._device['supportExt']['support_sensibility_adjust']:
KeyError: 'support_sensibility_adjust'

BTW, great work!

compatibility ezviz c6c

Hello,
it's compatible with ezviz c6c caméra ? or it's just compatible with an ezwiz camera with an http interface ?
thank you
regards

Add LICENSE file

Please add a LICENSE file that contains the content of the used license.

This is a requirement for a lot of distributions. The review for the Fedora Package Collection may fails if licensing is not clean. Thus it's highly recommended to add the version number of the license as well (ASL 2.0?).

Incorrect captcha code

PS C:\Users\Lenovo> pyezviz.exe -u user -p pass --debug devices switch
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): euauth.ezvizlife.com:443
send: b'POST /doLogin HTTP/1.1\r\nHost: euauth.ezvizlife.com\r\nUser-Agent: python-requests/2.25.1\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 162\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n'
send: b'account=user&password=pass&from=from&returnUrl=plugin&host=apiieu.ezvizlife.com'
reply: 'HTTP/1.1 200 OK\r\n'
header: Server: Tengine
header: Date: Sat, 20 Mar 2021 20:05:42 GMT
header: Content-Type: application/json;charset=UTF-8
header: Content-Length: 65
header: Connection: keep-alive
header: X-Powered-By: PS
header: Content-Language: zh-CN
header: Cache-Control: max-age=3600
header: Pragma: cache
header: X-UA-Compatible: IE=Edge,chrome=1
DEBUG:urllib3.connectionpool:https://euauth.ezvizlife.com:443 "POST /doLogin HTTP/1.1" 200 65
Login error: Incorrect Captcha code

move_coords does not work with y axis

My cam: c8c

My env:

Python 3.8.5 (default, Sep 3 2020, 21:29:08) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32

Name: pyezviz
Version: 0.2.0.5
Summary: Pilot your Ezviz cameras
Home-page: http://github.com/baqs/pyEzviz/
Author: Pierre Ourdouille
Author-email: [email protected]
License: Apache Software License 2.0
Location: d:\anaconda3\lib\site-packages
Requires: paho-mqtt, pandas, requests, xmltodict, pycryptodome
Required-by:

The problem for me is that when I am using move_coords method via console camera moves only changing X direction. The problem persists in python scripts too. I use X and Y params in range [0.0;1.0].

I tried to dump the request via editing the ptz_control_coordinates method and check if Y param is corrupted but it seems to be OK.
Also the response is:
{"meta":{"code":200,"message":"操作成功","moreInfo":null}}
which means that operation succeeded.

When I'm trying to move in the app - everything works. When I'm using the move method - everything works except some speeds of moving.

Also I've investigated that when you add some random keys and values to the data dictionary of move_coords method the response and status are still 200 and OK. That inspires that 'y' key in this dictionary is ignored and somehow not used. This could be due to problems on the server and due to wrong key naming in the dictionary of pyezviz.

How to solve this, any ideas? I need this method for some reasons and can not use move method because I can not store camera coordinated from time to time.

EDIT:
Ok, it seems that I have found the problem.
The problem is that this method uses PANO API of the application. Application resets Y coordinate to fixed state every time when you make a 360 image. That is why API does not use Y parameter when it is passed and ignores it. I do not know if this is the same for every model but I think this is how it works with C8C camera. Better it was documented.

Also, help with function that moves to custom Y coordinate for my camera would be nice.

Hi,

Hi,

I've installed HACS package ha-ezviz (v. 0.0.2.7, which uses pyezviz v. 0.1.6.1) in Home Assistant and noticed that attempting to connect to my Ezviz account with only one camera (C1C PIR) throws an exception.

It looks like that the library doesn't support this camera model or (any?) non-battery powered camera without sensibility adjustments. This option is not available in the official Ezviz app.

Home Assistant log:

2021-02-03 22:27:10 WARNING (MainThread) [homeassistant.config_entries] Config entry for ezviz_cloud not ready yet. Retrying in 80 seconds
2021-02-03 22:28:32 ERROR (MainThread) [custom_components.ezviz_cloud.coordinator] Unexpected error fetching ezviz_cloud data: 'support_sensibility_adjust'
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 144, in async_refresh
    self.data = await self._async_update_data()
  File "/config/custom_components/ezviz_cloud/coordinator.py", line 39, in _async_update_data
    return await self.hass.async_add_executor_job(self._update_data)
  File "/usr/local/lib/python3.8/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/ezviz_cloud/coordinator.py", line 31, in _update_data
    cameras = self.EzvizClient.load_cameras()
  File "/usr/local/lib/python3.8/site-packages/pyezviz/client.py", line 270, in load_cameras
    camera.load()
  File "/usr/local/lib/python3.8/site-packages/pyezviz/camera.py", line 34, in load
    if self._device['supportExt']['support_sensibility_adjust']:
KeyError: 'support_sensibility_adjust'

BTW, great work!

Originally posted by @olekbruks in #31

Changing status of alarm notification returns error

I have an issue when trying to enable or disable the alarm notification. I receive this error:

Impossible to decode response: Expecting value: line 1 column 1 (char 0)
Response was: <!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=EDGE">
<meta charset="utf-8">
<meta HTTP-EQUIV="pragma" CONTENT="no-cache">
<meta HTTP-EQUIV="Cache-Control" CONTENT="no-cache, no-store">
...

It can be reproduced with this command:
pyezviz -u XXXX -p XXXX camera --serial XXXX alarm --notify 1

Note that this command works correctly:
pyezviz -u XXXX -p XXXX --debug camera --serial XXXX alarm --sensibility 3

Thanks

access stream video with opencv?

I already install and access my ipcctv, with EzvizClient and execute "clien.login()". I already pick camera too with EzvizCamera(client, "camera serial number"). but until now I cannot find how to get the stream video url to open it with opencv.

I want open the stream video with opencv and add the capability of camera like face recognition or any other module that can we do with opencv.

any clue? please....

Trigger Light

Heyya..

I am currently using EZVIZ LC3..
Just wondering if I could get the human-shaped trigger flag and then set the light to light up by using this package?

add support for python 3.10 required by home assistant 2022.7.0

HA 2022.7.0 was just released, and they started using python 3.10. It seems that some of the integration works (like RTSP) but I do get errors about SSL that didn't exist in 2022.6.7:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 193, in handle_call_service
    await hass.services.async_call(
  File "/usr/src/homeassistant/homeassistant/core.py", line 1713, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1750, in _execute_service
    await cast(Callable[[ServiceCall], Awaitable[None]], handler.job.target)(
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 204, in handle_service
    await service.entity_service_call(
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 680, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 930, in async_request_call
    await coro
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 717, in _handle_entity_call
    await result
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 652, in async_disable_motion_detection
    await self.hass.async_add_executor_job(self.disable_motion_detection)
  File "/usr/local/lib/python3.10/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/src/homeassistant/homeassistant/components/ezviz/camera.py", line 233, in disable_motion_detection
    self.coordinator.ezviz_client.set_camera_defence(self._serial, 0)
  File "/usr/local/lib/python3.10/site-packages/pyezviz/client.py", line 743, in set_camera_defence
    cas_client.set_camera_defence_state(serial, enable)
  File "/usr/local/lib/python3.10/site-packages/pyezviz/cas.py", line 134, in set_camera_defence_state
    my_socket = context.wrap_socket(
  File "/usr/local/lib/python3.10/ssl.py", line 513, in wrap_socket
    return self.sslsocket_class._create(
  File "/usr/local/lib/python3.10/ssl.py", line 1071, in _create
    self.do_handshake()
  File "/usr/local/lib/python3.10/ssl.py", line 1342, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:997)

This limits my ability to control the camera (like turning it on/off)

I would appreciate your help on the matter :-)

Unable to check status / manipulate with camera on 0.1.8.3

So I had issues with login in previous versions, so I upgraded to newset 0.1.8.3. But this version seems still not working in terms of operating with camera.

This ends with fail (please note, ID, email, password and content-length are altered to preserve my privacy):

$ /usr/local/bin/pyezviz -d -u [email protected] -p redacted camera --serial 123456 status
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): apiieu.ezvizlife.com:443
send: b'POST /v3/users/login/v5 HTTP/1.1\r\nHost: apiieu.ezvizlife.com\r\nUser-Agent: python-requests/2.23.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nclientType: 3\r\nContent-Length: 123\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n'
send: b'account=email%example.com&password=redacted&featureCode=c22cb01f8cb83351422d82fad59c8e4e'
reply: 'HTTP/1.1 200 OK\r\n'
header: Content-Encoding: gzip
header: Content-Type: application/json;charset=UTF-8
header: Date: Sun, 04 Apr 2021 08:29:44 GMT
header: Server: Tengine
header: Vary: Accept-Encoding
header: Content-Length: 812
header: Connection: keep-alive
DEBUG:urllib3.connectionpool:https://apiieu.ezvizlife.com:443 "POST /v3/users/login/v5 HTTP/1.1" 200 812
DEBUG:root:Camera loaded
'NoneType' object has no attribute 'get'
Traceback (most recent call last):
  File "/usr/local/bin/pyezviz", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.8/dist-packages/pyezviz/__main__.py", line 251, in main
    client.close_session()
  File "/usr/local/lib/python3.8/dist-packages/pyezviz/client.py", line 866, in close_session
    self._session.close()
AttributeError: 'NoneType' object has no attribute 'close'

But it seems login it self is working, calling devices status correctly returns all devices in my account!

EU API is my desired destination.

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.