[i=s] 本帖最后由 无垠的广袤 于 2025-8-8 22:31 编辑 [/i]
【AiPi-PalChatV1语音开发板】Home Assistant 语音助手
本文介绍了 小安AI - AiPi-PalChatV1 语音开发板通过 MCP 接入 Home Assistant 并实现智能家居终端设备读取和控制的项目设计。
项目介绍
- 环境搭建:Docker、HA、EMQX 部署、MQTT 配置;
- 小智 MCP:HACS 、HA MCP 、Xiaozhi MCP 安装;
- 建立连接:小智与HA连接,配置 HA 语音助手、公开实体;
- 工程测试:流程图、关键代码、MQTTX 通信测试;
- 效果演示:温度传感器的语音读取、开关及 LED 的语音控制、Shell 终端打印 MQTT 消息等。
环境搭建
包括 Docker、HA、EMQX 部署、MQTT 配置等,为 Xiaozhi 的连接提供基础。
Docker
镜像源更换
为了便于后续 EMQX 和 HA 平台部署,需要添加镜像源以加速下载。
- 依次进入
设置
- Docker Engine
添加如下代码
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"debug": true,
"experimental": false,
"insecure-registries": [
"registry.docker-cn.com",
"docker.mirrors.ustc.edu.cn"
],
"registry-mirrors": [
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://dockerproxy.com",
"https://gst6rzl9.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"http://mirrors.ustc.edu.cn/",
"https://mirrors.tuna.tsinghua.edu.cn/",
"http://mirrors.sohu.com/"
]
}
选择 Apply
即可。
HA 部署
docker pull homeassistant/home-assistant:latest
- 待拉取 HA 镜像完成;
- 磁盘根目录创建
homeassistant
文件夹,新建 docker-compose.yaml
文件,并添加如下代码
version: '3'
services:
homeassistant:
image: homeassistant/home-assistant:latest
container_name: homeassistant
restart: always
volumes:
- /data/homeassistant/config:/config
environment:
- TZ=Asia/Shanghai
ports:
- "8123:8123"
- 保存文件,并在终端打开该文件夹,执行
docker compose up -d
指令,完成 HA 容器创建。
- 进入 Containers 容器页面,点击 homeassistant 端口链接,进入 HA 浏览器页面,创建并登录账户;
EMQX 部署
在添加软件镜像源的基础上,终端执行指令
docker pull emqx/emqx:latest
拉取最新版 emqx 镜像
终端执行指令
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest
创建并运行 emqx 容器;
若提示端口被占用报错,可删除已创建的 emqx 容器,进入 Images 标签页,点击 emqx/emqx 镜像对应的启动按钮,手动配置容器名称、Host端口等参数,端口填写 0 ,系统随机分配可用端口。
配置 EMQX
(1)进入 Containers 容器页面,点击 emqx 端口链接,进入 emqx 浏览器页面,初始登录账户名 admin
密码 public
;
(2)依次打开 访问控制
- 客户端认证
- 创建
- Password-Based
- 内置数据库
- (默认配置)- 创建
;
(3)用户管理
- 新建用户
- 自定义用户名和密码 .
MQTT 配置
(1)命令行终端输入 ipconfig
获取本地计算机 IPv4 地址,如 192.168.31.160
(2)配置 Home Assistant ,依次点击设置 - 设备与服务 - 添加集成 - 搜索 MQTT - 填写代理信息。
代理栏输入计算机 IP 地址,端口 1883,用户名和密码为 EMQX 中创建的用户信息。
(3)进入 HA 所在文件夹,打开 configuration.yaml 配置文件,添加温度传感器和开关设备
mqtt:
sensor:
- name: "Temperature"
state_topic: "ha/adc/temp"
suggested_display_precision: 1
unit_of_measurement: "°C"
value_template: "{{ value_json.temperature }}"
switch:
- name: "Switch"
unique_id: "led_switch"
command_topic: "ha/switch/cmd"
state_topic: "ha/switch/state"
payload_on: "ON"
payload_off: "OFF"
retain: true
保存更改并 重新加载配置 以应用更改。
(4)进入 HA 概览页面,编辑仪表盘,添加温度传感器和开关卡片。
小智 MCP
包括 HACS 、HA MCP、Xiaozhi MCP 的安装与参数配置等。
HACS 安装
使用命令行安装;

wget -O - https://get.hacs.vip | bash -
获取 HACS 压缩文件并自动安装

- 待提示安装完成,进入设置,搜索并添加 HACS 集成;
详见:hacs-china: HACS 极速版 .
HA MCP 安装
在安装小智 MCP 之前,需要安装 HA 官方 MCP Server 集成;
- 进入设置,设备与服务,添加集成,搜索 MCP Server 并安装;

- MCP 服务器将在 HA 实例中本地运行,网址为
http://localhost:8123/mcp_server/sse
Xiaozhi MCP 安装
- 在 HACS 中搜索并下载 Xiaozhi MCP,同样进入设置,添加该集成;

- 配置 Xiaozhi MCP 参数,包括 HA 长期访问令牌 (Long-Lived Access Token)、小智 MCP 端点 (Xiaozhi MCP Endpoint);

原理
小智 MCP 接入 HA 运行原理

