添加前 5 个值以计算偏移量

Adding the first 5 values to compute offset

我正在使用 node-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;

msg 在我的称重传感器发出每个新数据后更新...或者我只想保留前 5 个值(5 个用于进行测试,然后我想使用5分以上)。

例如,这是我从称重传感器获得的数据:

1.93, 1.94, 1.95, 1.94, 1.96, 1.93, 1.88, 1.93. 

它应该取前 5 个:

1.93, 1.94, 1.95, 1.94, 1.96 

并取平均值。

您可以取索引的余数并将 sum 重置为零,然后得到最后五个的平均值为四个。

var values = [1.93, 1.94, 1.95, 1.94, 1.96, 1.93, 1.88, 1.93],
    sum = 0,
    count = 0,
    i;

for (i = 0; i < values.length; i++) {
    if (i % 5 === 0) sum = 0;         // reset
    sum += values[i];
    if (i % 5 === 4) {                // take mean
        console.log(sum / 5);
    }
}

你的方法有很多问题。

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

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

您需要使用所谓的 context 来存储到达函数节点的消息之间的值。

像这样的东西应该是一个起点:

//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;
}