Files
miot_x/README.md
lanyuanxiaoyao 63dc55fa5a refactor: 重构为单向生成架构,CLI 零参数可用
- 迁移 examples/rules/ 到 src/rules/,resources/devices.json 到 src/devices.json
- 迁移 resources/fetch-devlist.js 到 src/tools/fetch-devlist.ts 并改造为 ESM
- CLI 简化为零参数:bun run pack 自动编译并输出 dist/miot_{timestamp}.bak
- 移除备份合并能力:删除 mergeCompiledRules、RuleReplaceStrategy、dry-run、replace 参数
- 编译器简化为从零生成,不再支持 baseBackup 合并
- 新增 fetch-devices 命令用于从中枢网关更新设备清单
- 新增 bn.js、elliptic 依赖
- 更新测试路径引用,移除依赖合并逻辑的测试用例
- 更新 README.md 反映新项目结构和命令
2026-05-08 00:03:27 +08:00

3.6 KiB
Raw Permalink Blame History

miot_x

miot_x 是一个基于 Bun + TypeScript 的米家极客版工作流编排项目。用 TypeScript 代码描述工作流规则,编译并打包成米家极客版可导入的 .bak 备份文件。

当前范围

当前支持:

  • 设备属性触发和事件触发,生成 deviceInput
  • 设备属性读取条件,生成 deviceGet
  • 设备属性写入和动作调用,生成 deviceOutput
  • 多触发合并,生成 signalOr
  • 简单逻辑组合,生成 logicAndlogicOrlogicNot
  • 延时动作,生成 delay
  • 注释节点,生成 nop
  • .bak 解包、打包和校验
  • 从中枢网关抓取设备清单

当前不支持:

  • 纯文本 DSL 或自定义 parser
  • 中文能力名自动匹配,例如 light.power.on()
  • 主动连接中枢网关或复现 websocket 会话
  • 完整覆盖米家极客版所有节点类型

项目结构

src/
  index.ts            # public API
  builder.ts          # TypeScript 规则 builder
  graph.ts            # Graph IR 与节点 ID
  nodes.ts            # 米家节点模板
  compiler.ts         # 规则编译与备份生成
  validate.ts         # 结构、连接、设备和能力参数校验
  backup.ts           # .bak 解包与打包
  cli.ts              # 命令入口(零参数)
  devices.json        # 设备清单(由 fetch-devices 工具更新)
  rules/
    index.ts          # 个人规则
  tools/
    fetch-devlist.ts  # 中枢网关设备抓取工具
tests/
  backup.test.ts
  compiler.test.ts
  validate.test.ts
dist/                 # 输出目录(.bak 备份文件)

编写规则

规则直接使用 TypeScript

import { defineDevices, defineRule } from "../index.ts";

const devices = defineDevices({
  corridorLight: {
    did: "group.1815373077765824512",
    urn: "urn:miot-spec-v2:device:light:0000A001:mijia-group3:3:0000C802",
    name: "走廊筒灯",
  },
  corridorMotion: {
    did: "blt.3.1htiptpdgco00",
    urn: "urn:miot-spec-v2:device:motion-sensor:0000A014:xiaomi-pir1:2",
    name: "走廊人体传感器",
  },
});

export default defineRule("走廊有人开灯", ({ device, on }) =>
  on(device(devices.corridorMotion).event({ siid: 2, eiid: 1008 }))
    .do(device(devices.corridorLight).set({ siid: 2, piid: 1, value: true })),
);

第一版要求显式填写 didurnsiidpiideiidaiid 等 MIoT 参数。后续可以在此基础上增加语义别名。

打包命令

编译规则并生成 .bak 备份文件:

bun run pack

自动读取 src/rules/index.tssrc/devices.json,从零编译,输出到 dist/miot_{timestamp}.bak

更新设备清单

从中枢网关抓取最新设备清单:

bun run fetch-devices 192.168.31.166 048889

048889 是中枢网关屏幕上显示的 6 位 passcode。抓取结果直接写入 src/devices.json

校验策略

工具在写出最终 .bak 前会检查:

  • 顶层 versionrulesvariables.global
  • 规则 idcfg.id
  • 节点 id/type/props/inputs/outputs/cfg
  • 节点 ID 是否只包含 0-9a-zA-Z
  • 连接是否为 目标节点ID.目标端口名
  • 连接目标节点和端口是否存在
  • 设备 did 是否存在于 devices.json
  • deviceInputdeviceGetdeviceOutput 的基础字段和操作符约束

测试

bun test

测试覆盖真实备份解包统计、备份打包往返、规则编译输出和常见校验错误。

导入验证建议

先使用示例规则生成一个新备份文件,在米家极客版中导入并确认画布可以打开。确认简单规则能运行后,再对真实工作流进行替换。原始备份文件应始终保留,便于导入失败时回退。