智能家居中控方案:OpenClaw+ollama-QwQ-32B语音控制HomeAssistant
1. 为什么需要AI语音控制智能家居?
去年装修新房时,我安装了二十多个智能设备——从灯光、窗帘到空调地暖。本以为用手机App或语音助手就能轻松控制,实际使用中却遇到三个痛点:
- 跨平台割裂:不同品牌的设备需要打开不同App,米家、HomeKit、涂鸦的指令无法互通
- 自然语言理解差:现有语音助手只能识别固定句式,说"客厅太亮"和"把灯调暗"会被当作不同指令
- 自动化局限:预设的自动化规则无法应对复杂场景,比如"如果室外温度高于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配置时特别注意两点:
- 模型提供商选择"Custom",填入本地ollama服务地址
http://127.0.0.1:11434 - 在
~/.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)作为智能家居中控,需要完成三项配置:
- 长期访问令牌:在HA配置文件
configuration.yaml添加:
homeassistant: auth_providers: - type: trusted_networks trusted_networks: - 192.168.1.0/24 - type: legacy_api_password- API测试:用curl验证基础功能是否正常:
curl -X GET -H "Authorization: Bearer YOUR_TOKEN" \ -H "Content-Type: application/json" \ http://192.168.1.100:8123/api/states- 设备实体注册:将所有智能设备在HA中注册为实体(entity),建议按
区域_功能命名,如livingroom_light、bedroom_curtain
3. 飞书语音控制链路实现
3.1 飞书机器人配置
在飞书开放平台创建自建应用时,最容易出错的是权限配置。必须开启以下权限:
- 获取用户发给机器人的单聊消息
- 以应用身份读取通讯录
- 获取用户在群组中@机器人的消息
关键配置项保存在~/.openclaw/openclaw.json:
"channels": { "feishu": { "enabled": true, "appId": "cli_xxxxxx", "appSecret": "xxxxxx", "encryptKey": "xxxxxx", "verificationToken": "xxxxxx" } }3.2 语音消息处理流程
当用户发送语音消息时,整个处理链路如下:
- 飞书服务器将语音消息转文本后推送到OpenClaw网关
- OpenClaw调用ollama-QwQ-32B进行意图识别,返回结构化指令
- 根据指令匹配HA中的设备实体和操作类型
- 通过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. 最终效果与使用建议
经过两个月的迭代,现在全家人都习惯用飞书语音控制家居设备。典型使用场景包括:
- 晨起模式:说"我醒了"自动执行开窗帘→关夜灯→播报天气→烧热水
- 观影模式:说"看电"自动调暗灯光→降下投影幕布→打开功放(避免误触发"看电影"全称)
- 离家模式:说"出门了"检查所有设备状态,提醒未关闭的电器
对于想尝试类似方案的开发者,我的三点建议:
- 从简单场景入手:先实现"开/关灯"这类明确指令,再扩展复杂意图
- 注重错误处理:网络波动、设备离线等情况要有友好提示
- 建立反馈机制:当模型无法理解指令时,主动询问用户并记录修正
这套方案的独特价值在于:既保留了大模型的理解能力,又通过本地化部署保障了隐私和响应速度。现在我的NUC每天处理约50条语音指令,CPU平均负载不到20%,证明轻量级部署完全可行。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。