第 3 课 自然语言控制全屋设备

第 3 课 自然语言控制全屋设备

本课目标

  • 实现灯光 / 空调 / 窗帘等常见设备的自然语言控制
  • 掌握复合指令的解析与执行
  • 构建设备别名与房间映射系统

小赵的第一个周末

经过上一课的环境搭建,小赵已经能在 Telegram 上发"打开客厅灯"了。但妻子小李试了一下,发现说法稍微不同就不行。她想说"把灯开一下",Agent 却不理解。

小赵意识到:自然语言控制不是"关键词匹配",需要一套完整的意图识别体系。


3.1 自然语言控制原理

用户:"把客厅灯调暗一点"

┌─────────────┐
│ Hermes Agent │
│             │
│ 意图识别:   │
│  动作=调节亮度│
│  设备=客厅灯 │
│  方向=调暗   │
│  幅度=适当   │
│             │
│ 推理+执行:  │
│  当前亮度 80% │
│  → 调到 40%  │
└──────┬──────┘
       │ MCP 调用
       ▼
  light.turn_on
  entity_id: light.living_room_ceiling
  brightness_pct: 40

关键能力

能力 说明 示例
意图识别 理解用户想要做什么 “开灯” → turn_on
设备映射 找到对应的 Entity “客厅灯” → light.living_room_ceiling
参数推理 补全缺失的参数 “调暗” → 当前的 50%
上下文记忆 记住之前的对话 “那个也调暗” → 同一个灯

3.2 灯光控制

基本操作

✅ "打开客厅灯"
✅ "关闭卧室灯"
✅ "把书房灯调到 60%"
✅ "客厅灯调暗一些"
✅ "全部关灯"

色温控制

✅ "客厅灯调成暖色"     → 色温 3000K
✅ "书房灯白一点"       → 色温 5000K
✅ "卧室灯调到 3200K"   → 精确色温

小赵在 SOUL.md 中设置了偏好:

## 灯光偏好
- "暖色"/"暖光" → 3000K
- "白光"/"冷色" → 4500K
- "阅读模式" → 4000K 亮度 70%
- "电影模式" → 2700K 亮度 15%

亮度智能推理

你:"灯太亮了"
Agent:
  → 当前亮度 100% → 调到 50%
  → "已将客厅灯亮度从 100% 调到 50%"

你:"还是太亮"
Agent:
  → 当前亮度 50% → 调到 20%
  → "已调到 20%,如需进一步调整请告诉我"

3.3 空调控制

基本操作

✅ "开空调"              → 使用上次温度
✅ "空调调到 25 度"       → 精确温度
✅ "开暖风"              → 制热模式
✅ "空调风大一点"         → 风速调高
✅ "关空调"              → 关闭

模式映射

小赵在 SOUL.md 中配置了空调映射:

## 空调设置
| 指令 | 模式 | 温度 | 风速 |
|------|------|------|------|
| "开空调" | 上次模式 | 上次温度 | auto |
| "开冷气/制冷" | cool | 25°C | auto |
| "开暖风/制热" | heat | 22°C | auto |
| "除湿" | dry | - | low |
| "睡眠模式" | cool/heat | 26°C | quiet |

上下文推理

你:"有点冷"
Agent 推理:
  → 查传感器:客厅 20°C
  → 空调状态:开着制冷 24°C
  → 动作:调到 26°C
  → "客厅温度 20°C,已将空调从 24°C 调到 26°C"

你:"卧室也是"
Agent 推理:
  → 上下文=调高温度
  → 卧室空调也调到 26°C

3.4 窗帘与其他设备

窗帘控制

✅ "拉开客厅窗帘"       → 全开
✅ "关上卧室窗帘"       → 全关
✅ "窗帘开一半"         → 50%

扫地机器人

✅ "扫地机开始工作"     → 全屋清扫
✅ "清扫客厅"           → 指定区域
✅ "扫地机回去充电"     → 回充
✅ "扫地机暂停"         → 暂停

设备别名系统

小赵发现妻子的叫法和自己不一样:

## 设备别名(SOUL.md)
- "大灯"/"主灯" → light.living_room_ceiling
- "灯带"/"氛围灯" → light.living_room_strip
- "小灯"/"床头灯" → light.bedroom_bedside
- "机器人"/"扫地的" → vacuum.roborock
- "窗帘" → 根据上下文判断哪个房间

3.5 复合指令

多设备联动

你:"把客厅调成电影模式"

Agent 执行:
  1. 客厅吸顶灯 → 关闭
  2. 灯带 → 10% 亮度,暖黄色(2700K)
  3. 窗帘 → 关闭
  4. 空调 → 25°C 静音模式
  → "电影模式已开启:灯带柔光,窗帘已拉上,空调静音"

条件指令

你:"如果外面温度超过 30 度就开空调"

Agent 推理:
  → 查询室外温度传感器
  → 当前 32°C → 满足条件
  → 开启空调制冷 25°C
  → "室外 32°C,已开启客厅空调制冷 25°C"

模糊指令

你:"我要看书了"

Agent 推理(基于 SOUL.md 偏好):
  → 用户在书房
  → 书房台灯 → 70% 亮度,4000K 色温
  → 书房窗帘 → 全开(如果白天)或 全关(如果晚上)
  → "阅读模式已开启"

3.6 动手练习

练习 1:灯光控制

分别尝试以下指令:
1. "打开客厅灯"
2. "客厅灯暗一点"
3. "把灯调成暖色"
4. "关掉所有灯"

练习 2:空调控制

1. "开空调"
2. "太冷了"(不指定设备,让 Agent 推理)
3. "空调设为睡眠模式"

练习 3:复合指令

1. "我要睡觉了"
2. "准备出门"
3. "外面下雨了"(期望 Agent 关窗帘)

练习 4:设备别名

SOUL.md 中添加你自己的设备别名,然后测试各种叫法是否都能识别。


本课小结

要点 内容
控制原理 意图识别 → 设备映射 → 参数推理 → API 调用
灯光控制 开关/亮度/色温/颜色,支持模糊指令
空调控制 温度/模式/风速,上下文推理
复合指令 一句话触发多设备联动
别名系统 SOUL.md 中配置,适配不同叫法

下一课:智能场景编排——一句话启动整套生活方式。