# dsh-mihome
给 DeepSeek Harness agent 的米家(Xiaomi Home)控制插件。
读取家庭/设备 · 查询属性 · 控制设备——所有改变状态的调用都经过人工审批闸门。
English ·
·
## ✨ 效果预览
| ① 提问 | ② 审批闸门 | ③ 完成——状态真的变了 |
|---|---|---|
| agent 用 `mi_list_devices` 列出你的设备。 | `mi_turn` / `mi_control` 暂停,弹出人工审批框。 | 批准后设备状态更新,`mi_get_state` 确认。 |
**还有 Web UI 仪表盘卡片** —— 调用 `mi_dashboard`,全屋状态直接渲染在对话里:
```
🏠 米家仪表盘 · 14 台设备 · 12 在线 · 18:32:05
🏠 客厅 🏠 卧室 🏠 厨房
💡 灯光 💡 客厅灯 on · brightness 100% 💡 卧室灯 off
🔌 插座 🔌 客厅插线板 on · 32 W …
📊 传感器 🌡️ 客厅温湿度 temperature 22.5°C 💧 卧室温湿度 humidity 52%
…
🕐 最近变化 卧室灯: power — → on 18:31
```
**没有米家账号也能玩** —— 自带演示模拟器(`pnpm demo:mi`)+ 交互式演示页(`docs/demo.html`),5 分钟完整体验。
## 🎯 能做什么?
像跟管家说话一样指挥你的家——所有写操作都先经过人工审批:
| 你说 | 会发生什么 |
|---|---|
| 「检查米家连接,列出所有设备」 | `mi_health` / `mi_list_devices` 扫描并汇总 |
| 「客厅灯开着吗?卧室呢?」 | `mi_get_state` 按需读取属性 |
| 「给我看看家庭仪表盘。」 | `mi_dashboard` 在对话里渲染**实时仪表盘卡片**——分类、房间、最近变化一览无余 |
| 「关掉卧室灯。」 | `mi_turn` → **审批弹窗** → 执行 → 状态即时更新 |
| 「把客厅灯调到 60% 亮度。」 | `mi_control`(set_bright)→ **审批弹窗** → 执行 |
| 「等空调到 24° 再告诉我。」 | `mi_wait_for_state` 轮询到目标状态 |
| 「出门模式:把所有灯都关掉。」 | 批量 `mi_turn`(每条都过审批) |
## 🛠 功能
| 工具 | 说明 | 审批 |
|---|---|---|
| `mi_health` | 验证连接;返回账号、区域、家庭数、设备数 | 只读 |
| `mi_list_homes` | 列出家庭与房间(home_id / owner_id / 房间) | 只读 |
| `mi_list_devices` | 列出设备,按名称/类别过滤(light、outlet、sensor、climate…) | 只读 |
| `mi_get_state` | 单设备状态:在线状态、类别、常见属性(power/brightness/温度/湿度/电量…) | 只读 |
| `mi_turn` | `set_power` 开/关设备 | **需批准** |
| `mi_control` | 任意 miIO raw_command:set_bright、set_properties(MIoT)… | **需批准** |
| `mi_wait_for_state` | 轮询等待属性达到/离开某个状态 | 只读 |
| `mi_dashboard` | 全屋快照,在 Web UI 渲染为**仪表盘卡片** | 只读 |
## 📦 安装
需要 **dsh ≥ 0.1.0-rc.7**(0.1.1-rc.2 已实测)。
```sh
# 从 npm 安装(推荐,预构建产物):
dsh plugin --profile web add dsh-mihome
# 或从 GitHub 安装(源码安装,pnpm 会在安装时自动构建):
# dsh plugin --profile web add github:/dsh-mihome
```
安装后重启 `dsh --profile web`。可在 **Settings → Plugins** 管理。
## 🧪 没有米家账号?先玩演示模式
```sh
git clone https://github.com//dsh-mihome
cd dsh-mihome
pnpm install
pnpm demo:mi # 在 http://127.0.0.1:8125 起一个假的米家云
```
在 profile 的 `cordis.patch.yml` 里配置:
```yaml
- id: mihome
config:
mode: demo
baseUrl: http://127.0.0.1:8125
```
然后启动 dsh 试试:
> 「检查米家连接,然后列出所有设备。」
>
> 「把卧室灯调到 60 亮度。」——会弹出审批请求;批准后 `mi_get_state` 显示 `brightness: 60`。
>
> 「关掉客厅里所有的灯。」
模拟器里的温度传感器每几秒漂移一次,所以仪表盘和「最近变化」永远有新数据。
**想完全不启动 dsh 就先看效果?** 用浏览器打开 [`docs/demo.html`](docs/demo.html):模拟 DSH 对话(工具卡片 + 审批弹窗),右侧实时控制台直连模拟器做真实调用。
可直接粘贴的配置(演示 / 真实米家 / 关闭审批)见 [`examples/cordis.patch.yml`](examples/cordis.patch.yml)。
## ⚙️ 配置
在 profile 的 `cordis.patch.yml` 中覆盖插件配置(后层覆盖前层):
```yaml
- id: mihome
config:
mode: cloud # cloud 或 demo
region: cn # 米家账号区域:cn / de / ru / us / tw / sg / in…
usernameEnv: MIHOME_USERNAME # 存放账号的环境变量名
passwordEnv: MIHOME_PASSWORD # 存放密码的环境变量名
timeoutMs: 15000
requireApproval: true # 改变状态的调用需要人工批准
allowedCategories: [] # 可控制类别白名单,例如 [light, outlet, climate];留空 = 全部允许
dashboardPropsLimit: 30 # 仪表盘拉取属性的设备上限
recentBufferSize: 50 # 最近变化缓冲大小
```
然后带上环境变量启动:
```sh
MIHOME_USERNAME=<米家账号> MIHOME_PASSWORD=<米家密码> dsh --profile web
```
`username` / `password` 也可以直接写进配置,但**强烈建议**用 `usernameEnv` / `passwordEnv` 走环境变量或 [credentials 接缝](https://github.com/deepseek-ai/deepseek-harness/tree/main/packages/credentials)——凭证每次请求重新解析,轮换无需重启。
## 🔒 安全说明
- **运输安全**:米家云 API 使用账号密码登录换取一次性会话(serviceToken / ssecurity),插件不在本地保存密码,只在使用时通过凭证接缝读取。
- **审批闸门**:`mi_turn` / `mi_control` 永远走 harness 的审批接缝(`requireApproval: true` 默认开启)——agent 不经你同意碰不了你的家。
- **类别白名单**:`allowedCategories` 是第二道保险,设置后其他类别的控制调用直接被拒绝,且设备类别解析失败时**默认拒绝**(最小权限)。
- **账号安全**:建议开启米家 App 的「设备授权」验证;如账号触发验证码/2FA 登录(部分账号会有安全风控),当前版本会给出明确报错——这种情况请用无 2FA 的账号或等待风控解除。
## ⚠️ 已知限制
- 云 API(`account.xiaomi.com` / `api.io.mi.com`)**非官方文档**,接口可能随米家 App 更新而变化;本插件按社区验证过的登录/签名流程实现(参考 [Xiaomi-cloud-tokens-extractor](https://github.com/PiotrMachowski/Xiaomi-cloud-tokens-extractor) / python-miio)。
- 不支持的场景:米家账号需验证码/2FA;分组设备(`get_split_device` 的子设备)属性读取可能受限。
- 本地直连(miIO UDP + 设备 token)规划中,接入后不依赖云端即可控制局域网设备。
## 🛠 开发
```sh
pnpm install
pnpm typecheck # 针对 @deepseek-ai/* 类型做严格 TS 检查
pnpm build # 打包 lib/(ESM + d.ts)
pnpm test # 签名/加密原语 + 演示服务器端到端测试
```
## 📋 兼容性
- Host 端零运行时依赖:Node 内置 `crypto` / `fetch` + 标准库,无 MQTT、无额外守护进程。
- 已针对 npm 发布的 `@deepseek-ai/dsh@0.1.1-rc.2` 类型验证;harness 更新导致不兼容请提 issue。
## 📄 许可证
MIT