Javascript 将前5个值相加以计算偏移量

Javascript 将前5个值相加以计算偏移量,javascript,node-red,Javascript,Node Red,我使用节点red获取称重传感器的信号。我使用MQTT(来自python脚本)接收称重传感器的值,然后我想保存来自MQTT的前5个值以计算称重传感器的偏移量。然后,当我得到偏移量时,我可以从我的msg.payload中减去它,将称重传感器设置为0 我试着做了一个while循环来累加前5个值,但是结果是更新的,即使前5个值消失了。看起来它应用了循环中的计算,即使循环结束 var offset0 = 0; var i = 0; while (i < 5) { offset0 = pa

我使用节点red获取称重传感器的信号。我使用MQTT(来自python脚本)接收称重传感器的值,然后我想保存来自MQTT的前5个值以计算称重传感器的偏移量。然后,当我得到偏移量时,我可以从我的
msg.payload
中减去它,将称重传感器设置为0

我试着做了一个while循环来累加前5个值,但是结果是更新的,即使前5个值消失了。看起来它应用了循环中的计算,即使循环结束

var offset0 = 0;
var i = 0;


while (i < 5) {
    offset0 = parseFloat(msg.payload) + offset0;
    i = i + 1;
}
offset0 = offset0 / 5;


msg.payload = offset0;
return msg;
应采取前5项措施:

1.93, 1.94, 1.95, 1.94, 1.96 

然后求平均值。

你可以取指数的剩余部分,然后将
和重置为零,得到最后五对四的平均值

var值=[1.93,1.94,1.95,1.94,1.96,1.93,1.88,1.93],
总和=0,
计数=0,
我
对于(i=0;i}
您的方法存在许多问题

首先,默认情况下,函数节点(代码运行的地方)不保持任何状态。这意味着对于每个传入消息,
offset0
将重置为0

其次,代码由传入消息触发,这意味着
while()
循环将始终以相同的值运行(触发节点的消息的
msg.payload
中的值)

您需要使用已知的来存储到达功能节点的消息之间的值

像这样的事情应该是一个起点:

//get current offset array from context or empty array
var offset = context.get('offset') || [];

//if less than 5 readings store value and do not send on message
if (offset.length < 5) {
  offset.push(msg.payload);
  context.set('offset',offset);
  return;
} else {
  //otherwise calculate mean and remove from value and forward.
  var o;
  for (var i=0; i<5; i++) {
    o += offset[i];
  }
  msg.payload = msg.payload - (o/5);
  return msg;
}
//从上下文或空数组获取当前偏移量数组
var offset=context.get('offset')||[];
//如果少于5个读数,则存储数值,不发送信息
如果(偏移量长度<5){
偏置推送(消息有效载荷);
context.set('offset',offset);
返回;
}否则{
//否则,计算平均值并从值中删除并向前移动。
var o;

对于(var i=0;我是否有
msg
的一些数据以及想要的结果?我更新了我的帖子以显示数据。@Ninascholz这在节点红色功能节点中不起作用,因为这些值事先不知道,我们需要使用上下文在消息之间存储值。太好了!谢谢。这意味着现在我可以访问off从另一个节点设置?是的,请阅读有关3个不同级别的上下文存储(节点、流、上下文)的链接文档
//get current offset array from context or empty array
var offset = context.get('offset') || [];

//if less than 5 readings store value and do not send on message
if (offset.length < 5) {
  offset.push(msg.payload);
  context.set('offset',offset);
  return;
} else {
  //otherwise calculate mean and remove from value and forward.
  var o;
  for (var i=0; i<5; i++) {
    o += offset[i];
  }
  msg.payload = msg.payload - (o/5);
  return msg;
}