Skip to main content

AI 对话驱动全屋智能

想象一下

清晨,你对着床头的 SenseCAP Watcher 轻语:“Jarvis,早安,今天天气怎么样?顺便帮我打开咖啡机。”(你也可以修改唤醒词为“小智”)

你的 AI 助手立即回应:“早上好!今天天气晴朗,气温预计在 18 到 25 摄氏度。咖啡机已开启,稍后为您准备好香浓的咖啡。”与此同时,客厅的智能灯缓缓亮起,咖啡机也开始运作。

晚上,你回到家,疲惫地说:“Jarvis,我回来了,把客厅灯光调暗一些,并播放一些轻音乐。”

AI 助手理解你的指令,柔和地调整了客厅的灯光,并通过 Home Assistant 控制音响播放起舒缓的音乐。如果你好奇家里的温湿度,只需再问一句:“现在室内温度和湿度是多少?”,它会即时播报相关信息。

更进一步,当你想了解最新的时政动态时,你可以问:“Jarvis,最近有什么我会感兴趣的新闻吗?”

如果你的 Dify 应用配置了相关的知识库(如网页爬虫、Notion 等),AI 助手就能从这些知识库中检索所需的信息,并将最新的动态、资讯或你关心的内容以简明扼要的方式告知你。这不仅让你能够及时获取更新,还能实现个性化的信息推送,提升智能家居的交互体验。

本文将分步骤讲解如何使用 Dify、小智后端服务和 SenseCAP Watcher,将这样一个具备情境理解、设备控制、状态查询乃至知识问答能力的 AI 助手融入你的 Home Assistant 智能家居系统。你将学会如何通过简单的语音交互,让 AI 真正成为你智能生活的得力助手。

准备工作​

请准备如下的物料清单和所需条件:

设备用途
Home Assistant Green提前部署好的 Home Assistant 系统
ReComputer R1000用于部署 Dify、小智服务和 Watcher 进行交互
SenseCAP Watcher人机交互的接口
一台电脑用于访问安装好的应用

除此之外需要保证有稳定的网络连接。

Ⅰ. 安装与部署​

这部分我们会分三步来安装和配置核心组件:

  1. 安装 Dify - AI 应用大脑中枢
  2. 安装小智后端服务 - 连接 AI 与硬件的桥梁
  3. 配置 SenseCAP Watcher - 让语音助手听到你的声音

你可以跳过如下步骤到 Dify 应用编排,如果你已经安装并配置好了 Dify、小智后端服务器以及 SenseCAP Watcher。

安装 Dify​

请先安装 Docker,如果你还没有安装 Docker。

tip

对于中国大陆用户可能需要更新 Docker 镜像源:

