智能家居中控方案:OpenClaw+ollama-QwQ-32B语音控制HomeAssistant

1. 为什么需要AI语音控制智能家居?

去年装修新房时,我安装了二十多个智能设备——从灯光、窗帘到空调地暖。本以为用手机App或语音助手就能轻松控制,实际使用中却遇到三个痛点:

  1. 跨平台割裂:不同品牌的设备需要打开不同App,米家、HomeKit、涂鸦的指令无法互通
  2. 自然语言理解差:现有语音助手只能识别固定句式,说"客厅太亮"和"把灯调暗"会被当作不同指令
  3. 自动化局限:预设的自动化规则无法应对复杂场景,比如"如果室外温度高于28度且有人在家,就把客厅空调开到26度"

直到发现OpenClaw+ollama-QwQ-32B这个组合,才真正实现"说人话控制全家设备"。这套方案的核心优势在于:

  • 意图理解:32B参数的大模型能准确解析"我睡觉了"背后的意图(关灯+关窗帘+开睡眠模式)
  • 本地化执行:所有数据处理和设备控制都在本地网络完成,响应速度在300ms内
  • 可扩展性:通过飞书语音消息触发,无需额外硬件,后续可接入更多设备类型

2. 基础环境搭建

2.1 组件选型与部署

我的硬件配置是一台Intel NUC迷你主机(i5-1135G7/16GB内存),作为家庭服务器常年开机。关键组件部署如下:

# 在NUC上部署ollama-QwQ-32B
curl -fsSL https://ollama.ai/install.sh | sh
ollama pull qwq-32b

# 安装OpenClaw(使用国内镜像加速)
npm install -g @qingchencloud/openclaw-zh@latest
openclaw onboard --mode=Advanced

配置时特别注意两点:

  1. 模型提供商选择"Custom",填入本地ollama服务地址http://127.0.0.1:11434
  2. ~/.openclaw/openclaw.json中增加QwQ-32B的模型定义:
"models": {
  "providers": {
    "ollama-local": {
      "baseUrl": "http://127.0.0.1:11434",
      "api": "openai-completions",
      "models": [
        {
          "id": "qwq-32b",
          "name": "QwQ-32B-Local",
          "contextWindow": 32768
        }
      ]
    }
  }
}

2.2 HomeAssistant对接

HomeAssistant(HA)作为智能家居中控,需要完成三项配置:

  1. 长期访问令牌:在HA配置文件configuration.yaml添加:
homeassistant:
  auth_providers:
    - type: trusted_networks
      trusted_networks:
        - 192.168.1.0/24
    - type: legacy_api_password
  1. API测试:用curl验证基础功能是否正常:
curl -X GET -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  http://192.168.1.100:8123/api/states
  1. 设备实体注册:将所有智能设备在HA中注册为实体(entity),建议按区域_功能命名,如livingroom_lightbedroom_curtain

3. 飞书语音控制链路实现

3.1 飞书机器人配置

在飞书开放平台创建自建应用时,最容易出错的是权限配置。必须开启以下权限:

  • 获取用户发给机器人的单聊消息
  • 以应用身份读取通讯录
  • 获取用户在群组中@机器人的消息

关键配置项保存在~/.openclaw/openclaw.json

"channels": {
  "feishu": {
    "enabled": true,
    "appId": "cli_xxxxxx",
    "appSecret": "xxxxxx",
    "encryptKey": "xxxxxx",
    "verificationToken": "xxxxxx"
  }
}

3.2 语音消息处理流程

当用户发送语音消息时,整个处理链路如下:

  1. 飞书服务器将语音消息转文本后推送到OpenClaw网关
  2. OpenClaw调用ollama-QwQ-32B进行意图识别,返回结构化指令
  3. 根据指令匹配HA中的设备实体和操作类型
  4. 通过HA API执行设备控制

我开发了一个简单的意图识别prompt模板:

你是一个智能家居控制助手,请将用户指令转换为JSON格式。可操作设备包括:
{设备列表}

示例输入:"客厅太热了"
示例输出:{"action":"adjust","device":"livingroom_ac","value":"-2"}

当前输入:{用户指令}

实际运行效果测试:

# 测试指令解析
curl -X POST http://127.0.0.1:18789/api/parse \
  -H "Content-Type: application/json" \
  -d '{"text":"卧室窗帘拉开一半"}'

# 返回结果示例
{
  "action": "set",
  "device": "bedroom_curtain",
  "value": 50
}

4. 实战问题与解决方案

4.1 多意图指令处理

初期遇到复杂指令如"打开客厅灯和空调,窗帘留个缝"时,模型会返回单个操作。解决方案是在prompt中明确要求批量输出:

def parse_complex_command(text):
    prompt = f"""将指令拆分为独立操作步骤:
输入:{text}
输出格式:
```json
[
  {{"action":"..","device":"..","value":".."}},
  ...
]
```"""
    response = ollama.generate(prompt)
    return json.loads(response)

4.2 设备状态同步

为避免"关已经关闭的灯"这类操作,需要先获取设备状态。我在OpenClaw中增加了预检查逻辑:

async function executeAction(action) {
  const currentState = await haApi.getState(action.device);
  if (action.action === 'turn_off' && currentState === 'off') {
    return { skipped: true };
  }
  return haApi.callService(action);
}

4.3 意图识别优化

通过收集飞书聊天记录中的真实指令,持续优化训练数据。发现中文用户常用隐含意图表达,例如:

  • "有点闷" → 开窗/开空气净化器
  • "我要看电影" → 关灯+降窗帘+开投影仪
  • "起床了" → 开窗帘+关夜灯+播报天气

这些场景需要人工标注后加入few-shot示例:

examples:
  - input: "空气不太好"
    output: {"action":"turn_on","device":"air_purifier"}
  - input: "准备睡觉"
    output: [
        {"action":"turn_off","device":"livingroom_light"},
        {"action":"close","device":"bedroom_curtain"}
      ]

5. 最终效果与使用建议

经过两个月的迭代,现在全家人都习惯用飞书语音控制家居设备。典型使用场景包括:

  • 晨起模式:说"我醒了"自动执行开窗帘→关夜灯→播报天气→烧热水
  • 观影模式:说"看电"自动调暗灯光→降下投影幕布→打开功放(避免误触发"看电影"全称)
  • 离家模式:说"出门了"检查所有设备状态,提醒未关闭的电器

对于想尝试类似方案的开发者,我的三点建议:

  1. 从简单场景入手:先实现"开/关灯"这类明确指令,再扩展复杂意图
  2. 注重错误处理:网络波动、设备离线等情况要有友好提示
  3. 建立反馈机制:当模型无法理解指令时,主动询问用户并记录修正

这套方案的独特价值在于:既保留了大模型的理解能力,又通过本地化部署保障了隐私和响应速度。现在我的NUC每天处理约50条语音指令,CPU平均负载不到20%,证明轻量级部署完全可行。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