A Python library to communicate with Ring Door Bell (https://ring.com/)
Project description
Python Ring Door Bell is a library written for Python 3.6+ that exposes the Ring.com devices as Python objects.
Currently Ring.com does not provide an official API. The results of this project are merely from reverse engineering.
Documentation: http://python-ring-doorbell.readthedocs.io/
Installation
# Installing from PyPi $ pip install ring_doorbell # Installing latest development $ pip install \ git+https://github.com/tchellomello/python-ring-doorbell@master
Initializing your Ring object
import json import getpass from pathlib import Path from pprint import pprint from ring_doorbell import Ring, Auth from oauthlib.oauth2 import MissingTokenError cache_file = Path("test_token.cache") def token_updated(token): cache_file.write_text(json.dumps(token)) def otp_callback(): auth_code = input("2FA code: ") return auth_code def main(): if cache_file.is_file(): auth = Auth("MyProject/1.0", json.loads(cache_file.read_text()), token_updated) else: username = input("Username: ") password = getpass.getpass("Password: ") auth = Auth("MyProject/1.0", None, token_updated) try: auth.fetch_token(username, password) except MissingTokenError: auth.fetch_token(username, password, otp_callback()) ring = Ring(auth) ring.update_data() devices = ring.devices() pprint(devices) if __name__ == "__main__": main()
Listing devices linked to your account
# All devices devices = ring.devices() {'chimes': [<RingChime: Downstairs>], 'doorbots': [<RingDoorBell: Front Door>]} # All doorbells doorbells = devices['doorbots'] [<RingDoorBell: Front Door>] # All chimes chimes = devices['chimes'] [<RingChime: Downstairs>] # All stickup cams stickup_cams = devices['stickup_cams'] [<RingStickUpCam: Driveway>]
Playing with the attributes and functions
devices = ring.devices() for dev in list(devices['stickup_cams'] + devices['chimes'] + devices['doorbots']): dev.update_health_data() print('Address: %s' % dev.address) print('Family: %s' % dev.family) print('ID: %s' % dev.id) print('Name: %s' % dev.name) print('Timezone: %s' % dev.timezone) print('Wifi Name: %s' % dev.wifi_name) print('Wifi RSSI: %s' % dev.wifi_signal_strength) # setting dev volume print('Volume: %s' % dev.volume) dev.volume = 5 print('Volume: %s' % dev.volume) # play dev test shound if dev.family == 'chimes': dev.test_sound(kind = 'ding') dev.test_sound(kind = 'motion') # turn on lights on floodlight cam if dev.family == 'stickup_cams' and dev.lights: dev.lights = 'on'
Showing door bell events
devices = ring.devices() for doorbell in devices['doorbots']: # listing the last 15 events of any kind for event in doorbell.history(limit=15): print('ID: %s' % event['id']) print('Kind: %s' % event['kind']) print('Answered: %s' % event['answered']) print('When: %s' % event['created_at']) print('--' * 50) # get a event list only the triggered by motion events = doorbell.history(kind='motion')
Downloading the last video triggered by ding
devices = ring.devices() doorbell = devices['doorbots'][0] doorbell.recording_download( doorbell.history(limit=100, kind='ding')[0]['id'], filename='last_ding.mp4', override=True)
Displaying the last video capture URL
print(doorbell.recording_url(doorbell.last_recording_id)) 'https://ring-transcoded-videos.s3.amazonaws.com/99999999.mp4?X-Amz-Expires=3600&X-Amz-Date=20170313T232537Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=TOKEN_SECRET/us-east-1/s3/aws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=secret'
Controlling a Light Group
groups = ring.groups() group = groups['the-group-you-want'] print(group.lights) # Prints True if lights are on, False if off # Turn on lights indefinitely group.lights = True # Turn off lights group.lights = False # Turn on lights for 30 seconds group.lights = (True, 30)
How to contribute
See CONTRIBUTING.rst
Credits && Thanks
- This project was inspired and based on https://github.com/jeroenmoors/php-ring-api. Many thanks @jeroenmoors.
- A guy named MadBagger at Prism19 for his initial research (http://www.prism19.com/doorbot/second-pass-and-comm-reversing/)
- The creators of mitmproxy (https://mitmproxy.org/) great http and https traffic inspector
- @mfussenegger for his post on mitmproxy and virtualbox https://zignar.net/2015/12/31/sniffing-vbox-traffic-mitmproxy/
- To the project http://www.android-x86.org/ which allowed me to install Android on KVM.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Filename, size | File type | Python version | Upload date | Hashes |
---|---|---|---|---|
Filename, size ring_doorbell-0.7.0-py3-none-any.whl (24.6 kB) | File type Wheel | Python version py3 | Upload date | Hashes View |
Filename, size ring_doorbell-0.7.0.tar.gz (29.4 kB) | File type Source | Python version None | Upload date | Hashes View |
Close
Hashes for ring_doorbell-0.7.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | abb4fb3bf5629007244d02dbe5d74321777ac88aea89c252750a8d07730c7992 |
|
MD5 | a22ecf0e54bae10c6525633190ecf2d6 |
|
BLAKE2-256 | d84aa1a380ba11e5c392ed61045167c11d9b85f79ef3f5ef718840f9d05a5665 |