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

0 設(shè)備信息

本次采用設(shè)備為小米智能插座基礎(chǔ)版,購(gòu)買鏈接為:天貓購(gòu)買鏈接

產(chǎn)品型號(hào):ZNCZ04CM

1 python-miio模塊

米家的智能設(shè)備都遵循了 miio 的協(xié)議,協(xié)議內(nèi)容參見:mihome-binary-protocol

python-miio為封裝后的miio-API

可以采用python代碼控制miio設(shè)備

python-miio安裝方式(1):

pip install python-miio

python-miio安裝方式(2):

從github的python-miio頁面下載:https://github.com/rytilahti/python-miio

將壓縮包中的miio目錄放到項(xiàng)目文件夾,或者放入python程序的LIb/site-packages目錄中

2 獲得miio設(shè)備的Token

python-miio控制小米設(shè)備需要獲得相關(guān)設(shè)備的Token及IP地址。

IP地址可以在米家APP的設(shè)備控制界面查詢:右上角...按鈕,選擇網(wǎng)絡(luò)信息,可看到IP。

小米設(shè)備的Token獲取比較復(fù)雜。一般有以下幾種方式

(1)已ROOT的安卓手機(jī) 或 電腦安卓模擬器(推薦、已驗(yàn)證)

打開手機(jī) ROOT 權(quán)限,賦予文件管理器權(quán)限;

下載安裝并使用『米家』App(請(qǐng)使用 5.0.19-及之前版本 App,參見附件,新版 App 已屏蔽 token 提取)連接所有需要的設(shè)備;

使用文件管理器(例如 ES 文件管理器),進(jìn)入 /data/data/com.xiaomi.smarthome/databases/,復(fù)制粘貼 miio2.db 至有權(quán)限的文件夾 (例如 下載)。注意由根目錄進(jìn)入而不是主目錄;

方法一:使用 SQL 讀取 App (推薦 aSQLiteManager),打開 miio2.db 文件直接打開 devicerecord 項(xiàng),手動(dòng)尋找設(shè)備 token; 方法二:使用 SQL 讀取 App (推薦 aSQLiteManager),點(diǎn)選 Query,輸入 select token from devicerecord where localIP is '192.168.0.1',將其中的 IP 地址替換為你想要查詢的米家設(shè)備的 IP。 方法三(推薦):下載 miio2.db 文件至電腦,將文件上傳至網(wǎng)頁:http://miio2.yinhh.com/ 直接獲取。

記錄下 token,建議保存在備忘錄內(nèi)。

(2)利用miio discover(未驗(yàn)證)

就是小米設(shè)備連上電源后,在配置前,會(huì)首先釋放出一個(gè) WIFI, 我們用一臺(tái)電腦去連接這個(gè) 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 的安卓手機(jī)獲?。ㄎ打?yàn)證)

原因在于米家 v5.4.54 版本的 App(百度網(wǎng)盤有) 有一個(gè)小 bug,其中寫入內(nèi)部存儲(chǔ)器的日志文件暴露了小米 miio 設(shè)備的設(shè)備 token。

卸載最新版米家,安裝米家 v5.4.54 版本

登錄小米賬戶等待設(shè)備連接,正常操作一遍設(shè)備

使用文件資源管理器導(dǎo)航到/sdcard/SmartHome/logs/Plug_Devicemanager/

打開名稱為 yyyy-mm-dd.txt 的日志文件

在文檔中搜索 token 或你需要的設(shè)備名稱

image.png

(4)注意

注意:獲取到的設(shè)備 token 請(qǐng)及時(shí)配置,如重置家中的網(wǎng)絡(luò),設(shè)備 token 會(huì)發(fā)生變更。

3 插座控制示例

如果不清楚需要使用python-miio的那個(gè)設(shè)備模塊,可以通過以下方式獲得設(shè)備對(duì)應(yīng)的模塊名。

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: *****

我們可以得到設(shè)備的模塊名稱為:chuangmi.plug.m3

查看miio目錄中的chuangmi_plug.py文件,可以看到對(duì)應(yīng)的Class ChuangmiPlug。

插座可以通過以下類似的方式進(jìn)行:

 from miio.chuangmi_plug import ChuangmiPlug

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

x=d.status() # 給出設(shè)備的狀態(tài)
# x: <ChuangmiPlugStatus power=True, usb_power=None, temperature=46, load_power=None, wifi_led=None>
# 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'] 則 控制成功

通過以上接口函數(shù),可以控制插座實(shí)現(xiàn)更復(fù)雜的邏輯

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容