特点
核心架构特点如下
- 采用官方 MCP 服务器,所有 MCP 功能由官方 Home Assistant MCP 服务器集成提供;
- 作为 SSE 代理,将 MCP 消息通过服务器发送事件转发至官方 MCP 服务器;
- 本地通信安全,所有 Home Assistant 通信通过官方 MCP 服务器在本地进行;
- 无需外部 URL,无需将 Home Assistant 实例暴露至互联网;
详见:小智 MCP 接入 Home Assistant .
GitHub 开源地址: Xiaozhi AI chatbot to Home Assistant via MCP .
建立连接
为了使 Xiaozhi 与目标实体设备建立联系,需要将实体公开。
公开实体
- 进入设置 - 语音助手 - 添加助手,语言为中文;
- 开启公开新实体;

- 进入
公开
标签页面,添加目标实体,如温度传感器、开关等设备;

工程测试
这里使用 MicroPython 开发板作为 HA 终端设备(温度传感器、LED 开关)进行工程测试;
包括流程图、工程代码、固件上传、MQTT 测试等。
流程图

代码
运行 Thonny IDE ,新建文件,添加如下代码
#!/usr/bin/env python3
import json
import network
import time
import random
from machine import Pin, ADC
from umqtt.simple import MQTTClient
# ========== Configuration ==========
WIFI_SSID = "xxx" # wifi name
WIFI_PASS = "xxx" # wifi password
ADC_PIN = 16 # ADC pin
LED_PIN = 3 # LED pin
MQTT_SERVER = "192.168.31.160" # ip address
MQTT_PORT = 32768 # MQTT Broker port
MQTT_USER = "xxx" # MQTT Broker user
MQTT_PASS = "xxx" # MQTT Broker password
MQTT_CLIENT_ID = f"ha-client-{random.getrandbits(8)}"
# MQTT topic
PUB_TOPIC = "ha/adc/temp" # publish topic
SUB_TOPIC = "ha/switch/cmd" # subscribe LED
STATE_TOPIC = "ha/switch/state" # publish LED state
# ============================
led = Pin(LED_PIN, Pin.OUT, value=0) # initialize LED
def wifi_connect():
sta = network.WLAN(network.STA_IF)
sta.active(True)
if not sta.isconnected():
print("Connecting to WiFi...")
sta.connect(WIFI_SSID, WIFI_PASS)
for _ in range(20):
if sta.isconnected():
break
time.sleep(1)
print("WiFi Connected:", sta.ifconfig())
def read_temperature():
adc = ADC(Pin(ADC_PIN))
adc.atten(ADC.ATTN_11DB)
raw = adc.read()
volt = raw / 4095 * 3.3
temp = (volt - 0.5) * 100 - 88 # ADC temperature
return round(temp, 1)
def mqtt_callback(topic, msg):
topic = topic.decode()
msg = msg.decode()
print(f"MQTT Received: {topic} -> {msg}")
if topic == SUB_TOPIC:
if msg == "ON":
led.on()
client.publish(STATE_TOPIC, "ON")
elif msg == "OFF":
led.off()
client.publish(STATE_TOPIC, "OFF")
def mqtt_connect():
client = MQTTClient(
MQTT_CLIENT_ID,
MQTT_SERVER,
MQTT_PORT,
MQTT_USER,
MQTT_PASS,
keepalive=60
)
client.set_callback(mqtt_callback)
client.connect()
client.subscribe(SUB_TOPIC)
print(f"MQTT Connected to {MQTT_SERVER}, subscribed to {SUB_TOPIC}")
return client
def main():
wifi_connect()
global client
client = mqtt_connect()
try:
while True:
client.check_msg() # check MQTT
temp = read_temperature() # read temperature
client.publish(PUB_TOPIC, json.dumps({"temperature": temp}))
time.sleep(1) # delay
finally:
client.disconnect()
print("MQTT Disconnected")
if __name__ == "__main__":
main()
保存代码,配置解释器,运行程序。
MQTTX 测试
- 下载、安装并运行 MQTTX 软件;
- 添加连接,配置 MQTT 通信参数,点击连接;
- 添加订阅主题,包括 ADC 温度传感器、开关控制和状态;
- 设置发送主题,通过消息指令实现开关控制及状态反馈;

效果演示
这里展示小智接入 HA 并获取 ADC 温度传感器数据、以及控制开关 LED 的测试效果。
传感器读取
语音获取温度传感器数值

视频演示
https://www.bilibili.com/video/BV1K6tpzaEJM/
对话:
Q: 你好,小安
A: 我在
Q: 接入家庭助理
A: 已接入 Home Assistant 家庭助理
Q: 温度的值
A: 当前温度是 114.1 摄氏度 …
PS:调整 ADC 温度算法(增加偏移量),以测试小智是否获取 HA 传感器数据并严格执行播报。
语音控制
语音控制 打开
和 关闭
Switch 开关

视频演示
https://www.bilibili.com/video/BV1VstpzkECR/
对话:
Q: 你好,小安
A: 我在
Q: 打开 Switch
A: 好的,正在打开 ……
Q: 关闭 Switch
A: 好的,已关闭 ……
Shell 打印
小智语音发送 MQTT 消息控制开关,同时终端打印通信消息及开关状态

总结
本文介绍了 小安AI - AiPi-PalChatV1 语音开发板通过 MCP 接入 Home Assistant 并实现智能家居终端设备读取和控制的项目设计,为该套件在物联网领域的开发设计及应用提供了参考。