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

122 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# miot_x
`miot_x` 是一个基于 Bun + TypeScript 的米家极客版工作流编排项目。用 TypeScript 代码描述工作流规则,编译并打包成米家极客版可导入的 `.bak` 备份文件。
## 当前范围
当前支持:
- 设备属性触发和事件触发,生成 `deviceInput`
- 设备属性读取条件,生成 `deviceGet`
- 设备属性写入和动作调用,生成 `deviceOutput`
- 多触发合并,生成 `signalOr`
- 简单逻辑组合,生成 `logicAnd``logicOr``logicNot`
- 延时动作,生成 `delay`
- 注释节点,生成 `nop`
- `.bak` 解包、打包和校验
- 从中枢网关抓取设备清单
当前不支持:
- 纯文本 DSL 或自定义 parser
- 中文能力名自动匹配,例如 `light.power.on()`
- 主动连接中枢网关或复现 websocket 会话
- 完整覆盖米家极客版所有节点类型
## 项目结构
```text
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
```ts
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 })),
);
```
第一版要求显式填写 `did``urn``siid``piid``eiid``aiid` 等 MIoT 参数。后续可以在此基础上增加语义别名。
## 打包命令
编译规则并生成 `.bak` 备份文件:
```bash
bun run pack
```
自动读取 `src/rules/index.ts``src/devices.json`,从零编译,输出到 `dist/miot_{timestamp}.bak`
## 更新设备清单
从中枢网关抓取最新设备清单:
```bash
bun run fetch-devices 192.168.31.166 048889
```
`048889` 是中枢网关屏幕上显示的 6 位 passcode。抓取结果直接写入 `src/devices.json`
## 校验策略
工具在写出最终 `.bak` 前会检查:
- 顶层 `version``rules``variables.global`
- 规则 `id``cfg.id`
- 节点 `id/type/props/inputs/outputs/cfg`
- 节点 ID 是否只包含 `0-9a-zA-Z`
- 连接是否为 `目标节点ID.目标端口名`
- 连接目标节点和端口是否存在
- 设备 `did` 是否存在于 `devices.json`
- `deviceInput``deviceGet``deviceOutput` 的基础字段和操作符约束
## 测试
```bash
bun test
```
测试覆盖真实备份解包统计、备份打包往返、规则编译输出和常见校验错误。
## 导入验证建议
先使用示例规则生成一个新备份文件,在米家极客版中导入并确认画布可以打开。确认简单规则能运行后,再对真实工作流进行替换。原始备份文件应始终保留,便于导入失败时回退。