You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:40:04