package xiaomi import ( "context" "strconv" ) // GetHomeList 获取所有家庭列表 // 合并自有家庭 (home_list) 和共享家庭 (share_home_list) func (c *Client) GetHomeList(ctx context.Context) ([]*HomeInfo, error) { data, err := c.http.GetHomeInfos() if err != nil { return nil, wrapErr("GetHomeList", "", err) } var homes []*HomeInfo // 解析自有家庭 if homeMap, ok := data["home_list"].(map[string]interface{}); ok { for _, v := range homeMap { if hm, ok := v.(map[string]interface{}); ok { homes = append(homes, parseHomeInfo(hm, false)) } } } // 解析共享家庭 if shareMap, ok := data["share_home_list"].(map[string]interface{}); ok { for _, v := range shareMap { if hm, ok := v.(map[string]interface{}); ok { homes = append(homes, parseHomeInfo(hm, true)) } } } return homes, nil } // GetHome 获取指定家庭详情(含房间) func (c *Client) GetHome(ctx context.Context, homeID int64) (*HomeInfo, error) { homes, err := c.GetHomeList(ctx) if err != nil { return nil, err } for _, h := range homes { if h.ID == homeID { return h, nil } } return nil, ErrHomeNotFound } // GetRooms 获取指定家庭的所有房间 func (c *Client) GetRooms(ctx context.Context, homeID int64) ([]*RoomInfo, error) { home, err := c.GetHome(ctx, homeID) if err != nil { return nil, err } rooms := make([]*RoomInfo, len(home.Rooms)) for i := range home.Rooms { rooms[i] = &home.Rooms[i] } return rooms, nil } // GetRoomDevices 获取指定房间的设备 DID 列表。 // 优先使用 homeroom API 返回的 dids,为空时从设备列表按 room_id 过滤。 func (c *Client) GetRoomDevices(ctx context.Context, homeID, roomID int64) ([]string, error) { rooms, err := c.GetRooms(ctx, homeID) if err != nil { return nil, err } for _, r := range rooms { if r.ID == roomID { if len(r.DidList) > 0 { return r.DidList, nil } break } } // 退化:从设备列表按 room_id 过滤 devices, err := c.GetDevices(ctx, FilterByRoom(strconv.FormatInt(roomID, 10))) if err != nil { return nil, err } dids := make([]string, 0, len(devices)) for _, d := range devices { dids = append(dids, d.DID) } return dids, nil } // parseHomeInfo 从 miot 返回的 map 解析 HomeInfo(含房间列表) func parseHomeInfo(m map[string]interface{}, shared bool) *HomeInfo { h := &HomeInfo{ ID: int64FromStr(strVal(m, "home_id")), Name: strVal(m, "home_name"), UID: strVal(m, "uid"), GroupID: strVal(m, "group_id"), CityID: strVal(m, "city_id"), Address: strVal(m, "address"), ShareState: shared, } // 地理位置 if v, ok := m["longitude"]; ok { h.Longitude = toFloat64(v) } if v, ok := m["latitude"]; ok { h.Latitude = toFloat64(v) } // 解析设备列表 h.DidList = strSliceVal(m, "dids") // 解析房间(room_info 是 map[string]interface{},key=room_id) if roomMap, ok := m["room_info"].(map[string]interface{}); ok { for _, v := range roomMap { if rm, ok := v.(map[string]interface{}); ok { roomID := int64FromStr(strVal(rm, "room_id")) h.Rooms = append(h.Rooms, RoomInfo{ ID: roomID, Name: strVal(rm, "room_name"), HomeID: h.ID, DidList: strSliceVal(rm, "dids"), }) } } } return h }