lobster-home
by yxy123a
README.md
# Lobster-HomeAgent(龙虾家庭AI管家)
> **English documentation: [README.en.md](README.en.md)**
> ## ⚠️ 强制说明:这是测试版本,请酌情使用
>
> 当前版本 **`v0.1.0-alpha.1` 是测试版本**:只完成了方案的第一阶段,
> 且**从未在真实 Home Assistant 上验证过**(所有测试都跑在内置的模拟环境上)。
>
> **请勿直接用于真实家庭,更不要依赖它做安全相关的判断。**
> 这个软件会向真实设备下发控制指令,一次误判就可能造成后果。
> 燃气、门锁、安防等安全相关设备**默认已被策略拒绝**,
> 但请不要为了"试试看"去放开它们——那是本项目明确不负责的范围。
>
> 使用前请先读 [DISCLAIMER.md](DISCLAIMER.md)(免责声明与安全警告),
> 自行评估风险后酌情决定是否使用。**作者不对使用后果负责。**
> 强烈建议先用 `HA_DRY_RUN=true` 预演模式观察一段时间。
>
> 开发者:**YeXiaoYe** | 联系:**zqjqyq123@qq.com**
基于 OpenClaw 二次开发、MCP 协议驱动、对接 Home Assistant 的全屋 AI 家庭管家。
本仓库是**能力层**:把 Home Assistant 的全屋设备能力,以 MCP 服务 + OpenClaw 插件两种形式暴露给 Agent,
并内置安全策略——**只控制家电类设备**(灯、窗帘、影音、空调等);
燃气、阀门、门锁、安防等安全相关设备**默认直接拒绝**,不交给 AI。
> 只完成方案「第 1-2 个月:基础链路验证」阶段,详见[已知限制](#已知限制重要)。
授权模式为**个人使用免费、企业商用收费**(PolyForm Noncommercial 1.0.0)——
源码可见,但**不是** OSI 认证的开源项目,详见[许可证](#许可证)。
## 当前进度
| 方案阶段 | 内容 | 状态 |
| --- | --- | --- |
| 第 1-2 月 | 基础链路验证:Agent 对接 Home Assistant,聊天控制设备 | ✅ 已完成 |
| 第 3-4 月 | 语音层:离线唤醒、ASR、声纹识别 | ⏳ 待开发 |
| 第 5-6 月 | 场景 Skill:回家 / 离家 / 睡眠 / 安防 | ⏳ 待开发 |
| 第 7-8 月 | 本地多模态、上下文压缩、模型混合路由 | ⏳ 待开发 |
| 第 9-10 月 | 一键部署脚本、文档、Bug 修复 | ⏳ 待开发 |
第一阶段已实现并通过测试的能力:
- **设备控制**:查询实体、查状态、调服务、场景激活、模板统计、历史查询,共 10 个工具。
- **安全策略(范围控制)**:只控制家电类设备。燃气 / 阀门 / 门锁 / 警报 / 安防面板 / 热水器 /
门窗类 cover **默认直接拒绝**,模型连执行入口都拿不到;无法识别的敏感设备走
一次性令牌二次确认;`shell_command` 等能执行任意命令的 domain 一律拒绝。
支持预演模式与 domain 黑白名单,全部规则可配置。
- **两种接入方式**:MCP stdio 服务器(方案里的「MCP 服务层」)与 OpenClaw 原生插件。
- **无硬件开发**:内置 Mock Home Assistant(REST + WebSocket + 区域注册表),没有真设备也能跑通全链路。
- **区域语义**:通过 WebSocket 注册表把「客厅」「主卧」解析成实体,支持自然语言按房间控制。
测试:59 项自动化测试全部通过,含 MCP 协议端到端用例(真起子进程、走完整 JSON-RPC 协议)。
## 已知限制(重要)
请在动手之前先读这一节,**这个版本还不能当作可用的家庭管家**。
| 限制 | 影响 | 说明 |
| --- | --- | --- |
| **未在真实 HA 上验证** | 高 | 所有测试都跑在内置 Mock 上。真实环境的实体命名、区域配置缺失、`device_class` 不规范等情况都可能出问题 |
| **OpenClaw 接入未实测** | 高 | 插件清单与 `openclaw mcp add` 命令是按官方文档写的,还没用真实 CLI 执行过。第一次接入可能需要调整 |
| 语音层完全没有 | 高 | 方案里的离线唤醒、ASR、声纹校验都还没开始,现在只能打字 |
| 没有主动智能 | 中 | 只会「你说什么它做什么」,还不会根据位置/传感器/时间自动执行场景 |
| 没有上下文压缩与模型路由 | 中 | 长对话、隐私数据本地跑、复杂任务上云都还没做 |
| 没有操作审计日志 | 中 | 只有待确认队列,没有 append-only 的操作记录,商用场景的合规需求未满足 |
| 确认队列非持久化 | 低 | 内存或文件实现,进程重启后待确认操作丢失 |
已经做了但没有验证的:断线自动重连、区域过滤、历史查询在真实环境下的表现。
## 故障排查
**`认证失败:HA_TOKEN 无效或已过期`**
长期访问令牌不对或已撤销。在 Home Assistant「个人资料 → 安全性 → 长期访问令牌」重新生成。
注意令牌只在创建时显示一次。
**`无法访问 Home Assistant(...):fetch failed`**
地址不通。确认 `HA_BASE_URL` 带上了端口(`http://homeassistant.local:8123`),
且本机能访问该地址;HA 默认拒绝跨域以外的直连,但局域网内应当可达。
**Agent 说找不到工具 / 工具列表里没有 `ha_*`**
按顺序检查:`openclaw mcp status --verbose` 看 MCP 服务器是否连接成功;
`openclaw mcp tools lobster-home` 看工具是否注册;
再确认没有同时启用 MCP 与插件(两条路工具同名,同时开会冲突)。
**`ha_list_entities` 的 `area` 参数不生效**
区域信息只能通过 WebSocket 注册表获取。如果 WebSocket 连不上(例如只允许 REST 的反向代理),
工具会降级为忽略 `area` 并在返回里注明原因。检查 `ws://` / `wss://` 是否可达。
**高危设备没有被拒绝,或者想控制的设备被拒绝了**
先确认 `HA_POLICY` 或插件 `policy` 配置没有覆盖掉默认规则——
一旦设置了 `denyDomains` / `confirmDomains` / `denyCoverClasses`,
它会**替换**默认值而不是追加。用 `node dist/cli.js doctor` 可以看到当前生效的规则。
想让某类设备从不允许变成允许,改 `denyDomains`;想从"直接执行"变成"必须确认",
改 `confirmDomains`。注意安全兜底:即使把 `lock` 从 `denyDomains` 里去掉,
它仍会强制进入确认流程,不会被静默放行。
**想让 Agent 先"空跑"看看它会做什么**
设 `HA_DRY_RUN=true`(插件配置里是 `dryRun: true`),策略照常判定但不会真正下发指令。
**Windows 上路径含空格**
配置 `mcp.servers` 时 `args` 里的路径要写成 JSON 字符串(含转义反斜杠),
用 `openclaw mcp add` 时把整个路径放在引号里。
## 环境要求
- Node.js **≥ 24.16**(用到原生 TypeScript 运行、内置 WebSocket)
- 一个可访问的 Home Assistant 实例(本地部署即可),或使用内置 Mock 免硬件体验
## 一键安装
**Linux / macOS**
```bash
curl -fsSL https://raw.githubusercontent.com/yxy123a/lobster-homeagent/main/install.sh | bash
```
**Windows(PowerShell)**
```powershell
irm https://raw.githubusercontent.com/yxy123a/lobster-homeagent/main/install.ps1 | iex
```
脚本会检查 Node 版本(需 ≥ 24.16)、拉取代码、安装依赖、构建,并在检测到
`openclaw` 命令与 `HA_BASE_URL` / `HA_TOKEN` 时自动注册 MCP 服务。
不想盲跑脚本的话,先把脚本下载下来看一眼再执行:
```bash
curl -fsSL https://raw.githubusercontent.com/yxy123a/lobster-homeagent/main/install.sh -o install.sh
less install.sh # 看完再执行
bash install.sh
```
常用参数与环境变量:
| | Linux / macOS | Windows |
| --- | --- | --- |
| 指定安装目录 | `--dir /opt/lobster` 或 `LOBSTER_HOME` | `-Dir D:\lobster` 或 `$env:LOBSTER_HOME` |
| 指定版本 | `--ref v0.1.0-alpha.1` | `-Ref v0.1.0-alpha.1` |
| 不注册到 OpenClaw | `--no-register` | `-NoRegister` |
| 装完直接起 Mock 演示 | `--mock` | `-Mock` |
| 卸载 | `--uninstall` | `-Uninstall` |
| 自动注册用 | `HA_BASE_URL` + `HA_TOKEN` | `$env:HA_BASE_URL` + `$env:HA_TOKEN` |
> ⚠️ 安装脚本目前**尚未被任何人实际执行过**(写完之后没跑过,包括作者)。
> 它会在 CI 里做冒烟测试(Linux + Windows 各跑一遍),
> 但第一次在你机器上运行时如果报错,请直接提 issue。
## 快速开始
```bash
# 1. 安装依赖
npm install
# 2. 构建
npm run build
# 3. 无硬件体验:另开一个终端启动 Mock Home Assistant
npm run mock-ha # 默认监听 8123,输出 HA_BASE_URL 与 HA_TOKEN
# 4. 用 CLI 验证链路
set HA_BASE_URL=http://127.0.0.1:8123
set HA_TOKEN=mock-token
node dist/cli.js doctor
node dist/cli.js states light
node dist/cli.js call light turn_on light.zhuwo_deng "{\"brightness_pct\":70}"
```
> Linux / macOS 把 `set VAR=value` 换成 `export VAR=value`。
> 仓库里的代码不依赖任何平台特有 API,Windows / Linux / macOS 都能跑。
接入真实 Home Assistant:在 HA 里「个人资料 → 安全性 → 长期访问令牌」新建令牌,
然后设置 `HA_BASE_URL`(如 `http://homeassistant.local:8123`)与 `HA_TOKEN`。
## 接入 OpenClaw
两种方式注册的工具**完全相同**,二选一即可,同时启用会出现重名工具。
### 方式 A:MCP 服务(推荐,对应方案的「MCP 服务层」)
```bash
# Windows (cmd)
openclaw mcp add lobster-home ^
--command node ^
--arg "C:\path\to\lobster-homeagent\dist\mcp\server.js" ^
--env HA_BASE_URL=http://homeassistant.local:8123 ^
--env HA_TOKEN=<你的长期访问令牌>
# Linux / macOS
openclaw mcp add lobster-home \
--command node \
--arg "/home/pi/lobster-homeagent/dist/mcp/server.js" \
--env HA_BASE_URL=http://homeassistant.local:8123 \
--env HA_TOKEN=<你的长期访问令牌>
# 验证
openclaw mcp status --verbose
openclaw mcp tools lobster-home
```
等价的 `~/.openclaw/openclaw.json` 配置(两种写法等价,用其中一种即可):
```json5
{
mcp: {
servers: {
"lobster-home": {
command: "node",
args: ["C:\\Users\\as\\lobster-homeagent\\dist\\mcp\\server.js"],
env: {
HA_BASE_URL: "http://homeassistant.local:8123",
HA_TOKEN: "你的长期访问令牌"
}
}
}
}
}
```
### 方式 B:OpenClaw 插件(进程内,后续挂 Hook 用这个)
```bash
openclaw plugins install -l "C:\path\to\lobster-homeagent" --force
openclaw plugins enable lobster-homeagent
openclaw plugins inspect lobster-homeagent --runtime --json
```
然后在 `~/.openclaw/openclaw.json` 的 `plugins.entries.lobster-homeagent.config` 里填写:
```json5
{
plugins: {
entries: {
"lobster-homeagent": {
enabled: true,
config: {
haBaseUrl: "http://homeassistant.local:8123",
haToken: "你的长期访问令牌",
dryRun: false
}
}
}
}
}
```
> 为什么两条路都留着:MCP 是方案里的架构主干,跨 Agent 通用;
> 插件是进程内的,后续「上下文压缩」「模型混合路由」需要挂 OpenClaw 的
> `before_prompt_build` / `before_compaction` / `agent_end` 等 Hook,只能在插件里做。
## 工具清单
| 工具 | 作用 | 只读 |
| --- | --- | --- |
| `ha_health` | 连接、版本、实体数量与策略自检 | ✅ |
| `ha_list_entities` | 按 domain / 区域 / 关键词列出实体与状态 | ✅ |
| `ha_get_state` | 查单个实体完整状态与属性 | ✅ |
| `ha_list_services` | 查可用服务及参数 | ✅ |
| `ha_call_service` | 控制家电(敏感设备会返回确认令牌,安全设备直接拒绝) | ❌ |
| `ha_confirm_action` | 用户同意后凭令牌执行敏感操作 | ❌ |
| `ha_list_scenes` | 列出场景 | ✅ |
| `ha_activate_scene` | 激活场景 | ❌ |
| `ha_render_template` | Home Assistant 模板只读统计查询 | ✅ |
| `ha_get_history` | 查实体历史状态变化 | ✅ |
## 控制范围与安全策略
**本项目的定位是控制家电,不是看管家里的安全设备。**
燃气、阀门、门锁、警报、安防面板、热水器、门窗类设备默认**直接被拒绝**,
模型连执行入口都拿不到——不是"确认后可用",而是"不归 AI 管"。
```
模型调用 ha_call_service
│
├── 允许(allow)─────→ 直接执行,返回设备新状态
│
├── 需确认(confirm)──→ 不执行!返回一次性确认令牌与操作摘要
│ 模型必须把操作复述给用户
│ 用户明确同意后调用 ha_confirm_action 才真正执行
│
└── 拒绝(deny)──────→ 直接拒绝并说明原因,不给确认入口
```
**默认拒绝**(不在本项目控制范围内):
- 安全相关 domain:`lock`、`valve`、`siren`、`alarm_control_panel`、`gas`、`water_heater`
- 门窗类 `cover`:`device_class` 为 `window` / `door` / `garage` / `gate`
- 命名命中 `燃气`、`阀门`、`总阀`、`门锁`、`报警`、`烟雾` 等规则的实体
(很多家庭把燃气阀接在 `switch` 上,靠这条兜住)
- 能执行任意命令的 domain:`shell_command`、`python_script`、`command_line`、
`rest_command`、`hassio`、`homeassistant`、`recorder`、`system_log`
**默认放行**(家电类):灯光、窗帘(`curtain` / `blind` / `shade` / `shutter`)、
空调、风扇、影音、扫地机、开关、场景、脚本。
**需要确认**:无法识别类型的 `cover`(比如没设 `device_class` 的投影幕布)。
确认令牌一次性、默认 5 分钟有效、可跨进程传递。
> 想让 AI 控制某个安全设备(例如只在你在家时允许开门锁)?
> 把它从 `denyDomains` 移到 `confirmDomains` 即可,行为会变成"每次执行前必须经你确认"。
> 但请先读 [DISCLAIMER.md](DISCLAIMER.md)——**不建议这么做**。
规则可通过配置覆盖,详见 [docs/safety-policy.md](docs/safety-policy.md)。
## 配置项
| 环境变量 | 插件配置项 | 默认值 | 说明 |
| --- | --- | --- | --- |
| `HA_BASE_URL` | `haBaseUrl` | 必填 | Home Assistant 地址 |
| `HA_TOKEN` | `haToken` | 必填 | 长期访问令牌 |
| `HA_TIMEOUT_MS` | `timeoutMs` | 15000 | 单次请求超时 |
| `HA_DRY_RUN` | `dryRun` | false | 预演模式:只判定与回显,不下发指令 |
| `HA_POLICY` | `policy` | 默认策略 | JSON 形式的安全策略覆盖 |
| `LOBSTER_HA_CONFIG` | — | 无 | 指向 JSON 配置文件,优先级高于环境变量 |
| `LOBSTER_HA_CONFIRM_FILE` | — | 系统临时目录 | CLI 的待确认操作队列文件 |
也兼容 `HOMEASSISTANT_URL` / `HASS_URL`、`HOMEASSISTANT_TOKEN` / `HASS_TOKEN` 别名。
## CLI
```bash
node dist/cli.js doctor # 连接与策略自检
node dist/cli.js states [domain] [--area 客厅] [--search 关键词]
node dist/cli.js get <entity_id>
node dist/cli.js call <domain> <service> [entity_id] [json]
node dist/cli.js confirm <token> # 配合上一条完成敏感操作
node dist/cli.js scenes
node dist/cli.js watch [domain] # 实时订阅状态变化
node dist/cli.js mock-ha [--port 8123] # 启动内置 Mock HA
```
CLI 的确认队列落在文件里(`LOBSTER_HA_CONFIRM_FILE`),因此 `call` 与 `confirm`
分两条命令也能完成一次需要确认的操作。
## 开发
```bash
npm run typecheck # tsc --noEmit
npm test # 59 项测试
npm run build # 输出到 dist/
```
测试不需要任何硬件(全部跑在内置 Mock 上),任何操作系统都能跑。
仓库配了 GitHub Actions(`.github/workflows/ci.yml`),
在 Ubuntu 与 Windows 上各跑一遍类型检查、测试、构建,
并额外验证构建产物 `dist/mcp/server.js` 能作为 MCP 服务器被真实协议调通——
所以不想在本地装环境的话,推上去让 CI 跑就行。
单独验证构建产物:
```bash
# Windows
set LOBSTER_TEST_MCP_ENTRY=%CD%\dist\mcp\server.js
# Linux / macOS
export LOBSTER_TEST_MCP_ENTRY=$PWD/dist/mcp/server.js
node --test test/mcp-server.test.ts
```
## 目录结构
```
src/
core/ 与 Agent 无关的核心(可被任何前端复用)
config.ts 配置加载与校验(环境变量 / JSON 文件 / 插件配置)
policy.ts 风险判定、确认令牌队列(内存版 + 文件版)
gateway.ts 动作网关:串起策略判定、确认流程与实际执行
ha-rest.ts Home Assistant REST 客户端
ha-ws.ts WebSocket 客户端、区域注册表、实时状态缓存
format.ts 面向中文对话的状态格式化
types.ts 领域类型
errors.ts 统一错误与可读翻译
mcp/ MCP 服务层
tools.ts 10 个工具的定义(MCP 与插件共用同一份规格)
server.ts MCP stdio 服务器
plugin/ OpenClaw 插件适配器(进程内)
dev/mock-ha.ts Mock Home Assistant(REST + WebSocket)
cli.ts 调试 CLI
test/ 单元测试与 MCP 协议端到端测试
docs/ 架构、安全策略、路线图
.github/ CI 工作流与 issue 模板
```
根目录的说明性文件:
| 文件 | 内容 |
| --- | --- |
| `LICENSE` | PolyForm Noncommercial 1.0.0 协议全文 |
| `DISCLAIMER.md` | **免责声明与安全警告(使用前必读)** |
| `NOTICE` | 版权声明、开发者信息与授权模式摘要 |
| `COMMERCIAL.md` | 什么算商业用途、如何获取商业授权 |
| `CONTRIBUTING.md` | 开发环境、代码约定、贡献者授权声明 |
| `CHANGELOG.md` | 版本变更记录 |
| `install.sh` / `install.ps1` | 一键安装脚本(Linux/macOS 与 Windows) |
| `openclaw.plugin.json` | OpenClaw 插件清单(工具契约与配置 schema) |
## 文档
- [DISCLAIMER.md](DISCLAIMER.md) —— **免责声明与安全警告(使用前必读)**
- [docs/architecture.md](docs/architecture.md) —— 分层架构与关键设计决策
- [docs/safety-policy.md](docs/safety-policy.md) —— 安全策略细则与配置方式
- [docs/roadmap.md](docs/roadmap.md) —— 后续阶段落点(语音层 / 场景 Skill / 模型路由)
- [CHANGELOG.md](CHANGELOG.md) —— 版本变更记录
- [CONTRIBUTING.md](CONTRIBUTING.md) —— 开发环境、代码约定、贡献者授权声明
- [COMMERCIAL.md](COMMERCIAL.md) —— 商业授权说明
## 许可证
本项目采用 **[PolyForm Noncommercial License 1.0.0](LICENSE)**:
个人及非商业用途免费,企业/商业用途需购买授权。
| 用途 | 是否收费 |
| --- | --- |
| 自己家里用、学习研究、非商业开源项目 | 免费 |
| 企业、门店、民宿、公寓、办公等经营性场所 | **需购买授权** |
| 作为产品的一部分交付给客户、对外提供付费服务、硬件预装 | **需购买授权** |
需要说明的是:这**不是**一份 OSI 认证的开源协议,而是「源码可见 + 非商业免费」的授权模式。
之所以这么选,是因为方案里的商业模式要求「企业商用需付费」——
宽松协议(MIT / Apache-2.0)允许企业免费商用,无法支撑收费;
AGPL-3.0 虽然能迫使企业开源自己的修改,但企业只要愿意开源就依然可以免费商用。
PolyForm Noncommercial 让「个人免费、商用付费」成为可执行的授权条款。
详见 [COMMERCIAL.md](COMMERCIAL.md)。
## 贡献
欢迎帮忙测试和提 issue。当前阶段最有价值的贡献是**真实 Home Assistant 下的兼容性反馈**
——所有测试都跑在 Mock 上,真实环境的问题只有你能发现。
提 PR 前请先读 [CONTRIBUTING.md](CONTRIBUTING.md),
其中包含一条**贡献者授权声明**(因为项目是双授权模式,
提交 PR 即表示同意你的贡献可用于商业授权版本)。
## 开发者与联系方式
| | |
| --- | --- |
| 开发者 | **YeXiaoYe** |
| 邮箱 | **zqjqyq123@qq.com** |
| 项目主页 | https://github.com/yxy123a/lobster-homeagent |
| 问题反馈 | https://github.com/yxy123a/lobster-homeagent/issues |
> 再次强调:**当前是测试版本(v0.1.0-alpha.1),请酌情使用**。
> 使用前请务必阅读 [DISCLAIMER.md](DISCLAIMER.md)。
> 如果你在真实 Home Assistant 上跑通了,或者遇到了问题,欢迎邮件或提 issue 告诉我
> ——这正是当前阶段最需要的信息。
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues