def ringOperations(emailname): s3 = boto3.client('s3') getCacheFileFromBucket(BUCKET_NAME, emailname) if cache_file.is_file(): cachefile = open(CACHE_FILE_NAME, "r") tokendata = json.loads(cachefile.read()) cachefile.close() auth = Auth("MyProject/1.0", tokendata, token_updated) uploadCacheFileToBucket(BUCKET_NAME, CACHE_FILE_NAME, emailname) ring = Ring(auth) ring.update_data() devices = ring.devices() getLatestMotionVideo(devices) getFrameFromVideo() sourceKey = "video_frame.png" imagelabels = getlabels(BUCKET_NAME, sourceKey) imagefaces = getfaces(BUCKET_NAME, sourceKey) imagetext = gettext(BUCKET_NAME, sourceKey) addImageInfotoTable(imagelabels, imagetext, imagefaces) s3.delete_object(Bucket=BUCKET_NAME, Key=sourceKey) s3.delete_object(Bucket=BUCKET_NAME, Key="last_trigger.mp4")
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: "******"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() print(devices) doorbells = devices["doorbots"] chimes = devices["chimes"] stickup_cams = devices["stickup_cams"] print(doorbells) print(chimes) print(stickup_cams)
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: "******"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() print(devices) doorbells = devices["doorbots"] chimes = devices["chimes"] stickup_cams = devices["stickup_cams"] print(doorbells) #print(chimes) #print(stickup_cams) x = 0 y = 0 limit = 100 doorbell = devices['doorbots'][0] typelist = { "motion", "ding", } for rt in typelist: print(rt) for i in doorbell.history(limit=limit, kind=rt): print(i['id']) doorbell.recording_download( doorbell.history(limit=limit, kind=rt)[x]['id'], filename=str(i['created_at'].strftime("%m-%d-%Y-%H-%M-%S")) + '.mp4', override=True) x += 1
def main(): # initialize logger for debugging initialize_logger() if cache_file.is_file(): auth = Auth("MyProject/1.0", json.loads(cache_file.read_text()), token_updated) else: # initialize ring account username and password username = config('user') password = config('pw') # use the Authenticator of the ring_doorbell API # tries to fetch token for authentication # requests user input for the code if necessary auth = Auth("MyProject/1.0", None, token_updated) try: auth.fetch_token(username, password) except MissingTokenError: auth.fetch_token(username, password, otp_callback()) threshold = input( "Enter the percentage where-in you want to get reminders: ") # loop for checking battery life while True: ring = Ring(auth) ring.update_data() # filter the Ring Devices devices = ring.devices() front_door = devices['authorized_doorbots'] battery_life = front_door[0].battery_life logging.info(f'The current battery life is {battery_life}') # if battery is less than threshold, send the e-mail if (battery_life <= int(threshold)): logging.info("Sending the email") send_email(battery_life) # loop sleeps for 6 hours 21600 sleep(3600)
class DoorbellManager(object): def __init__(self): if cache_file.is_file(): auth = Auth("MyProject/1.0", json.loads(cache_file.read_text()), token_updated) else: username = input("Username: "******"Password: "******"MyProject/1.0", None, token_updated) try: auth.fetch_token(username, password) except MissingTokenError: auth.fetch_token(username, password, otp_callback()) self.ring = Ring(auth) self.ring.update_data() def get_doorbell(self): devices = self.ring.devices() bell = devices["doorbots"][0] return bell def get_dings(self) -> DoorbellEvent: bell = self.get_doorbell() events = bell.history(limit=15, kind="ding") dings = list() for event in events: ding = DoorbellEvent(event) # ding.print() dings.append(ding) dings = sorted(dings, key=lambda ding: ding.timesince) return dings def get_last_ding(self) -> DoorbellEvent: dings = self.get_dings() if len(dings) > 0: ding = dings[0] return ding return None
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: "******"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) # play with the API to figure out which camera you want deck = devices['doorbots'][0] download(deck) print('\nDONE.')
def main(): if cache_file.is_file(): token = json.loads(cache_file.read_text()) auth = Auth("Ringer/1.0", token, token_updated) print(f"Token expires at {expires_at_to_datetime(token['expires_at'])}") else: username = input("Username: "******"Password: "******"Ringer/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) doorbell = devices['doorbots'][0] history = doorbell.history(limit=100, kind='motion') id = history[0]['id'] doorbell.recording_download( id, filename=f'doorbell_motion_{id}.mp4', override=True) cams = devices['stickup_cams'] for cam in cams: history = cam.history(limit=100, kind='motion') id = history[0]['id'] cam.recording_download( id, filename=f'cam_motion_{id}.mp4', override=True)
lights = [] hue_lights = b.lights print("[Hue] Connected") # Sign in to Ring RING_USERNAME = data['RING_USER'] RING_PASSWORD = data['RING_PASS'] auth = Auth("huebell/v1") auth.fetch_token(RING_USERNAME, RING_PASSWORD) ring = Ring(auth) ring.update_data() print("[Ring] Connected") # Load doorbell devices = ring.devices() doorbell = devices['doorbots'][0] def flash_lights(): # Get current status of all lights for l in hue_lights: light = { 'name': l.name, 'light': l, 'status': b.get_light(l.name, 'on'), 'bright': b.get_light(l.name, 'bri') } lights.append(light) # Turn on hallway light
async def async_setup_entry(hass, entry): """Set up a config entry.""" def token_updater(token): """Handle from sync context when token is updated.""" run_callback_threadsafe( hass.loop, partial( hass.config_entries.async_update_entry, entry, data={ **entry.data, "token": token }, ), ).result() auth = Auth(f"HomeAssistant/{__version__}", entry.data["token"], token_updater) ring = Ring(auth) try: await hass.async_add_executor_job(ring.update_data) except AccessDeniedError: _LOGGER.error( "Access token is no longer valid. Please set up Ring again") return False hass.data.setdefault(DOMAIN, {})[entry.entry_id] = { "api": ring, "devices": ring.devices(), "device_data": GlobalDataUpdater(hass, "device", entry.entry_id, ring, "update_devices", timedelta(minutes=1)), "dings_data": GlobalDataUpdater( hass, "active dings", entry.entry_id, ring, "update_dings", timedelta(seconds=5), ), "history_data": DeviceDataUpdater( hass, "history", entry.entry_id, ring, lambda device: device.history(limit=10), timedelta(minutes=1), ), "health_data": DeviceDataUpdater( hass, "health", entry.entry_id, ring, lambda device: device.update_health_data(), timedelta(minutes=1), ), } hass.config_entries.async_setup_platforms(entry, PLATFORMS) if hass.services.has_service(DOMAIN, "update"): return True async def async_refresh_all(_): """Refresh all ring data.""" for info in hass.data[DOMAIN].values(): await info["device_data"].async_refresh_all() await info["dings_data"].async_refresh_all() await hass.async_add_executor_job(info["history_data"].refresh_all) await hass.async_add_executor_job(info["health_data"].refresh_all) # register service hass.services.async_register(DOMAIN, "update", async_refresh_all) return True
def py_ring(): get_access_token() ring = Ring(get_access_token.auth) ring.update_data() devices = ring.devices() get_doorbell_cam_motion2(devices) sys.exit(0) while True: if os.path.isdir('Recordings'): None else: os.mkdir('Recordings') print(u"{}[2J{}[;H".format(chr(27), chr(27))) get_access_token() print(u"{}[2J{}[;H".format(chr(27), chr(27))) print(' --- PyRing Main Menu --- \n') print(style.GREEN('[01]') + style.RESET(' Ring devices.')) print(style.GREEN('[02]') + style.RESET(' Ring devices status.')) print(style.GREEN('[03]') + style.RESET(' Ring light control.')) print(style.GREEN('[04]') + style.RESET(' Ring motion alerts.')) print( style.GREEN('[05]') + style.RESET(' Download Ring latest motion video.')) print(style.GREEN('[06]') + style.RESET(' Download a month of video.')) print(style.GREEN('[99]') + style.RESET(' Exit PyRing.')) try: option = input( style.YELLOW('\n[+]') + style.RESET(' Choose your option [Eg: 01]: ')) except KeyboardInterrupt: print(u"{}[2J{}[;H".format(chr(27), chr(27))) print(style.RED('\n[!]') + style.RESET(' Error: User exit.')) print( style.GREEN('[+]') + style.RESET(' Thank you for using PyRing.')) print(style.GREEN('[+]') + style.RESET(' Author: Pr0xy07')) print( style.GREEN('[+]') + style.RESET( ' If you need any help, contact: [email protected]')) sys.exit(0) try: ring = Ring(get_access_token.auth) ring.update_data() devices = ring.devices() except: print(u"{}[2J{}[;H".format(chr(27), chr(27))) print(style.RED('\n[!]') + style.RESET(' Error: User exit.')) print( style.GREEN('[+]') + style.RESET(' Thank you for using PyRing.')) print(style.GREEN('[+]') + style.RESET(' Author: Pr0xy07')) print( style.GREEN('[+]') + style.RESET( ' If you need any help, contact: [email protected]')) sys.exit(0) if option == "01": print(u"{}[2J{}[;H".format(chr(27), chr(27))) get_devices(devices) elif option == "02": print(u"{}[2J{}[;H".format(chr(27), chr(27))) get_status(devices) elif option == "03": light_control(devices) elif option == "04": get_alerts(devices) elif option == "05": get_motions(devices) elif option == "06": get_doorbell_cam_motion2(devices) elif option == "99": print(u"{}[2J{}[;H".format(chr(27), chr(27))) print( style.GREEN('\n[+]') + style.RESET(' Thank you for using PyRing.')) print(style.GREEN('[+]') + style.RESET(' Author: Pr0xy07')) print( style.GREEN('[+]') + style.RESET( ' If you need any help, contact: [email protected]')) break
def downloadSnapshot(dev): # don't let snapshot ever be undefined snapshot = False try: snapshot = dev.get_snapshot() if snapshot: logger.debug("Snapshot: " + str(snapshot)) open(fhem_path + 'snap.png', "wb").write(snapshot) except Exception as inst: logger.info("No connection to ring API, continueing... ") logger.info("Snapshot: " + str(snapshot)) # GATHERING DEVICES devs = myring.devices() poll_device = None logger.debug("Devices: " + str(devs)) tmp = list(devs['doorbots'] + devs['authorized_doorbots']) logger.debug(tmp) for t in tmp: # start background fhemReadingsUpdate _thread.start_new_thread(fhemReadingsUpdate, (t, readingsUpdates)) t.update_health_data() logger.debug(t.address) # devs[t.id] = t # all alerts can be recognized on all devices poll_device = t # take one device for polling logger.info("Found " + str(len(tmp)) + " devices.")
def main(): if cache_file.is_file(): auth = Auth("MyProject/1.0d", json.loads(cache_file.read_text()), token_updated) else: # Comment or Un the following to be prompted or use what we have already set # username = input("Username: "******"Password: "******"MyProjectShared/1.0d", None, token_updated) try: auth.fetch_token(username, password) except MissingTokenError: auth.fetch_token(username, password, otp_callback()) myring = Ring(auth) myring.update_data() #;print(How To Print All Data) devices = myring.devices() #;print(devices) doorbells = devices["doorbots"] print(doorbells) stickup_cams = devices["stickup_cams"] #;print(stickup_cams) chimes = devices["chimes"] #;print(chimes) # print( "myring.is_connected" ), # Not valid after python2.7 # print( "myring.is_connected", end = '' ) # print( myring.is_connected ) # True ## Would be nice to esplicitly test that we got connefcted, # p = subprocess.Popen(["sleep", "1"], stdout=subprocess.PIPE); output, err = p.communicate()#; print(output.rstrip(os.linesep)) # Sleep for BreakAbility # p = subprocess.Popen(["sleep", "1"], stdout=subprocess.PIPE); output, err = p.communicate()#; print(output.rstrip(os.linesep)) # Sleep for BreakAbility for acamera in list(stickup_cams + doorbells): # limit on dev.account_id = 12345678 and print the Account ID: when connecting? # for event in acamera.history(limit=QueueDepth, older_than=6753104150123456789): # ['created_at'] #,'id'] # Older than example for event in acamera.history( limit=QueueDepth, older_than=OlderThan): # ['created_at'] #,'id'] # filename='%s-%s-%s' % (acamera.name.replace(" ","_"), event['created_at'].astimezone(timezone('US/Pacific')).strftime("%Y%m%d.%H%M%S"), event['id']) # from pytz import timezone # TODO: ... ... Need a new Ignore: state for cameras that match "-Driveway-" for the neighbors cam. # #Or filter on the Account ID: 12345678 camname = '%s' % acamera.name.replace( " ", "_") # Sanitize Cam Names, of Spaces at least... ... cliptime = '%s' % event['created_at'].astimezone( timezone(MyTimeZone)).strftime("%Y%m%d.%H%M%S") clipyear = '%s' % event['created_at'].astimezone( timezone(MyTimeZone)).strftime("%Y") clipmonth = '%s' % event['created_at'].astimezone( timezone(MyTimeZone)).strftime("%m") clipday = '%s' % event['created_at'].astimezone( timezone(MyTimeZone)).strftime("%d") clipid = '%s' % event['id'] foldername = BaseDir + "/" + clipyear + "/" + clipmonth + "/" + clipday p = subprocess.Popen(["mkdir", "-pv", foldername], stdout=subprocess.PIPE) output, err = p.communicate() # print(output.rstrip(os.linesep)) # print the result of creating the container folder YYYY/MM/DD # Prints an empty line if dir already exists filename = cliptime + "-" + camname + "-" + clipid #print(filename) filepath = foldername + "/" + filename + ".mp4" print(bcolors.OKBLUE + "Fetchin " + filepath + bcolors.ENDC, end='') sys.stdout.flush() # import sys # Force partial line to be printed print( "\r", end='' ) # Carrage return back to top of line for the results to be rewritten if not os.path.exists( filepath): # import os # Test that file does not exist yet ## Would like to esplicitly watch for a ^C BREAK from the parent, sometimes that gets ignored and can not abort. if acamera.recording_download(event['id'], filename=filepath): print(bcolors.OKGREEN + "Success" + bcolors.ENDC + bcolors.BOLD, end='') # subprocess.call(["ls", "-lh", filepath]) # import subprocess # # print(subprocess.call(["ls", "-lh", filepath])) # import subprocess # Prints ls output and then "Success 0"(Return Code)? p = subprocess.Popen(["ls", "-lh", filepath], stdout=subprocess.PIPE) output, err = p.communicate() # print("*** Running ls -l command ***\n") # print(output), # Does a new line even though we used a comma, otherwise does two new lines, must have a \n within the output # print(output.rstrip(os.linesep)) # This inline comment no longer works from py2.7 to py3.6 # similar to perl chomp to cleanup /r/n # df=os.system("df -h / | grep /") # Not working right? # print(df) # when attempting .rstrip(os.linesep) get error AttributeError: 'int' object has no attribute 'rstrip' print(bcolors.UNDERLINE + bcolors.OKGREEN + "#" + bcolors.ENDC) # print(acamera.recording_url(event['id'])) # Could print this into a filename.lnk instead to keep a shareable link? DEBUG else: # acamera.recording_download failed print(bcolors.FAIL + "Failed-" + bcolors.ENDC) print(acamera.recording_url(event['id'])) else: # os.path.exists so skip print(bcolors.WARNING + "Skipped" + bcolors.ENDC)
def main(): configure_logger() register_stack_dump() global slack slack = Slacker(SLACK_API_KEY) global worker_thread worker_thread = Thread(target=worker_loop, name="Worker Thread") worker_thread.daemon = True worker_thread.start() global s3_client s3_client = boto3.client( 's3', aws_access_key_id=AWS_ACCESS_KEY, aws_secret_access_key=AWS_SECREY_KEY, ) logger.info("Connecting to Ring API") if cache_file.is_file(): auth = Auth("MyProject/1.0", loads(cache_file.read_text()), token_updated) else: username = RING_USERNAME password = RING_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() logger.info("Connected to Ring API") devices = ring.devices() logger.info("Found devices {}".format(devices)) video_devices = devices["doorbots"] + devices["stickup_cams"] logger.info("Watching for events on devices {}".format(video_devices)) # Init event ids for device in video_devices: device.latest_id = get_latest_recording(device)["id"] logger.info("Found latest event id {} for device {}".format( device.latest_id, device)) # Loop for ever, checking to see if a new video becomes available try: while True: time.sleep(HIST_POLL_TIMEOUT_SECS) for device in video_devices: event = get_latest_recording(device) new_id = event["id"] if new_id != device.latest_id: logger.info("Detected a new event for device {}".format(device)) device.latest_id = new_id enqueue_event(event, device) except KeyboardInterrupt: exit(0)
def main(): parser = argparse.ArgumentParser( description="Ring Doorbell", epilog="https://github.com/tchellomello/python-ring-doorbell", formatter_class=argparse.RawDescriptionHelpFormatter, ) parser.add_argument( "-u", "--username", dest="username", type=str, help="username for Ring account" ) parser.add_argument( "-p", "--password", type=str, dest="password", help="username for Ring account" ) parser.add_argument( "--count", action="store_true", default=False, help="count the number of videos on your Ring account", ) parser.add_argument( "--download-all", action="store_true", default=False, help="download all videos on your Ring account", ) args = parser.parse_args() _header() # connect to Ring account if cache_file.is_file(): auth = Auth("RingCLI/0.6", json.loads(cache_file.read_text()), token_updated) else: if not args.username: args.username = input("Username: "******"Password: "******"RingCLI/0.6", None, token_updated) try: auth.fetch_token(args.username, args.password) except MissingTokenError: auth.fetch_token(args.username, args.password, input("2FA Code: ")) ring = Ring(auth) ring.update_data() devices = ring.devices() doorbell = devices["doorbots"][0] _bar() if args.count: print( "\tCounting videos linked on your Ring account.\n" + "\tThis may take some time....\n" ) events = [] counter = 0 history = doorbell.history(limit=100) while len(history) > 0: events += history counter += len(history) history = doorbell.history(older_than=history[-1]["id"]) motion = len([m["kind"] for m in events if m["kind"] == "motion"]) ding = len([m["kind"] for m in events if m["kind"] == "ding"]) on_demand = len([m["kind"] for m in events if m["kind"] == "on_demand"]) print("\tTotal videos: {}".format(counter)) print("\tDing triggered: {}".format(ding)) print("\tMotion triggered: {}".format(motion)) print("\tOn-Demand triggered: {}".format(on_demand)) # already have all events in memory if args.download_all: counter = 0 print( "\tDownloading all videos linked on your Ring account.\n" + "\tThis may take some time....\n" ) for event in events: counter += 1 filename = _format_filename(event) print("\t{}/{} Downloading {}".format(counter, len(events), filename)) doorbell.recording_download( event["id"], filename=filename, override=False ) if args.download_all and not args.count: print( "\tDownloading all videos linked on your Ring account.\n" + "\tThis may take some time....\n" ) history = doorbell.history(limit=100) while len(history) > 0: print( "\tProcessing and downloading the next" + " videos".format(len(history)) ) counter = 0 for event in history: counter += 1 filename = _format_filename(event) print("\t{}/{} Downloading {}".format(counter, len(history), filename)) doorbell.recording_download( event["id"], filename=filename, override=False ) history = doorbell.history(limit=100, older_than=history[-1]["id"])