引言

作为一名后端开发者,我的技术栈从C#开始,逐渐学会了VUE,变成了全栈开发。后来也学习了Python,也用Java开发企业级应用。但是最近这几年,随着AI的发展,从ChatGPT到Kimi,从在VsCode中对话,到在Cursor中编程,从学会使用Claude Code开始,我已经变成了AI全栈开发者。最近OpenClaw也很火,而我也很羡慕钢铁侠中的贾维斯,于是我开始探索一个不同的方向:把AI助手部署在自己的树莓派上。

为什么是树莓派?

  1. 数据隐私:AI助手运行在自己的设备上,数据不出本地
  2. 硬件集成:树莓派支持GPIO、摄像头、蓝牙等硬件
  3. 7x24小时运行:低功耗,可以一直待命
  4. 多渠道集成:直接在钉钉、Discord等通讯工具中使用
  5. 自动化能力强:内置Cron调度器,各种定时任务

听起来很完美,对吧?

但实际在树莓派上安装和配置OpenClaw的过程中,我踩了不少坑。下面,我想记录真实的探索过程。


为什么选择在树莓派上部署OpenClaw?

我的树莓派配置

  • 型号:树莓派4B(4GB内存)
  • 系统:Linux 6.12.62+rpt-rpi-v8(ARM64架构)
  • Python版本:3.8+
  • Node.js版本:v24.13.0

选择OpenClaw的原因

  1. 本地化部署:完全在树莓派上运行,数据更安全
  2. 硬件友好:支持摄像头、蓝牙等硬件设备
  3. 多渠道集成:支持钉钉、Discord等,直接在聊天中使用
  4. 技能扩展:可以自己写Python/Shell脚本扩展功能
  5. 定时任务:内置Cron调度器,自动化更方便

在树莓派上安装OpenClaw:从"一键安装"到"慢慢摸索"

第一步:环境准备

树莓派的系统环境和普通的x86服务器不太一样,这点在安装时给了我不少惊喜。

坑1:Python版本不兼容

树莓派默认安装的是Python 3.7,但OpenClaw需要Python 3.8+。

# 检查Python版本
python3 --version
# Python 3.7.3

# 安装Python 3.8+
sudo apt update
sudo apt install python3.8 python3.8-venv python3-pip

坑2:ARM64架构的Node.js安装

OpenClaw需要Node.js,但树莓派是ARM64架构,普通的x86版本不能用。

解决:

# 下载ARM64版本的Node.js
wget https://nodejs.org/dist/v24.13.0/node-v24.13.0-linux-arm64.tar.xz

# 解压
tar -xf node-v24.13.0-linux-arm64.tar.xz

# 移动到系统目录
sudo mv node-v24.13.0-linux-arm64 /usr/local/node

# 配置环境变量
echo 'export PATH=/usr/local/node/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

# 验证安装
node --version
# v24.13.0

第二步:安装OpenClaw CLI

官方文档说一行命令就能安装:

npm install -g @openclaw/cli

但在树莓派上,遇到了几个问题。

坑3:npm权限问题

第一次安装时报错:EACCES: permission denied

解决:

# 配置npm全局目录
mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
npm install -g @openclaw/cli

坑4:npm安装速度慢

树莓派的性能有限,npm安装速度很慢,甚至会超时。

解决:

# 使用国内镜像
npm config set registry https://registry.npmmirror.com

第三步:初始化配置

openclaw init

这步比较顺利,但有个小细节:

坑5:时区配置错误

一开始我没注意时区设置,结果定时任务总是比我预期的时间晚8小时(UTC vs 北京时间)。

解决:

# 检查系统时区
timedatectl status
# 显示:Time zone: UTC

# 设置时区为Asia/Shanghai
sudo timedatectl set-timezone Asia/Shanghai
# 验证
timedatectl status
# 显示:Time zone: Asia/Shanghai (CST, +0800)

第四步:安装DingTalk插件

我想用钉钉作为主要通讯工具,所以安装了DingTalk插件:

openclaw plugins install dingtalk

