Добавление первых 5 значений для вычисления смещения - PullRequest
1 голос
/ 20 января 2020

Я использую нод-красный, чтобы получить сигнал от моей ячейки загрузки. Я получаю значение ячейки загрузки, используя MQTT (из моего сценария python), затем я хотел бы сохранить первые 5 значений, поступающих из MQTT, для вычисления смещения моей ячейки загрузки. Затем, когда у меня будет смещение, я могу вычесть его из моего msg.payload, чтобы установить тензодатчик на 0.

Я попытался сделать некоторое время l oop, чтобы накопить первые 5 значений, но результат обновляется, даже если первые 5 значений пропали. Похоже, что он применил вычисления, которые находятся внутри моего l oop, даже если l oop закончился.

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 

и составить среднее значение.

Ответы [ 2 ]

1 голос
/ 20 января 2020

Существует ряд проблем с вашим подходом.

Во-первых, по умолчанию узел функции (где работает ваш код) не сохраняет никакого состояния. Это означает, что offset0 будет сброшено в 0 для каждого входящего сообщения.

Во-вторых, код запускается входящим сообщением, это означает, что while() l oop всегда будет работать с тем же значением (что когда-либо было в 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;
}
1 голос
/ 20 января 2020

Вы можете взять оставшуюся часть индекса и сбросить 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);
    }
}
...