ГлавнаяАкадемияCOURSE-16: Основы Интернета Вещей и практическое применение → Визуализация данных на платформе HI: от датчика до дашборда

Визуализация данных на платформе HI: от датчика до дашборда

Урок 5 · COURSE-16: Основы Интернета Вещей и практическое применение · theory

COURSE-16-M03-L06 — Визуализация данных на платформе HI: от датчика до дашборда

Введение в визуализацию данных на встроенных системах

Визуализация данных — это не просто построение красивых графиков. В контексте систем автоматизации и IoT — это ключевой инструмент для оперативного мониторинга, управления и диагностики объекта в реальном времени. Для инженера, работающего с платформой HI, визуализация является основным способом взаимодействия с системой после ее внедрения. Она позволяет мгновенно оценить состояние объекта (температуру, влажность, состояние реле, аварии) и при необходимости вмешаться в его работу.

В отличие от аналитических систем, работающих с "большими данными" (Big Data), где важен ретроспективный анализ, в нашей сфере приоритетом является оперативная визуализация (real-time dashboarding). Наша цель — создать простой, понятный и отзывчивый интерфейс для управления умным домом, офисом или небольшим промышленным объектом прямо с контроллера HI, без зависимости от облачных сервисов.

Основной инструмент: Node-RED Dashboard

Для создания пользовательских интерфейсов на платформе HI мы используем стандартный и мощный инструмент — `node-red-dashboard`. Это набор узлов для Node-RED, который позволяет в несколько кликов создавать веб-интерфейсы, доступные с любого устройства в локальной сети (компьютера, планшета, смартфона).

Ключевые преимущества:

Ключевые компоненты дашборда (UI Nodes)

Для построения интерфейса используются специальные узлы из палитры `dashboard`. Рассмотрим самые важные из них:

| Узел (Node) | Назначение | Пример использования на платформе HI |

| :--- | :--- | :--- |

| `ui_chart` | График. Отображает данные в виде линейного графика, гистограммы или круговой диаграммы. | Мониторинг динамики температуры с датчика 1-Wire за последние 24 часа. |

| `ui_gauge` | Индикатор. Показывает текущее значение на шкале с цветовыми зонами. | Отображение текущей температуры в помещении. Зеленая зона: 20-24°C, желтая: 24-28°C, красная: >28°C. |

| `ui_switch` | Переключатель. Позволяет отправлять команды `ON`/`OFF` или `true`/`false`. | Включение/выключение группы освещения, подключенной к реле контроллера. |

| `ui_text` | Текстовое поле. Выводит статическую или динамическую текстовую информацию. | Отображение статуса системы ("Все в норме", "Авария: протечка"), времени последнего обновления данных. |

| `ui_button` | Кнопка. При нажатии отправляет заданное сообщение для запуска сценария. | Кнопка "Активировать сценарий 'Никого нет дома'", которая выключает свет и розетки. |

| `ui_form` | Форма. Позволяет пользователю вводить данные (текст, числа) и отправлять их в поток. | Установка желаемой температуры (уставки) для системы климат-контроля. |

Практический пример: Создание дашборда мониторинга и управления

