1. 项目概述:当小龙虾养殖遇上智能自动化
去年夏天,我在自家后院搞了个小龙虾养殖池,每天手动投喂、水质检测搞得焦头烂额。直到发现OpenClaw这个开源项目——它用Node.js+Git+Kimi模型+飞书打造了一套完整的智能养殖管理系统。经过三个月的实战调试,现在我的手机每天会准时收到水质报告,自动喂食器会根据虾群活动规律精准投料,连邻居都跑来问这套"黑科技"是怎么弄的。
这套系统最吸引人的是它的模块化设计:Node.js负责核心逻辑,Git管理配置版本,Kimi模型分析养殖数据,飞书机器人实现远程交互。接下来我会手把手带你完成Windows环境下的完整部署,过程中遇到的坑和解决方案都会详细说明。
2. 环境准备与工具选型
2.1 硬件基础配置建议
虽然OpenClaw可以在普通PC上运行,但长期稳定运行建议:
- 处理器:Intel i5十代或同级AMD以上(处理Kimi模型需要一定算力)
- 内存:16GB起步(Node服务+模型推理较吃内存)
- 存储:256GB SSD(日志和养殖数据会持续增长)
- 外设:建议配备USB水质传感器(我用的是PH-200型,兼容性最好)
注意:如果连接真实养殖设备,需要额外准备RS485转USB模块,市面上常见的CH340芯片款就够用,价格约30元。
2.2 软件环境安装
按这个顺序安装才不会出现依赖问题:
Node.js 18.x LTS版(必须这个版本,新版有兼容性问题)
- 安装时勾选"Automatically install necessary tools"
- 安装完成后执行:
npm install -g yarn yarn config set registry https://registry.npmmirror.com
Git 2.40+(配置版本管理核心)
- 安装时选择"Use Visual Studio Code as default editor"
- 关键配置:
git config --global core.autocrlf false git config --global core.ignorecase false
Python 3.8(Kimi模型依赖)
- 勾选"Add Python to PATH"
- 安装后需要额外装:
pip install torch==1.12.1+cpu -f https://download.pytorch.org/whl/torch_stable.html
3. OpenClaw核心组件部署
3.1 项目获取与初始化
不要直接clone主分支!正确做法是:
git clone -b stable-2026 https://github.com/openclaw/OpenClaw.git cd OpenClaw yarn install --ignore-engines遇到node-gyp报错时的解决方案:
- 以管理员身份打开PowerShell
- 执行:
npm install --global windows-build-tools --vs2015 - 重新运行yarn install
3.2 Kimi模型配置技巧
模型文件较大(约4.7GB),建议用aria2多线程下载:
aria2c -x16 -s16 https://model.kimi.ai/openclaw/v3/lite.bin配置文件需要特别关注的参数:
# config/model.yaml inference: device: cpu # 有显卡可改为cuda threads: 4 # 建议设为CPU物理核心数 quantization: enable: true # 必须开启才能跑在消费级硬件上实测发现模型初次加载需要3-5分钟,属于正常现象。第二次启动就会快很多。
3.3 飞书机器人深度配置
在飞书开放平台创建应用时,这几个权限必须勾选:
- 获取与发送单聊、群组消息
- 获取用户user_id
- 上传文件
关键配置项:
// config/feishu.js module.exports = { appId: 'your_app_id', appSecret: 'your_app_secret', encryptKey: 'your_encrypt_key', verificationToken: 'your_token', // 特别重要! eventFilter: { message: { allow: ['text', 'post', 'image'] } } }建议在飞书后台设置IP白名单,防止恶意调用。
4. 养殖业务逻辑实现
4.1 水质监测模块开发
传感器数据接入示例代码:
// services/waterQuality.js const { SerialPort } = require('serialport') const { ReadlineParser } = require('@serialport/parser-readline') const port = new SerialPort({ path: 'COM3', baudRate: 9600, dataBits: 8, parity: 'none' }) const parser = port.pipe(new ReadlineParser({ delimiter: '\r\n' })) parser.on('data', data => { const [ph, temp, oxygen] = data.split(',').map(parseFloat) // 数据校验逻辑 if([ph, temp, oxygen].some(isNaN)) { console.error('Invalid sensor data:', data) return } WaterQuality.create({ ph, temp, oxygen }) })常见问题处理:
- 数据乱码:检查波特率是否与传感器匹配
- 持续收到NaN:可能是接地不良导致的信号干扰
- 数据突变:检查传感器探头是否被藻类覆盖
4.2 智能投喂算法调优
在config/feeding.js中有几个关键参数需要根据实际情况调整:
module.exports = { // 小龙虾活跃时段(24小时制) activeHours: [19, 20, 21, 6, 7, 8], // 温度补偿系数(克/℃) tempCompensation: 0.5, // 基于体重的投喂量基准(克/100克体重) baseAmount: 2.5, // 最大单次投喂量(克) maxSingleFeed: 150 }我的调参经验:
- 夏季水温超过28℃时,建议将tempCompensation调到0.3
- 观察到残饵较多时,按0.2梯度下调baseAmount
- 脱壳期需要额外增加10-15%投喂量
4.3 飞书消息模板设计
建议使用飞书多维表格实现数据可视化:
# 🦞 今日养殖日报 {{date}} **水质状况** - PH值:{{ph}} ({{phStatus}}) - 水温:{{temp}}℃ ({{tempStatus}}) - 溶氧量:{{oxygen}}mg/L ({{oxygenStatus}}) **投喂记录** - 今日总量:{{totalFeed}}克 - 最近一次:{{lastFeedTime}} {{lastFeedAmount}}克 [查看详细数据]({{reportLink}})状态判断逻辑示例:
function getPhStatus(ph) { if(ph < 6.5) return '偏低⚠️' if(ph > 8.5) return '偏高⚠️' return '正常✅' }5. 生产环境部署方案
5.1 使用PM2实现持久化
推荐配置:
pm2 start ecosystem.config.js --env production配置文件示例:
// ecosystem.config.js module.exports = { apps: [{ name: 'openclaw', script: 'src/index.js', instances: 1, autorestart: true, watch: false, max_memory_restart: '2G', env: { NODE_ENV: 'production' }, output: './logs/out.log', error: './logs/error.log', log_date_format: 'YYYY-MM-DD HH:mm:ss' }] }日志轮转配置(防止日志爆盘):
pm2 install pm2-logrotate pm2 set pm2-logrotate:max_size 100M pm2 set pm2-logrotate:retain 305.2 数据备份策略
我采用的自动化备份方案:
- 每天凌晨3点全量备份
- 使用7z压缩(比zip节省40%空间)
- 自动上传至阿里云OSS
备份脚本示例:
#!/bin/bash DATE=$(date +%Y%m%d) 7z a -p${PASSWORD} /backups/openclaw_${DATE}.7z /data/openclaw/db rclone copy /backups/openclaw_${DATE}.7z aliyun:openclaw-backups5.3 安全防护要点
必须做的几项安全措施:
- 修改默认端口(原端口3000易被扫描)
// config/server.js port: 5866 // 改成随机高位端口 - 启用HTTPS(Let's Encrypt免费证书就行)
- 设置接口频率限制:
// 使用express-rate-limit const limiter = rateLimit({ windowMs: 15 * 60 * 1000, max: 100 }) app.use('/api/', limiter)
6. 常见问题排坑指南
6.1 模型加载失败排查
典型错误现象及解决方案:
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 卡在"Loading model..." | 内存不足 | 添加swap空间或关闭其他程序 |
| 报错"Invalid model format" | 下载文件损坏 | 检查文件md5是否匹�� |
| 推理速度极慢 | 未启用量化 | 确认config中quantization.enable=true |
6.2 飞书消息延迟处理
消息流优化方案:
- 使用Redis做消息队列
const redis = require('redis') const client = redis.createClient() // 生产者 client.lpush('feishu_queue', JSON.stringify(message)) // 消费者 const processQueue = async () => { const msg = await client.brpop('feishu_queue', 0) // 处理消息 } - 启用消息去重(相同内容5分钟内不重复发送)
- 非关键消息批量合并发送
6.3 传感器数据异常处理
我总结的数据清洗规则:
function cleanSensorData(values) { // 规则1:连续3次相同值视为卡死 if(values.slice(-3).every(v => v === values[0])) { throw new Error('Sensor stuck') } // 规则2:相邻数据突变超过阈值 const diff = Math.abs(values[values.length-1] - values[values.length-2]) if(diff > thresholds[valueType]) { return median(values) // 取中位数 } // 规则3:移动平均滤波 return values.slice(-5).reduce((a,b) => a+b, 0) / 5 }这套系统稳定运行半年后,我的小龙虾产量提升了35%,最意外的是通过数据分析发现下午5点的投喂效果最好——这和传统养殖手册说的"早晚各一次"完全不同。现在每次打开飞书看到自动生成的养殖报告,都会感叹技术真的改变了传统行业。