The API this library wraps is not yet publicly available. If you want something you can use today, check out the v0.1 branch. Please note that v0.1.x wraps Logitech's private API and won't be supported once the public API is released.

Features implemented

Download real-time live stream data to disk or serve to your application as a raw bytes object

Download any activity video to disk or serve to your application as a raw bytes object

Download still images from camera to disk or serve to your application as a raw bytes object

Query/filter the activity history by start time and/or activity properties (duration, relevance)

Features planned

Update Home Assistant integration to support v0.2.x version of this library (dependent on Logitech's public release of their API)

Usage example

Setup and authenticate:

Requires API access from Logitech (not yet publicly available).

importasynciofromlogi_circleimportLogiCirclelogi=LogiCircle(client_id='your-client-id',client_secret='your-client-secret',redirect_uri='https://your-redirect-uri',api_key='your-api-key')ifnotlogi.authorized:print('Navigate to %s and enter the authorization code passed back to your redirect URI'%(logi.authorize_url))code=input('Code: ')asyncdefauthorize():awaitlogi.authorize(code)awaitlogi.close()asyncio.get_event_loop().run_until_complete(authorize())

Download latest activity for all cameras:

asyncdefget_latest_activity():forcamerainawaitlogi.cameras:last_activity=awaitcamera.last_activityiflast_activity:# Get activity as imageawaitlast_activity.download_jpeg(filename='%s-last-activity.jpg'%(camera.name))# Get activity as videoawaitlast_activity.download_mp4(filename='%s-last-activity.mp4'%(camera.name))awaitlogi.close()asyncio.get_event_loop().run_until_complete(get_latest_activity())

Turn off streaming for all cameras:

asyncdefdisable_streaming_all():forcamerainawaitlogi.cameras:ifcamera.streaming:awaitcamera.set_config(prop='streaming',value=False)print('%s is now off.'%(camera.name))else:print('%s is already off.'%(camera.name))awaitlogi.close()asyncio.get_event_loop().run_until_complete(disable_streaming_all())

Play with props:

asyncdefplay_with_props():forcamerainawaitlogi.cameras:last_activity=awaitcamera.get_last_activity()print('%s: %s'%(camera.name,('is charging'ifcamera.chargingelse'is not charging')))ifcamera.battery_level>=0:print('%s: %s%% battery remaining'%(camera.name,camera.battery_level))print('%s: Battery saving mode is %s'%(camera.name,'on'ifcamera.battery_savingelse'off'))print('%s: Model number is %s'%(camera.name,camera.model))print('%s: Mount is %s'%(camera.name,camera.mount))print('%s: Signal strength is %s%% (%s)'%(camera.name,camera.signal_strength_percentage,camera.signal_strength_category))iflast_activity:print('%s: last activity was at %s and lasted for %s seconds.'%(camera.name,last_activity.start_time.isoformat(),last_activity.duration.total_seconds()))print('%s: Firmware version %s'%(camera.name,camera.firmware))print('%s: MAC address is %s'%(camera.name,camera.mac_address))print('%s: Microphone is %s and gain is set to %s (out of 100)'%(camera.name,'on'ifcamera.microphoneelse'off',camera.microphone_gain))print('%s: Speaker is %s and volume is set to %s (out of 100)'%(camera.name,'on'ifcamera.speakerelse'off',camera.speaker_volume))print('%s: LED is %s'%(camera.name,'on'ifcamera.ledelse'off'))print('%s: Recording mode is %s'%(camera.name,'on'ifcamera.recordingelse'off'))awaitlogi.close()asyncio.get_event_loop().run_until_complete(play_with_props())

Thanks

This first version of API borrowed a lot of the design and some utility functions from tchellomello'sPython Ring Doorbell project. It made a great template for how to implement a project like this, so thanks!

Thanks sergeymaysak for suggesting a switch to aiohttp, it made integrating with Home Assistant much easier.

Logitech for reaching out and providing support to reimplement this library using their official API.