qhue:philips hue api的python包装器

qhue的Python项目详细描述


q色调

q hue(发音为"q")是飞利浦色调api的一个非常薄的python包装器。

我写这篇文章是因为其他一些(优秀的)框架跟不上api的发展。因为qhue几乎不编码任何底层模型——它实际上只是构建url和http调用的一种方式——它应该自动继承任何新的api特性。qhue的目标不是为hue系统创建另一个python api,而是将现有的api转换为python,并且干扰最小。

了解qhue

值得称赞的是,飞利浦为色调系统创建了一个漂亮的restful api。它可能还没有我们想要的所有功能,但是它的设计非常优雅。

您可以(也应该)阅读这里的完整文档,但是一个快速的总结是,像灯光、场景等资源都有一个url,可能是这样的:

http://[myhub]/api/<username>/lights/1

您可以通过对这个url执行http get来读取关于light 1的信息,并通过执行http put来修改它。

qhue模块中,我们有一个resource类,它表示具有url的内容。通过调用此类的一个实例,您将向该url上的集线器发出http请求。

它还有一个bridge类,这是构建资源的一个方便的起点(它本身就是一个资源)。如果这看起来有点抽象,请不要担心-下面将说明所有内容。

安装QHUE

这很简单。

pip install qhue

您可能需要查看github的最新版本以及本文档。最新的代码可能位于"development"分支上。

示例

注意:这些示例假设您知道网桥的IP地址。如果需要帮助,请参见api文档的"入门"部分。我给我的地址分配了一个192.168.0.45的静态地址,这就是下面的内容。

他们还假设您以前尝试过api,因此在网桥上设置了一个用户帐户,并将用户名存储在某个地方。如果没有,请参阅下面标题为"创建用户"的部分。

<好的。现在这些预赛已经结束了…

首先,让我们创建一个桥,它将是您的顶级资源。

# Connect to the bridge with a particular username
from qhue import Bridge
b = Bridge("192.168.0.45", username)

您可以看到任何资源的url:

# This should give you something familiar from the API docs:
print b.url

通过请求资源对象的大多数其他属性,您将构造一个新的资源,并将属性名添加到原始资源的url中:

lights = b.lights   # Creates a new Resource with its own URL
print lights.url    # Should have '/lights' on the end

现在,在这个阶段,这些资源只是引用了桥上的实体:它们还没有与之通信。要对网桥进行实际的api调用,我们只需像调用函数一样调用资源:

# Let's actually call the API and print the results
print lights()

qhue接受api返回的json并将其转换回python对象(通常是字典),这样您就可以轻松地访问它的各个部分,例如:

# Get the bridge's configuration info as a dict,
# and print the ethernet MAC address
print b.config()['mac']

现在,理想情况下,我们希望能够以相同的方式构造所有的url,因此我们将light 1称为b.lights.1,但是在python中不能使用数字作为属性名。也不能使用变量。因此,作为替代方法,您可以使用字典键语法-例如,b.lights[1]

# Get information about light 1
print b.lights[1]()

# or, to do the same thing another way:
print b['lights'][1]()

或者,当您调用一个资源时,您可以给它一些参数,这些参数将在调用时添加到它的url中:

# This is the same as the last examples:
print b('lights', 1)

因此,有几种方法可以表达同一件事,您可以选择最适合您的代码的方法。

进行更改

现在,要更改值,还可以调用res但是您可以添加关键字参数来指定要更改的属性。可以通过设置灯光状态的属性来更改灯光的亮度和色调,例如:

http://[myhub]/api/<username>/lights/1
0

如果您愿意,还可以将url构造位置参数与值设置关键字参数混合使用:

http://[myhub]/api/<username>/lights/1
1

当需要指定布尔真/假值时,应使用本机python真和假。

作为一个更复杂的示例,如果要设置给定场景中灯光的亮度和色温,可以使用如下调用:

http://[myhub]/api/<username>/lights/1
2

这涵盖了大多数简单的案例。如果没有任何关键字参数,则http请求将是get,并将告诉您当前状态。如果您确实有关键字参数,它将是一个PUT,并将更改当前状态。

但是,有时需要指定post或delete,可以使用特殊的http方法参数来指定,该参数将覆盖上述规则:

