All Projects → evanjd → python-logi-circle

evanjd / python-logi-circle

Licence: MIT license
Python 3.6+ API for Logi Circle cameras

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to python-logi-circle

Python Mocket
a socket mock framework - for all kinds of socket animals, web-clients included
Stars: ✭ 209 (+808.7%)
Mutual labels:  aiohttp, asyncio
node-deepstackai-trigger
Detects motion using Deepstack AI and calls registered triggers based on trigger rules.
Stars: ✭ 154 (+569.57%)
Mutual labels:  home-automation, surveillance
Arsenic
Async WebDriver implementation for asyncio and asyncio-compatible frameworks
Stars: ✭ 209 (+808.7%)
Mutual labels:  aiohttp, asyncio
pytest-aiohttp
pytest plugin for aiohttp support
Stars: ✭ 110 (+378.26%)
Mutual labels:  aiohttp, asyncio
aioScrapy
基于asyncio与aiohttp的异步协程爬虫框架 欢迎Star
Stars: ✭ 34 (+47.83%)
Mutual labels:  aiohttp, asyncio
Aiohttp admin
admin interface for aiohttp application http://aiohttp-admin.readthedocs.io
Stars: ✭ 207 (+800%)
Mutual labels:  aiohttp, asyncio
automate-home
Yet another python home automation (iot) project. Because a smart light is more than just on or off.
Stars: ✭ 59 (+156.52%)
Mutual labels:  home-automation, asyncio
Bolt Python
A framework to build Slack apps using Python
Stars: ✭ 190 (+726.09%)
Mutual labels:  aiohttp, asyncio
Core
🏡 Open source home automation that puts local control and privacy first.
Stars: ✭ 48,265 (+209747.83%)
Mutual labels:  home-automation, asyncio
Pyatv
A python client library for the Apple TV
Stars: ✭ 322 (+1300%)
Mutual labels:  home-automation, asyncio
Aiohttp Devtools
dev tools for aiohttp
Stars: ✭ 202 (+778.26%)
Mutual labels:  aiohttp, asyncio
trellio
Python3 asyncio based microframework for microservice architecture
Stars: ✭ 19 (-17.39%)
Mutual labels:  aiohttp, asyncio
Aiohttp Security
auth and permissions for aiohttp
Stars: ✭ 195 (+747.83%)
Mutual labels:  aiohttp, asyncio
Create Aio App
The boilerplate for aiohttp. Quick setup for your asynchronous web service.
Stars: ✭ 207 (+800%)
Mutual labels:  aiohttp, asyncio
Fooproxy
稳健高效的评分制-针对性- IP代理池 + API服务,可以自己插入采集器进行代理IP的爬取,针对你的爬虫的一个或多个目标网站分别生成有效的IP代理数据库,支持MongoDB 4.0 使用 Python3.7(Scored IP proxy pool ,customise proxy data crawler can be added anytime)
Stars: ✭ 195 (+747.83%)
Mutual labels:  aiohttp, asyncio
Tokio
Asyncio event loop written in Rust language
Stars: ✭ 236 (+926.09%)
Mutual labels:  aiohttp, asyncio
Aiohttp Jinja2
jinja2 template renderer for aiohttp.web
Stars: ✭ 180 (+682.61%)
Mutual labels:  aiohttp, asyncio
Aiohttp Debugtoolbar
aiohttp_debugtoolbar is library for debugtoolbar support for aiohttp
Stars: ✭ 183 (+695.65%)
Mutual labels:  aiohttp, asyncio
aioesphomeapi
Python Client for ESPHome native API. Used by Home Assistant.
Stars: ✭ 52 (+126.09%)
Mutual labels:  home-automation, asyncio
aioneo4j
asyncio client for neo4j
Stars: ✭ 29 (+26.09%)
Mutual labels:  aiohttp, asyncio

Python Logi Circle API

Python 3.6+ API for interacting with Logi Circle cameras, written with asyncio and aiohttp.

PyPI version License Build Status Coverage Status Open Issues

This library exposes the Logi Circle family of cameras as Python objects, wrapping Logi Circle's official API.

Now available as a Home Assistant integration! 🎉

There are two versions of this API:

  • 2.x - which targets the public API (you are here)
  • 1.x - which targets the private API (private-api branch)

To access the public API, you must request access from Logitech. Unfortunately, it's become increasingly difficult to get API keys issued by Logitech. Initially, API key requests were turned around in a few business days. Now, the wait time is several months.

