Skip to content

Застосування вузлів та функцій для обробки та трансформації даних в Node-RED.

Мета: Набуття навичок практичного застосування вузлів та функцій в середовищі Node-RED для ефективної обробки та трансформації даних.

Виконавець:
студент групи КН-41
Кривобоков Микита Олександрович


Завдання

  1. Використовуючи попередній потік, проаналізуйте область вказану на Рис 1.0 на предмет можливих оптимізацій за рахунок використання блоку Function та можливостей контексту.
  2. Замініть надлишкові вузли, використовуючи вузол Function який реалізовує необхідний функціонал.
  3. Реалізуйте функціонал загальної аналітики (у рамках серії повідомлень) за критеріями: загальна тривалість тривог (total duration), загальна кількість тривог (total count), середня тривалість тривоги (average duration), мінімальна та максимальна тривалості тривоги (min duration, max duration). Результати необхідно зберігати в контексті потоку та надсилати на порт виводу №2 (по аналогії з попередньою практичною роботою), приклад полів наведено на Рис 1.2.
  4. Додайте функціонал форматування дат за допомогою інтеграції бібліотеки moment.js у вузлах Function.
  5. Реалізований функціонал повинен коректно працювати у випадку багаторазового отримання послідовності повідомлень; статистика має накопичуватися відповідно до заданих критеріїв, з урахуванням усіх отриманих (за увесь час) повідомлень.
  6. Сформувати шаблони для виведення інформації за прикладом попередньої практичної роботи (можливе повторне використання).
  7. Складіть звіт про виконану роботу, в якому необхідно перелічити використані вузли та їх застосування. А також, описати в деталях перший пункт з даного переліку завдань.

Хід роботи

Оптимізація під-потоку статистики

Оптимізація передбачала використання компонента Function на заміну Change та Humanizer.

До оптимізації

До оптимізації потоку


Після оптимізації

Оптимізований потік


Приклад кінцевого повідомлення

Результат

Код компоненту обробки статистики
// Отримуємо поточний стан або ініціалізуємо нульовий
let stats = flow.get("flowStats") || {
    totalDuration: 0,
    totalCount: 0,
    minDuration: null,
    maxDuration: null,
    avgDuration: 0
};

const updateStats = (item) => {
    if (!item || typeof item.duration !== 'number') return;

    // Накопичення суми та кількості
    stats.totalDuration += item.duration;
    stats.totalCount++;

    // Оновлення екстремумів (перший запис або менше/більше поточного)
    if (stats.minDuration === null || item.duration < stats.minDuration) stats.minDuration = item.duration;
    if (stats.maxDuration === null || item.duration > stats.maxDuration) stats.maxDuration = item.duration;

    // Перерахунок середнього
    stats.avgDuration = Math.ceil(stats.totalDuration / stats.totalCount);
};

// Обробка масиву або одного об'єкта
if (Array.isArray(msg.payload)) {
    msg.payload.forEach(updateStats);
} else if (typeof msg.payload === 'object') {
    updateStats(msg.payload);
}

// Збереження в контекст та вивід результату
flow.set("flowStats", stats);
msg.payload = stats;

return msg;

Як результат: усі дані накопичуються через акамулятор в контексті, тому подальші ітерації збільшують значення кількості і загальної тривалості.


Гуманізатор

Початковий компонент гуманізатора недостатньо гнучкий для роботи із декількома полями та результатом, тому було створено окрему функцію з інтеграцією модуля moment.js.

Код компонента гуманізатора
// Список полів, які треба обробити
const fields = ['totalDuration', 'avgDuration', 'minDuration', 'maxDuration'];

// Ініціалізація вихідного об'єкта
msg.payload.formatted = msg.payload.formatted || {};

fields.forEach(field => {
    // Перевіряємо, чи є таке поле у вхідних даних
    if (field in msg.payload) {
        // Конвертуємо і записуємо у formatted
        msg.payload.formatted[field] = moment.duration(+msg.payload[field], 'seconds').humanize();
    }
});

return msg;

Вивід даних

Вивід даних здійснюється в два дебага: перший виводить інформацію про поточно опубліковані повідомлення, другий виводить глобальну статистику на основі кількості об'єктів на вході, зберігаючи дані в проміжковому контексті (третій дебаг використовується для виводу помилок).

Висновок

Виконання практичної роботи дозволило набути навички практичного застосування вузлів та функцій в середовищі Node-RED для ефективної обробки та трансформації даних, з проміжковими результатами та потоковою обробкою в реальному часі.