Расчет усредненного значения за период (скользящая средняя)

Добрый день,
Есть потребность работать со усредненным значением за период - напр, середняя Т за последние N минут. Не могу сходу сообразить, как это реализовать на wb-rules, если кто-то сталкивался поделитесь примером скрипта плз

Добрый день.

В качестве примера:

/*
Функция для расчета скользящей средней, где аргументы:
  data — массив значений
  windowSize — размер окна (количество элементов для усреднения)
*/
function calculateMovingAverage(data, windowSize) {
  var movingAverage = [];
  for (var i = 0; i < data.length; i++) {
    var sum = 0;
    var count = 0;
    for (var j = Math.max(0, i - windowSize + 1); j <= i; j++) {
      sum += data[j];
      count++;
    }
    movingAverage.push(sum/count);
  }
  return movingAverage;
}

var control = "wb-msw-v4_222/Temperature"; // Контрол, значения которого необходимо усреднять
var data = [];                             // Массив, куда будут добавляться значения контрола
var time = 5000;                           // Время, в течение которого будут добавляться значения в массив (мс)
var tickerTime = 1000;                     // Интервал периодического таймера (мс)

startTicker("ticker", tickerTime);

defineRule({
  when: function () { 
    return timers.ticker.firing; 
  },
  then: function () {
    if (time > 0) {
      time -= tickerTime;
      data.push(dev[control]);
    } else {
      data.shift();
      data.push(dev[control]);
    }
    var movingAverage = calculateMovingAverage(data, data.length); // Рассчет скользящего среднего при размере окна равному количеству элементов массива
    log(movingAverage[data.length - 1]); // Вывод в лог последнего значения
  }
});
1 Like

Александр, большое спасибо за понятный пример

1 Like