与logi circle相机通信的python库

logi-circle的Python项目详细描述


Python Logi循环API

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

PyPI versionLicenseBuild StatusCoverage StatusOpen Issues

这个库将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重新实现这个库的支持。

贡献

拉请求很受欢迎,每一点都有帮助!

  1. 在开始工作之前,对您的功能请求或错误提出问题
  2. 叉它(https://github.com/evanjd/python-logi-circle/fork
  3. 创建功能分支(git checkout -b feature/fooBar)。
  4. 提交更改(git commit -am 'Add some fooBar')。
  5. 如果需要,添加/更新测试,然后运行tox以确认没有测试失败。
  6. 推到分支(git push origin feature/fooBar)。
  7. 创建新的拉取请求

埃文·布鲁恩–@evanjdevan.bruhn@gmail.com

根据麻省理工学院的许可证发行。有关详细信息,请参见LICENSE

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java正则表达式模式编译最佳实践(使用enum)   使eclipse动态web项目在real server中拥有站点的java步骤   java创建JSON对象   JavaJBox2D+Slick2D不会发生冲突   java如何在ANTLR中处理左联想语法   java如何在JaCoCo故障保护测试执行中禁用stacktrace微调?   java有没有办法将jar库指向与Tomcat8中的war不同的位置以减少war的大小?   安卓在Java中删除主文件表   java如何将用户输入从GUI传递到主类   如何在Java中更改字符串两次(基于前面的更改)?(内部代码)   ios java小程序无法将文件保存到本地pc   透明度Java BuffereImage如何知道像素是否透明   java断开连接后如何重新连接到netty通道?   加载bean的java打印类型以及名称   java无法从活动移动到ViewPager   继承为什么java在子类中编写类的packageprivate成员时出错   如何在eclipse中导入java项目?   java在verticle vert中实例化类的危险。十、   aws cdk如何在aws cdk java中向事件规则添加目标?