package bridge import ( "context" "strconv" "xiaomihome/xiaomi" "xiaomihome/xiaomi/devices" ) // ── 账号 / Token / 家庭 ── func (b *Bridge) RefreshToken(ctx context.Context) (*xiaomi.TokenResult, error) { return b.client.RefreshToken(ctx) } func (b *Bridge) GetUserInfo(ctx context.Context) (*xiaomi.UserInfo, error) { return b.client.GetUserInfo(ctx) } func (b *Bridge) GetHomeList(ctx context.Context) ([]*xiaomi.HomeInfo, error) { return b.client.GetHomeList(ctx) } func (b *Bridge) GetHomeDevices(ctx context.Context, homeID int64) ([]*xiaomi.DeviceInfo, error) { return b.client.GetDevices(ctx, xiaomi.FilterByHome(strconv.FormatInt(homeID, 10))) } func (b *Bridge) GetHome(ctx context.Context, homeID int64) (*xiaomi.HomeInfo, error) { return b.client.GetHome(ctx, homeID) } func (b *Bridge) GetRooms(ctx context.Context, homeID int64) ([]*xiaomi.RoomInfo, error) { return b.client.GetRooms(ctx, homeID) } func (b *Bridge) GetRoomDevices(ctx context.Context, homeID, roomID int64) ([]string, error) { return b.client.GetRoomDevices(ctx, homeID, roomID) } func (b *Bridge) RefreshDevices(ctx context.Context, homeIDs ...int64) error { var ids []string if len(homeIDs) > 0 { ids = make([]string, len(homeIDs)) for i, v := range homeIDs { ids[i] = strconv.FormatInt(v, 10) } } err := b.client.RefreshDevices(ctx, ids...) if err != nil { return err } // 获取设备列表:指定家庭则只取家庭设备,否则全量 b.mu.Lock() defer b.mu.Unlock() // 全量设备列表(SDK 已在 RefreshDevices 中剔除米家已删除的设备), // 本地控制器集合必须与它保持一致 all, err := b.client.GetDevices(ctx) if err != nil { return err } alive := make(map[string]struct{}, len(all)) for _, info := range all { alive[info.DID] = struct{}{} } if removed := pruneControllers(b.dv, alive); len(removed) > 0 { b.lgr.Infof("[bridge] %d: %d device(s) removed from Mi Home, controllers dropped: %v", b.id, len(removed), removed) } if len(homeIDs) > 0 { for _, hid := range homeIDs { devs, err := b.client.GetDevices(ctx, xiaomi.FilterByHome(strconv.FormatInt(hid, 10))) if err != nil { return err } for _, info := range devs { if _, exists := b.dv[info.DID]; !exists { if d, createErr := devices.Create(b.client, info); createErr == nil && d != nil { b.dv[info.DID] = d b.subscribeDevice(info.DID, d) } } } } return nil } // 全量 for _, info := range all { if _, exists := b.dv[info.DID]; !exists { if d, createErr := devices.Create(b.client, info); createErr == nil && d != nil { b.dv[info.DID] = d b.subscribeDevice(info.DID, d) } } } return nil }