// Package main demonstrates cover (curtain) device control. // 运行前提:已配置环境变量 XIAOMI_CLIENT_ID / XIAOMI_CLIENT_SECRET / XIAOMI_ACCESS_TOKEN。 package main import ( "context" "log" "time" "xiaomihome/xiaomi" "xiaomihome/xiaomi/devices" miotconfig "xiaomihome/miot/examples/config" ) 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: 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("=== 窗帘控制 ===") coverList, err := client.GetDevices(ctx, xiaomi.FilterByKind(xiaomi.KindCover)) if err != nil { log.Fatalf("获取窗帘列表失败: %v", err) } if len(coverList) == 0 { log.Fatal("未找到窗帘类设备") } info := coverList[0] log.Printf("设备: %s (DID: %s, 型号: %s)", info.Name, info.DID, info.Model) cv, err := devices.NewCover(client, info) if err != nil { log.Fatalf("创建 Cover 控制失败: %v", err) } pos, err := cv.GetPosition(ctx) if err != nil { log.Printf(" 获取位置失败: %v", err) } else { log.Printf(" 当前位置: %d", pos) } log.Println(" 打开窗帘...") cv.Open(ctx) time.Sleep(500 * time.Millisecond) log.Println(" 设置到 50...") cv.SetPosition(ctx, 50) time.Sleep(500 * time.Millisecond) log.Println(" 停止...") cv.Stop(ctx) log.Println(" 关闭窗帘...") cv.Close(ctx) pos, _ = cv.GetPosition(ctx) log.Printf(" 最终位置: %d", pos) log.Println("窗帘演示完毕") }