最近買了新的人體傳感器2s,結果發現xiaomi_gateway3沒辦法正常讀取,只有ble正常。於是我只能使用雲端版的xiaomi,然後感應燈自動化就不夠及時了。
小米IoT有一套很成熟的平臺,而且陸版往往比台版早推出許久,因此我認為參數運作等等早就已經在陸版推出不久就已經被串好,只是台版沒有順利用陸版運作邏輯去撈資料。
陸版跟台版最大差異是無線與伺服器。
因此台版人體傳感器2s,其實與陸版人體傳感器2s是不同model,這也導致xiaomi_gateway3沒辦法將台版人體傳感器2s用陸版人體傳感器2s的參數去撈資料。
https://iot.mi.com/v2/new/doc/introduction/knowledge/spec
https://home.miot-spec.com/s/xiaomi.motion.pir1
以上是小米各種產品的iot運作參數,在兩三年前,小米各種產品都各自有一套siid與piid,這部份看以上連結就能查閱。
台版人體傳感器2s與陸版人體傳感器2s的參數都一樣,只是一個型號是
xiaomi.motion.pir1g、xiaomi.motion.pir1,這是市場型號,對於xiaomi_gateway3來說,型號是19552、13617。
怎麽得知台版人體傳感器2s的model?透過xiaomi_gateway3的裝置資訊!

這邊可以看到model為19552。
米家生態系產品眾多,不可能每一種都為其創立函式。一定是透過字典mapping,而字典mapping就需要model在字典中。
這份字典在哪裡?在xiaomi_gateway3/core/devices.py中。

新增部分:
19552: ["xiaomi", "Motion Sensor 2s", "XMPIRO2G5XS", "xiaomi.motion.pir1g"],
"spec": [
# main sensors
ConstConv("motion", "binary_sensor", mi="2.e.1008", value=True),
BaseConv("illuminance", "sensor", mi="2.p.1005"),
BaseConv("custom_no_motion_time", "sensor", mi="2.p.1053", entity={"units": UNIT_MINUTES, "icon": "mdi:timer"}),
# other sensors
MathConv("no_motion_duration", "sensor", mi="2.p.1024", entity={"enabled": False, "units": UNIT_SECONDS, "icon": "mdi:timer"}),
BaseConv("battery", "sensor", mi="3.p.1003"),
],
在xiaomi_gateway3/core/devices.py中,siid與piid都能對上,如2.p.1005是光照度lux。
而2.e.1008,則對應MIot的Event,如果有觸發就會上報事件,即時更新狀態。

要如何讓台版人體傳感器2s在hacs中的xiaomi_gateway3中能正常被讀取?
- 參考https://home.miot-spec.com/s/xiaomi.motion.pir1,瞭解eiid、siid。
- 透過xiaomi_gateway3的裝置資訊取得model。
- 在xiaomi_gateway3/core/devices.py中,添加model,並對照eiid與siid。