基于aiohttp的genius集线器系统客户端

geniushub-client的Python项目详细描述


CircleCI

geniushub客户端

这是一个python库,通过抽象它的RESTful API来提供对genius hub的访问。它使用aiohttp,因此是异步友好的。

这个库可以使用带有hub tokenofficelv1 api,也可以使用latestv3 api(使用自己的username and password)。在这两种情况下,库将尽可能返回v1兼容的结果(这不是一个简单的任务)。

如果您使用v3 api,您可以直接查询集线器,而不是通过heat genius自己的服务器。请注意,v3 api没有文档记录,因此此功能可能随时中断。事实上,v3到v1的转换如果尽最大努力甚至可能像某些边缘情况一样被破坏-它是用硬件、开/关(即智能插头)和散热器进行测试的。

它是一个WIP,缺少一些功能(例如计划)。此外,还有一些其他限制(见下文)。

它是基于@GeoffAtHome的工作-谢谢!

当前限制

当前限制和待办事项包括:

  • ghclient.py未完成
  • 日程表是只读的
  • 在使用v3 api时,区域有时有一个错误的值occupied

安装

克隆此存储库并运行python setup.py install,或者使用pip install geniushub-client从pip安装。

使用库

参见ghclient.py示例代码。您还可以使用ghclient.py进行特殊查询:

python ghclient.py -?

访问Genius集线器有两个不同的选项:

选项1:hub令牌仅限于:

选项2:hub主机名/地址用户凭据

  • 需要您的username&;password,与https://www.geniushub.co.uk/app
  • 一起使用
  • 使用v3 api-结果是在制品,可能不是您期望的那样
  • 直接询问集线器(因此速度更快)
HUB_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsInZlc..."HUB_ADDRESS="my-geniushub.dyndns.com"USERNAME="my-username"PASSWORD="my-password"

python ghclient.py ${HUB_TOKEN} issues

python ghclient.py ${HUB_ADDRESS} -u ${USERNAME} -p ${PASSWORD} zones -v

您可以将任何输出与“官方”API(v1响应)进行比较:

curl -X GET https://my.geniushub.co.uk/v1/zones -H "authorization: Bearer ${HUB_TOKEN}"
python ghclient.py ${HUB_TOKEN} zones -v

curl -X GET https://my.geniushub.co.uk/v1/devices/summary -H "authorization: Bearer ${HUB_TOKEN}"
python ghclient.py ${HUB_ADDRESS} -u ${USERNAME} -p ${PASSWORD} devices

curl -X GET https://my.geniushub.co.uk/v1/issues -H "authorization: Bearer ${HUB_TOKEN}"
python ghclient.py ${HUB_ADDRESS} -u ${USERNAME} -p ${PASSWORD} issues

您可以获得“raw”v3 api响应(即json未转换为v1模式):

python ghclient.py ${HUB_ADDRESS} -u ${USERNAME} -p ${PASSWORD} zones -vvv
python ghclient.py ${HUB_ADDRESS} -u ${USERNAME} -p ${PASSWORD} devices -vvv

要获得“官方”v3 api响应需要做一些工作。首先,使用python获得HASH

>>>fromhashlibimportsha256>>>hash=sha256()>>>hash.update(("my_username"+"my_password").encode('utf-8'))>>>print(hash.hexdigest())001b24f45b...

然后可以使用curl

curl --user ${USERNAME}:${HASH} -X GET http://${HUB_ADDRESS}:1223/v3/zones

高级功能

当用作库时,可以选择使用引用模块自己的aiohttp.ClientSession()(推荐)。

下面是一个示例,但有关最终版本,请参见ghclient.py

importasyncioimportaiohttpfromgeniushubclientimportGeniusHubmy_session=aiohttp.ClientSession()...ifnot(usernameorpassword):hub=GeniusHub(hub_id=hub_address,username,password,session=my_session)else:hub=GeniusHub(hub_id=hub_token,session=my_session)awaithub.update()# enumerate all zones, devices and issuesclient.verbosity=0# same as v1/zones/summary, v1/devices/summaryprint(hub.zones)client.verbosity=1# default, same as v1/zones, v1/devices, v1/issuesprint(hub.devices)print(hub.zone_by_id[3].temperature)awaitsession.close()

通过Circleci的QA/CI

qa包括使用diff将来自curl的json与来自此应用程序的输出进行比较,例如:

(venv) root@hostname:~/$ curl -X GET https://my.geniushub.co.uk/v1/zones -H "authorization: Bearer ${HUB_TOKEN}"|\
    python -c "import sys, json; print(json.load(sys.stdin))" > a.out
    
(venv) root@hostname:~/$ python ghclient.py ${HUB_ADDRESS} -u ${USERNAME} -p ${PASSWORD} zones -v > b.out

(venv) root@hostname:~/$ diff a.out b.out

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

推荐PyPI第三方库


热门话题
Android Studio中的Java错误,但不是Eclipse   java如何使用jsp更新数据库中的文件?   jsoup如何在java中从较大的子字符串中提取多个子字符串?   java RestFB:当页面的URI具有页面名称时,无法获取页面帖子   java可以让Maven做我们在ANT构建中正在做的事情。xml   java如何在JasperReports中动态包含来自Servlet的图像?   java在hibernate中用新集更新旧集   从导出为可运行的Java应用程序创建、解析和管理XML文件。jar文件   在Java中使用数组的基础知识   调试从JAVA程序调用的MATLAB函数   java实现了Iterable hands错误大小的备份   JAVA木卫一。FileNotFoundException:请求的资源不可用   java Android Spring 1.0.1使用基本身份验证删除   java如何使用com解析和对象在一个数字数组中的值。fasterxml。杰克逊。数据绑定。对象映射器   比较两个字符串时发生java NullPointerException