人工智能和机器学习的炽热,将Python语言的热度带到了一个新高度,朋友圈常常刷到的Python小课,甚至让很多非技术的同学一度狐疑,不会点Python都不好意思说本人是现代人。对于Python的基础知识,网上内容很多,感兴趣的都能够找到大量材料学习。本篇文章,我次要从一些读者关注的问题登程,比方在各种IoT智能设施遍及的明天,如何利用Python去管制智能硬件,实现一些性能演示呢?比方咱们能够利用Python管制灯泡的开关、亮度调节、色彩变动等等。

实际上,这些管制硬件设施的能力,并不需要你齐全本人去开发程序实现,通过现成的平台,通过简略的Python代码编程,就能够实现智能设施的管制和交互,真正让你把握软件和硬件能力的买通。

上面,我会利用涂鸦云开发平台手把手教你如何应用该平台并通过 Python 调用相干 API 管制一款智能设施。利用涂鸦云开发平台,您能够获取涂鸦 IoT 平台 OpenAPI 的调用权限。通过简略的代码编程就能够轻易管制 Powered By Tuya 智能设施。

物料清单

硬件:一款智能硬件设施,任何 Powered By Tuya 设施皆可,您也能够返回涂鸦智选平台洽购样品。

软件:一款 Python IDE,例如 PyCharm、VS Code、IDLE 等

步骤

第 1 步:创立云开发我的项目

想要应用涂鸦API,您须要先在 涂鸦云开发平台 创立一个我的项目。

创立胜利后,在我的项目详情页面,您能够取得受权密钥(Access ID 和 Access Secret 的组合)。请复制进去妥善保存,调用 API 时您须要用到受权密钥。

第 2 步:关联设施到我的项目

应用涂鸦 OpenAPI 次要是为了管制智能设施,所以咱们须要先将设施关联到云开发我的项目中。

设施关联形式

涂鸦提供了4种关联设施的维度:

因为前 3 种须要您开发智能硬件产品或挪动利用,为了疾速体验 IoT 利用构建流程,本文应用第 4 种形式关联设施关联。

  • 举荐形式一:应用涂鸦智能 App 增加智能设施
  • 举荐形式二:增加虚构设施

如果您没有可用的 Powered By Tuya 设施,您还能够通过增加虚构设施来实现调试。

  • 关联产品下的设施:通过产品 PID 关联您开发的智能设施。
  • 关联微信小程序配网增加的设施:通过 App schema 关联您开发的小程序下的设施。
  • 关联 App 配网增加的设施:通过 App schema 关联您开发的 App 下的设施。
  • 关联 App 账号下的设施:通过应用涂鸦智能 App 关联您的 IoT 账号里配网的设施。
  1. 在手机里装置涂鸦智能 App 或智能生存 App。
  2. 将智能设施配网到 App。
  3. 关上云开发 关联设施 页面。
  4. 抉择 关联 App 账号下的设施 页签。
  5. 应用涂鸦智能 App 进行扫码即可将账号下的所有设施受权给云开发我的项目应用。
  6. 智能设施关联到云开发我的项目后,您能够在 设施治理 > 设施列表 查看到通过各种形式关联的设施。
  7. 增加实现后,能够先将设施 ID 复制进去备用,假如您获取的设施 ID 为6c7asa9b55fs632c12zcwy。
  8. 关上云开发 虚构设施 页面。
  9. 抉择 增加虚构设施
  10. 抉择一款产品,而后抉择 增加虚构设施 > 关联到涂鸦 App 账号
  11. 应用涂鸦智能 App 进行扫码即可将账号下的虚构设施受权给云开发我的项目应用。虚构设施都被独立搁置在 设施治理 > 虚构设施 页面。
  12. 增加实现后,能够先将设施 ID 复制进去备用,假如您获取的虚构设施 ID 为 vdevo160544422718591。

第 3 步:申请 API 调用权限

涂鸦 IoT 平台 OpenAPI 默认是非开明状态,您须要以分组为单位发动 API 开明申请方可应用。如果您调用未开明的 API,将产生权限有余的调用谬误。

本文操作中,您须要在 云开发 API 分组页面 申请的 API 别离为 受权治理设施治理设施管制

至此,在涂鸦云开发平台上的筹备工作曾经实现,接下来请抉择任意一个Python IDE 进行接下来的编程实际。

=

第 4 步:调用 API 管制设施

本步骤中所有波及的 Python 代码曾经打包生成为 python_iot_code_sample.py,您能够提前下载应用。

4.1 获取 access_token

涂鸦 IoT 采纳 HMAC-SHA256 创立摘要,依据不同利用场景,云开发平台提供两套签名算法。其中,令牌治理接口(获取令牌、刷新令牌)算法如下:

sign = HMAC-SHA256(client_id + t, secret).toUpperCase()

