乐于分享
好东西不私藏

单片机+OpenClaw打造智能家居控制中心:从零到一的详细教程

单片机+OpenClaw打造智能家居控制中心:从零到一的详细教程

> 阅读时长:约 20 分钟   

> 难度级别:中级(需要基础嵌入式开发知识)

> 适用人群:嵌入式开发者、智能家居爱好者、AI 应用探索者

前言:为什么是「单片机 + OpenClaw」? 

传统智能家居系统有两个让人头疼的问题: 

1. 生态封闭:小米、华为、苹果各自为政,设备互联靠”缘分”; 

2. 中心化依赖:云端宕机,全屋瘫痪,你的家成了”数字孤岛”。 

2026 年,OpenClaw 的出现彻底改变了这一局面。这款开源 AI 智能体框架,不仅支持自然语言操控设备,还能本地化部署、私有化运行——你的数据,真正留在自己手里。

而当我们把OpenClaw的”大脑”与ESP32单片机的”神经末梢”结合起来,一套成本不超过¥200、却能媲美商业方案的智能家居系统就诞生了。

本文将带你完整走完这条路:

从单片机硬件选型,到OpenClaw系统部署,再到智能家居场景联动,每一步都有代码、有图解、有避坑指南,非常适合DIY的伙伴们。 

一、系统架构总览

在动手之前,先理清整个系统的骨架

三层架构说明

二、硬件准备:ESP32选型与外设清单

2.1主控芯片选型ESP32家族有多款型号,根据场景选择:

2.2外设清单(一套完整智能家居节点)基础硬件清单(单节点):

2.3引脚连接图

三、固件开发

让ESP32成为智能节点我们使用ESPHome框架——无需手写C++代码,用YAML配置即可让ESP32接入Home Assistant。 

3.1安装ESPHome

```bash # 方法一:pip 安装(推荐) pip install esphome
# 方法二:Docker 安装 docker pull ghcr.io/esphome/esphomedocker run --rm -v "${PWD}":/config -it ghcr.io/esphome/esphome run bedroom-node.yaml

3.2 编写节点配置文件

创建文件 `bedroom-node.yaml`:  ```yaml # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # 卧室智能节点配置 # 功能:温湿度监测 + 人体感应 + 灯光控制 # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  esphome:     name: bedroom-node    friendly_name: 卧室智能节点esp32:    board: esp32dev     framework:        type: arduino # ─── Wi-Fi 配置 ─────────────────── wifi:       ssid: !secret wifi_ssid          # 在 secrets.yaml 中存放       password: !secret wifi_password    ap:          # 失联时启动热点             ssid: "Bedroom-Node-Fallback"        password: "esp32fallback"captive_portal:  # ─── MQTT 配置(连接 Home Assistant)── mqtt:  broker: 192.168.1.100            # Home Assistant IP  port: 1883  username: !secret mqtt_user  password: !secret mqtt_password  topic_prefix: home/bedroom# ─── 日志 ──────────────────────── logger:   level: INFO  # ─── Home Assistant API ───────────api:  encryption:         key: !secret api_encryption_keyota:  password: !secret ota_password# ─── 传感器配置 ──────────────────  # 温湿度传感器(DHT22)sensor:     - platform: dht    pin: GPIO4    model: DHT22    temperature:    name: "卧室温度"    id: bedroom_temp    unit_of_measurement: "°C"    accuracy_decimals: 1    on_value:             - if:        condition:          sensor.in_range:            id: bedroom_temp            above: 28.0                     then:                         - switch.turn_on: fan_relay          - logger.log: "温度过高,自动开启风扇"    humidity:      name: "卧室湿度"      unit_of_measurement: "%"        update_interval: 30s# ─── 二进制传感器(人体感应)─────  binary_sensor:     - platform: gpio         pin:      number: GPIO13      mode: INPUT    name: "卧室人体感应"    id: pir_sensor    device_class: motion    filters:             - delayed_off: 30s          # 无人后延迟 30s 关闭    on_press:             - logger.log: "检测到人体,执行欢迎场景"             - switch.turn_on: light_relay_1         on_release:             - logger.log: "人员离开,关闭灯光"             - switch.turn_off: light_relay_1  # ─── 开关控制(继电器)─────────  switch:  - platform: gpio    pin: GPIO16    name: "主灯"    id: light_relay_1    icon: mdi:ceiling-light    restore_mode: RESTORE_DEFAULT_OFF  - platform: gpio    pin: GPIO17    name: "床头灯"    id: light_relay_2    icon: mdi:floor-lamp    restore_mode: RESTORE_DEFAULT_OFF  - platform: gpio    pin: GPIO18    name: "风扇"    id: fan_relay    icon: mdi:fan    restore_mode: RESTORE_DEFAULT_OFF# ─── OLED 状态显示 ──────────────i2c:  sda: GPIO21  scl: GPIO22display:  - platform: ssd1306_i2c    model: "SSD1306 128x64"    address: 0x3C    lambda: |-      it.printf(0, 0, id(font_small), "卧室节点 Online");             it.printf(0, 16, id(font_small), "温度: %.1f °C", id(bedroom_temp).state);             it.printf(0, 32, id(font_small), "IP: %s", WiFi.localIP().toString().c_str());  font:  - file: "gfonts://Roboto"         id: font_small         size: 12    ```
 创建secrets.yaml(不要提交到版本控制!):

