主要变更: **类型系统重构** - HomeInfo.ID/RoomInfo.ID/HomeID 从 string 改为 int64,json tag 使用 ,string - GetHome/GetRooms/GetRoomDevices 接口同步修改 - 新增 int64FromStr 工具函数,更新 parseHomeInfo 解析逻辑 **新增 Speaker 设备** - 新增 KindSpeaker 类型 - classify 映射覆盖 speaker/bluetooth-speaker/alarm-clock/media-player/playback/music **设备驱动重构** - AC 驱动彻底重写:从硬编码常量改为基于 SPEC ValueList 的动态 valMapper - 所有设备(Fan/Humidifier/Light/OccupancySensor/Switch/TempHumiditySensor/Thermostat/Vacuum/WaterHeater/Cover)新增 GetState() 和 FetchState(ctx) 接口 - base.go 新增 specResolver.format() 方法 **MIoT 模块增强** - MIoTClient 新增 homeIDs 字段,支持按家庭过滤设备 - RefreshDevices 支持 homeIDs 参数 - SpecStdLib 引入 logger.Logger,log.Printf 全部迁移为结构化日志 **其他** - Config 新增 RedirectURL 和 HomeIDs 字段 - AuthInfo.ExpiresIn 类型从 int 改为 int32 - UUID 生成简化为 hex.EncodeToString - 新增 github.com/sirupsen/logrus 依赖 - .gitignore 新增 examples/*/data/ 忽略规则 - 删除已提交的 config.json 敏感配置
167 lines
4.9 KiB
Go
167 lines
4.9 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"
|
||
KindThermostat Kind = "thermostat"
|
||
KindSpeaker Kind = "speaker"
|
||
KindSensor Kind = "sensor"
|
||
KindUnknown Kind = "unknown"
|
||
)
|
||
|
||
// DeviceKind 从 URN 快速判断设备种类(不依赖 SPEC 加载)
|
||
func (d *DeviceInfo) DeviceKind() Kind {
|
||
return Classify(d)
|
||
}
|