Node-RED中如何基于小时级动态JSON计算指定字段每小时平均值?
Node-RED实现每小时IAQ平均值计算与邮件报告
核心思路
利用Node-RED的上下文存储维护1小时内的IAQ数据列表,定时触发平均值计算并生成邮件报告,流程分为「实时数据收集」和「定时计算报告」两部分。
1. 实时数据收集(JavaScript节点)
每次获取到动态JSON数据后,提取analogInput["4"]字段值并存入上下文列表:
示例输入JSON
{ "analogInput": { "4": 87.26, "1": 22.5, "2": 45.3 }, "timestamp": "2024-05-20T14:30:00Z" }
JavaScript节点代码
// 从上下文获取当前小时的IAQ数值列表,无则初始化空数组 let iaqValues = context.get('iaqHourlyValues') || []; // 提取目标字段值 const currentIaq = msg.payload.analogInput["4"]; // 将新值加入列表 iaqValues.push(currentIaq); // 更新上下文存储 context.set('iaqHourlyValues', iaqValues); // 传递原消息(不影响后续流程) return msg;
注:若需跨流程共享数据,可将
context替换为flow或global(如flow.get('iaqHourlyValues'))。
2. 定时计算与邮件报告
使用「注入节点」设置每小时触发(Cron表达式填0 * * * *),连接到JavaScript节点完成平均值计算,再对接「邮件节点」发送报告。
JavaScript节点代码(计算+重置)
// 取出上下文存储的1小时数据 let iaqValues = context.get('iaqHourlyValues') || []; let avgIaq = 0; if (iaqValues.length > 0) { // 计算总和 const total = iaqValues.reduce((acc, val) => acc + val, 0); // 计算平均值并保留两位小数 avgIaq = (total / iaqValues.length).toFixed(2); } // 构建邮件内容 msg.payload = `每小时室内空气质量(IAQ)报告 时间:${new Date().toLocaleString()} 平均IAQ值:${avgIaq} 数据采样次数:${iaqValues.length}`; // 重置上下文,准备下一小时的数据收集 context.set('iaqHourlyValues', []); // 传递消息给邮件节点 return msg;
邮件节点配置
- 主题设置为「每小时IAQ报告」
- 收件人、发件人信息根据实际需求填写
关键注意事项
- 确保上下文存储的生命周期:若Node-RED重启,默认上下文数据会丢失,可开启上下文持久化(在
settings.js中配置contextStorage) - 异常处理:若JSON数据中
analogInput["4"]不存在,需添加判断避免报错(如const currentIaq = msg.payload?.analogInput?.["4"] || null;,并跳过无效值) - 采样频率:根据数据推送频率调整,确保1小时内的样本量足够反映平均水平
内容的提问来源于stack exchange,提问作者s hunter
相关产品推荐
相关产品推荐

