Files
xiaomihome/xiaomi/classify.go
T
4566704 b808e51b3e refactor: 重大架构升级 — HomeID/RoomID int64化 + 设备驱动重构 + 结构化日志
主要变更:

**类型系统重构**
- HomeInfo.ID/RoomInfo.ID/HomeID 从 string 改为 int64,json tag 使用 ,string
- GetHome/GetRooms/GetRoomDevices 接口同步修改
- 新增 int64FromStr 工具函数,更新 parseHomeInfo 解析逻辑

**新增 Speaker 设备**
- 新增 KindSpeaker 类型
- classify 映射覆盖 speaker/bluetooth-speaker/alarm-clock/media-player/playback/music

**设备驱动重构**
- AC 驱动彻底重写:从硬编码常量改为基于 SPEC ValueList 的动态 valMapper
- 所有设备(Fan/Humidifier/Light/OccupancySensor/Switch/TempHumiditySensor/Thermostat/Vacuum/WaterHeater/Cover)新增 GetState() 和 FetchState(ctx) 接口
- base.go 新增 specResolver.format() 方法

**MIoT 模块增强**
- MIoTClient 新增 homeIDs 字段,支持按家庭过滤设备
- RefreshDevices 支持 homeIDs 参数
- SpecStdLib 引入 logger.Logger,log.Printf 全部迁移为结构化日志

**其他**
- Config 新增 RedirectURL 和 HomeIDs 字段
- AuthInfo.ExpiresIn 类型从 int 改为 int32
- UUID 生成简化为 hex.EncodeToString
- 新增 github.com/sirupsen/logrus 依赖
- .gitignore 新增 examples/*/data/ 忽略规则
- 删除已提交的 config.json 敏感配置
2026-07-13 10:40:20 +08:00

106 lines
3.2 KiB
Go

package xiaomi
import "strings"
// deviceTypeToKind maps SPEC URN device types to Kind.
// URN format: urn:miot-spec-v2:device:{TYPE}:...
var deviceTypeToKind = map[string]Kind{
"air-conditioner": KindAirConditioner,
"air-condition-outlet": KindAirConditioner,
"air-condition-eco": KindAirConditioner,
"airer": KindAirConditioner,
"ac-partner": KindAirConditioner,
"light": KindLight,
"lightbulb": KindLight,
"night-light": KindLight,
"ceiling-light": KindLight,
"switch": KindSwitch,
"outlet": KindSwitch,
"powerstrip": KindSwitch,
"toggle-switch": KindSwitch,
"wireless-switch": KindSwitch,
"curtain-switch": KindSwitch,
"fan": KindFan,
"ceiling-fan": KindFan,
"ventilator": KindFan,
"air-fresh": KindFan,
"air-purifier": KindFan,
"curtain": KindCover,
"airer-rack": KindCover,
"humidifier": KindHumidifier,
"dehumidifier": KindHumidifier,
"humidifier-dehumidifier": KindHumidifier,
"vacuum": KindVacuum,
"sweeper": KindVacuum,
"robot-cleaner": KindVacuum,
"water-heater": KindWaterHeater,
"water-cooler": KindWaterHeater,
"kettle": KindWaterHeater,
"heater": KindThermostat,
"electric-blanket": KindThermostat,
"thermostat": KindThermostat,
"speaker": KindSpeaker,
"bluetooth-speaker": KindSpeaker,
"alarm-clock": KindSpeaker,
"media-player": KindSpeaker,
"playback": KindSpeaker,
"music": KindSpeaker,
"sensor": KindSensor,
"sensor-ht": KindSensor,
"sensor-occupy": KindSensor,
"motion-sensor": KindSensor,
"magnet": KindSensor,
"sensor-smoke": KindSensor,
"sensor-gasm": KindSensor,
"sensor-temp": KindSensor,
"sensor-humidity": KindSensor,
"illumination": KindSensor,
}
// Classify 从 DeviceInfo 判断设备种类。
// 优先从 URN 的 device type 段精确提取,降至 model 子串匹配。
func Classify(info *DeviceInfo) Kind {
if info == nil {
return KindUnknown
}
// 从 URN 精确解析 device type
if k := classifyByURN(info.URN); k != KindUnknown {
return k
}
// 降至 model 匹配
if k := classifyByModel(info.Model); k != KindUnknown {
return k
}
return KindUnknown
}
// classifyByURN 从 URN 中提取 device type 并映射 Kind。
func classifyByURN(urn string) Kind {
parts := strings.Split(urn, ":")
if len(parts) >= 4 && parts[2] == "device" {
if k, ok := deviceTypeToKind[parts[3]]; ok {
return k
}
}
return KindUnknown
}
// classifyByModel 对 model 字符串做子串匹配(用于无 URN 或 URN 不标准时)。
func classifyByModel(model string) Kind {
model = strings.ToLower(model)
for t, k := range deviceTypeToKind {
if strings.Contains(model, t) {
return k
}
}
return KindUnknown
}
// FilterByKind 按设备种类过滤。
func FilterByKind(kind Kind) DeviceFilter {
return func(d *DeviceInfo) bool { return d.DeviceKind() == kind }
}