**AC 驱动增强** - 支持 thermostat + air-conditioner + air-fresh 多服务三合一设备,属性跨服务合并解析 - 新增 specResolver.findValListInService/findInService/hasService/serviceShortName 方法 - 移除 KindThermostat,heater/electric-blanket/thermostat 重新归类为 KindAirConditioner **Cover 窗帘重构** - CoverProps 结构化:Position/Status/Fault 分离 - SetPosition 优先写 target-position,回退 current-position - OnPropsChanged/FetchProps 支持多属性同步刷新 **新增设备类型** - Plug 驱动:插座/插头,支持开合、在线状态、属性变更订阅 - Gateway 驱动:网关设备类型识别 - miot/miot_errors.go:新增 MIoT 云端错误码定义 **MIoT 客户端健壮性** - SetProp 空结果视为失败;设备被移除或离线时自动刷新设备列表 - GetDevices 的 has_more 改用 parseBool 严格解析 - MIPS SubscribeMany 批量订阅减少往返 - matchURN 改为按段精确匹配,避免 tofan 误匹配 fan **Bridge** - 移除 Thermostat case,Cover 改用结构化 CoverProps - 新增设备创建后自动订阅属性变更 **其他** - 日志整体 Info → Debug 降噪 - .gitignore 忽略 /.codebuddy/memory - 更新 devices_test 与 08_adv_filter_classify 示例
169 lines
5.0 KiB
Go
169 lines
5.0 KiB
Go
// Package xiaomi provides a high-level, strongly-typed wrapper over the miot package.
|
||
// It converts map[string]interface{} APIs into typed structs and offers device
|
||
// control abstractions that hide siid/piid details behind semantic interfaces.
|
||
package xiaomi
|
||
|
||
// ========== 基础信息 ==========
|
||
|
||
// UserInfo 用户信息(字段对齐 Xiaomi open.account.xiaomi.com/user/profile API)
|
||
type UserInfo struct {
|
||
UID string `json:"userId"`
|
||
NickName string `json:"miliaoNick"`
|
||
AvatarURL string `json:"miliaoIcon"`
|
||
}
|
||
|
||
// HomeInfo 家庭信息
|
||
type HomeInfo struct {
|
||
ID int64 `json:"id,string"`
|
||
Name string `json:"name"`
|
||
UID string `json:"uid"`
|
||
GroupID string `json:"group_id"`
|
||
Rooms []RoomInfo `json:"rooms"`
|
||
DidList []string `json:"did_list"`
|
||
ShareState bool `json:"share_state"`
|
||
CityID string `json:"city_id"`
|
||
Longitude float64 `json:"longitude"`
|
||
Latitude float64 `json:"latitude"`
|
||
Address string `json:"address"`
|
||
}
|
||
|
||
// RoomInfo 房间信息
|
||
type RoomInfo struct {
|
||
ID int64 `json:"id,string"`
|
||
Name string `json:"name"`
|
||
HomeID int64 `json:"home_id,string"`
|
||
DidList []string `json:"did_list"`
|
||
}
|
||
|
||
// DeviceInfo 设备信息(替代 map[string]interface{})
|
||
type DeviceInfo struct {
|
||
DID string `json:"did"`
|
||
Name string `json:"name"`
|
||
Model string `json:"model"`
|
||
Manufacturer string `json:"manufacturer"`
|
||
FWVersion string `json:"fw_version"`
|
||
Icon string `json:"icon"`
|
||
URN string `json:"urn"` // 设备 SPEC 类型
|
||
Token string `json:"token"`
|
||
IP string `json:"local_ip"`
|
||
RSSI int `json:"rssi"`
|
||
SSID string `json:"ssid"`
|
||
BSSID string `json:"bssid"`
|
||
Online bool `json:"is_online"`
|
||
HomeID string `json:"home_id"`
|
||
HomeName string `json:"home_name"`
|
||
RoomID string `json:"room_id"`
|
||
RoomName string `json:"room_name"`
|
||
OwnerID string `json:"owner_id"`
|
||
ParentID string `json:"parent_id"`
|
||
ParentModel string `json:"parent_model"`
|
||
GroupID string `json:"group_id"`
|
||
ConnectType int `json:"connect_type"` // 0=WiFi, 1=BLE, 2=ZigBee, ...
|
||
}
|
||
|
||
// ========== 属性/事件 ==========
|
||
|
||
// PropertyValue 属性值(强类型)。
|
||
// Type 字段仅在主动 GetProp 场景可用(可从 SPEC 推断 format),SubProp 回调中 miot 不提供 type 信息。
|
||
type PropertyValue struct {
|
||
DID string `json:"did"`
|
||
SIID int `json:"siid"`
|
||
PIID int `json:"piid"`
|
||
Code int `json:"code"`
|
||
Value interface{} `json:"value"`
|
||
Type string `json:"type"` // SPEC format ("bool"/"uint8"/"float"/"string"); 仅 GetProp 时可用
|
||
}
|
||
|
||
// PropertiesChanged 属性变化事件
|
||
type PropertiesChanged struct {
|
||
DID string `json:"did"`
|
||
Properties []PropertyValue `json:"properties"`
|
||
}
|
||
|
||
// EventOccurred 事件发生通知
|
||
type EventOccurred struct {
|
||
DID string `json:"did"`
|
||
SIID int `json:"siid"`
|
||
EIID int `json:"eiid"`
|
||
Arguments map[string]interface{} `json:"arguments"`
|
||
Timestamp int64 `json:"timestamp"`
|
||
}
|
||
|
||
// DeviceState 设备在线状态
|
||
type DeviceState string
|
||
|
||
const (
|
||
StateOnline DeviceState = "online"
|
||
StateOffline DeviceState = "offline"
|
||
)
|
||
|
||
// ========== Action ==========
|
||
|
||
// ActionResult Action 执行结果
|
||
type ActionResult struct {
|
||
DID string `json:"did"`
|
||
SIID int `json:"siid"`
|
||
AIID int `json:"aiid"`
|
||
Code int `json:"code"`
|
||
Out []map[string]interface{} `json:"out"`
|
||
}
|
||
|
||
// ========== 属性读写辅助类型 ==========
|
||
|
||
// PropKey 属性键对
|
||
type PropKey struct {
|
||
DID string
|
||
SIID int
|
||
PIID int
|
||
}
|
||
|
||
// PropKeyValue 属性键值对
|
||
type PropKeyValue struct {
|
||
PropKey
|
||
Value interface{}
|
||
}
|
||
|
||
// PropResult 写入结果
|
||
type PropResult struct {
|
||
PropKey
|
||
Code int
|
||
}
|
||
|
||
// ========== 回调定义 ==========
|
||
|
||
// PropHandler 属性变化回调(强类型,替代 miot 的 map handler)
|
||
type PropHandler func(did string, prop *PropertyValue)
|
||
|
||
// EventHandler 事件回调(强类型)
|
||
type EventHandler func(did string, event *EventOccurred)
|
||
|
||
// DeviceStateHandler 设备在线状态变化回调
|
||
type DeviceStateHandler func(did string, state DeviceState)
|
||
|
||
// ========== 设备分类 ==========
|
||
|
||
// Kind 设备大类
|
||
type Kind string
|
||
|
||
const (
|
||
KindAirConditioner Kind = "air_conditioner"
|
||
KindLight Kind = "light"
|
||
KindSwitch Kind = "switch"
|
||
KindFan Kind = "fan"
|
||
KindCover Kind = "cover"
|
||
KindHumidifier Kind = "humidifier"
|
||
KindVacuum Kind = "vacuum"
|
||
KindWaterHeater Kind = "water_heater"
|
||
KindSpeaker Kind = "speaker"
|
||
KindGateway Kind = "gateway"
|
||
KindPlug Kind = "plug"
|
||
KindOccupancySensor Kind = "sensor_occupy"
|
||
KindSensor Kind = "sensor"
|
||
KindUnknown Kind = "unknown"
|
||
)
|
||
|
||
// DeviceKind 从 URN 快速判断设备种类(不依赖 SPEC 加载)
|
||
func (d *DeviceInfo) DeviceKind() Kind {
|
||
return Classify(d)
|
||
}
|