// Package main demonstrates full air conditioner 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: 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 = "2053225728" info, err := client.GetDevice(ctx, targetDID) if err != nil { log.Fatalf("获取设备 %s 失败: %v", targetDID, err) } ac, err := devices.NewAirConditioner(client, info) if err != nil { log.Fatalf("创建 AirConditioner 失败: %v", err) } log.Printf("空调: %s (DID: %s, 型号: %s)", info.Name, info.DID, info.Model) on, _ := ac.IsOn(ctx) modeName, _ := ac.GetMode(ctx) targetTemp, _ := ac.GetTargetTemp(ctx) currentTemp, _ := ac.GetCurrentTemp(ctx) fanName, _ := ac.GetFanSpeed(ctx) swingName, _ := ac.GetSwing(ctx) log.Printf("当前状态: on=%v mode=%s target=%.1f current=%.1f fan=%s swing=%s", on, modeName, targetTemp, currentTemp, fanName, swingName) log.Println("=== 执行控制: 开 -> 制冷 -> 26度 -> 自动风速 -> 垂直摆风 ===") if !on { log.Println(" 开启空调...") ac.TurnOn(ctx) time.Sleep(500 * time.Millisecond) } log.Println(" 设置制冷模式...") ac.SetMode(ctx, devices.ACModeCool) log.Println(" 设置目标温度 26度...") ac.SetTargetTemp(ctx, 26.0) log.Println(" 设置自动风速...") ac.SetFanSpeed(ctx, devices.ACFanAuto) log.Println(" 设置垂直摆风...") ac.SetSwing(ctx, devices.ACSwingVertical) time.Sleep(1 * time.Second) modeName, _ = ac.GetMode(ctx) targetTemp, _ = ac.GetTargetTemp(ctx) currentTemp, _ = ac.GetCurrentTemp(ctx) fanName, _ = ac.GetFanSpeed(ctx) swingName, _ = ac.GetSwing(ctx) log.Printf("更新后状态: mode=%s target=%.1f current=%.1f fan=%s swing=%s", modeName, targetTemp, currentTemp, fanName, swingName) log.Println("设置目标湿度 50...") if err := ac.SetTargetHumidity(ctx, 50); err != nil { log.Printf(" 设置湿度失败(可能不支持): %v", err) } else { humidity, _ := ac.GetTargetHumidity(ctx) curHumidity, _ := ac.GetCurrentHumidity(ctx) log.Printf(" 湿度: target=%d current=%d", humidity, curHumidity) } log.Println("关闭电辅热...") ac.SetAuxHeat(ctx, false) log.Println("开启节能模式...") ac.SetEco(ctx, true) subID, err := ac.OnPropsChanged(func(props devices.ACProps, changed string) { log.Printf("空调状态变化: %s → on=%v mode=%s target=%.1f current=%.1f fan=%s swing=%s", changed, props.On, props.Mode, props.TargetTemperature, props.Temperature, props.FanLevel, props.Swing) }) if err != nil { log.Printf("订阅状态失败: %v", err) } else { log.Printf("已订阅空调状态: subID=%s", subID) } log.Println("空调控制演示完毕") }