坑6:插件配置复杂

安装后需要配置AppKey、AppSecret、企业ID等信息。我在钉钉开发者后台折腾了很久才搞清楚这些参数从哪里获取。

解决:

  1. 登录钉钉开放平台:https://open.dingtalk.com/
  2. 创建应用(机器人应用)
  3. 获取AppKey、AppSecret
  4. 配置企业ID
  5. 在 ~/.openclaw/openclaw.json中填入这些信息

配置文件示例:

{
  "channels": {
    "dingtalk": {
      "enabled": true,
      "clientId": "你的AppKey",
      "clientSecret": "你的AppSecret",
      "robotCode": "你的机器人编码",
      "corpId": "你的企业ID",
      "dmPolicy": "open",
      "groupPolicy": "open",
      "messageType": "card"
    }
  }
}

第五步:启动Gateway服务

openclaw gateway start

坑7:端口冲突

第一次启动时报错:Error: listen EADDRINUSE: address already in use :::18789

检查发现是其他服务占用了端口。

解决:

# 检查端口占用
lsof -i :18789

# 停止占用端口的进程
sudo kill <进程ID>

# 或者修改配置文件中的端口

坑8:树莓派性能限制

启动Gateway后,树莓派的内存占用很高,系统变得卡顿。

解决:

# 在~/.openclaw/openclaw.json中调整并发参数
"agents": {
  "defaults": {
    "maxConcurrent": 2,  // 降低并发数
    "subagents": {
      "maxConcurrent": 4  // 降低子任务并发数
    }
  }
}

在树莓派上的实用场景

场景1:蓝牙TTS语音播放

我想让OpenClaw通过蓝牙音箱播放语音。这在树莓派上实现起来很有意思。

坑9:蓝牙音箱配对

树莓派的蓝牙配置和普通电脑不太一样。

# 安装蓝牙工具
sudo apt install bluez bluez-tools pulseaudio pulseaudio-module-bluetooth

# 启动蓝牙服务
sudo systemctl start bluetooth

