基于aiohttp的genius集线器系统客户端
geniushub-client的Python项目详细描述
geniushub客户端
这是一个python库,通过抽象它的RESTful API来提供对genius hub的访问。它使用aiohttp,因此是异步友好的。
这个库可以使用带有hub token的officelv1 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令牌仅限于:
- 需要从https://my.geniushub.co.uk/tokens 获取集线器令牌
- 使用v1 api-这是一个很好的文档
- 询问Heat Genius自己的服务器(速度较慢)
选项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