```xxx.yaml

wifi_ssid"你的WiFi名称" wifi_password"你的WiFi密码" mqtt_user"homeassistant" mqtt_password"你的MQTT密码" api_encryption_key"随机32字节Base64密钥" ota_password"OTA更新密码"  

3.3 烧录固件

bash # 首次烧录(USB 连接)esphome run bedroom-node.yaml# 后续OTA无线更新esphome run bedroom-node.yaml --device 192.168.1.x```  #烧录成功后,串口监视器会输出:``` [I][wifi:285]: Connected to WiFi! IP: 192.168.1.105[I][mqtt:255]: MQTT Connected![I][app:102]: Home Assistant API Connected!```---  ## 

四、Home Assistant搭建:设备接入中枢

Home Assistant(HA)是连接ESP32节点与OpenClaw的关键桥梁。

4.1 安装Home Assistant(Docker 方式)

```bash# 创建数据目录 mkdir -p /opt/homeassistant/config# 启动容器 docker run -d \    --name homeassistant \       --privileged \       --restart=unless-stopped \    -e TZ=Asia/Shanghai \       -v /opt/homeassistant/config:/config \    -v /run/dbus:/run/dbus:ro \    --network=host \    ghcr.io/home-assistant/home-assistant:stable ``` 

 访问 `http://localhost:8123` 完成初始化向导。  

4.2 配置MQTT Broker

在HA中安装Mosquitto Broker插件:

1. 进入设置 → 加载项 → 加载项商店 

2. 搜索并安装”Mosquitto broker”

3. 在配置页面添加用户:

“`yaml 

# Mosquitto 配置logins:     - username: homeassistant    password: your_mqtt_passwordanonymous: falsecustomize:  active: false     folder: mosquittocertfile: fullchain.pemkeyfile: privkey.pem ```

4.3 创建OpenClaw 访问令牌

OpenClaw 通过 HA 的 REST API 控制设备,需要长期访问令牌:

1. 进入个人资料 → 长期访问令牌 

2. 点击「创建令牌」,命名为 “openclaw-token”

3. 保存好生成的 Token(只显示一次!)  

“` 

示例 Token:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYWFiYmJjY2NkZGRl... ``` 

4.4 测试 API 连通性

```bash# 测试 HA API 是否可访问curl -X GET \  http://192.168.1.100:8123/api/ \       -H "Authorization: Bearer <YOUR_TOKEN>" \       -H "Content-Type: application/json"# 预期响应 {"message""API running."}# 查看所有设备状态 curl -X GET \  http://192.168.1.100:8123/api/states \     -H "Authorization: Bearer <YOUR_TOKEN>" ``` 

五、OpenClaw系统部署

5.1 环境要求

组件

最低要求

推荐配置

操作系统

Linux/macOS/Windows

Ubuntu 22.04 LTS

CPU

2 核

4 核+

内存

2GB

8GB

Node.js

v20+

v22 LTS

网络

能访问 LLM API

局域网或内网穿透

5.2 安装 OpenClaw

```bash # 安装 Node.js(Ubuntu)curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash - sudo apt install -y nodejs  # 配置国内镜像加速npm config set registry https://registry.npmmirror.com# 全局安装 OpenClawnpm install -g openclaw@latest# 验证安装openclaw --version ```  ### 5.3 初始化配置```bash # 创建工作目录mkdir ~/openclaw-home && cd ~/openclaw-home# 交互式初始化openclaw setup```  初始化过程中配置以下内容:``` ? 选择 AI 模型提供商: ❯ 智谱 GLM-4 (国内推荐)                                                   OpenAI GPT-4o                        Anthropic Claude 3.5                        本地 Ollama? 智谱 API Key: xxxxxxxxxxxxxxxxxxxxxxxx? Gateway 监听端口: 18789  ? 是否启用 Web 界面: ❯ 是  ? 管理员密码: ************ ```  ### 5.4 启动服务```bash # 前台运行(调试用)openclaw start  # 后台守护进程openclaw start --daemon# 查看运行状态 openclaw status# 生成访问 Tokenopenclaw token create --admin --expires-in 30d```

成功启动后访问:http://服务器IP:18789

5.5 配置 LLM 模型(以智谱 GLM-4 为例)

编辑 `~/openclaw-home/config.yml`:

“`yaml

# OpenClaw 主配置文件name: 家庭AI助手models:  - provider: zhipu    api_key: ${ZHIPU_API_KEY}    model: glm-4    temperature: 0.3          # 智能家居场景建议低温,减少幻觉    max_tokens: 2048gateway:  port: 18789  auth_required: true  cors_origins:    - "http://localhost:3000"    - "http://192.168.1.0/24"workspace:    path: ./workspace    skills_path: ./workspace/skillslogging:  level: info  file: ./logs/openclaw.log```  

六、配置智能家居 Skill:打通 AI 与设备

Skill是OpenClaw的”技能包”,告诉AI如何与外部系统交互。

6.1 创建 Home Assistant Skill

```bash mkdir -p ~/openclaw-home/workspace/skills/homeassistant```创建 `~/openclaw-home/workspace/skills/homeassistant/SKILL.md`:````markdown # Home Assistant 智能家居控制技能## 能力说明 你可以通过 Home Assistant REST API 控制家中的所有智能设备,包括:- 灯光(开/关/调光/调色) - 传感器数据读取(温度、湿度、人体感应) - 开关插座 - 窗帘、门锁  ## 环境变量 - HA_URL: Home Assistant 的完整地址(如 http://192.168.1.100:8123) - HA_TOKEN: 长期访问令牌## 控制设备### 1. 获取设备状态```bashcurl -s -X GET "${HA_URL}/api/states/${entity_id}" \  -H "Authorization: Bearer ${HA_TOKEN}" \     -H "Content-Type: application/json" ```  ### 2. 打开/关闭开关类设备 ```bash# 打开设备curl -X POST "${HA_URL}/api/services/switch/turn_on" \  -H "Authorization: Bearer ${HA_TOKEN}" \  -H "Content-Type: application/json" \     -d '{"entity_id": "switch.主灯"}'# 关闭设备curl -X POST "${HA_URL}/api/services/switch/turn_off" \  -H "Authorization: Bearer ${HA_TOKEN}" \  -H "Content-Type: application/json" \  -d '{"entity_id": "switch.主灯"}' ```  ### 3. 控制灯光(含亮度) ```bashcurl -X POST "${HA_URL}/api/services/light/turn_on" \  -H "Authorization: Bearer ${HA_TOKEN}" \  -H "Content-Type: application/json" \  -d '{"entity_id": "light.卧室主灯", "brightness_pct": 60, "color_temp": 4000}' ```### 4. 执行场景 ```bashcurl -X POST "${HA_URL}/api/services/scene/turn_on" \  -H "Authorization: Bearer ${HA_TOKEN}" \  -H "Content-Type: application/json" \  -d '{"entity_id": "scene.回家模式"}'   ```  ### 5. 语音播报(通过智能音箱)```bash curl -X POST "${HA_URL}/api/services/tts/cloud_say" \  -H "Authorization: Bearer ${HA_TOKEN}" \  -H "Content-Type: application/json" \  -d '{"entity_id": "media_player.客厅音箱", "message": "播报内容", "language": "zh-cn"}' ```

