// E2 — Cloud device management example. // Demonstrates: get user info → home list → device list → read/write prop → do action. package main import ( "fmt" "os" "xiaomihome/miot" "xiaomihome/miot/examples/config" ) func main() { // 1. Load config cfg, err := config.LoadConfig(config.DefaultPath()) if err != nil { fmt.Printf("Load config error: %v\n", err) return } if cfg.AuthInfo.AccessToken == "" { fmt.Println("请先运行 E1 cloud_oauth 获取 token") os.Exit(1) } // 2. Create HTTP client http, err := miot.NewMIoTHttpClient(cfg.CloudServer, miot.OAUTH2_CLIENT_ID, cfg.AuthInfo.AccessToken) if err != nil { fmt.Printf("Create HTTP client error: %v\n", err) return } defer http.Close() // 3. Get user info user, err := http.GetUserInfo() if err != nil { fmt.Printf("GetUserInfo error: %v\n", err) } else { fmt.Println("=== 用户信息 ===") printMap(user) } // 4. Get home list homes, err := http.GetHomeInfos() if err != nil { fmt.Printf("GetHomeInfos error: %v\n", err) return } fmt.Println("\n=== 家庭列表 ===") if uid, ok := homes["uid"].(string); ok { fmt.Printf("UID: %s\n", uid) } if homeList, ok := homes["home_list"].(map[string]interface{}); ok { for hid, hi := range homeList { if h, ok := hi.(map[string]interface{}); ok { fmt.Printf(" Home: %s, Name: %v\n", hid, h["home_name"]) } } } // 5. Get device list devices, err := http.GetDevices(nil) if err != nil { fmt.Printf("GetDevices error: %v\n", err) return } devMap, _ := devices["devices"].(map[string]map[string]interface{}) if len(devMap) == 0 { fmt.Println("没有找到设备") return } fmt.Println("\n=== 设备列表 ===") var firstDID string for did, d := range devMap { fmt.Printf(" DID: %s, Name: %v, Model: %v, Online: %v\n", did, d["name"], d["model"], d["online"]) if firstDID == "" { firstDID = did } } // 6. Read a property (use hardcoded siid=2, piid=1 — power for many devices) siid := 2 piid := 1 fmt.Printf("\n=== 读取属性 (did=%s, siid=%d, piid=%d) ===\n", firstDID, siid, piid) prop, err := http.GetProp(firstDID, siid, piid) if err != nil { fmt.Printf("GetProp error: %v\n", err) } else { fmt.Printf("属性值: %v\n", prop["value"]) } // 7. Set a property (toggle power: 0→1) fmt.Printf("\n=== 设置属性 (did=%s, siid=%d, piid=%d, value=false) ===\n", firstDID, siid, piid) setResult, err := http.SetProp([]miot.PropParam{ {DID: firstDID, Siid: siid, Piid: piid, Value: false}, }) if err != nil { fmt.Printf("SetProp error: %v\n", err) } else { for _, r := range setResult { fmt.Printf(" DID: %s, Code: %d, Value: %v\n", r.DID, r.Code, r.Value) } } // 8. Do an action (toggle: siid=2, aiid=1) aiid := 1 fmt.Printf("\n=== 执行动作 (did=%s, siid=%d, aiid=%d) ===\n", firstDID, siid, aiid) actionResult, err := http.DoAction(firstDID, siid, aiid, []interface{}{ map[string]interface{}{"value": true}, }) if err != nil { fmt.Printf("DoAction error: %v\n", err) } else { fmt.Printf("动作结果: %v\n", actionResult) } } func printMap(m map[string]interface{}) { for k, v := range m { fmt.Printf(" %s: %v\n", k, v) } }