Задача: Создать простой дашборд для одной комнаты, который будет:
  • Отображать текущую температуру с датчика DS18B20 (подключен к универсальному входу).
  • Строить график изменения температуры за последний час.
  • Позволять включать и выключать свет, подключенный к реле №5.
  • Flow Diagram (ASCII):
    //========= FLOW-DASH-ROOM-001: Room Monitoring & Control =========
    
    

    // --- 1. Data Acquisition ---

    // Чтение данных с датчика 1-Wire каждые 15 секунд

    [Inject: 15s] --> [1-Wire In: DS18B20] --> [Function: Validate & Format] --+

    |

    // --- 2. Visualization --- |

    // Отправка данных на дашборд |

    +--> [ui_gauge: Температура] |

    +--> [ui_chart: График температуры] |

    +--> [ui_text: Время обновления] |

    |

    // --- 3. Control --- |

    // Получение команды от переключателя на дашборде |

    [ui_switch: Свет] --> [Function: Create Command] --> [Relay Out: RL-05] --+

    |

    // --- 4. Feedback --- |

    // Получение реального статуса реле и отправка его обратно на дашборд |

    +--> [Function: Format State] --> [ui_switch: Свет] (для обновления)

    +--> [Log to MySQL] (для аудита действий)

    // --- 5. Error Handling ---

    [Catch: All Nodes] --> [Function: Format Error] --> [ui_text: Status]

    Шаг 1: Сбор и форматирование данных

    Создаем поток для чтения данных с датчика. Ключевым элементом здесь является узел `Function`, который приводит данные к стандартному контракту сообщения.

    // Узел: Function: Validate & Format
    

    // Вход: msg.payload от датчика (например, "23.562")

    // Выход: msg с payload в формате JSON

    let temp = parseFloat(msg.payload);

    // Валидация

    if (isNaN(temp) || temp < -55 || temp > 125) {

    node.status({fill:"red", shape:"dot", text:"Invalid reading"});

    node.error("Некорректное значение температуры: " + msg.payload, msg);

    return null; // Останавливаем поток

    }

    // Формирование сообщения по контракту

    // Это сообщение будет использоваться для всех последующих узлов

    msg.payload = {

    "value": temp,

    "source": "ds18b20-room-01",

    "ts": Date.now(),

    "unit": "°C"

    };

    // Устанавливаем топик для графика. Все сообщения с одним топиком

    // попадут на одну линию графика.

    msg.topic = "temperature_room_01";

    node.status({fill:"green", shape:"dot", text: temp + " °C"});

    return msg;

    Шаг 2: Визуализация температуры

  • Gauge: Подключите выход узла `Function` к узлу `ui_gauge`. В настройках узла достаточно указать диапазон (например, 0-40) и желаемые цветовые секторы. Узел автоматически возьмет значение из `msg.payload` (если это число) или `msg.payload.value`.
  • Chart: Подключите тот же выход к узлу `ui_chart`. Узел `ui_chart` автоматически будет строить график, используя `msg.payload` как значение по оси Y и время получения сообщения по оси X. `msg.topic` определяет, на какой линии графика отображать значение.
  • Шаг 3: Добавление элемента управления

  • Добавьте на холст узел `ui_switch`.
  • Настройте его так, чтобы при включении он отправлял строковое значение `ON`, а при выключении — `OFF`.
  • Подключите его выход к узлу `Function` ("Create Command"), который сформирует команду для реле.
  •     // Узел: Function: Create Command

    // Вход: msg.payload от ui_switch ("ON" или "OFF")

    // Выход: msg.payload для узла реле (true или false)

    if (msg.payload === 'ON') {

    msg.payload = true;

    } else {

    msg.payload = false;

    }

    return msg;

  • Подключите выход этого узла к узлу управления реле (например, `rpi gpio out`, настроенному на реле №5).
  • Шаг 4: Реализация обратной связи

    ⚠️ Критически важно: Переключатель на дашборде должен отражать реальное состояние реле, а не просто команду, которую отправил пользователь.

    Для этого после узла управления реле добавьте узел, который будет отправлять его новое состояние обратно в `ui_switch`. Это замкнет цикл и гарантирует, что если реле по какой-то причине не включилось, переключатель на дашборде вернется в положение "Выкл".

    Принципы эффективной визуализации для инженера

  • 💡 Цель превыше всего. Прежде чем добавить график, спросите себя: "Какую задачу он решает? Какое решение на его основе можно принять?". Не добавляйте элементы "просто чтобы было".
  • ⚠️ Не перегружайте информацией. Дашборд — это не отчет. Он должен давать быструю оценку ситуации. Выносите на главный экран только самые важные параметры. Второстепенные данные можно разместить на отдельных вкладках.
  • 🎨 Используйте цвета осмысленно. Цвет — мощный инструмент для привлечения внимания. Используйте стандартную семантику:
  • * Зеленый: Норма, ОК, включено.

    * Желтый/Оранжевый: Предупреждение, приближение к пороговому значению.

    * Красный: Авария, ошибка, критическое значение, выключено.

  • 🔗 Обеспечьте контекст. Просто число "25" ничего не значит. Подпишите его: "Температура, °C". Для графика укажите временной диапазон.
  • 🔄 Реализуйте обратную связь. При нажатии на кнопку или переключатель пользователь должен видеть результат своего действия. Элемент интерфейса должен изменить свое состояние, подтверждая, что команда выполнена.
  • Типовые ошибки и диагностика

    * Причина: Узел `ui_chart` требует, чтобы у сообщений для одной линии был одинаковый `msg.topic`. Вероятно, `msg.topic` не задан или меняется.

    * Решение: Перед узлом `ui_chart` установите `msg.topic` в константное значение (например, с помощью узла `Change`).

    * Причина: Либо не добавлено ни одного UI-узла, либо они все отключены, либо вы перешли по неверному URL.

    * Решение: Убедитесь, что узлы `ui_...` есть в потоке и они активны. Проверьте URL для доступа к дашборду (обычно `http://:1880/ui`).

    * Причина: Неправильно настроен контракт сообщения. Узел `ui_switch` отправляет одно, а логика управления реле ожидает другое.

    * Решение: Используйте узел `Debug` после `ui_switch`, чтобы увидеть, какое именно сообщение он отправляет. Адаптируйте последующий поток для обработки этого сообщения.

    * Причина: В дашборд отправляется слишком много данных за короткий промежуток времени (например, данные с датчика отправляются 100 раз в секунду).

    * Решение: Используйте узел `Delay` в режиме `Rate Limit`, чтобы ограничить частоту отправки сообщений в UI-узлы до разумного значения (например, 1 сообщение в секунду).

    ---

    Лабораторная работа: COURSE-16-M03-LAB11 — Создание дашборда мониторинга

    Цель: Создать дашборд для чтения и визуализации данных с двух разных источников: датчика температуры 1-Wire и Modbus-счетчика электроэнергии. Оборудование: Задание:
  • Создать поток для чтения температуры с датчика DS18B20 каждые 10 секунд.
  • Создать поток для чтения текущей потребляемой мощности (кВт) со счетчика электроэнергии по Modbus каждые 5 секунд.
  • На дашборде создать отдельную группу "Климат". В ней разместить:
  • * Индикатор `ui_gauge` для текущей температуры.

    * График `ui_chart` для отображения динамики температуры за последние 30 минут.

  • На дашборде создать группу "Энергопотребление". В ней разместить:
  • * Текстовое поле `ui_text`, отображающее текущую мощность в формате "Х.ХХ кВт".

    * График `ui_chart` (тип "bar chart"), показывающий пики потребления.

    Чек-лист сдачи: Критерии оценки: Усложнение (для самостоятельной работы): Добавьте узел `ui_text`, который будет менять цвет и текст в зависимости от температуры (например, "Холодно", "Норма", "Жарко").

    ---

    Лабораторная работа: COURSE-16-M03-LAB12 — Интерактивная панель управления

    Цель: Расширить дашборд из предыдущей лаборатории, добавив элементы управления освещением и розетками. Оборудование: Задание:
  • Создать на дашборде новую группу "Управление".
  • Добавить в нее два переключателя `ui_switch`: "Свет в комнате" и "Розетки".
  • Создать потоки в Node-RED, которые будут принимать команды от этих переключателей и управлять реле №1 и №2 соответственно.
  • Реализовать механизм обратной связи: состояние переключателей на дашборде должно обновляться в соответствии с реальным состоянием реле.
  • Все команды управления должны логироваться в базу данных MySQL на контроллере с помощью соответствующего узла. Запись в логе должна содержать: временную метку, имя устройства, выполненное действие (`ON`/`OFF`).
  • Чек-лист сдачи: Критерии оценки: Усложнение (для самостоятельной работы): Добавьте кнопку `ui_button` "Выключить все". При ее нажатии оба реле должны выключаться, а их переключатели на дашборде — обновлять свое состояние.

    ---

    Тест для самопроверки: COURSE-16-M03-QUIZ

  • Какой основной инструмент используется для создания веб-интерфейсов на платформе HI?
  • * a) Grafana

    * b) Node-RED Dashboard

    * c) Python (Matplotlib)

    * d) Встроенный веб-сервер с HTML-страницами

  • Для чего используется `msg.topic` при отправке данных в узел `ui_chart`?
  • * a) Чтобы задать заголовок графика.

    * b) Чтобы разделить данные на разные линии на одном графике.

    * c) Чтобы указать единицы измерения.

    * d) Для этого узла `msg.topic` не используется.

  • Вы хотите отобразить текущую температуру на круговой шкале с зеленой, желтой и красной зонами. Какой узел вы используете?
  • * a) `ui_chart`

    * b) `ui_text`

    * c) `ui_gauge`

    * d) `ui_form`

  • Что такое "принцип обратной связи" применительно к элементам управления на дашборде?
  • * a) Пользователь должен получить email-уведомление после нажатия кнопки.

    * b) Состояние элемента управления (например, переключателя) должно отражать реальное состояние оборудования, а не просто отправленную команду.

    * c) Каждое действие должно сопровождаться звуковым сигналом.

    * d) Данные с датчиков должны обновляться после отправки команды.

  • Ваш дашборд перестал отвечать. Вы отправляете данные с датчика вибрации 50 раз в секунду. В чем наиболее вероятная причина проблемы?
  • * a) Неправильный IP-адрес контроллера.

    * b) Слишком высокая частота отправки сообщений в UI-узлы, что перегружает браузер и WebSocket соединение.

    * c) Закончилось место на диске контроллера.

    * d) Ошибка в контракте сообщения.

  • Какой узел поможет вам ограничить частоту отправки сообщений на дашборд до одного раза в две секунды?
  • * a) `Switch`

    * b) `Function`

    * c) `Catch`

    * d) `Delay` (в режиме Rate Limit)

  • Вы хотите, чтобы при нажатии на кнопку на дашборде запускался сложный сценарий (например, "Я ушел"). Какой узел лучше всего подходит для этой цели?
  • * a) `ui_switch`

    * b) `ui_button`

    * c) `ui_slider`

    * d) `ui_text_input`

  • Для доступа к дашборду по умолчанию используется URL:
  • * a) `http://:1880`

    * b) `http://:1880/admin`

    * c) `http://:1880/ui`

    * d) `http:///dashboard`

  • Зачем нужен узел `Function` или `Change` перед узлами `ui_...`?
  • * a) Чтобы замедлить поток данных.

    * b) Чтобы привести `msg` к формату, который понимает узел дашборда (контракт сообщения).

    * c) Чтобы зашифровать данные.

    * d) Это не обязательно, узлы дашборда принимают любые данные.

  • Вы создали дашборд, но он работает только с вашего компьютера в офисе. В чем может быть причина?
  • * a) Дашборд привязан к MAC-адресу.

    * b) Ваш компьютер и контроллер находятся в одной локальной сети, а другие устройства — нет.

    * c) Требуется специальная лицензия для удаленного доступа.

    * d) Node-RED Dashboard не поддерживает мобильные устройства.

    ---

    Мини-Runbook: "Если дашборд не работает"

    📋 Пошаговая диагностика:

  • Проверьте доступность: Попробуйте открыть дашборд в браузере в режиме "инкогнито" по адресу `http://:1880/ui`. Если страница не открывается, проверьте сетевое подключение к контроллеру (команда `ping `).
  • Проверьте поток: Откройте редактор Node-RED. Убедитесь, что в проекте есть хотя бы один активный узел из палитры `dashboard` (например, `ui_button`). Если узлы есть, но они серые (отключены), включите их и разверните проект (Deploy).
  • Проверьте данные (для графиков и индикаторов):
  • * Подключите узел `Debug` к выходу потока, который отправляет данные на дашборд (например, после узла `Function`, форматирующего показания датчика).

    * Убедитесь, что сообщения действительно генерируются.

    * Проверьте структуру `msg.payload`. Для `ui_gauge` это должно быть простое число. Для `ui_chart` — тоже число. Убедитесь, что `msg.topic` задан, если вы хотите строить несколько линий.

  • Проверьте управление (для кнопок и переключателей):
  • * Подключите узел `Debug` сразу после узла `ui_switch` или `ui_button`.

    * Нажмите на элемент в интерфейсе.

    * Посмотрите в панели отладки, какое сообщение было сгенерировано. Убедитесь, что ваша последующая логика ожидает именно такое сообщение.

  • Проверьте консоль браузера: Откройте дашборд, нажмите F12 (Инструменты разработчика) и перейдите на вкладку "Консоль". Ищите красные сообщения об ошибках. Часто там можно найти информацию об ошибках WebSocket-соединения или неправильном формате данных.