If you still want to request access, please refer to the instructions here for more information. Otherwise, please refer to the private-api branch.

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)
  • Set name, timezone, streaming mode and privacy mode of a given camera
  • On-demand polling from server to update camera properties
  • Subscribe to WebSocket API to handle camera property updates and activities pushed from API
  • Read camera properties (see "play with props" example)

Usage example

Setup and authenticate:

import asyncio
from logi_circle import LogiCircle

logi = LogiCircle(client_id='your-client-id',
                  client_secret='your-client-secret',
                  redirect_uri='https://your-redirect-uri',
                  api_key='your-api-key')

if not logi.authorized:
    print('Navigate to %s and enter the authorization code passed back to your redirect URI' % (logi.authorize_url))
    code = input('Code: ')

    async def authorize():
        await logi.authorize(code)
        await logi.close()

    asyncio.get_event_loop().run_until_complete(authorize())

Grab latest still image:

async def get_snapshot_images():
    for camera in await logi.cameras:
        if camera.streaming:
            await camera.live_stream.download_jpeg(filename='%s.jpg' % (camera.name),
                                                   quality=75,  # JPEG compression %
                                                   refresh=False)  # Don't force cameras to wake
    await logi.close()

asyncio.get_event_loop().run_until_complete(get_snapshot_images())

Download 30s of live stream video from 1st camera (requires ffmpeg):

async def get_livestream():
    camera = (await logi.cameras)[0]
    filename = '%s-livestream.mp4' % (camera.name)

    await camera.live_stream.download_rtsp(filename=filename,
                                           duration=30)

    await logi.close()

asyncio.get_event_loop().run_until_complete(get_livestream())

Download latest activity for all cameras:

async def get_latest_activity():
    for camera in await logi.cameras:
            last_activity = await camera.last_activity
            if last_activity:
                # Get activity as image
                await last_activity.download_jpeg(filename='%s-last-activity.jpg' % (camera.name))
                # Get activity as video
                await last_activity.download_mp4(filename='%s-last-activity.mp4' % (camera.name))

    await logi.close()

asyncio.get_event_loop().run_until_complete(get_latest_activity())

Turn off streaming for all cameras:

async def disable_streaming_all():
    for camera in await logi.cameras:
        if camera.streaming:
            await camera.set_config(prop='streaming',
                                    value=False)
            print('%s is now off.' % (camera.name))
        else:
            print('%s is already off.' % (camera.name))
    await logi.close()

asyncio.get_event_loop().run_until_complete(disable_streaming_all())

Subscribe to camera events with WS API:

async def subscribe_to_events():
    subscription = await logi.subscribe(['accessory_settings_changed',
                                         "activity_created",
                                         "activity_updated",
                                         "activity_finished"])
    while True:
        await subscription.get_next_event()

asyncio.get_event_loop().run_until_complete(subscribe_to_events())

Play with props:

async def play_with_props():
    for camera in await logi.cameras:
        last_activity = await camera.get_last_activity()
        print('%s: %s' % (camera.name,
                          ('is charging' if camera.charging else 'is not charging')))
        if camera.battery_level >= 0:
            print('%s: %s%% battery remaining' %
                  (camera.name, camera.battery_level))
            print('%s: Battery saving mode is %s' %
                  (camera.name, 'on' if camera.battery_saving else '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))
        if last_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' if camera.microphone else 'off', camera.microphone_gain))
        print('%s: Speaker is %s and volume is set to %s (out of 100)' % (
            camera.name, 'on' if camera.speaker else 'off', camera.speaker_volume))
        print('%s: LED is %s' % (
            camera.name, 'on' if camera.led else 'off'))
        print('%s: Recording mode is %s' % (
            camera.name, 'on' if camera.recording else 'off'))
    await logi.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's Python 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.

Contributing

Pull requests are very welcome, every little bit helps!

  1. Raise an issue with your feature request or bug before starting work.
  2. Fork it (https://github.com/evanjd/python-logi-circle/fork).
  3. Create your feature branch (git checkout -b feature/fooBar).
  4. Commit your changes (git commit -am 'Add some fooBar').
  5. Add/update tests if needed, then run tox to confirm no test failures.
  6. Push to the branch (git push origin feature/fooBar).
  7. Create a new pull request!

Meta

Evan Bruhn – @evanjd[email protected]

Distributed under the MIT license. See LICENSE for more information.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].