设备实体ID映射表

设备名称

Entity ID

类型

卧室主灯

switch.bedroom_main_light

switch

客厅灯

light.living_room

light

卧室温度

sensor.bedroom_temp

sensor

卧室湿度

sensor.bedroom_humidity

sensor

卧室人体感应

binary_sensor.bedroom_pir

binary_sensor

客厅风扇

switch.fan_relay

switch

入户门锁

lock.front_door

lock

使用规则

1. 控制设备前,先用GET确认设备当前状态 

2. 批量控制时,使用`entity_id`数组:`[“switch.light1”, “switch.light2”]` 

3. 睡眠模式下,只接受指定设备的控制指令,避免误操作 

4. 如遇到401错误,说明Token已过期,需要重新生成

6.2 设置环境变量

```bash # 在 .bashrc 或 .zshrc 中添加export HA_URL="http://192.168.1.100:8123"export HA_TOKEN="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."export ZHIPU_API_KEY="你的智谱API密钥"# 刷新配置source ~/.bashrc# 验证 echo $HA_URL ```

6.3 启用 Skill

在OpenClaw WebUI中:  

1. 进入「技能管理」 

2. 点击「从本地目录加载」 

3. 选择 `~/openclaw-home/workspace/skills/homeassistant` 

4. 点击「启用」  

七、实战场景演示

系统搭建完毕,来看几个真实的使用场景。

场景一:早晨起床自动化

