资讯动态

家庭光伏数据平台实战:REA项目完整复盘与工程经验

发布时间:2026/10/22 19:24:38 来源:尧图企业网站定制
去年夏天一位老同学找到我说他家屋顶那套太阳能光伏系统买了一年多除了手机APP上一个总发电量数字以外什么数据都看不到。电费确实降了但具体哪几天发得好、哪几天白白浪费了光照、电池什么时候快不行了全靠猜。我随口回了一句要不我帮你做一个REA——REARenewable Energy Application也就是可再生能源应用平台。本来只是一句玩笑谁想到后来真的从一个毕业设计式的小Demo长成了一个能每天自动出报告、发电预测准确率稳定在八成以上的完整项目。这篇文章就是把整个REA项目的设计思路、硬件选型、软件实现和踩坑过程完整复盘一遍。里面没有什么高深算法也没有神秘硬件全靠普通工具和合理组合拼凑出来。它适合三类人看第一类是自己家里装了光伏或储能设备、想搞清楚数据背后逻辑的普通人第二类是想入行物联网或者边缘计算方向、需要一个完整练手项目的开发者第三类是已经在做类似数据采集系统、但被稳定性和误报问题折腾得头疼的同行。我会尽量把每一步为什么这么做、哪些地方容易掉坑都讲清楚希望能帮大家少走几个月的弯路。1. REA项目的起点一个“记录不透明”的痛点1.1 为什么偏要“可再生数据”这个切口说起可再生能源大多数人的第一反应是光伏板、风机、锂电池这些大件设备。但真正用过的人会发现设备买回来只是第一步后面的运行管理才是无底洞。光伏系统的发电量受天气影响波动非常大同样是四月份的晴天中午峰值功率可能差出四成。储能电池更麻烦它的健康状态不会直接显示在APP里等你发现续航明显变短时电池往往已经悄悄衰减了十几个百分点。老同学抱怨的本质上是“设备是买了但完全不知道它平时在干什么”。他要的不是一堆图表而是几个能直接指导行动的问题答案今天要不要洗光伏板明天能发多少度电、够不够开空调电池需不需要做一次深度维护REA项目的定位就来自这些朴素的追问。我不打算做一个商业气象软件也不想做电站级SCADA系统我只需要把屋顶那套设备的每一条关键数据收集起来让数字自己说话。这里的核心关键词不是“智能”而是“透明”——先把底层数据流全部打通让系统的每一次发电、每一次充放电、每一次温度波动都变成可查询、可对比、可报警的记录。透明是一切优化的前提没有数据做底子后面聊再多策略都是空谈。1.2 需求拆解我砍掉了什么留住了什么任何项目开始前都有个致命诱惑把能想到的功能全加上。我自己一开始也列了一份很长的愿望清单APP推送、微信小程序、三维可视化大屏、AI故障诊断、自动清洗光伏板……但真到了动手阶段我冷静下来做了个减法。原因很简单我是一个人维护的小项目没有运维团队也不打算为了一堆花哨功能把自己绑在电脑前。最后保留下来的核心需求只有五条实时采集光伏板输出功率、电池电压电流、环境温度、光照强度采样周期30秒覆盖主要工况。数据落库与查询所有历史数据要能按分钟、小时、天、月四个粒度聚合方便回溯和对比。发电量预测提前一天预测次日总发电量并在当天滚动修正一次让老同学能决定明天空调怎么开。异常告警电池电压异常、光伏输出与预测偏离过大、通信中断等必须主动通知。可视化面板不需要炫酷的3D但要一眼看清当前功率、今日发电、电池状态、本月累计收益按阶梯电价折算。被砍掉的包括远程控制负载开关涉及安全风险单独拉线成本高、自动生成PDF报告没人看纯属自嗨、多用户权限系统只有我一个人用权限管理反而添乱。砍完之后整个系统的复杂度降低了大概一半开发周期从预想的两个月压缩到了三周。我想强调一下这个减法过程因为后来很多朋友问我能不能加某个功能时我都会先问一句这个功能产生的数据你到底会不会看如果答案是不确定那就先别加。2. 硬件选型与成本模型的推算过程2.1 四类组件的搭配逻辑硬件选型是整个REA项目里最容易被低估的一环。代码写得不好可以随时改硬件一旦定死后面想换就要动线路甚至重新打孔。我先把整个系统拆成了四个模块发电端、储能端、控制端、数据采集端。每一块都有明确的责任边界选型时也只考虑满足这个边界内的问题绝不做超出需求的堆料。发电端用的是市面上最常见的单晶硅光伏组件单片额定功率400W一共10片组成4kW的阵列。选单晶硅不是因为它在实验室效率标称更高而是因为它的弱光响应明显优于老式多晶硅。清晨、傍晚、阴天这些低辐照场景下单晶硅的发电量能比多晶硅高出8%到12%在居民屋顶这种没有追光系统的场景里这部分低光收益实打实影响全年电量。组件安装倾角我按当地纬度到底的角度来定大概在28度到32度之间朝向正南偏西五度。这个朝向选择是故意为之下午时段往往是家庭用电高峰偏西一点可以让发电峰值往午后挪提高自发自用比例。储能端选的是磷酸铁锂LFP电池总容量10kWh。之所以不用三元锂电池纯粹是安全冗余考虑。磷酸铁锂的热失控阈值普遍在180度以上而三元锂大约在120度到150度之间对安装在屋顶、夏天暴晒温度可能超过70度的环境来说磷酸铁锂的安全裕度明显更舒服。电池包分成三个独立模组每个模组配备独立的BMS板这样做的好处是某个模组异常时可以通过BMS的级联通信精确定位到具体位置而不是整包直接停摆。控制端是太阳能控制器和逆变器的组合体。控制器选了MPPT类型也就是最大功率点追踪它会不断调整光伏组件的工作电压以榨取当前光照下的最大输出功率。这一点特别重要光伏板的输出电压会随温度变化同样光照下板温高的时候最大功率点电压会往下掉如果没有MPPT自动追踪系统可能始终工作在次优状态白白损失5%到10%的发电量。逆变器我选了5kW的离网混合型逆变器能同时支持电池优先、光伏优先、市电补充三种工作模式。参数上特意留了余量4kW的光伏阵列配5kW逆变器不是因为钱多烧的而是为了给光伏组件日后的轻微衰减以及早晨低温时功率轻微超载预留缓冲区。逆变器长期满功率运行会显著缩短电容寿命这是很多人忽略的成本账。数据采集端是最便宜也最容易忽视的环节。我用了ESP32开发板作为边缘采集主机外接一块带RS485接口的扩展板与逆变器通信再用I2C挂载光照传感器、温湿度传感器和电流互感器模块。整套采集硬件成本不到一百五十块却承担了整个系统的心脏功能。对你没看错一个手机大小的小板子就是整个REA的神经中枢。后面我会详细讲为什么不用现成的工业DTU核心原因不是钱而是自由度工业DTU虽然稳定但固件封闭我想按30秒周期采集自定义字段、想临时加一路传感器它都做不到。2.2 关键参数对照与发电量预估在你决定复刻类似项目之前有一张参数对照表必须放在前面。很多人在这个阶段会犯一个误判只看设备单体参数不看整套系统的匹配度。我把整个REA的关键参数摆成一张表它同时回答了“为什么这样配”的问题。组件关键参数我的选择选择理由光伏组件单片功率/类型400W单晶硅10片共4kW弱光响应好低温高辐照时允许轻微超发电池容量/化学体系10kWh磷酸铁锂热失控阈值高屋顶高温环境更安全逆变器额定功率/类型5kW离网混合留20%余量延长电容寿命兼容电池优先模式控制器MPPT通道/最大电压双通道支持组串A/B独立追踪阵列朝向微调后可双路最优减少组串失配损失采集板主控/通信接口ESP32 RS485 模拟量I2C固件可改、成本低、足够应付30秒采样的低负载光照传感器量程/精度0-2000W/m²±3%匹配光伏辐照范围误差低于对发电预测的干扰阈值基于这套配置我做了一个粗糙的发电量预估模型。模型公式并不复杂用到了当地气象站提供的月均日照峰值小时数PSH。光伏日发电量的简化公式是日发电量 ≈ 装机容量 × 当日峰值日照小时数 × 系统综合效率其中系统综合效率取值0.78包含了组件衰减首年约2%、灰尘遮挡按月平均3%、逆变器转换损耗约5%、线损约3%以及高温降额夏季可达8%。举个例子当地6月的日均PSH大约4.8小时那么单日理论发电量就是4kW × 4.8h × 0.78 ≈ 14.98kWh这个数字和后期实际数据基本吻合。不过要注意PSH资料反映的是历史平均状况无法处理极端天气所以它在选型估算阶段够用真到了逐日预测就必须引入气象API和滚动修正这就是后面第4章的内容。2.3 成本怎么分摊才不算亏我和老同学最终把整个项目的硬件成本摊开算了一遍总数让我自己都有点意外光伏组件和电池是大头占了总预算的七成逆变器和控制器占两成采集传感器、线缆、接线盒、外壳这些小件加起来只占一成。这说明了一个道理REA的核心价值不在那些小传感器上储能和发电设备才是决定系统收益的大头数据采集系统做得再花哨也不能让光伏板多发一度电。它真正的价值在于让每一度电的去向变得清楚让低效运行状态能被及时揪出来。成本模型上我做了一个最简单的回本测算。假定当地居民阶梯电价平均按每度0.62元计算系统年发电量按本地光照资源估算约6000kWh其中自用比例70%即4200kWh节省了电费约2600元剩余30%电量即便按脱硫燃煤标杆电价折算上网也就几百块。这样算下来不含人工的硬件总投入大约5万元静态回收期接近8年。听起来并不划算但这里有个延伸价值这套系统的数据让我能精准判断什么时候清洗光伏板每次清洗能恢复约3%到8%发电量、什么时候电池该维护这些优化让实际发电量比裸装系统高出一成左右回收期缩短到接近6年。数据采集看起来不直接产生收益但它让每一分钱花得明明白白。3. 数据采集与控制的链路设计3.1 从传感器到数据落库数据采集链路是整个REA项目最核心的组成部分也是最容易在设计阶段想当然、实测阶段翻车的地方。整套链路的起点是传感器终点是数据库里一行一行带时间戳的记录。中间任何一环掉链子后面的分析模型就跑不起来。我设计的链路是这样走的逆变器和电池BMS各自通过RS485总线以Modbus RTU协议向外吐数据ESP32通过扩展板上的RS485收发芯片读取这些寄存器数值光照传感器和温度传感器走的是I2C接口短距离传输抗干扰能力足够电流互感器把交流侧电流换算成0-1V的模拟量信号ESP32的ADC引脚直接采样。ESP32拿到所有原始值后做校验、换算、打包通过WiFi以HTTP POST的方式推送到局域网里一台跑着数据库服务的迷你主机上。考虑到家用路由器在弱网环境下HTTP很可能丢包我加了一层本地缓冲ESP32的SD卡上会保存最近七天的完整原始记录网络恢复后自动补传。这一条设计后来救了我好几次因为家用WiFi每周大概率会抽风几次。数据库选型上我没有上工业时序数据库那些重型方案而是用了一种更简单直接的方式迷你主机上跑了一个轻量级时序数据库按时间分片自动清理超过三个月的原始分钟数据但会把每日聚合结果永久保留。实时表存原始点聚合表存统计值两个层次的存储把查询速度和存储容量都照顾到了。3.2 30秒采样周期背后的考虑不少做物联网的朋友拿到这个项目后第一反应是为什么采样周期是30秒不是秒级采样这里有一个很现实的计算。系统里要采集的对象一共二十多个数据点包括三相电压电流、直流侧电压电流、电池电压电流、各模组温度、光照强度、控制器功率等。ESP32的CPU跑起来其实不弱但RS485总线的波特率默认只有9600bps读取一个带多个寄存器的帧就需要几十毫秒全部轮询一遍要80-120毫秒。如果采用1秒采样频率ESP32几乎把所有时间花在通信上稍有干扰就会超时反而得不到干净数据。30秒采样还有一个更大的好处对历史数据的存储体积影响巨大。一分钟一个点一天1440个点一个月4万多个点如果改成1秒一个点一天就是8.6万个点存储膨胀三十倍查询变慢图表绘制卡顿而实际信息量几乎没有增加。光伏系统是慢变量系统温度、光照、功率的变化周期都在分钟级30秒采样已经完全能还原变化曲线。我还特意在代码里加入了滑动平均滤波每次采样读取三次取中值以剔除偶发的通信错误值。这些细节全部指向同一个目标数据要稳而不是数据要快。3.3 仪表盘、告警与远程运维数据采集毕竟只是水管不装龙头就出不了效果。我花了一个周末做了一个极简仪表盘不搞3D大屏一屏看全所有关键信息。顶部是当前实时光伏输出功率、电池电量和当日累计发电量中间区域是一张24小时功率曲线同时叠加光照强度曲线能直观看出光伏板有没有被遮挡或积灰底部是最近七天的发电量柱状图和几条异常告警记录。告警模块最初做得很粗糙纯粹是阈值比较上下游手动设置。后来经过三次迭代最终落地为三档结构警告、严重、紧急。警告对应电池电压略低、光伏输出偏离预测值20%以上但未触发保护严重对应电压降至保护阈值前一步、逆变器故障时通信中断等紧急通常意味着硬件层面已经出现异常比如电池欠压保护启动、温度越限。每类告警都有自己的持续判定条件必须连续满足一定时长才真正推送防止瞬时尖峰误报。这个改进在后面第5章会详细说因为告警风暴真的能把人逼疯。远程运维上我没有用现成云平台而是走了最简单也最隐私友好的方案主机上跑了一个轻量级局域网服务申请一个DDNS域名然后把路由器的端口转发指向它。这样在外面连回家就能直接看仪表盘和日志。考虑到安全风险这个入口只开放了只读页面远程控制功能我一律没做。原因很务实数据看板和告警能解决绝大多数远程问题真要是需要动手操作跑一趟现场反而比远程调试更稳妥也省得把自己绑在随时待命的状态里。4. 发电预测模型的调参与实测复盘4.1 影响发电量的最大变量发电量预测是REA项目里最能体现“数据会说话”的部分。刚开始我天真地以为光伏发电预测就是看明天晴天还是阴天晴天给个高值阴天给个低值。后来被实际数据狠狠教育了一顿同为晴天冬季和夏季的发电量能差三倍以上同为多云天厚云和薄云的发电量又差出五成。影响发电量的变量远不止那一个天气标签。我把影响因子拆成四类天文因子、气象因子、系统因子、环境因子。天文因子包括日出日落时间和太阳高度角它决定了理论可照时长这个是可以预先计算的误差极小。气象因子包括云量、降水概率、气温、风速和湿度气温高反而对光伏是一个减分项因为组件温度升高会拉低输出电压和效率。系统因子是组件本身的衰减率、逆变器效率曲线、清洗状态这部分可以通过历史数据回归得到。环境因子则是污染、遮挡、季节性积灰等虽然单日影响小但累积起来不可忽视。最终模型采用了一种折中方案不追求一次到位精确预测全天逐小时曲线而是先预测日总发电量再按预测日照曲线分配到各个小时。特征向量包括次日峰值日照小时数预测值、每日最高最低气温、降水概率、云量百分比、季节编码以及“近三天实际发电均值”。模型主体是带正则化的回归模型另加了一层规则修正降水概率大于60%时乘以0.65的折扣系数云量低于20%时乘以1.08的修正系数。整个过程大约300行代码训练数据来自过去四个月的实测日志。说实话这个模型离机器学习还差得远但对家庭屋顶系统来说它的预测能力已经足够指导日常决策了。4.2 三类天气下的误差表现模型上线后的前两周我每天手工记录当天的预测值与实际值。把数据摊到表格里看问题立刻显出原型。同一个模型在晴天条件下表现得像模像样误差能压到5%以内一到阴天或多云天误差就开始放飞自我暴雨天更是离谱最大一次误差超过了三成。这不是偶然而是方法本身的偏向性。日总发电量预测本质上是对全天光照积分值做估计而每天的光照曲线形态完全不同。晴天那条曲线是一条光滑的单峰曲线形状稳定只要峰值日照小时数估准总量基本不会跑偏。阴天的时候云密度和云层厚度随时变化模型用日均云量代表全天状态这等于用平均值去估计一个高阶非线性过程必然压不准。暴雨天更极端降水云团是阵性的一场雨过去天又开了光伏出力前后差异巨大模型无法捕捉这种突发性的波动。复盘后的改进方向也很清楚日总发电量预测不能只看预报天气标签必须引入逐小时的辐照度预报曲线。我从气象API的免费接口拉取次日逐小时辐照度和云量数据把预测任务从“全天一个数”改成“24个逐小时数”再累加成日总量。同时把当前时刻的实时辐照度作为反馈修正项当系统检测到实时辐照度与预期偏差超过某个阈值时自动拉低后续小时段的预测权重。这个修正逻辑让第二周的预测误差整体下降了大约5个百分点。4.3 实测结果与数据解读我用系统上线后第三周的连续八天数据整理成了下面这张对照表。这八天涵盖了晴天、多云、阵雨和大风四种典型天气算是给了模型一个比较全面的压力测试。日期序列天气概览预测日发电量(kWh)实际日发电量(kWh)相对误差D1晴无云19.218.7-2.6%D2晴转多云15.414.2-7.8%D3多云午后云量增大12.110.9-9.9%D4间歇性小雨6.85.6-17.6%D5阵雨午后放晴5.27.442.3%D6阴天零星降水4.94.1-16.3%D7晴间多云16.615.8-4.8%D8大风晴日18.819.53.7%D5那天的42.3%误差是典型的小概率事件天气预报预测全天阵雨实情却是上午阵雨后云层快速消散午后阳光直接拉满发电量比低估线高出三分之一以上。这类极端转换场景在现有模型里很难提前捕捉除非接入分钟级雷达回波数据。但看整体表现八天里六天误差在±20%以内其中三天在±5%以内对于一个无GPU、纯逻辑推导加回归的项目来说我已经很满意了。这张表也暴露出一个重要的运营规律预测的主要价值不在极端天气而在常态天气。只要模型把晴、多云、小雨这些日常天气的误差控制在15%以内用户就可以放心地根据预测值安排大功率电器的使用时段。极端天气就像偶尔抽风的同事你不可能让他永远靠谱但要确保他大多数时候不掉链子。5. 现场调试踩过的三个坑5.1 电池电压跳变一条接线引发的数据抖动项目进入现场联调阶段后第一个让我熬夜的坑是电池电压数据的神秘跳动。数据显示电池端电压在某个阈值附近每隔几分钟就出现一次短暂的台阶式下跌幅度约0.4V持续十几秒后自动恢复。最诡异的是这个现象毫无规律有时一小时出现三次有时半天不出现一次。理论上磷酸铁锂电池的放电电压曲线非常平缓不可能自己跳来跳去问题一定出在数据采集链路本身。排查过程一开始走错了方向。我先怀疑是ESP32的ADC参考电压漂移于是换了三块不同厂商的采集板测试故障依旧。然后怀疑是RS485通讯干扰给总线加了磁环、屏蔽层接地还是没有根治。最后是拿万用表守在电池端子旁对比采集系统读数和实测电压才发现了真正的秘密万用表读数非常平稳采集系统却在负载启停的同一瞬间出现跳变。我顺着这条线索查接线图终于找到了问题根源——电压采样线的接法。当时为了图省事把电压采样线就近接到了电池端子的接线螺栓上而这个螺栓同时还压着逆变器的直流输入电缆。逆变器在工作时电流脉动很大尤其是在负载启动瞬间电流可以从几安培跳到二十多安培这会在接线端子上产生微小的接触电阻压降。采样线离负载回路太近等于把负载的电流噪声直接送进了ADC前端。解决方案很简单把电压采样线从电池端子改接到电池BMS的专用采样排针上并串联一个双向稳压管做保护同时给ADC读取结果增加一个移动中值滤波。这三步做完电压曲线走向丝般顺滑再也没有复发。这个坑给我留下的经验是采集系统的地线回路设计直接决定了数据质量。信号线与大电流动力线哪怕只有十几厘米的平行距离都可能把开关噪声耦合进来。后来我看到不少同行遇到的数据毛刺问题十有八九都是采样线的物理位置放错了。5.2 阴天预测整体偏差特征太少的锅追完硬件还有一个更隐蔽的软件坑等着我。在一次连续三天阴雨天气之后的复盘里我发现模型的表现呈现一个明显的定向偏差阴天预测值几乎总是比实际值低而且低出的比例非常稳定基本在12%到18%之间。一开始我以为是模型的常数项出了问题于是重新校准了回归系数可到了下一个阴天预测偏差照旧。这让我意识到问题不在系数而在特征本身。我翻阅了当天的原始天气数据发现气象API对“阴天”的云量描述始终是95%以上但这个数字是日均值并不是逐时的云层厚度变化。实际情况却是阴天并不等于全天没有辐照相反当云层偏薄或者云层移动出现短暂裂隙时辐照度可以瞬间跃升到晴天的60%以上。我的模型里存在一个隐式假设阴天全天辐照度平滑且偏低。这个假设在连续阴雨的中段大体成立但在云层厚度不稳定的阴天就被彻底打穿了。模型在阴天系统性偏小根本原因就是缺少“云层厚度波动性”这个特征而不是模型参数不对。对症的修正办法是给模型增加两个新的特征变量一是气象API提供的逐小时云量标准差用它间接量化云层厚度变化程度二是最近一小时实测辐照度的滚动方差作为反馈信息告诉模型“此刻光照波动剧烈不要全套用平均值预测”。加入这两个特征后阴天场景的预测平均误差从17%降到了10%左右。我后来回顾这次调参最大的体会是模型的错误往往不是数学问题而是变量选择没有贴近物理过程。光伏系统的特性是辐照度随云层变化呈高度非线性凡是用日平均量去模拟这个过程的都会在极端天气下暴露出能力边界。5.3 告警风暴阈值设计不是拍脑袋最后一个坑发生在系统上线第一周的周日。那天上午仅仅四个小时我的手机就收到了超过两百条告警推送几乎把微信消息列表刷爆。原因是一场阵雨雨滴刚落到光伏板上时发电功率骤降触发了“功率偏离预测值超20%”的告警雨停后功率回升又触发了“恢复”通知。如此反复四次系统就生成了上百条事件记录。这种“狼来了”式的告警完全失去了意义也让我第一次意识到阈值设计不能靠拍脑袋必须结合设备特性和数据变化节奏。我做了一次系统性的告警机制重构。核心思路是两条给每个告警类型增加“持续判定时间”条件对同一类事件实施“状态倍增值”消抖。以功率偏离告警为例单次采样超限不触发必须连续三个采样周期即90秒都超限才告警恢复通知也一样要连续五个周期恢复正常才发送。这样整场阵雨下来我只收到一条“功率偏离”告警和一条“已恢复”通知告警量从两百条骤降到两条。同时我调整了各类阈值的触点把瞬时值和平均值分开判断瞬时值用于触发硬件保护类告警平均值用于性能衰减类告警。比如电池电压瞬时低于某个安全值必须立刻报警而发电效率下降这种缓慢变化的指标则用24小时滚动平均来判断避免白天短时多云造成的自然波动被误判成设备故障。这次重构让我对“监控系统”有了更深的理解。告警的本质不是越多越好而是“在正确的时间让正确的人注意到问题”。频繁误报会让人变得麻木进而忽略真正的异常而过于迟钝的阈值又会让小问题拖成大故障。合理的设计必须同时考虑设备的物理极限、数据波动的自然规律以及人对告警的耐受度。我现在的告警频率大概每周一两条每一条都值得打开看一眼这才是一个合格监控系统该有的状态。回头再看整个REA项目从一张玩笑说到一句话到一个完整可用的数据平台最大的收获反而不是那些技术选型和代码而是我越来越认同一个朴素的工程观小项目不必追求大架构但必须追求数据闭环。硬件负责感知软件负责记录模型负责预测告警负责通知每一环都简单可靠组合起来就能覆盖一个家庭光伏系统从运行到维护的全部需求。如果让我给想复刻类似项目的朋友提一个建议我会说先别急着上预测模型和各种酷炫功能把数据采集和告警这两层做扎实用干净、连续、可追溯的数据撑起后面的所有分析。同样一套系统数据干净与否决定了项目日后能走多远的全部可能。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