与logi circle相机通信的python库
logi-circle的Python项目详细描述
Python Logi循环API
Python 3.6+ API for interacting with Logi Circle cameras, written with asyncio and aiohttp.
这个库将Logi Circle系列相机公开为python对象,包装logi circle的官方api。
Now available as a Home Assistant integration!:tada:
此库包装的api尚未公开可用。如果您想要今天可以使用的东西,请查看v0.1 branch。请注意,v0.1.x包装了Logitech的私有API,并且在公共API发布后将不受支持
实现的功能
- 将实时实时流数据下载到磁盘或作为原始字节对象提供给应用程序
- 将任何活动视频下载到磁盘或作为原始字节对象提供给应用程序
- 将静态图像从相机下载到磁盘,或作为原始字节对象提供给应用程序
- 按开始时间和/或活动属性(持续时间、相关性)查询/筛选活动历史记录
- 设置给定相机的名称、时区、流模式和隐私模式
- 从服务器按需轮询以更新相机属性
- 订阅WebSocket API以处理来自API的相机属性更新和活动
- 阅读相机属性(请参见“播放道具”示例)
待办事项
更新家庭助手集成以支持此库的v0.2.x版本。已引发PR- 在readthedocs上发布文档
用法示例
设置和验证:
需要从Logitech访问API(尚未公开)。
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())
获取最新静止图像:
asyncdefget_snapshot_images():forcamerainawaitlogi.cameras:ifcamera.streaming:awaitcamera.live_stream.download_jpeg(filename='%s.jpg'%(camera.name),quality=75,# JPEG compression %refresh=False)# Don't force cameras to wakeawaitlogi.close()asyncio.get_event_loop().run_until_complete(get_snapshot_images())
从第1台摄像机下载30秒的直播视频(需要ffmpeg):
asyncdefget_livestream():camera=(awaitlogi.cameras)[0]filename='%s-livestream.mp4'%(camera.name)awaitcamera.live_stream.download_rtsp(filename=filename,duration=30)awaitlogi.close()asyncio.get_event_loop().run_until_complete(get_livestream())
下载所有摄像头的最新活动:
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())
关闭所有摄像头的流媒体:
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())
使用ws-api订阅相机事件:
asyncdefsubscribe_to_events():subscription=awaitlogi.subscribe(['accessory_settings_changed',"activity_created","activity_updated","activity_finished"])whileTrue:awaitsubscription.get_next_event()asyncio.get_event_loop().run_until_complete(subscribe_to_events())
玩道具:
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())
谢谢
- 这个api的第一个版本从tchellomello'sPython Ring Doorbell项目中借用了很多设计和一些实用函数。它为如何实现这样一个项目制作了一个很好的模板,所以谢谢
- 感谢sergeymaysak建议切换到aiohttp,这使得与家庭助理的集成变得更加容易
- Logitech提供了使用他们的官方API重新实现这个库的支持。
贡献
拉请求很受欢迎,每一点都有帮助!
- 在开始工作之前,对您的功能请求或错误提出问题
- 叉它(https://github.com/evanjd/python-logi-circle/fork)
- 创建功能分支(
git checkout -b feature/fooBar
)。 - 提交更改(
git commit -am 'Add some fooBar'
)。 - 如果需要,添加/更新测试,然后运行
tox
以确认没有测试失败。 - 推到分支(
git push origin feature/fooBar
)。 - 创建新的拉取请求
元
埃文·布鲁恩–@evanjd–evan.bruhn@gmail.com
根据麻省理工学院的许可证发行。有关详细信息,请参见LICENSE