你对OpenClaw说:早上7点,帮我设置一个起床场景:先把卧室灯调到30% 亮度,5分钟后调到80%,同时播报今日天气和温度。 OpenClaw 执行流程:1[分析意图] 创建定时自动化,包含灯光渐亮+语音播报 2[查询当前状态] GET /api/states/light.bedroom 3[创建自动化规则]    POST /api/services/automation/trigger    {  "trigger": {"platform": "time""at""07:00:00"},  "action": [            {"service": "light.turn_on""data"    {"brightness_pct": 30}},            {"delay": "00:05:00"},            {"service": "light.turn_on""data": {"brightness_pct": 80}},    {"service": "tts.cloud_say""data": {"message": "早上好!今天气温22°C,晴天。"}}        ]    4[确认执行] ✅ 起床场景已创建,明早 7:00 生效 
场景二:根据传感器数据联动
你对OpenClaw说:查看卧室现在的温度,如果超过 26 度就开风扇, 同时告诉我当前各房间的温度情况。  OpenClaw执行流程:1.[读取传感器]         GET /api/states/sensor.bedroom_temp → 28.3°C    GET /api/states/sensor.living_room_temp → 25.1°C    GET /api/states/sensor.kitchen_temp → 26.8°C  2.[判断条件]卧室 28.3°C > 26°C,触发联动3.[执行控制]POST /api/services/switch/turn_on{"entity_id": "switch.bedroom_fan"}  4.[语音播报]各房间温度情况:- 卧室:28.3°C(已自动开启风扇)    - 客厅:25.1°C(正常)    - 厨房:26.8°C(偏高) 

 场景三:离家安防模式

你对 OpenClaw 说: 我要出门了,帮我执行离家模式。OpenClaw 执行流程:1[理解意图] 触发离家场景2[批量关闭]    关闭所有灯光 → entity_id: ["switch.bedroom_light",                                                                   "switch.living_room_light",                                                                "switch.kitchen_light"]  3. [安全检查]    检查门窗传感器状态...        ⚠️ 厨房窗户未关闭,提示用户确认4. [启用监控]     启用摄像头录制模式    开启人体感应告警推送5. [确认反馈]    离家模式已激活:    ✅ 全屋灯光已关闭    ⚠️ 厨房窗户请检查    ✅ 安防系统已启动 

八、进阶优化:MimiClaw 边缘 AI 方案

当你有大量节点时,让每个ESP32都通过Home Assistant中转会增加延迟。MimiClaw是OpenClaw 生态中专为单片机设计的轻量AI代理,可以让ESP32直接理解自然语言指令。  

8.1 MimiClaw 核心特性

特性

数值

目标芯片

ESP32(及ESP32-S3支持AI加速)

运行环境

FreeRTOS

活跃功耗

0.5W

深睡功耗

0.01W

本地存储

4MB SPIFFS

通信协议

Wi-Fi 802.11b/g/n + BLE4.2

8.2 MimiClaw 工作原理

```c // MimiClaw 核心工作流程(伪代码)void main_loop() {    // 1. 监听指令(来自本地或 OpenClaw Gateway)    String command = receive_command();              // 2. 本地预处理(简单规则)         if (is_simple_command(command)) {                 execute_local(command);     // 如"开灯"直接本地执行                 return    }              // 3. 复杂指令:调用远端 LLM    String llm_response = call_llm_api(command);    // 4. 解析 LLM 响应,执行动作    Action action = parse_action(llm_response);     execute_action(action);              // 5. 上报状态    report_status_to_ha(); ```

8.3 MimiClaw 安装配置

```bash # 克隆 MimiClaw 仓库git clone https://github.com/memovai/mimiclaw.gitcd mimiclaw# 安装 ESP-IDF(Espressif 官方框架)./install.sh# 配置项目idf.py menuconfig # 设置:Wi-Fi SSID/密码、LLM API Key、MQTT Broker 地址```

关键配置文件 `main/config.h`:

```c // MimiClaw 配置#define WIFI_SSID           "你的WiFi"#define WIFI_PASSWORD       "WiFi密码" #define LLM_API_URL         "https://open.bigmodel.cn/api/paas/v4/chat/completions" #define LLM_API_KEY         "你的智谱APIKey" #define MQTT_BROKER         "192.168.1.100" #define MQTT_PORT           1883 #define DEVICE_NAME         "卧室边缘节点" #define DEEP_SLEEP_SEC      30      // 空闲时深度睡眠30秒 ```  ```bash# 编译并烧录 idf.py buildidf.py -p /dev/ttyUSB0 flash monitor```

8.4 MimiClaw 与标准方案对比

``` 场景:用户说"打开卧室灯"标准方案(OpenClaw → HA → ESP32):用户指令 → OpenClaw(AI) → HA API → MQTT → ESP32延迟:约 500ms~2s(受网络影响)MimiClaw 边缘方案(直接处理):用户指令 → MimiClaw(ESP32) → 本地执行延迟:约 50ms(仅本地处理)```  架构建议:- 简单控制(开/关/调光)→ MimiClaw 本地处理,极低延迟 - 复杂场景(多设备联动、条件判断)→ 上报 OpenClaw 中枢处理 - 数据汇总(全屋状态查询、历史记录)→ Home Assistant 负责  ---  

九、安全加固与维护

9.1 网络安全  

1. ESP32 固件 OTA 加密(在 ESPHome 配置中)
ota:    password: !secret ota_password    # 强密码    safe_mode: true
2. MQTT TLS 加密
mqtt:    broker: 192.168.1.100   port: 8883                        # 使用 TLS 端口       certificate_authority: /config/certs/ca.crt       client_certificate: /config/certs/client.crt    client_certificate_key: /config/certs/client.key
3. HA 开启 HTTPS
# 在 /config/configuration.yaml中http:   ssl_certificate: /ssl/fullchain.pem  ssl_key: /ssl/privkey.pem 

9.2 权限最小化

```bash# 为 OpenClaw 创建专用系统用户sudo useradd -r -s /bin/false openclawsudo mkdir -p /opt/openclawsudo chown openclaw:openclaw /opt/openclaw  # 以专用用户运行服务 sudo -u openclaw openclaw start 

9.3 创建 systemd 守护服务

```ini# /etc/systemd/system/openclaw.service  [Unit]Description=OpenClaw AI Agent for Smart HomeAfter=network.target[Service]Type=simpleUser=openclawWorkingDirectory=/opt/openclawExecStart=/usr/bin/openclaw startRestart=on-failureRestartSec=5StandardOutput=journalStandardError=journal[Install] WantedBy=multi-user.target```bashsudo systemctl daemon-reloadsudo systemctl enable openclawsudo systemctl start openclawsudo systemctl status openclaw

9.4 备份策略

```bash #!/bin/bash # backup-smarthome.sh - 每日自动备份脚本BACKUP_DIR="/backup/smarthome/$(date +%Y%m%d)"mkdir -p $BACKUP_DIR  # 备份 Home Assistant 配置cp -r /opt/homeassistant/config $BACKUP_DIR/ha_config# 备份 OpenClaw 配置 cp -r ~/openclaw-home/workspace $BACKUP_DIR/openclaw_workspacecp ~/openclaw-home/config.yml $BACKUP_DIR/# 备份 ESPHome 配置 cp -r ~/.esphome $BACKUP_DIR/esphome_config# 压缩tar -czf "$BACKUP_DIR.tar.gz" $BACKUP_DIRrm -rf $BACKUP_DIRecho "✅ 备份完成: $BACKUP_DIR.tar.gz"``````bash# 添加到 crontab(每天凌晨 3 点备份)crontab -e0 3 * * * /bin/bash ~/backup-smarthome.sh

十、常见问题 FAQ

Q1:ESP32 无法连接 Wi-Fi,一直重启?  

排查步骤: 

```bash # 1. 检查 secrets.yaml 中的 SSID 是否正确(区分大小写) # 2. 确认 Wi-Fi 是 2.4GHz(ESP32 不支持 5GHz) # 3. 临时禁用防火墙测试 # 串口日志关键词 [E][wifi:498]: Connection failed: wrong password     → 密码错误 [W][wifi:375]: No AP found                           → SSID 错误或信号弱 ``` 

 Q2:Home Assistant检测不到ESPHome设备?

```bash # 检查 ESPHome 集成是否安装 # HA设置 → 集成 → 搜索 ESPHome → 安装  # 手动添加设备HA设置 → 设备与服务 → 添加集成 → ESPHome主机:设备IP,端口:6053```

Q3:OpenClaw调用HA API报401错误?

```bash# Token 可能已过期,重新生成# HA → 个人资料 → 长期访问令牌 → 创建新令牌# 更新 OpenClaw Skill 中的环境变量export HA_TOKEN="新的Token"openclaw restart ``` 

Q4:AI指令执行慢,延迟超过5秒?  

优化建议: 

1. 切换到响应更快的模型(如 `glm-4-flash`)

2. 在 Skill 中提供更清晰的设备列表,减少 AI “思考”时间

3. 对高频简单指令使用 MimiClaw 本地处理

4. 将 OpenClaw 部署在局域网内,减少公网延迟

Q5:如何添加新的设备类型(如空调)?  

在 `SKILL.md`的实体 ID 映射表中添加:
```markdown| 客厅空调 | climate.living_room_ac | climate |
在 Home Assistant 中配置对应的空调集成(如 `xiaomi_miio`),然后更新 Skill 中的控制示例即可。

总结

通过本文,我们完整搭建了一套基于「单片机 + OpenClaw」的智能家居控制系统:  

✅ ESP32 节点    → 负责设备控制和环境感知

✅ ESPHome       → 固件框架,零代码接入 HA 

✅ Home Assistant → 设备统一管理中枢

✅ OpenClaw      → AI 大脑,自然语言控制

✅ MimiClaw      → 边缘 AI,超低延迟本地执行

这套系统的核心优势在于: 

– 🔓 完全开源,无供应商锁定 

– 🏠 本地化部署,数据不出家门 

– 🧠 AI 驱动,自然语言控制,无需记命令 

– 💰 极低成本,单节点硬件约 ¥56 

– ⚡ 边缘计算,MimiClaw实现50ms级响应  

下一步,我们可以继续探索: 

– 接入更多设备类型(门锁、摄像头、空调) 

– 开发自定义 Skill(天气联动、电价感知节能) 

– 结合语音识别实现真正的”语音管家” 

– 部署 Prometheus 实现设备健康监控  


> 📌 相关资源 

> – OpenClaw 官方文档:https://openclaw.cc 

> – ESPHome 文档:https://esphome.io 

> – Home Assistant 社区:https://community.home-assistant.io 

> – MimiClaw GitHub:https://github.com/memovai/mimiclaw 

> – 本文代码示例:见文中各代码块  如有问题,欢迎在评论区交流。觉得有用就点个❤在看吧!