feat: 完善 AC"set 后回读"机制 — 目标聚合 + 防抖重试验证
**回读目标聚合(recordReadback)** - 所有 set 方法(TurnOn/TurnOff/SetMode/SetTargetTemp/SetFanSpeed/ SetSwing/SetTargetHumidity/SetAuxHeat/SetEco)成功后记录目标值 rbTarget - 同属性目标覆盖、不同属性追加,连续 set 自动聚合 **防抖 + 重试验证(readbackLoop)** - 静默窗口 readbackIdle=3s:等待最后一次 set 无新操作才开始验证 - 未命中目标时按 readbackRetryInterval=3s 重试,上限 readbackMaxRetries=5 - 整体超时 readbackTimeout=30s,防云端卡住导致回读永久挂起 - 命中后逐字段回调 OnPropsChanged 注册的 handler(与 MQTT 推送同语义) - rbValueEqual 数值比较用 epsilon=0.01,bool/string 直接相等 **白名单配置透传** - xiaomi.Config 新增 ReadbackModels 白名单(留空 = 全部不回读,默认) - Client 新增 NeedReadback(model) 判定 + Logger() 访问器 - bridge.Pool.NewPool(readbackModels...) 透传;newBridge 传入 Client 配置 **其他** - bridge 设备创建失败(Warn)与不支持跳过(Debug)分别记录日志
This commit is contained in:
@@ -25,6 +25,8 @@ type Client struct {
|
||||
propSubs map[string]string
|
||||
eventSubs map[string]string
|
||||
mu sync.RWMutex
|
||||
|
||||
readbackModels map[string]struct{} // 需要 set 后回读的型号集合
|
||||
}
|
||||
|
||||
// NewClient 创建并初始化客户端。
|
||||
@@ -103,13 +105,31 @@ func NewClient(ctx context.Context, cfg Config) (*Client, error) {
|
||||
devices: make(map[string]*miot.MIoTDevice),
|
||||
propSubs: make(map[string]string),
|
||||
eventSubs: make(map[string]string),
|
||||
readbackModels: make(map[string]struct{}, len(cfg.ReadbackModels)),
|
||||
}
|
||||
for _, m := range cfg.ReadbackModels {
|
||||
if m != "" {
|
||||
c.readbackModels[m] = struct{}{}
|
||||
}
|
||||
}
|
||||
return c, nil
|
||||
}
|
||||
|
||||
// NeedReadback 判断指定型号是否需要"set 成功后回读状态"。
|
||||
func (c *Client) NeedReadback(model string) bool {
|
||||
if model == "" || len(c.readbackModels) == 0 {
|
||||
return false
|
||||
}
|
||||
_, ok := c.readbackModels[model]
|
||||
return ok
|
||||
}
|
||||
|
||||
// SetLogger 设置日志记录器。
|
||||
func (c *Client) SetLogger(l logger.Logger) { c.lgr = l }
|
||||
|
||||
// Logger 返回日志记录器。
|
||||
func (c *Client) Logger() logger.Logger { return c.lgr }
|
||||
|
||||
// SetHomeIDs 动态设置 miot 层的家庭过滤,供后台定时 RefreshDevices 使用。
|
||||
func (c *Client) SetHomeIDs(homeIDs []string) { c.inner.SetHomeIDs(homeIDs) }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user