添加前 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;
}
我正在使用 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;
}