- 改动:go.mod module 声明与全部内部导入路径补全为完整域名路径,README 同步 - 原因:裸模块名无法被 go get 解析,发版前必须修正为 GOPRIVATE 可拉取路径
109 lines
2.8 KiB
Go
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)
|
|
}
|