Files
4566704 cdc459b5ff fix(xiaomihome): 模块路径改为 git.zeroonesoft.cn/golib/xiaomihome
- 改动:go.mod module 声明与全部内部导入路径补全为完整域名路径,README 同步
- 原因:裸模块名无法被 go get 解析,发版前必须修正为 GOPRIVATE 可拉取路径
2026-10-05 08:53:23 +08:00

109 lines
2.8 KiB
Go

package xiaomi
import "git.zeroonesoft.cn/golib/xiaomihome/miot"
// ========== 属性订阅 ==========
// SubProp 订阅设备属性变化通知
// 内部调用 miot.MIoTClient.SubProp,在 adapter handler 中完成 map→PropertyValue 转换
// siid/piid 为 0 表示订阅该设备所有属性
// 返回 subscription ID(与 miot.SubProp 一致)
func (c *Client) SubProp(did string, siid, piid int, handler PropHandler) (string, error) {
wrappedHandler := func(params map[string]interface{}, ctx interface{}) {
prop := &PropertyValue{
DID: strVal(params, "did"),
SIID: intVal(params, "siid"),
PIID: intVal(params, "piid"),
Code: intVal(params, "code"),
Value: params["value"],
Type: strVal(params, "type"),
}
handler(did, prop)
}
subID := c.inner.SubProp(did, wrappedHandler, siid, piid)
c.mu.Lock()
c.propSubs[subID] = did
c.mu.Unlock()
return subID, nil
}
// UnsubProp 取消属性订阅
func (c *Client) UnsubProp(did string, subID string) error {
c.inner.UnsubProp(did, subID)
c.mu.Lock()
delete(c.propSubs, subID)
c.mu.Unlock()
return nil
}
// ========== 事件订阅 ==========
// SubEvent 订阅设备事件通知
// 内部调用 miot.MIoTClient.SubEvent,完成 map→EventOccurred 转换
func (c *Client) SubEvent(did string, siid, eiid int, handler EventHandler) (string, error) {
wrappedHandler := func(params map[string]interface{}, ctx interface{}) {
event := &EventOccurred{
DID: strVal(params, "did"),
SIID: intVal(params, "siid"),
EIID: intVal(params, "eiid"),
Timestamp: int64(intVal(params, "timestamp")),
}
if args, ok := params["arguments"].(map[string]interface{}); ok {
event.Arguments = args
}
handler(did, event)
}
subID := c.inner.SubEvent(did, wrappedHandler, siid, eiid)
c.mu.Lock()
c.eventSubs[subID] = did
c.mu.Unlock()
return subID, nil
}
// UnsubEvent 取消事件订阅
func (c *Client) UnsubEvent(did string, subID string) error {
c.inner.UnsubEvent(did, subID)
c.mu.Lock()
delete(c.eventSubs, subID)
c.mu.Unlock()
return nil
}
// ========== 设备状态订阅 ==========
// SubDeviceState 订阅设备在线状态变化
// 内部调用 miot.MIoTClient.SubDeviceState,完成 MIoTDeviceState→DeviceState 转换
func (c *Client) SubDeviceState(did string, handler DeviceStateHandler) error {
wrappedHandler := func(did string, state miot.MIoTDeviceState, ctx interface{}) {
var ds DeviceState
switch state {
case miot.DeviceStateOnline:
ds = StateOnline
case miot.DeviceStateOffline:
ds = StateOffline
default:
return // DeviceStateDisable 忽略
}
handler(did, ds)
}
return c.inner.SubDeviceState(did, wrappedHandler)
}
// UnsubDeviceState 取消设备状态订阅
func (c *Client) UnsubDeviceState(did string) error {
return c.inner.UnsubDeviceState(did)
}