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
,然后尝试以下操作:
6http://[myhub]/api/<username>/lights/1
桥通常以合理的逻辑顺序返回项。顺序实际上并不重要,但是如果您希望保留它,那么您可能不希望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下发布的。请参阅许可证文件。(他们在池塘的另一边这样拼写。)它没有任何明示或暗示的保证,只是希望它可能对某人有用。
贡献
建议,补丁,拉请求欢迎。有很多方法可以改进。
如果你能用一般的方式,不加太多的行,那就更好了!正如波罗尼亚斯所说,简洁是智慧的灵魂。
非常感谢大卫·科尔斯、克里斯·麦克林、安德里亚·杰米特、马丁·保卢斯、瑞安·特纳、马修·克拉普、马库斯·克拉斯·德弗里斯和理查德·莫里森等人的贡献!