http://[myhub]/api/<username>/lights/1
3

如果需要指定与python关键字冲突的关键字参数,例如,只需在其上附加下划线,如下所示:

http://[myhub]/api/<username>/lights/1
4

最后,对于某些操作,比如调度和规则,您需要知道资源的"地址",这是绝对的url路径-ip地址后面的位,或者最近,用户名后面的位。您可以使用地址短地址属性来获取这些信息:

http://[myhub]/api/<username>/lights/1
5

有关何时需要此功能的详细信息,请参阅API文档。

现在,就这样了。

一些提示:

  • 有些请求可以返回大量信息。使它更可读的一种简便方法是将它格式化为yaml。您可能需要pip install pyyaml,然后尝试以下操作:

    http://[myhub]/api/<username>/lights/1
    
    6
  • 桥通常以合理的逻辑顺序返回项。顺序实际上并不重要,但是如果您希望保留它,那么您可能不希望json结构变成python dict,因为这些结构通常不会保留顺序。构造bridge对象时,可以告诉它使用另一个函数将json字典转换为python结构,例如通过指定object\u hook=collections.orderedict。这将为您提供OrderedDicts而不是Dicts,这在几乎所有方面都是一个好处,除了您从中创建的任何YAML输出看起来都不太好。

  • 如果您熟悉jupyter(ipython)笔记本系统,这是一种探索api的有趣方法。请参阅qhue playground示例笔记本。

创建用户

如果您以前没有使用过API,则需要在网桥上创建一个用户帐户。

http://[myhub]/api/<username>/lights/1
7

你会得到一个提示说需要按下桥上的链接按钮。去按它,你应该得到一个生成的用户名。现在您可以获得一个新的bridge对象,如上面的示例所示,将这个用户名作为第二个参数传递。

请查看examples目录,以获取存储用户名以供将来会话使用的方法。

使用说明

请注意,qhue不会对任何方法调用或参数进行任何本地检查-它只是将您提供的内容打包并发送到网桥。

这方面的一个重要例子是,网桥期望色温和亮度等的整数值。比方说,如果对返回浮点值的颜色进行计算,则需要在发送之前将其转换为int,否则将被忽略。(发送字符串返回错误,但发送浮点则不返回错误。)

先决条件

这适用于python 2和python 3。它使用了Kenneth Reitz优秀的请求模块,因此您需要执行:

http://[myhub]/api/<username>/lights/1
8

或者类似的东西在使用qhue之前。如果使用pip安装qhue本身,则不必这样做。

许可证

这个小片段是在gpl v2下发布的。请参阅许可证文件。(他们在池塘的另一边这样拼写。)它没有任何明示或暗示的保证,只是希望它可能对某人有用。

贡献

建议,补丁,拉请求欢迎。有很多方法可以改进。

如果你能用一般的方式,不加太多的行,那就更好了!正如波罗尼亚斯所说,简洁是智慧的灵魂。

非常感谢大卫·科尔斯、克里斯·麦克林、安德里亚·杰米特、马丁·保卢斯、瑞安·特纳、马修·克拉普、马库斯·克拉斯·德弗里斯和理查德·莫里森等人的贡献!

quentin stafford fraser

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

推荐PyPI第三方库


热门话题
java为什么会出现这些错误?表达式的非法开始   使用HttpUrlConnection的java测试URL仅适用于前面的www   在大数据集上使用kmeans的java堆外内存   查找Java RandomAccessFile如何以字符形式读取第n个字节   java Android从BroadcastReceiver获取标题和描述   java使用构造函数参数模拟嵌套类并测试方法   正在将Azure Blob项强制转换为Java文件对象   java并行运行testNG套件   java程序在运行时似乎没有进入   贬低Java规则引擎的优点和缺点   文本区域中的java中心文本   java JPA从多个表中选择错误   类Java问题使用类加载器重新加载代码   java如何在Spring非管理类上使用@Value   java(关闭)Gradle导入VS代码失败   java arraylist拆分(“空白”)并计算字数   Android/Java如何在单独的*中调用函数。java文件?   具有基本身份验证的java Apache Camel RSS模块   java为什么程序在出现溢出或下溢时不抛出异常