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, "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 } }