Застосування вузлів та функцій для обробки та трансформації даних в Node-RED.¶
Мета: Набуття навичок практичного застосування вузлів та функцій в середовищі Node-RED для ефективної обробки та трансформації даних.
Виконавець:
студент групи КН-41
Кривобоков Микита Олександрович
Завдання¶
- Використовуючи попередній потік, проаналізуйте область вказану на Рис 1.0 на предмет можливих оптимізацій за рахунок використання блоку
Functionта можливостей контексту. - Замініть надлишкові вузли, використовуючи вузол
Functionякий реалізовує необхідний функціонал. - Реалізуйте функціонал загальної аналітики (у рамках серії повідомлень) за критеріями: загальна тривалість тривог (
total duration), загальна кількість тривог (total count), середня тривалість тривоги (average duration), мінімальна та максимальна тривалості тривоги (min duration,max duration). Результати необхідно зберігати в контексті потоку та надсилати на порт виводу №2 (по аналогії з попередньою практичною роботою), приклад полів наведено на Рис 1.2. - Додайте функціонал форматування дат за допомогою інтеграції бібліотеки
moment.jsу вузлахFunction. - Реалізований функціонал повинен коректно працювати у випадку багаторазового отримання послідовності повідомлень; статистика має накопичуватися відповідно до заданих критеріїв, з урахуванням усіх отриманих (за увесь час) повідомлень.
- Сформувати шаблони для виведення інформації за прикладом попередньої практичної роботи (можливе повторне використання).
- Складіть звіт про виконану роботу, в якому необхідно перелічити використані вузли та їх застосування. А також, описати в деталях перший пункт з даного переліку завдань.
Хід роботи¶
Оптимізація під-потоку статистики¶
Оптимізація передбачала використання компонента 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 для ефективної обробки та трансформації даних, з проміжковими результатами та потоковою обробкою в реальному часі.


