// Package main demonstrates switch 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() const targetDID = "2170429382" info, err := client.GetDevice(ctx, targetDID) if err != nil { log.Fatalf("获取设备 %s 失败: %v", targetDID, err) } sw, err := devices.NewSwitch(client, info) if err != nil { log.Fatalf("创建 Switch 失败: %v", err) } log.Printf("开关: %s (DID: %s, 型号: %s)", info.Name, info.DID, info.Model) log.Printf("通道数: %d", sw.ChannelCount()) if sw.ChannelCount() == 1 { demoSingleChannel(ctx, sw) } else { demoMultiChannel(ctx, sw) } log.Println("开关控制演示完毕") } func demoSingleChannel(ctx context.Context, sw devices.Switch) { on, _ := sw.IsOn(ctx) log.Printf("当前状态: on=%v", on) log.Println("执行 Toggle...") sw.Toggle(ctx) time.Sleep(1 * time.Second) newOn, _ := sw.IsOn(ctx) log.Printf("Toggle 后: on=%v", newOn) } func demoMultiChannel(ctx context.Context, sw devices.Switch) { for ch := 1; ch <= sw.ChannelCount(); ch++ { on, err := sw.IsChannelOn(ctx, ch) if err != nil { log.Printf("通道 %d: 查询失败 %v", ch, err) continue } log.Printf("通道 %d: on=%v", ch, on) log.Printf(" 通道 %d 执行 Toggle...", ch) sw.ToggleChannel(ctx, ch) time.Sleep(1 * time.Second) newOn, _ := sw.IsChannelOn(ctx, ch) log.Printf(" 通道 %d Toggle 后: on=%v", ch, newOn) // 恢复原状态 if on { log.Printf(" 通道 %d 恢复为 开", ch) sw.TurnOnChannel(ctx, ch) } else { log.Printf(" 通道 %d 恢复为 关", ch) sw.TurnOffChannel(ctx, ch) } } }