bash <(curl -sSL https://linuxmirrors.cn/docker.sh)

请注意:此脚本由第三方提供,此处引用仅作示例,请用户自行评估其适用性与风险。

执行如下的命令安装 Docker,详情请看 Dify Install:

git clone https://github.com/langgenius/dify.git --branch 1.3.1 # 下载 Dify 版本 1.3.1 的代码
cd dify/docker # 进入 Dify 的 Docker 配置目录
cp .env.example .env # 初学者,不需要修改此文件
docker compose up -d

当命令成功执行完毕后,Dify 就应该已经运行起来了。现在,你需要找到运行 Docker 的这台电脑的 IP 地址。

查找 IP 地址
  • 在 Windows 上,打开命令提示符 (CMD) 或 PowerShell,输入 ipconfig,查找“IPv4 地址”。
  • 在 macOS 或 Linux 上,打开终端,输入 ip addr 或 ifconfig,查找你的网络接口对应的 IP 地址 (通常以 192.168.x.x 或 10.x.x.x 开头)。

假设你电脑的 IP 地址是 192.168.101.109,那么在浏览器中访问 http://192.168.101.109/install (首次访问会跳转到初始化安装页面)。

按照页面提示完成管理员账户的创建。之后,你可以通过 http://192.168.101.109 访问 Dify 的主面板。

配置模型供应商​

为了让 Dify 的 AI 应用能够思考和回应,你需要为其接入至少一个“大语言模型供应商”。

  • 登录 Dify 后,在顶部导航栏找到个人头像并点击“设置”。
  • 在左侧菜单中选择“模型供应商”。
  • 这里会列出 Dify 支持的多种模型供应商(如 OpenAI, Azure OpenAI, 火山引擎,MiniMax 等)。选择一个你拥有账户并希望使用的供应商,点击“添加”。
  • 按照界面提示,填入你的模型供应商的 API 密钥 (API Key) 等授权信息。例如,本文选择了“火山引擎”作为示例。

Dify MCP authorize

详情操作请查阅接入大模型简介 - Dify Docs:

新建 Agent 应用​

AI 助手在 Dify 中以“应用 (App)”的形式存在。我们需要创建一个“Agent (智能助手)”类型的应用。

  • 在 Dify 主面板,点击“创建应用”。
  • 选择应用类型为“Agent (智能助手)”。
  • 给你的应用起一个名字(例如:“我的智能管家”),然后点击“创建”。

获取应用 API 密钥​

为了让后续安装的“小智后端服务”能够和这个 Dify 应用通信,我们需要获取该应用的 API 密钥。

创建一个Agent 应用后,点击侧边栏目中终端形似图标,并点击右上角的“API 密钥”进行创建密钥。

  • 进入你刚刚创建的 Agent 应用。
  • 在应用内部的左侧导航栏,找到并点击一个类似“终端”形状的图标,也就是“访问 API”。
  • 在 API 访问页面,点击右上角的“API 密钥”,并点击新提示的“创建密钥”按钮。
  • 系统会生成一串 API 密钥 (也叫 Token),例如 app-T9jHW9pCtj3NVMHHPAPrNFAg。

非常重要:立即复制这串 API 密钥,并粘贴到一个安全的地方(比如记事本),我们马上就会用到它。

加载中...

安装小智后端服务​

小智后端服务是一个专门为 ESP32 系列微控制器(SenseCAP Watcher 就是基于 ESP32S3)设计的服务程序,它可以接收来自硬件的语音数据,进行识别,并将其转发给我们刚刚在 Dify 上创建的 AI 应用。

小智后端服务提供了两种方法进行安装:简化安装、全模块安装,具体请查阅部署方式选择。

我们推荐采用全模块进行安装,能够享受更便捷的体验。

执行如下快速安装脚本

curl -L -o xiaozhi-server-docker-setup.sh https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/main/docker-setup.sh
chmod +x xiaozhi-server-docker-setup.sh
./xiaozhi-server-docker-setup.sh

脚本执行完毕后,会在当前目录下创建一个名为 xiaozhi-server 的文件夹并自动下载小智后端服务所需的文件和基础的语音识别模型。

为了能够有完整功能体验,我们需要采用全模块的配置文件进行安装,请再次执行如下的指令:

cd xiaozhi-server
wget https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/refs/heads/main/main/xiaozhi-server/docker-compose_all.yml
wget https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/refs/heads/main/main/xiaozhi-server/config_from_api.yaml
mv data/.config.yaml data/.config.yaml.bk
mv config_from_api.yaml data/.config.yaml

现在,尝试启动全模块的小智后端服务的容器:

docker compose -f docker-compose_all.yml up -d

执行完后,再执行以下命令,查看日志信息。

docker logs -f xiaozhi-esp32-server-web

当你看到输出日志时,说明你的智控台启动成功了。

2025-xx-xx 22:11:12.445 [main] INFO  c.a.d.s.b.a.DruidDataSourceAutoConfigure - Init DruidDataSource
2025-xx-xx 21:28:53.873 [main] INFO xiaozhi.AdminApplication - Started AdminApplication in 16.057 seconds (process running for 17.941)
http://localhost:8002/xiaozhi/doc.html

现在,你可以访问 http://localhost:8002,登录智控台,并注册第一个用户。第一个用户就是超级管理员,后续只能通过超级管理员创建其他的普通用户。

Docker 8000 端口冲突

小智后端服务默认会使用一些网络端口(例如,Websocket 服务默认使用宿主机的 8000 端口映射到容器的 8000 端口)。如果这些端口已经被你电脑上的其他程序占用了,docker compose up -d 命令可能会失败并提示端口冲突。

此时,你需要编辑 xiaozhi-server 文件夹下的 docker-compose_all.yml 文件。

分别找到 xiaozhi-esp32-server 和 xiaozhi-esp32-server-web 服务的 ports: 部分,例如:

xiaozhi-esp32-server:
ports:
- "8088:8000" # 左边是宿主机端口,右边是容器端口
xiaozhi-esp32-server-web:
ports:
- "8002:8002"
  • 如果 8000 端口冲突,你可以将其修改为其他未被占用的端口,比如 8088,那么配置就变成 - "8088:8000"。修改后保存文件,再重新运行 docker compose up -d。
  • 注意:如果你修改了这里的宿主机端口(例如从 8000 改为 8088),那么在配置/data.config.yaml 和配置 SenseCAP Watcher 时,都要使用对应的新端口号。

步骤 1: 参数管理​

登录超级管理员账号后,在智控台中,顶部菜单找到参数管理,找到列表中第一条数据,参数编码是server.secret,复制它到参数值。

修改 xiaozhi-server 下的 data 目录的 .config.yaml 文件,找到 manager-api 配置项,修改 secret 值为复制的参数值。 同时修改 url 链接为 http://xiaozhi-esp32-server-web:8002/xiaozhi。

manager-api:
url: http://xiaozhi-esp32-server-web:8002/xiaozhi
secret: 12345678-xxxx-xxxx-xxxx-123456789000 # 请替换为你的server.secret值

步骤 2: 配置容器间通信​

由于 Dify 和小智后端服务是分别通过 Docker 启动的,默认情况下它们可能在不同的“虚拟网络”里,无法直接通信。我们需要将 Dify 的 API 服务容器连接到小智服务的网络中。

docker network connect xiaozhi-server_default docker-api-1

此条命令之后,小智服务便可以通过 http://dify-api-1:5001/v1 这个地址访问到 Dify 的 API 服务。

为什么不是 host.docker.internal

你可能会考虑使用 host.docker.internal(一个特殊的 DNS 名称,用于从 Docker 容器内部访问宿主机)作为一种连接方案。然而,请注意,docker-api-1 服务(即 Dify API 容器)并未将其端口映射到宿主机,或者其服务本身不直接监听宿主机的网络接口,那么 xiaozhi-server 容器将无法通过 host.docker.internal:5001 的方式成功访问到 docker-api-1。因此,确保两个容器在同一 Docker 网络并通过服务名通信是更为推荐和可靠的配置方法,尤其是在 docker-api-1 服务主要在容器网络内部提供服务时。

步骤 3: 重启 xiaozhi-esp32-server​

配置了如上信息之后,由于每次“零部署”方式安装小智后端服务,用到了 server.secret 去连接服务,所以此时需要重启小智后端服务来使其生效。

docker restart xiaozhi-esp32-server

查看小智后端服务运行日志 (可选):

如果你想确认小智服务是否正常启动和运行,可以执行以下命令查看实时日志:

docker logs -f xiaozhi-esp32-server

(xiaozhi-esp32-server 是小智服务容器的默认名称。按 Ctrl+C 可以退出日志查看。)

如果你能看到,类似以下日志,则是Server启动成功的标志。

25-02-23 12:01:09[core.websocket_server] - INFO - Websocket地址是      ws://xxx.xx.xx.xx:8000/xiaozhi/v1/
25-02-23 12:01:09[core.websocket_server] - INFO - =======上面的地址是websocket协议地址,请勿用浏览器访问=======
25-02-23 12:01:09[core.websocket_server] - INFO - 如想测试websocket请用谷歌浏览器打开test目录下的test_page.html
25-02-23 12:01:09[core.websocket_server] - INFO - =======================================================

假设你电脑的 IP 地址是 192.168.101.109,那么此时,你的小智后端服务的 OTA 和 Websocket 接口应该分别是:

OTA接口:

http://192.168.101.109:8002/xiaozhi/ota/

Websocket接口:

ws://192.168.101.109:8000/xiaozhi/v1/

记得修改 192.168.101.109 为你的小智服务所在的 IP 地址。

步骤 4: 配置服务连接 Dify​

我们需要告诉小智后端服务如何找到并使用我们之前在 Dify 中创建的 AI 应用,即路由所有 LLMs 请求到 Dify 上,我们需要修改大语言模型的配置;

再次登录到小智后端服务的智控台,在顶部菜单找到模型配置,然后在左侧栏点击大语言模型,找到第一条Dify,点击修改按钮, 弹出修改框后,将你在 Dify 中创建的应用的 API 密钥填写到 API 密钥中。并修改基础 URL 为 http://dify-api-1:5001/v1。

tip

你也可以创建多个 Dify 应用,然后在智控台中创建多个 Dify 大语言模型。

步骤 5: 添加智能体​

点击顶部菜单的智能体,点击添加智能体,任意填写名字,比如Dify_Agent。

在添加的 Dify_Agent 中,点击配置角色进入角色配置,然后修改右侧栏目的大语言模型(LLM) 为 Dify(你之前修改的 Dify 接入配置),其他的功能按需修改,点击保存配置。

我们将在下一节配置助手 Watcher 的时候会用到。

Ⅱ. 配置 SenseCAP Watcher​

现在,我们需要配置 SenseCAP Watcher 设备,让它知道去哪里连接我们刚刚搭建好的小智后端服务。

注意

SenseCAP Watcher 本篇采用的是小智 AI 聊天机器人 1.6.2 版本,如果你使用的是其他版本,可能需要根据你的情况调整配置。

修改 OTA 地址​

上电 SenseCAP Watcher,用任意设备连接到 SenseCAP Watcher 的 WiFi 网络。

连接成功后,访问 192.168.4.1 进行配置 Wi-Fi 热点连接和 OTA 地址。

OTA 地址则应为:

http://IP_地址:端口号/xiaozhi/ota/
  • IP_地址: 替换成运行小智后端服务的那台电脑的局域网 IP 地址(例如 192.168.101.109)。
  • 端口号: 替换成小智后端服务暴露的 OTA 端口号。如果你在上面没有修改过 xiaozhi-server 的 docker-compose.yaml 文件,那么这里就是 8002。如果你修改过(比如改成了 8088),则这里要用你修改后的端口号。

例如:

http://192.168.101.109:8002/xiaozhi/ota/

配置完后并确定后,设备会自动重启,尝试连接到小智后端服务。

当成功连接到 OTA 服务后,Watcher 设备将会播报一个验证码。

这时,在智控台创建的Dify_Agent智能体下,点击设备管理进行设备添加,点击新增,并把设备播报的验证码填入,点击保存。

如上配置完成之后,Watcher 就可以连接到小智后端服务了。

🎉到这里,所有的软件安装和硬件基础配置工作就全部完成了!接下来,我们将专注于在 Dify 平台上“编排”我们的 AI 应用,让它能理解并响应我们的智能家居控制指令。

Ⅲ. Dify 应用编排​

我们回到 Dify 平台,将对之前创建的那个 Agent 应用进行一些设置,让它能够与 Home Assistant 通信并理解我们的指令。

Ⅰ. 添加 MCP 工具​

为了让 Dify 能够控制 Home Assistant 中的设备,我们需要给它添加一个“工具”。这个工具基于 MCP (Meta Control Protocol) 协议。

在 Dify 应用页面的顶部导航栏,找到“工具”选项,搜索“MCP SSE”并下载对应的插件。

配置 MCP 工具连接到 HA​

安装完后,再次点击此工具,它会提示你需要提供 MCP 服务配置信息,以便 Dify 可以通过 MCP 和它通信。根据模板和 MCP Server - Home Assistant,你通常需要填入类似下面这样的 JSON 格式的配置:

{
"Home Assistant": {
"url": "http://your_ha_ip:8123/mcp_server/sse",
"headers": {
"Authorization": "Bearer your_ha_token"
},
"timeout": 10,
"sse_read_timeout": 60
}
}

获取 Home Assistant 的 IP 地址 (your_ha_ip)​

Details

HA 的 IP 地址 如果你的 Home Assistant 运行在 http://homeassistant.local:8123,你可以尝试在电脑的命令行中输入 ping homeassistant.local 来获取其 IP 地址。

也可以通过 http://homeassistant.local:8123/config/network 的 IPV4 的网络接口中看到 homeassistant.local 的 IP 地址信息。

或者登录你的 Home Assistant,通常在“设置” > “系统” > “网络”中可以找到其 IPV4 地址。

假设当前你的 Home Assistant 地址为192.168.101.160,那么你的 SSE URL 就为:

http://192.168.101.160:8123/mcp_server/sse

获取 Home Assistant 的长期访问令牌 (your_ha_token)​

登录你的 Home Assistant。

  • 点击左下角你的用户名,进入“个人资料”页面。或直接访问 http://homeassistant.local:8123/profile/security。
  • 滚动到页面最下方,找到“长期访问令牌”部分。
  • 点击“创建令牌”,给它起一个名字(例如 Dify_MCP),然后点击“确定”。

填充完整的配置信息​

假设你的 Home Assistant IP 是 192.168.101.160,获得的令牌是 eyJhbGciOi...G4s6IQw (这里用省略号代替实际长令牌),那么完整的 JSON 配置应该是:

{
"Home Assistant": {
"url": "http://192.168.101.160:8123/mcp_server/sse",
"headers": {
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJiZGU0ZDQ5YzY4MDA0NjY5YTZkNjVkZWM4NWI1YjRhMiIsImlhdCI6MTc0Njc5OTIyMSwiZXhwIjoyMDYyMTU5MjIxfQ.gL6_wQWt1OixU8vGgz3aXC8q8rmlxzKfSnkyG4s6IQw"
},
"timeout": 10,
"sse_read_timeout": 60
}
}

将这段填写完整的 JSON 配置信息,复制并粘贴到 Dify 中 MCP 工具的授权配置输入框中(替换掉输入框中原有的模板内容),然后点击“保存”或“确定”。如果配置正确,应该会看到授权成功或工具可用的提示。

这样你就可以在你创建的应用中就可以调用 MCP 工具了。

Ⅱ. 编写提示词(Prompt)​

提示词 (Prompt) 是你给 AI Agent 的指令,告诉它扮演什么角色、如何工作、以及有哪些能力和限制。

  • 在 Dify Agent 应用的“编排”或“提示词”设置区域,你会看到一个文本框,可以在这里输入你的提示词。
  • 对于智能家居场景,你可以设计一个简单的提示词,告诉 AI 它可以调用 Home Assistant 工具来控制设备或查询状态。

一个简单的提示词示例:

# 角色
你是一个乐于助人的智能家居助手。

# 工作流程
1. 当用户提出关于控制家里的设备(比如开关灯、调节空调)或查询设备状态的请求时,你需要使用名为 "Home Assistant" 的工具来完成。
2. 首先分析用户的意图,判断需要控制哪个设备以及执行什么操作。
3. 然后生成调用 "Home Assistant" 工具的指令语句。
4. 如果用户只是闲聊,或者提出的问题与智能家居控制无关,请友好地与用户交谈。

# 要求
- 回答尽量简洁明了。
- 你只能控制通过 "Home Assistant" 工具接入的设备。
- 明确告诉用户操作是否成功,或者查询到的信息。

tip

上面这个提示词是一个非常基础的框架。你可以根据你实际的 Home Assistant 设备和希望实现的功能,对这个提示词进行修改和扩展,让它更符合你的需求。

例如,你可以添加更具体的设备名称、房间区域,或者设定 AI 的特定“性格”。

Dify 的提示词编排功能非常强大,支持变量、上下文、知识库等高级特性。你可以查阅 Dify 官方文档 和学习 Prompt Engineering (提示词工程) 的知识来打造更强大的 AI 应用。

编写并保存好你的提示词后,你的 AI 智能家居应用就基本搭建完成了!

开始体验​

现在,拿起你的 SenseCAP Watcher,尝试对它说话,看看你的 AI 智能家居助手是否能够正确响应你的指令,并通过 Home Assistant 控制你的智能设备了!

例如,你可以尝试说:“打开客厅的灯”,或者“现在卧室的温度是多少?” (前提是你已经在 Home Assistant 中配置了这些设备,并且你的提示词和 Dify Agent 能够正确理解和处理这些指令)。

引用​

Q&A​

How to upgrade xiaozhi-esp32-server?

Go to the folder where your Xiaozhi server backend's Docker files are stored.

docker compose -f docker-compose_all.yml down
docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:server_latest
docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:web_latest

Then, update the compose file (if it has been updated) and pull the new image files.

Optional: Update configuration files. For major version updates, the configuration files may differ. Copy the content below as your update script:

#!/bin/bash

# 更新文件的通用函数
update_file() {
local FILE="$1"
local URL="$2"
local BACKUP_SUFFIX=$(date +%Y%m%d%H%M%S).bk
local TEMP_FILE="/tmp/$(basename "$FILE")"

# 确保目标目录存在
local DIR=$(dirname "$FILE")
[ ! -d "$DIR" ] && mkdir -p "$DIR"

# 如果文件不存在,直接下载
if [ ! -f "$FILE" ]; then
wget -O "$FILE" "$URL" && echo "$FILE 不存在,已下载。" && return
fi

# 下载到临时文件并比较差异
wget -O "$TEMP_FILE" "$URL" && diff "$FILE" "$TEMP_FILE" >/dev/null && {
echo "$FILE 没有差异,无需更新。";
rm "$TEMP_FILE";
return;
}
echo "$FILE 存在差异:"
diff "$FILE" "$TEMP_FILE"

# 提示用户是否覆盖
echo -n "覆盖当前文件? (y/n): "
read CONFIRM
if [ "$CONFIRM" != "y" ]; then
echo "$FILE 的更新已取消。"
rm "$TEMP_FILE"
return
fi

# 备份旧文件并替换
cp "$FILE" "$FILE.$BACKUP_SUFFIX" && mv "$TEMP_FILE" "$FILE" && echo "$FILE 已更新并备份为 $FILE.$BACKUP_SUFFIX"
}

# 更新 data/.config.yaml
CONFIG_FILE="data/.config.yaml"
CONFIG_URL="https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/refs/heads/main/main/xiaozhi-server/config_from_api.yaml"
update_file "$CONFIG_FILE" "$CONFIG_URL"

# 更新 docker-compose_all.yml
DOCKER_COMPOSE_FILE="docker-compose_all.yml"
DOCKER_COMPOSE_URL="https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/refs/heads/main/main/xiaozhi-server/docker-compose_all.yml"
update_file "$DOCKER_COMPOSE_FILE" "$DOCKER_COMPOSE_URL"

echo "所有文件更新完成!"
docker compose -f docker-compose_all.yml up -d
Loading Comments...