小米智慧家庭有非常豐富的設備,Xiaomi Device接入Home Assistant可透過「雲端」與「本地」。
在2025/05/05的當下,數個月前經歷過Xiaomi為登入增加了二階段驗證,需要透過信箱或是手機接收驗證碼,因此,Xiaomi Device透過雲端(登入帳號)接入到HomeAssistant中,暫時是不可行的。
我因此一時糊塗,重置我的小米多模網關2S,導致Home Assistant抓不到資訊,所有聯動的自動化也都失效,彷彿智慧家庭又回到一般家庭。
我透過套件Xiaomi Gateway 3直接接入小米多模網關2S,並且能做到秒級別的反應,這使人體感應器觸發燈座開關可行。而Token與Key是Home Assistant Xiaomi Device溝通時必須的,若有,Home Assistant才得以直接連入小米網關,並最快速直接獲取傳感數據。
如今,雲端不行,那又有什麼方式適合呢?簡單來說就是回到最一開始的樣子。
最初的獲取Xiaomi Device Token與Key方法
隨著韌體升級,小米網關也升級通訊方式與關閉Telnet。
至於Token是放在mihome(米家)資料庫中,透過把xihome備份,讀取資料庫,取得token或是ztoken。ztoken本質上跟token一樣,只是ztoken多一層加密且增加長度,不過解密後就能變成token。名稱不同也可以避免衝突。
之後使用token與xiaomi device溝通。
另外,透過Telnet去連線到網關並且從中取得Key。但Key在早期不是必要,而在小米多模網關2s升級到1.07之後就需要了。
現在獲取Toekn與Key的方法
Token從登入雲端去下載暫時行不通,只好從應用程式資料庫取得。
Key從利用按鈕手法去開啟Telnet,並使用Telnet連入Gateway然後從中取得。
※Xiaomi Gateway 3 建議使用 UART,簡單來說就是拆殼接Console,非常費工且新手不友善。
而我透過iOS與macOS去獲取Token,建議用macOS去做,非常簡單就能抓出資料庫。
以下三篇文章是我的主要參考來源。
Obtain Mi Home device token
https://github.com/shaarkys/com.xiaomi-miio/blob/master/docs/obtain_token.md
Fix support Xiaomi Multimode Gateway 2 on firmware 1.0.7
https://github.com/AlexxIT/XiaomiGateway3/issues/1166
python-miio
https://github.com/rytilahti/python-miio
透過macOS搜尋資料庫並取得ZToken
token與ztoken是放在名稱為「<user id>_mihome.sqlite」的資料庫中,其中user id可以透過應用程式「米家」,查看自己的user id是什麼。
透過DB Browser for SQLite開啟該檔案,就能在ZDEVICE中查看到。

如果找不到「<user id>_mihome.sqlite」在哪裡,可以先開啟米家。
從活動監視器,對米家按資訊,進入打開的檔案和連接埠,下方一整排的路徑,就會包含「<user id>_mihome.sqlite」的路徑。

解密Ztoken並取得Token
依據「Obtain Mi Home device token」,可以找到線上工具,把找到的Ztoken輸入進去,並且選擇對應的類型,輸出就是Token。不放心資料安全的,可以使用python自己解開,
一個正確的Token,是可以透過 miio 去取得資訊。
miiocli device --ip 192.168.111.27 --token 594a44593952484b4a43725945483263 info
線上工具
http://aes.online-domain-tools.com/
python
"""
Input text (hex): your 96 character key
Selectbox Plaintext / Hex: Hex
Function: AES
Mode: ECB
Key (hex): 00000000000000000000000000000000
Selectbox Plaintext / Hex: Hex
"""
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
# 96*16(位元) ==/256=> 6
def ztoken_to_token(ztoken_hex: str) -> str:
"""
將 96 字元 ZTOKEN (Hex) 解密成 32 字元 TOKEN (Hex)
- 模式:AES-ECB
- 金鑰:16 個 0x00
- 填充:PKCS#7
"""
# 1. Hex → bytes (48 bytes ciphertext)
ct = bytes.fromhex(ztoken_hex)
# 2. 全零 16 bytes Key 與 AES-ECB cipher
key = b'\x00' * 16
cipher = AES.new(key, AES.MODE_ECB)
# 3. 執行解密,取得含填充的明文
pt_padded = cipher.decrypt(ct)
# 4. PKCS#7 unpad → 真正的 ASCII Hex 明文
pt = unpad(pt_padded, AES.block_size)
# 5. 解碼成字串,正好 32 字元
return pt.decode('ascii')
if __name__ == "__main__":
# 請替換成你的 96 字元 ZTOKEN
ztoken = "75c1479eedf1ebcf5d8c19aa20e6ea7c6a65ef16b26340bd792aa5f27c2ca4e30143db63ee66b0cdff9f69917680151e"
token = ztoken_to_token(ztoken)
print("轉換後的 TOKEN:", token)
print("字串長度:", len(token)) # 應為 32
開啟Telnet,5 2 2 2 2 2 大法
也就是連按5下,間隔,再按2下,間隔,再按2下,間隔,再按2下,間隔,再按2下,間隔,再按2下。
間隔,可以自己數1、2。實測長短不拘,有停就好。
※連按太快會觸發重置!若意外多按或少按,可以等長間隔再來按。
成功觸發後,設備會指示燈會閃爍,就能使用Telnet連入。

進入網關CLI介面後獲取Key
透過Telnet連入後,就能使用以下兩個指令輸出內容,內容中會有設備的Key。
cat device.conf
agetprop

在HomeAssistant中,使用Token與Key接入小米網關
透過一番操作,順利的話會取得 Token 與 Key,就能在Xiaomi Gateway3輸入並加入自己的網關。
網關IP位置一定要固定下來。
