从‘手动挡’到‘自动驾驶’:我用Python+树莓派给自家光伏储能系统DIY了一个简易EMS
从‘手动挡’到‘自动驾驶’:我用Python+树莓派给自家光伏储能系统DIY了一个简易EMS
去年夏天,当我第三次因为忘记调整储能电池模式而白白浪费了光伏发电时,终于下定决心要解决这个痛点。商业能源管理系统(EMS)动辄上万元的价格让我望而却步,但作为技术爱好者,我发现了更酷的解决方案——用树莓派和Python搭建一个完全自定义的家庭EMS。这个项目不仅将我的电费降低了30%,更让我体会到开源硬件与智能算法的完美结合。
1. 硬件准备:搭建数据采集的神经末梢
任何能源管理系统的基础都是可靠的数据采集。我的光伏系统由6块325W单晶硅组件、5kWh锂电池组和一台3kW混合逆变器组成。要实现智能化管理,首先需要让树莓派"感知"到系统状态。
1.1 核心硬件选型清单
- 树莓派4B:4GB内存版本足够运行所有服务
- RS485转USB适配器:与逆变器通信的关键接口(推荐使用CH340芯片版本)
- 电流电压传感器:INA219模块监测关键电路参数
- 环境传感器:BME280采集温度、湿度数据
- 备用电源:UPS HAT防止意外断电导致数据丢失
# 示例:使用pymodbus读取逆变器数据 from pymodbus.client import ModbusSerialClient client = ModbusSerialClient( method='rtu', port='/dev/ttyUSB0', baudrate=9600, timeout=1 ) if client.connect(): res = client.read_input_registers(address=0, count=10, unit=1) pv_voltage = res.registers[0] / 10 # 实际电压值注意:不同品牌逆变器的Modbus协议地址可能不同,需要查阅具体型号的通信协议文档
1.2 物理连接拓扑
通过RS485总线将逆变器、电池与树莓派连接,形成简易的SCADA网络。我在配电箱内安装了导轨式电源为所有设备供电,并用扎带固定线缆确保整洁安全。
2. 软件架构:构建EMS的智能中枢
系统的软件栈采用模块化设计,便于后期功能扩展。核心架构分为四层:
| 层级 | 组件 | 技术选型 |
|---|---|---|
| 数据采集 | 设备驱动 | pymodbus, smbus2 |
| 数据处理 | 实时计算 | pandas, numpy |
| 业务逻辑 | 控制策略 | 自定义算法 |
| 用户交互 | Web界面 | Flask, ECharts |
2.1 关键Python库及其作用
- pymodbus:与逆变器、电池BMS通信
- paho-mqtt:将数据发布到Home Assistant
- schedule:实现定时任务调度
- sqlalchemy:存储历史数据到SQLite数据库
# 项目依赖安装 pip install pymodbus paho-mqtt schedule sqlalchemy flask3. 核心算法:从手动规则到智能决策
最初的版本只是简单的时间控制(白天充电,晚上放电),但很快我发现这种固定策略无法适应多变的天气和用电需求。经过三次迭代,最终形成了动态调整算法。
3.1 充放电策略进化史
V1.0 时间基准策略
- 06:00-18:00:光伏充电优先
- 18:00-22:00:电池供电
- 22:00-06:00:电网供电
V2.0 电价感知策略
- 结合分时电价动态调整
- 在电价谷底时段强制充电
- 高峰时段禁止从电网取电
V3.0 预测型策略
- 基于天气预报调整充电阈值
- 学习家庭用电模式
- 动态保留应急电量
# V3.0策略核心代码片段 def calculate_charge_target(weather_prediction, electricity_price, usage_pattern): base_capacity = 0.7 # 常规储备 if weather_prediction['sunny'] > 0.6: base_capacity -= 0.1 elif weather_prediction['rainy'] > 0.5: base_capacity += 0.15 if electricity_price['current'] < electricity_price['average'] * 0.8: return min(base_capacity + 0.2, 0.9) return base_capacity4. 可视化与智能联动:让数据会说话
一个优秀的EMS需要直观的展示方式。我使用Flask搭建了本地Web界面,并通过MQTT将关键数据同步到Home Assistant。
4.1 仪表盘功能设计
- 实时监控视图:功率流向动画示意图
- 历史数据分析:可缩放的时间序列图表
- 系统配置界面:策略参数调整滑块
- 告警通知中心:短信/邮件报警设置
// ECharts示例:绘制功率曲线 option = { tooltip: { trigger: 'axis' }, legend: { data: ['光伏发电', '家庭用电', '电池充放'] }, xAxis: { type: 'category', data: timestamps }, yAxis: { type: 'value', name: '功率(W)' }, series: [ { name: '光伏发电', type: 'line', smooth: true, data: pvData }, { name: '家庭用电', type: 'line', smooth: true, data: loadData } ] };提示:在树莓派上运行Web服务时,建议使用Waitress代替Flask自带的开发服务器以获得更好性能
5. 实战经验:那些只有踩过坑才知道的事
在三个月的实际运行中,这套系统经历了各种意外情况,也暴露出一些需要特别注意的问题:
- 数据完整性检查:某次因RS485接口松动导致错误数据,触发异常充放电
- 电池保护机制:必须硬编码SOC上下限,防止过充过放
- 时钟同步:曾因NTP服务故障导致分时策略失效
- 灾备恢复:定期备份配置文件到Git仓库
最令我自豪的是成功预测了一次连续阴雨天气,提前储备了足够电量,让家庭在电网检修期间仍能正常用电。这种精准预测带来的成就感,远超过直接购买商业解决方案。
整个项目的物料成本不到800元,但获得的不仅是经济回报,更是一个完全按需定制的能源管家。每当看到系统自动优化充放电策略时,都能感受到从"手动挡"升级到"自动驾驶"的科技乐趣。
