// Package main demonstrates device list retrieval with various filters. // 运行前提:已配置环境变量 XIAOMI_CLIENT_ID / XIAOMI_CLIENT_SECRET / XIAOMI_ACCESS_TOKEN。 package main import ( "context" "log" "time" miotconfig "xiaomihome/miot/examples/config" "xiaomihome/xiaomi" ) func main() { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() cfg, err := miotconfig.LoadConfig("../../../miot/examples/config.json") if err != nil { log.Fatal("请先运行 miot/examples/cloud_oauth 获取 token:", err) } client, err := xiaomi.NewClient(ctx, xiaomi.Config{ AuthInfo: xiaomi.AuthInfo{ AccessToken: cfg.AuthInfo.AccessToken, RefreshToken: cfg.AuthInfo.RefreshToken, ExpiresIn: int32(cfg.AuthInfo.ExpiresIn), ExpiresTS: cfg.AuthInfo.ExpiresTS, }, DataDir: "./data", UUID: cfg.UUID, UID: cfg.UID, }) if err != nil { log.Fatal(err) } defer client.Close() log.Println("刷新设备列表...") if err := client.RefreshDevices(ctx); err != nil { log.Printf("刷新设备列表失败: %v", err) } allDevices, err := client.GetDevices(ctx) if err != nil { log.Fatal("获取设备列表失败:", err) } log.Printf("=== 全部设备 (%d 个) ===", len(allDevices)) for _, d := range allDevices { kind := d.DeviceKind() log.Printf(" %-20s | %-25s | 种类=%-18s | 在线=%v", d.Name, d.Model, kind, d.Online) } onlineDevices, err := client.GetDevices(ctx, xiaomi.FilterByOnline()) if err != nil { log.Printf("过滤在线设备失败: %v", err) } else { log.Printf("=== 在线设备 (%d 个) ===", len(onlineDevices)) for _, d := range onlineDevices { log.Printf(" %s (%s)", d.Name, d.Model) } } switchDevices, err := client.GetDevices(ctx, xiaomi.FilterByKind(xiaomi.KindSwitch)) if err != nil { log.Printf("过滤开关类设备失败: %v", err) } else { log.Printf("=== 开关类设备 (%d 个) ===", len(switchDevices)) for _, d := range switchDevices { log.Printf(" %s (%s)", d.Name, d.Model) } } lightDevices, err := client.GetDevices(ctx, xiaomi.FilterByKind(xiaomi.KindLight)) if err != nil { log.Printf("过滤灯光类设备失败: %v", err) } else { log.Printf("=== 灯光类设备 (%d 个) ===", len(lightDevices)) for _, d := range lightDevices { log.Printf(" %s (%s)", d.Name, d.Model) } } onlineLights, err := client.GetDevices(ctx, xiaomi.FilterByOnline(), xiaomi.FilterByKind(xiaomi.KindLight), ) if err != nil { log.Printf("组合过滤失败: %v", err) } else { log.Printf("=== 在线灯光类设备 (%d 个) ===", len(onlineLights)) for _, d := range onlineLights { log.Printf(" %s (%s)", d.Name, d.Model) } } if len(allDevices) > 0 { first := allDevices[0] detail, err := client.GetDevice(ctx, first.DID) if err != nil { log.Printf("获取设备详情失败: %v", err) } else { log.Printf("=== 设备详情: %s ===", detail.Name) log.Printf(" DID: %s", detail.DID) log.Printf(" 型号: %s", detail.Model) log.Printf(" URN: %s", detail.URN) log.Printf(" 固件: %s", detail.FWVersion) log.Printf(" IP: %s (RSSI: %d)", detail.IP, detail.RSSI) } } log.Println("设备列表演示完毕") }