为什么:并入宿主项目后须与宿主日志体系一致——宿主统一用 pkg/logger 初始化 logrus 全局实例并直接 logrus.Xxx 包级调用;包一层 Logger 接口会让 logrus 的 caller 定位(报告调用文件:行号)失准。 改动: - 删除 logger 包(Logger 接口 / Default / SetDefault,默认本就是 logrus.StandardLogger) - 11 个结构体移除 lgr logger.Logger 字段、SetLogger 方法及构造中的 lgr 初始化 - 192 处 lgr.Xxxf 调用改为 logrus.Xxxf,日志消息文本保持不变 - xiaomi.Client 移除 Logger() 访问器,air_conditioner 回读日志去掉判空调用直连 logrus - miot_i18n.go 两处标准库 log.Printf 改为 logrus.Errorf,统一日志出口 - go.mod:logrus 从 indirect 提升为直接依赖 - goimports/goformat 全树规范化:此前部分文件未 gofmt(单行 if、对齐),本次顺带 格式化,纯空白/换行变化,无逻辑改动 验证:go build / go vet / go test ./... 全部通过(bridge、miot、xiaomi、devices、specs)
104 lines
2.7 KiB
Go
104 lines
2.7 KiB
Go
package bridge
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
|
|
"xiaomihome/xiaomi"
|
|
"xiaomihome/xiaomi/devices"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// ── 账号 / 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 {
|
|
logrus.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
|
|
}
|