Files
xiaomihome/miot/migration/R2-01-spec-properties.md
4566704 3a44cb9e6a feat: 初始化小米 IoT (MIoT) 智能家居 Go 库
- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写)
- 支持云端 API 调用与局域网设备发现(mDNS)
- 集成国际化(i18n)多语言支持
- 添加 MIoT 设备规约解析器(spec_parser)
- 包含单元测试与使用示例
2026-06-28 22:05:49 +08:00

1.8 KiB

R2-01 — spec_parser.go: 属性值处理

缺失方法

MIoTSpecProperty.eval_expr — 表达式求值

def eval_expr(self, src_value: Any) -> Any:
    if not self.expr:
        return src_value
    try:
        return eval(self.expr, {'src_value': src_value})
    except Exception as err:
        return src_value

Go 实现:不推荐 eval,使用简单的数值表达式库或手动解析常见模式。若 expr 字段为空则返回原值。

MIoTSpecProperty.value_format — 值格式转换

def value_format(self, value: Any) -> Any:
    if value is None: return None
    if isinstance(value, str):
        if self.format_ == int: value = int(float(value))
        elif self.format_ == float: value = float(value)
    if self.format_ == bool:
        return bool(value in [True, 1, 'True', 'true', '1'])
    return value

Go 实现:根据 Format 字段将字符串转为对应类型。

MIoTSpecProperty.value_precision — 值精度处理

def value_precision(self, value: Any) -> Any:
    if value is None: return None
    if self.format_ == float:
        return round(value, self.precision)
    if self.format_ == int:
        if self.value_range is None: return int(round(value))
        return int(round(value / self.value_range.step) * self.value_range.step)
    return value

Go 实现:使用 math.Round 或自定义 round。int 类型需要按 step 对齐。

目标文件

D:\miot\go-miot\spec_parser.go

在 MIoTSpecProperty 结构体上添加 3 个方法:

  • func (p *MIoTSpecProperty) EvalExpr(srcValue interface{}) interface{}
  • func (p *MIoTSpecProperty) ValueFormat(value interface{}) interface{}
  • func (p *MIoTSpecProperty) ValuePrecision(value interface{}) interface{}