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è)備名稱

(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ù)雜的邏輯