# 配置蓝牙
sudo bluetoothctl
# 进入交互模式
[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# scan on
# 找到设备后
[bluetooth]# pair <设备MAC地址>
[bluetooth]# connect <设备MAC地址>
[bluetooth]# trust <设备MAC地址>
[bluetooth]# exit

问题:配对成功了,但音频输出不到蓝牙音箱。

解决:

# 检查音频输出设备
pactl list sinks short

# 设置默认输出为蓝牙设备
pactl set-default-sink <蓝牙设备名称>

# 测试音频播放
paplay /usr/share/sounds/alsa/Front_Center.wav

现在,我可以对OpenClaw说:

请播放语音:"现在是下午三点,记得休息一下"

它就会通过蓝牙音箱播放出来。

树莓派上的特别之处:

  • 蓝牙配置需要手动操作,不像PC那样图形界面方便
  • 脉冲音频(PulseAudio)的配置需要熟悉
  • 但一旦配置好,可以7x24小时待命,随时播报

场景2:摄像头拍照和控制

我想让OpenClaw帮我拍照并发送到钉钉。树莓派上接USB摄像头很方便。

坑10:摄像头被占用

树莓派上有个监控服务 motion,它占用了摄像头设备 /dev/video0

第一次拍照时报错:Could not open video device /dev/video0

解决:

# 停止motion服务
sudo pkill motion
sudo systemctl stop motion

# 检查摄像头
ls /dev/video*
# /dev/video0 /dev/video1

# 拍照
ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -frames:v 1 /tmp/photo.jpg -y

# 拍照后重启motion(如果需要)
sudo systemctl start motion

坑11:摄像头分辨率限制

树莓派支持的摄像头格式和分辨率有限。

# 查看摄像头支持的格式
v4l2-ctl --list-formats

# 查看支持的分辨率
v4l2-ctl --list-formats-ext

# 我的icspring camera最高只支持640x480,YUYV格式

拍摄命令需要指定正确的格式:

ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -pix_fmt yuyv422 -frames:v 1 /tmp/photo.jpg -y

现在,我可以对OpenClaw说:

请拍一张照片,并发送到钉钉

几秒后,我就能在钉钉聊天中看到刚刚拍的照片。

https://avg.163.com/topic/detail/11357497
https://avg.163.com/topic/detail/11357467
https://avg.163.com/topic/detail/11357457
https://avg.163.com/topic/detail/11357447
https://avg.163.com/topic/detail/11357434
https://avg.163.com/topic/detail/11357418
https://avg.163.com/topic/detail/11357417
https://avg.163.com/topic/detail/11356191
https://avg.163.com/topic/detail/11357412
https://avg.163.com/topic/detail/11357413
https://avg.163.com/topic/detail/11357398
https://avg.163.com/topic/detail/11357404
https://avg.163.com/topic/detail/11357391
https://avg.163.com/topic/detail/11357394
https://avg.163.com/topic/detail/11357389
https://avg.163.com/topic/detail/11357385
https://avg.163.com/topic/detail/11357358
https://avg.163.com/topic/detail/11357350
https://avg.163.com/topic/detail/11357345
https://avg.163.com/topic/detail/11357375
https://avg.163.com/topic/detail/11357374
https://avg.163.com/topic/detail/11357366
https://avg.163.com/topic/detail/11357351
https://avg.163.com/topic/detail/11357357
https://avg.163.com/topic/detail/11357339
https://avg.163.com/topic/detail/11357308
https://avg.163.com/topic/detail/11357334
https://avg.163.com/topic/detail/11357328
https://avg.163.com/topic/detail/11357321
https://avg.163.com/topic/detail/11357322
https://avg.163.com/topic/detail/11357310
https://avg.163.com/topic/detail/11357305
https://avg.163.com/topic/detail/11357291
https://avg.163.com/topic/detail/11357286
https://avg.163.com/topic/detail/11357282
https://avg.163.com/topic/detail/11357284
https://avg.163.com/topic/detail/11357252
https://avg.163.com/topic/detail/11357257
https://avg.163.com/topic/detail/11357239
https://avg.163.com/topic/detail/11357247
https://avg.163.com/topic/detail/11357250
https://avg.163.com/topic/detail/11357248
https://avg.163.com/topic/detail/11357243
https://avg.163.com/topic/detail/11357240
https://avg.163.com/topic/detail/11357224
https://avg.163.com/topic/detail/11357218
https://avg.163.com/topic/detail/11357217
https://avg.163.com/topic/detail/11357215
https://avg.163.com/topic/detail/11357216
https://avg.163.com/topic/detail/11357212
https://avg.163.com/topic/detail/11357208
https://avg.163.com/topic/detail/11357210
https://avg.163.com/topic/detail/11357200
https://avg.163.com/topic/detail/11357189
https://avg.163.com/topic/detail/11357193
https://avg.163.com/topic/detail/11357190
https://avg.163.com/topic/detail/11357188
https://avg.163.com/topic/detail/11357184
https://avg.163.com/topic/detail/11357181
https://avg.163.com/topic/detail/11357174
https://avg.163.com/topic/detail/11357169
https://avg.163.com/topic/detail/11357136
https://avg.163.com/topic/detail/11357168
https://avg.163.com/topic/detail/11357167
https://avg.163.com/topic/detail/11357163
https://avg.163.com/topic/detail/11357140
https://avg.163.com/topic/detail/11357141
https://avg.163.com/topic/detail/11357139
https://avg.163.com/topic/detail/11357138
https://avg.163.com/topic/detail/11357134
https://avg.163.com/topic/detail/11357135
https://avg.163.com/topic/detail/11357133
https://avg.163.com/topic/detail/11357132
https://avg.163.com/topic/detail/11357130
https://avg.163.com/topic/detail/11357129
https://avg.163.com/topic/detail/11357128
https://avg.163.com/topic/detail/11357117
https://avg.163.com/topic/detail/11357127
https://avg.163.com/topic/detail/11357126
https://avg.163.com/topic/detail/11357124
https://avg.163.com/topic/detail/11357123
https://avg.163.com/topic/detail/11357121
https://avg.163.com/topic/detail/11357122
https://avg.163.com/topic/detail/11357119
https://avg.163.com/topic/detail/11357120
https://avg.163.com/topic/detail/11357116
https://avg.163.com/topic/detail/11357115
https://avg.163.com/topic/detail/11357114
https://avg.163.com/topic/detail/11357113
https://avg.163.com/topic/detail/11357112
https://avg.163.com/topic/detail/11357110
https://avg.163.com/topic/detail/11357111
https://avg.163.com/topic/detail/11357109
https://avg.163.com/topic/detail/11357108
https://avg.163.com/topic/detail/11357105
https://avg.163.com/topic/detail/11357107
https://avg.163.com/topic/detail/11357106
https://avg.163.com/topic/detail/11357101
https://avg.163.com/topic/detail/11357104
https://avg.163.com/topic/detail/11357103
https://avg.163.com/topic/detail/11357102
https://avg.163.com/topic/detail/11357100
https://avg.163.com/topic/detail/11357099
https://avg.163.com/topic/detail/11357098
https://avg.163.com/topic/detail/11357097
https://avg.163.com/topic/detail/11357096
https://avg.163.com/topic/detail/11357093
https://avg.163.com/topic/detail/11357095
https://avg.163.com/topic/detail/11357094
https://avg.163.com/topic/detail/11357092
https://avg.163.com/topic/detail/11357091
https://avg.163.com/topic/detail/11357089
https://avg.163.com/topic/detail/11357087
https://avg.163.com/topic/detail/11357085
https://avg.163.com/topic/detail/11357086
https://avg.163.com/topic/detail/11357084
https://avg.163.com/topic/detail/11357082
https://avg.163.com/topic/detail/11357083
https://avg.163.com/topic/detail/11357080
https://avg.163.com/topic/detail/11357081
https://avg.163.com/topic/detail/11357078
https://avg.163.com/topic/detail/11357079
https://avg.163.com/topic/detail/11357077
https://avg.163.com/topic/detail/11357076
https://avg.163.com/topic/detail/11357074
https://avg.163.com/topic/detail/11357075
https://avg.163.com/topic/detail/11357071
https://avg.163.com/topic/detail/11357073
https://avg.163.com/topic/detail/11357072
https://avg.163.com/topic/detail/11357069
https://avg.163.com/topic/detail/11357070
https://avg.163.com/topic/detail/11357065
https://avg.163.com/topic/detail/11357068
https://avg.163.com/topic/detail/11357067
https://avg.163.com/topic/detail/11357066
https://avg.163.com/topic/detail/11357064
https://avg.163.com/topic/detail/11357063
https://avg.163.com/topic/detail/11357057
https://avg.163.com/topic/detail/11357060
https://avg.163.com/topic/detail/11357054
https://avg.163.com/topic/detail/11357061
https://avg.163.com/topic/detail/11357062
https://avg.163.com/topic/detail/11357058
https://avg.163.com/topic/detail/11357056
https://avg.163.com/topic/detail/11357055
https://avg.163.com/topic/detail/11357051
https://avg.163.com/topic/detail/11357050
https://avg.163.com/topic/detail/11357052
https://avg.163.com/topic/detail/11357049
https://avg.163.com/topic/detail/11357047
https://avg.163.com/topic/detail/11357048
https://avg.163.com/topic/detail/11357040
https://avg.163.com/topic/detail/11357046
https://avg.163.com/topic/detail/11357045
https://avg.163.com/topic/detail/11357041
https://avg.163.com/topic/detail/11357044
https://avg.163.com/topic/detail/11357043
https://avg.163.com/topic/detail/11357039
https://avg.163.com/topic/detail/11357042
https://avg.163.com/topic/detail/11357038
https://avg.163.com/topic/detail/11357037
https://avg.163.com/topic/detail/11357036
 

树莓派上的特别之处:

  • USB摄像头热插拔方便
  • 可以和监控服务motion配合使用
  • 树莓派体积小,可以放在任何需要监控的地方

场景3:邮件发送功能

我想让OpenClaw帮我发邮件。于是开发了一个email-sender技能。

坑12:SMTP配置陷阱

配置126邮箱的SMTP服务时,我一开始用的是邮箱密码,结果一直报认证错误。

查了半天文档才发现,126邮箱需要用"客户端授权码",而不是邮箱密码。

解决:

  1. 登录126邮箱网页版
  2. 进入设置 → POP3/SMTP/IMAP
  3. 开启SMTP服务
  4. 获取授权码
  5. 在配置文件中使用授权码

配置文件(/home/pi/.openclaw/workspace/config/email.conf):

[SMTP]
host = smtp.126.com
port = 465
username = ren8179@126.com
password = QHyjTYHm8w3QVpi6  # 客户端授权码,不是邮箱密码

Python发送脚本:

import smtplib
from email.mime.text import MIMEText
import configparser

def send_email(to, subject, content):
    config = configparser.ConfigParser()
    config.read('/home/pi/.openclaw/workspace/config/email.conf')

    smtp_host = config['SMTP']['host']
    smtp_port = config['SMTP']['port']
    username = config['SMTP']['username']
    password = config['SMTP']['password']

    msg = MIMEText(content)
    msg['From'] = username
    msg['To'] = to
    msg['Subject'] = subject

    with smtplib.SMTP_SSL(smtp_host, smtp_port) as server:
        server.login(username, password)
        server.send_message(msg)

现在,我可以对OpenClaw说:

请发送邮件到ren8179@126.com,主题是"测试",内容是"OpenClaw邮件发送功能测试"

几秒后,邮件就发送成功了。

树莓派上的特别之处:

  • 24小时在线,随时可以发送邮件
  • 可以配合定时任务,自动发送日报、周报
  • 邮件内容可以基于传感器数据(温度、湿度等)

场景4:定时任务和自动化

这是OpenClaw最强大的功能之一。内置的Cron调度器让我可以设置各种自动化任务。

坑13:Cron表达式理解错误

一开始我不太理解Cron表达式的格式,导致任务执行时间和预期不符。

比如,我想设置"每天早上8点执行",我写成了:

"expr": "0 8 * * *"

结果发现是在UTC时间8点执行,不是北京时间8点。

解决:
在配置文件中明确指定时区:

{
  "schedule": {
    "kind": "cron",
    "expr": "0 8 * * *",
    "tz": "Asia/Shanghai"  // 明确指定时区
  }
}

现在,我可以设置各种自动化任务:

  • 每天8点:发送早间简报到钉钉
  • 每小时整点:播报时间
  • 每天凌晨2点:执行数据备份
  • 工作日上午9点:发送工作提醒

早间简报示例:

{
  "id": "morning-report",
  "name": "早间简报",
  "schedule": {
    "kind": "cron",
    "expr": "0 8 * * *",
    "tz": "Asia/Shanghai"
  },
  "payload": {
    "kind": "agentTurn",
    "message": "请生成今天的早间简报,包括:\n1. 昨夜完成的工作\n2. 系统状态\n3. 今日建议\n\n发送到钉钉"
  }
}

树莓派上的特别之处:

  • 低功耗,24小时运行也不心疼电费
  • 系统稳定,长时间运行不重启
  • 可以和各种硬件定时器配合

树莓派性能优化经验

挑战1:内存占用高

OpenClaw运行在树莓派上,内存占用是个问题。

解决方案:

  1. 降低并发数

    "agents": {
      "defaults": {
        "maxConcurrent": 2,
        "subagents": {
          "maxConcurrent": 4
        }
      }
    }
    
  2. 启用会话压缩

    "agents": {
      "defaults": {
        "compaction": {
          "mode": "safeguard",
          "maxTokens": 200000
        }
      }
    }
    
  3. 定期清理旧会话

    openclaw sessions cleanup --older-than 1d
    

挑战2:磁盘空间不足

OpenClaw会话日志会占用大量磁盘空间。

解决方案:

# 设置日志轮转
sudo vim /etc/logrotate.d/openclaw

/home/pi/.openclaw/agents/main/sessions/*.jsonl {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
}

挑战3:树莓派散热

OpenClaw持续运行会让树莓派发热,影响性能。

解决方案:

# 安装散热监控
sudo apt install lm-sensors

# 查看温度
sensors

# 安装散热风扇
# 树莓派4B强烈建议安装主动散热

# 配置CPU频率调节
echo 'performance' | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

深入体验:主动式AI助手的力量

OpenClaw最让我惊喜的,是它的"主动性"。

传统的AI助手

传统的AI助手,是"被动式"的:

  • 你问什么,它答什么
  • 你不问,它什么都不会做
  • 像一个随时待命的仆人

OpenClaw的主动性

OpenClaw的设计理念是"主动式AI助手":

  • 它会主动检查系统状态
  • 它会主动发送早间简报
  • 它会主动执行定时任务
  • 像一个积极的队友

实际案例:早间简报

我设置了一个每日早间简报,每天早上8点自动发送到钉钉。内容包括:

  • 📝 内容创作进展
  • 🚀 工具优化和创新
  • 📚 学习进度
  • 🔍 行业动态
  • 💡 今日建议

每天早上醒来,打开钉钉,就能看到AI助手已经帮我整理好了所有重要信息。这种感觉,真的像有一个"私人助理"在默默为我工作。

树莓派上的优势:

  • 7x24小时在线,从不错过任何任务
  • 低功耗,一个月电费不到10元
  • 体积小,可以放在任何地方

我的思考:树莓派+AI助手的可能性

以前的想法:AI在云端

以前我觉得AI必须在云端运行,因为:

  • 云端算力强
  • 云端模型大
  • 云端更新快

现在的想法:AI也可以在边缘

在树莓派上运行OpenClaw后,我的想法改变了:

AI不是只能在云端,也可以在边缘设备上运行。

优势:

  1. 数据隐私:所有数据在本地,更安全
  2. 网络独立:不依赖网络,离线也能用(部分功能)
  3. 硬件集成:可以直接控制摄像头、蓝牙、GPIO等
  4. 7x24小时:低功耗,可以一直待命
  5. 成本可控:一次性购买,没有订阅费用

应用场景

基于树莓派+OpenClaw,可以做很多事情:

  1. 智能家居控制中心:控制灯光、温度、安防
  2. 家庭监控:摄像头拍照、异常检测
  3. 语音助手:通过蓝牙音箱播报信息
  4. 自动化任务:定时发送邮件、提醒、备份
  5. 远程监控:通过钉钉随时查看状态
  6. 学习记录:记录学习进度、生成日报周报

写在最后

这篇文章,记录了我在树莓派上安装和配置OpenClaw的真实过程。

真实体验总结:

  1. 安装不轻松:踩了不少坑,但都解决了
  2. 学习曲线陡:需要时间熟悉,但值得
  3. 功能很强大:超出了我的预期
  4. 主动性很强:像一个真正的"队友"
  5. 性能需要优化:树莓派性能有限,需要调整配置
  6. 硬件集成很有趣:摄像头、蓝牙等,探索空间很大

给想尝试的朋友的建议:

如果你也想在树莓派上玩AI助手,我的建议是:

  1. 选择合适的设备:树莓派4B(4GB或8GB内存)
  2. 耐心安装:会遇到各种问题,慢慢解决
  3. 关注性能:注意内存、CPU、磁盘使用情况
  4. 发挥硬件优势:摄像头、蓝牙、GPIO都试试
  5. 记录经验:把踩坑经验记录下来,既帮助自己,也能帮助别人

下一步计划:

  1. 继续探索OpenClaw的高级功能
  2. 开发更多自定义技能
  3. 尝试树莓派+AI的各种组合场景
  4. 记录完整的智能家居项目
  5. 分享更多树莓派+AI的实践经验
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