拿到了一个 米家智能插座 3,用了一下,发现米家 app 必须连接互联网才能控制设备,在断网情况下,即使 app 和设备在同一个局域网也无法控制。
发现了 python-miio 项目,可以通过 Python 指定 ip 控制设备。
先安装环境:
1 | sudo apt install pipx git -y |
首先获取设备 ip:
1 | $ miiocli discover |
配置完成的设备,获取到的 token
全是 ff,无法使用。
连接重置后设备开放的 WiFi 也可以使用 miiocli discover
获取到 Token,但是无法对设备进行管理,也无法修改连接的 WiFi。
在重置设备后,按照米家 app 流程配置设备并添加到小米账号里,然后使用 miiocli cloud
登录账号获取 Token,获取的数据如下(Token 和 mac 已替换为假数据):
1 | Model: cuco.plug.v3 |
查看设备状态:
1 | $ miiocli genericmiot --ip 192.168.1.20 --token c7c3b0c463e50f373aba1481ca0681f4 status |
可以成功获取到状态。
参考 Xiaomi Miot Spec: 小米 / 米家产品库 找到实时功率项的 SIID 和 PIID 分别是 11 和 2。
用命令获取实时数据:
1 | $ miiocli genericmiot --ip 192.168.1.20 --token c7c3b0c463e50f373aba1481ca0681f4 get_property_by 11 2 |
可以看到实时功率是 55w。
也可以通过命令控制开关:
1 | # 打开 |
或者通过 miiocli genericmiot actions
获取支持的 call,例如这个插座就可以通过 miiocli genericmiot call switch:toggle
切换开关状态。
可以正常操作插座后,试着写了一个收集实时功率数据的脚本。
首先配置脚本用的环境:
1 | # 安装 python3 虚拟环境支持 |
编写脚本:
1 | #!/opt/miio/bin/python3 |
脚本开头指定了脚本的解释器是虚拟环境里的,可以无需加载虚拟环境直接运行脚本。
运行后会把功率和温度的数据收集到 power_and_temperature_data.csv
文件。
官方米家程序并没有提供修改 WiFi 的设置,如果需要更换,则只能重置插座后重新连接。python-miio 已经实现了,但好像没有提供直接的调用命令。
参考了文档和源码,可以手动构建命令修改:
1 | miiocli genericmiot --ip 192.168.1.20 --token c7c3b0c463e50f373aba1481ca0681f4 raw_command miIO.config_router "{'ssid': 'name', 'passwd': 'password', 'uid': '0'}" |
修改会马上生效。