使用python-miio控制小米智能插座

0 设备信息

本次采用设备为小米智能插座基础版,购买链接为:天猫购买链接

产品型号:ZNCZ04CM

1 python-miio模块

米家的智能设备都遵循了 miio 的协议,协议内容参见:mihome-binary-protocol

python-miio为封装后的miio-API

可以采用python代码控制miio设备

python-miio安装方式(1):

pip install python-miio

python-miio安装方式(2):

从github的python-miio页面下载:https://github.com/rytilahti/python-miio

将压缩包中的miio目录放到项目文件夹,或者放入python程序的LIb/site-packages目录中

2 获得miio设备的Token

python-miio控制小米设备需要获得相关设备的Token及IP地址。

IP地址可以在米家APP的设备控制界面查询:右上角...按钮,选择网络信息,可看到IP。

小米设备的Token获取比较复杂。一般有以下几种方式

(1)已ROOT的安卓手机 或 电脑安卓模拟器(推荐、已验证)

打开手机 ROOT 权限,赋予文件管理器权限;

下载安装并使用『米家』App(请使用 5.0.19-及之前版本 App,参见附件,新版 App 已屏蔽 token 提取)连接所有需要的设备;

使用文件管理器(例如 ES 文件管理器),进入 /data/data/com.xiaomi.smarthome/databases/,复制粘贴 miio2.db 至有权限的文件夹 (例如 下载)。注意由根目录进入而不是主目录;

方法一:使用 SQL 读取 App (推荐 aSQLiteManager),打开 miio2.db 文件直接打开 devicerecord 项,手动寻找设备 token; 方法二:使用 SQL 读取 App (推荐 aSQLiteManager),点选 Query,输入 select token from devicerecord where localIP is '192.168.0.1',将其中的 IP 地址替换为你想要查询的米家设备的 IP。 方法三(推荐):下载 miio2.db 文件至电脑,将文件上传至网页:http://miio2.yinhh.com/ 直接获取。

记录下 token,建议保存在备忘录内。

(2)利用miio discover(未验证)

就是小米设备连上电源后,在配置前,会首先释放出一个 WIFI, 我们用一台电脑去连接这个 WIFI(没有密码),连接成功后,我们安装 miio, 通过 miio discover 命令,就可以得到 token了。

采用node.js的方式:

npm install miio
% 安装完成后
miio discover

采用python的方式:

from miio.discovery import Discovery
d = Discovery()
d.discover_mdns()

(3)使用无需 root 的安卓手机获取(未验证)

原因在于米家 v5.4.54 版本的 App(百度网盘有) 有一个小 bug,其中写入内部存储器的日志文件暴露了小米 miio 设备的设备 token。

卸载最新版米家,安装米家 v5.4.54 版本

登录小米账户等待设备连接,正常操作一遍设备

使用文件资源管理器导航到/sdcard/SmartHome/logs/Plug_Devicemanager/

打开名称为 yyyy-mm-dd.txt 的日志文件

在文档中搜索 token 或你需要的设备名称

image.png

(4)注意

注意:获取到的设备 token 请及时配置,如重置家中的网络,设备 token 会发生变更。

3 插座控制示例

如果不清楚需要使用python-miio的那个设备模块,可以通过以下方式获得设备对应的模块名。

import miio
ip='192.168.1.20'
token='*****' # 输入之前获得token
s = miio.device.Device(ip=ip, token=token)
s.info()
# Out: chuangmi.plug.m3 v1.3.8_0002 (04:CF:8C:5F:**:**) @ 192.168.1.20 - token: *****

我们可以得到设备的模块名称为:chuangmi.plug.m3

查看miio目录中的chuangmi_plug.py文件,可以看到对应的Class ChuangmiPlug。

插座可以通过以下类似的方式进行:

 from miio.chuangmi_plug import ChuangmiPlug

ip='192.168.1.20'
token='****' # 输入之前获得token
d = ChuangmiPlug(ip=ip, token=token)

x=d.status() # 给出设备的状态
# x: 
# x.power = True
x=d.info()
# type(z)
# miio.device.DeviceInfo
# print(z)
# chuangmi.plug.m3 v1.3.8_0002 (04:CF:8C:5F:**:**) @ 192.168.1.20 - token: *****
x=d.off()
# x = ['ok'] 则 控制成功
x=d.on()
# x = ['ok'] 则 控制成功

通过以上接口函数,可以控制插座实现更复杂的逻辑

你可能感兴趣的:(使用python-miio控制小米智能插座)