以下为对应的 Python 利用代码逻辑:

# 从云开发我的项目取得的受权密钥client_id = '3meqtq4x9wr22a90lee4'secret = '7b121dd8196043f3b6944250fa3ad4ab'# 各接口应用方请依据本身所在区域调用相应接口。# 中国区 https://openapi.tuyacn.com # 美洲区 https://openapi.tuyaus.com # 欧洲区 https://openapi.tuyaeu.com # 印度区 https://openapi.tuyain.combase = 'https://openapi.tuyacn.com'# 签名算法函数def calc_sign(msg,key):  import hmac  import hashlib  sign = hmac.new(msg=bytes(msg, 'latin-1'),key = bytes(key, 'latin-1'), digestmod = hashlib.sha256).hexdigest().upper()  return signimport timeimport requestst = str(int(time.time()*1000))r = requests.get(base+'/v1.0/token?grant_type=1',                 headers={                    'client_id':client_id,                    'sign':calc_sign(client_id+t, secret),                    'secret':secret,                    't':t,                    'sign_method':'HMAC-SHA256',                  })res = r.json()['result']print(res)

4.2 编写通用申请函数

所有业务 API 都须要带公共参数,为了防止反复繁琐的操作,建议您编写 GET 和 POST 申请,不便后续应用。同时,业务接口的签名算法与之前步骤中获取 Token 时应用的不同,算法如下:

sign = HMAC-SHA256(client_id + access_token + t, secret).toUpperCase()

以下为对应的 Python 利用代码逻辑:

import json# get 申请函数def GET(url, headers={}):  t = str(int(time.time()*1000))  default_par={      'client_id':client_id,      'access_token':res['access_token'],      'sign':calc_sign(client_id+res['access_token']+t, secret),      't':t,      'sign_method':'HMAC-SHA256',        }  r = requests.get(base + url, headers=dict(default_par,**headers))  r = json.dumps(r.json(), indent=2, ensure_ascii=False) # 丑化request后果格局,不便打印查看  return r# post 申请函数def POST(url, headers={}, body={}):  import json  t = str(int(time.time()*1000))  default_par={      'client_id':client_id,      'access_token':res['access_token'],      'sign':calc_sign(client_id+res['access_token']+t, secret),      't':t,      'sign_method':'HMAC-SHA256',        }  r = requests.post(base + url, headers=dict(default_par,**headers), data=json.dumps(body))  r = json.dumps(r.json(), indent=2, ensure_ascii=False) # 丑化request后果格局,不便打印查看  return r

4.3 双向管制设施

通过 获取设施最新状态 的 API,您能够取得设施的最新状态,须要应用设施 ID 作为参数调用 API。

以下为对应的 Python 利用代码逻辑:

# 云开发我的项目里关联设施的IDdevice_id = '65057368c44f3380cc4b'r = GET(url=f'/v1.0/devices/{device_id}/status')print(r)

返回后果示例如下所示,更多详情,请参考智能设施的 指令集:

{  "result": [    {      "code": "switch",      "value": true    },    {      "code": "countdown_1",      "value": 0    },    {      "code": "cur_current",      "value": 68    },    {      "code": "cur_power",      "value": 3    },    {      "code": "cur_voltage",      "value": 2125    }  ],  "success": true,  "t": 1606880360840}

在管制一个未知的设施之前,有时您并不知道能够下发哪些指令来管制设施。这时就能够先用这个 API 取得这个设施所有可用的控制指令,而后再下发具体指令来管制设施。

r = GET(url=f'/v1.0/devices/{device_id}/functions')print(r)

以智能插座为例,返回后果示例如下:

{  "result": {    "category": "cz",    "functions": [      {        "code": "switch",        "desc": "[插座]开关",        "name": "开关",        "type": "Boolean",        "values": "{}"      },      {        "code": "countdown_1",        "desc": "开关1倒计时",        "name": "开关1倒计时",        "type": "Integer",        "values": "{"unit":"s","min":0,"max":86400,"scale":0,"step":1}"      }    ]  },  "success": true,  "t": 1606880309547}

获取到设施指令集后,您能够调用 下发设施指令 API 来管制智能设施。

# 依据该设施的管制指令集组装参数d = {"commands":[{"code":"switch","value":True},]}r = POST(url=f'/v1.0/devices/{device_id}/commands', body=d)print(r)

返回后果示例:

{  "result": true,  "success": true,  "t": 1606880463013}

详情 :基于涂鸦云开发平台的 Python IoT 开发实际 (tuya.com)

小结

本文介绍了如何应用 Python 基于涂鸦云开发平台,调用根底 API 管制一个智能设施。因为 Powered By Tuya 设施体系严格的统一性,您能够将这个管制形式拓展到所有 Powered By Tuya 设施中。让您无需思考设施异构性,可能疾速构建 IoT 利用和服务。