// Package main demonstrates light device control - brightness, color temperature, RGB, and state subscription. // 运行前提:已配置环境变量 XIAOMI_CLIENT_ID / XIAOMI_CLIENT_SECRET / XIAOMI_ACCESS_TOKEN。 package main import ( "context" "log" "time" "git.zeroonesoft.cn/golib/xiaomihome/xiaomi" "git.zeroonesoft.cn/golib/xiaomihome/xiaomi/devices" miotconfig "git.zeroonesoft.cn/golib/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: 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() const targetDID = "2169700407" info, err := client.GetDevice(ctx, targetDID) if err != nil { log.Fatalf("获取设备 %s 失败: %v", targetDID, err) } lt, err := devices.NewLight(client, info) if err != nil { log.Fatalf("创建 Light 失败: %v", err) } log.Printf("灯光: %s (DID: %s, 型号: %s)", info.Name, info.DID, info.Model) log.Println("开启灯光...") if err := lt.TurnOn(ctx); err != nil { log.Printf("开启失败: %v", err) } log.Println("设置亮度...") if err := lt.SetBrightness(ctx, 50); err != nil { log.Printf("设置亮度失败(可能不支持): %v", err) } brightness, err := lt.GetBrightness(ctx) if err != nil { log.Printf("获取亮度失败: %v", err) } else { log.Printf("当前亮度: %d", brightness) } time.Sleep(1 * time.Second) log.Println("设置色温 4000K...") if err := lt.SetColorTemp(ctx, 4000); err != nil { log.Printf("设置色温失败(可能不支持): %v", err) } colorTemp, err := lt.GetColorTemp(ctx) if err != nil { log.Printf("获取色温失败: %v", err) } else { log.Printf("当前色温: %dK", colorTemp) } time.Sleep(1 * time.Second) log.Println("设置颜色 R=255 G=100 B=50...") if err := lt.SetColor(ctx, 255, 100, 50); err != nil { log.Printf("设置颜色失败(可能不支持): %v", err) } r, g, b, err := lt.GetColor(ctx) if err != nil { log.Printf("获取颜色失败: %v", err) } else { log.Printf("当前颜色: R=%d G=%d B=%d", r, g, b) } subID, err := lt.OnPropsChanged(func(props devices.LightProps, changed string) { log.Printf("灯光状态变化: %s → on=%v brightness=%d colorTemp=%dK rgb=[%d,%d,%d]", changed, props.On, props.Brightness, props.ColorTemperature, props.ColorRGB[0], props.ColorRGB[1], props.ColorRGB[2]) }) if err != nil { log.Printf("订阅状态失败: %v", err) } else { log.Printf("已订阅灯光状态: subID=%s", subID) } log.Println("执行 Toggle...") if err := lt.Toggle(ctx); err != nil { log.Printf("Toggle 失败: %v", err) } log.Println("灯光控制演示完毕") }