Первая лабораторная работа: Компоненты и концепции IoT
COURSE-16-M01-LAB01 — Первая лабораторная работа: Компоненты и концепции IoT
Введение
Данная лабораторная работа является первым практическим заданием в рамках курса "COURSE-16: Основы IoT для инженеров автоматизации". Цель работы — закрепить на практике базовые знания об экосистеме Интернета вещей (IoT), её ключевых компонентах и концепциях. Вы научитесь идентифицировать элементы системы, применять стандартный формат данных для телеметрии и спроектируете свой первый поток для симуляции данных с устройства на платформе контроллера HI.
Цели обучения:- Идентифицировать основные компоненты типовой IoT-системы (датчик, исполнительное устройство, логика, ввод).
- Понимать принципы сбора и базовой обработки данных.
- Применять стандартный "контракт сообщения" для унификации передаваемой телеметрии.
- Создать, протестировать и отладить базовый поток в среде Node-RED для эмуляции датчика и отправки данных по протоколу MQTT.
- Внедрить в поток элементы отказоустойчивости: валидацию данных и обработку ошибок.
- Доступ к контроллеру HI (физическому или виртуальному) с установленной средой Node-RED.
- Веб-браузер для доступа к интерфейсу Node-RED.
- Клиент MQTT Explorer (или аналогичный) для мониторинга сообщений.
Работа считается выполненной при предоставлении единого файла в формате Markdown (`.md`), содержащего:
---
Часть 1: Теоретическая подготовка и анализ
Перед началом практической работы необходимо продемонстрировать понимание ключевых концепций. Выполните следующие задания.
Задание 1.1: Идентификация компонентов системы
Сопоставьте компоненты платформы HI из первого списка с их основными функциями в рамках экосистемы IoT из второго списка.
Компоненты платформы HI:- A. Сбор данных об окружающей среде (телеметрия).
- B. Исполнение команды, физическое воздействие на объект (управление).
- C. Получение управляющего сигнала от пользователя (ввод).
- D. Обработка данных и принятие решений (логика).
Задание 1.2: Анализ телеметрии и работа с данными
Представьте, что вы анализируете данные, поступающие с двух универсальных входов (UI) контроллера HI, к которым подключены датчики температуры в разных помещениях.
| Идентификатор входа | Среднее значение за час (°C) | Максимальное пиковое значение (°C) |
| :--- | :--- | :--- |
| UI-05 (Гостиная) | 22.5 | 24.0 |
| UI-06 (Спальня) | 21.0 | 21.5 |
Вопросы:Задание 1.3: Практическое применение IoT
Опираясь на возможности контроллера HI (22 универсальных входа, 22 релейных выхода, поддержка Modbus, DALI, Node-RED), опишите в 50-100 словах, как его установка в загородном доме может повысить комфорт и безопасность жильцов. Приведите 2-3 конкретных примера сценариев автоматизации (например, `SCN-LIGHT-005`, `SCN-SAFETY-011`).
Задание 1.4: Оценка нагрузки на сеть (трафик)
Инженер проектирует систему мониторинга для небольшого складского комплекса. Система включает 100 Modbus-датчиков, опрашиваемых контроллером HI. Контроллер агрегирует данные и отправляет их на центральный сервер каждый час. Размер пакета данных от одного датчика составляет 128 байт.
---
Часть 2: Практическая работа в Node-RED
В этой части вы создадите и настроите свой первый поток в Node-RED, который пройдет два этапа: от простой симуляции до внедрения механизмов отказоустойчивости.
Этап 1: Симуляция датчика и отправка данных
Цель: Научиться создавать базовые потоки, генерировать данные, форматировать их согласно "контракту сообщения" и публиковать в MQTT. Требования к потоку:[Inject] --(payload: timestamp)--> [Function: Generate & Format Temp] --(msg.payload)--> [mqtt out: telemetry/lab01/temperature]
|
+-----------------------------------------------------> [Debug: msg.payload]
Шаги выполнения:
* `Payload`: `timestamp`
* `Repeat`: `interval` every `5` seconds
* `Name`: "Каждые 5 секунд"
* `Name`: "Генератор температуры"
* Вставьте следующий код:
// Генерируем случайное значение температуры от 20.0 до 25.0
let temperature = (Math.random() * 5 + 20).toFixed(1);
// Формируем сообщение по контракту Академии HI
msg.payload = {
value: parseFloat(temperature), // Преобразуем в число
unit: "°C",
source: "virtual-temp-sensor-lab01",
ts: Date.now() // Текущая временная метка в миллисекундах
};
// Обновляем визуальный статус узла (Паттерн "Визуальный статус")
node.status({fill:"green", shape:"dot", text:`OK: ${temperature} °C`});
return msg;
* `Server`: Выберите или добавьте MQTT-брокер (обычно `localhost:1883` для контроллера HI).
* `Topic`: `telemetry/lab01/temperature`
* `QoS`: `0`
* `Name`: "Отправить в MQTT"
* `Output`: `msg.payload`
* `Name`: "Проверка данных"
- Скриншот потока в Node-RED с отображением статуса узла `Function`.
- Скриншот вкладки `Debug` с примером сообщения.
- Скриншот MQTT Explorer, показывающий полученное сообщение.
- Экспортированный JSON-код потока.
---
Этап 2: Внедрение валидации и обработки ошибок
Цель: Усложнить поток, добавив симуляцию ошибок и реализовав паттерны "Контракт сообщения" (валидация) и "Обработка ошибок" для создания отказоустойчивой логики. Требования к потоку: +--> [mqtt out]
|
[Inject] --> [Function: Generate Temp (with errors)] --> [Function: Validate Data] --+
| +--> [Debug: Valid Data]
v (on error)
[Catch: All Nodes] --> [Debug: Error Log]
Шаги выполнения:
let temperature;
// 20% вероятность генерации некорректных данных
if (Math.random() < 0.2) {
temperature = (Math.random() < 0.5) ? "invalid_string" : 99.0; // Некорректный тип или значение вне диапазона
} else {
temperature = (Math.random() * 5 + 20).toFixed(1);
}
msg.payload = {
value: typeof temperature === 'string' ? temperature : parseFloat(temperature),
unit: "°C",
source: "virtual-temp-sensor-lab01",
ts: Date.now()
};
node.status({fill:"blue", shape:"dot", text:`Generated: ${temperature}`});
return msg;
const payload = msg.payload;
const { value, unit, source, ts } = payload;
// Проверка контракта: тип и диапазон значения
if (typeof value !== 'number' || isNaN(value) || value < 0 || value > 50) {
node.status({fill:"red", shape:"dot", text:`ERROR: Invalid value (${value})`});
node.error(`Contract violation: Invalid temperature value: ${value}`, msg);
return null; // Останавливаем поток
}
// Другие проверки контракта (наличие полей, типы и т.д.)
if (!unit || !source || !ts) {
node.status({fill:"red", shape:"dot", text:"ERROR: Missing fields"});
node.error("Contract violation: Missing required fields", msg);
return null;
}
// Если все проверки пройдены
node.status({fill:"green", shape:"dot", text:`OK: ${value} °C`});
return msg; // Передаем валидное сообщение дальше
- Скриншот итогового потока в Node-RED с отображением статусов узлов.
- Скриншот вкладки `Debug`, где одновременно видны и валидные сообщения, и перехваченные ошибки.
- Экспортированный JSON-код финального потока.
---
Рубрика оценивания и чек-лист для самопроверки
| Критерий | Макс. балл | Описание | Ваш чек-лист |
| :--- | :--- | :--- | :--- |
| Часть 1: Теория | 20 | Даны полные и корректные ответы на все вопросы (1.1 - 1.4). | `[ ]` |
| Этап 1: Базовый поток | 30 | Поток создан согласно схеме. Данные генерируются и отправляются в MQTT в правильном формате. Статус узла отображается. | `[ ]` |
| Этап 2: Поток с обработкой ошибок | 30 | Поток модифицирован, включает генерацию ошибок, узел валидации и узел `Catch`. Ошибки корректно перехватываются и логируются. | `[ ]` |
| Документация и сдача | 20 | Предоставлены все требуемые скриншоты (поток, `Debug`, MQTT Explorer) и JSON-коды для обоих этапов. Файл оформлен в формате Markdown. | `[ ]` |
| Итого | 100 | | |
---
Мини-runbook: Диагностика проблем
Этот раздел поможет вам диагностировать и устранить наиболее распространенные проблемы при выполнении данной лабораторной работы.
Проблема 1: Поток Node-RED не отправляет сообщения.- 📋 Чек-лист:
2. Узел `Inject` настроен на периодический запуск и активирован (не "disabled")?
3. Все узлы соединены линиями связи согласно схеме?
4. Нет ли красных треугольников над узлами, сигнализирующих об ошибке конфигурации?
- 💡 Решение: Нажмите `Deploy`. Проверьте настройки узла `Inject`. Исправьте синтаксические ошибки в узлах `Function` (Node-RED обычно подсвечивает их).
- 📋 Чек-лист:
2. В узле `mqtt out` указан правильный адрес брокера (`localhost` или IP контроллера) и порт (`1883`)?
3. В MQTT Explorer вы подключены к тому же брокеру?
4. В MQTT Explorer вы подписаны на правильный топик (`telemetry/lab01/temperature`)? ⚠️ Попробуйте подписаться на `#` для отладки, чтобы увидеть все сообщения.
- 💡 Решение: Перезапустите MQTT-брокер, если он неактивен (`sudo systemctl restart mosquitto`). Дважды проверьте идентичность настроек брокера и топика в Node-RED и в MQTT Explorer.
- 📋 Чек-лист:
2. Узел-валидатор действительно вызывает ошибку с помощью `node.error("Сообщение", msg);`? (Вызов `node.warn()` или возврат `null` не генерируют ошибку для `Catch`).
- 💡 Решение: Проверьте настройки узла `Catch`. Убедитесь, что в коде валидатора для генерации ошибки используется именно функция `node.error()`.
- 📋 Чек-лист:
2. Сообщения вообще доходят до этого узла? (Подключите к его входу узел `Debug`).
- 💡 Решение: Добавьте или исправьте вызов `node.status()`. Проведите трассировку потока с помощью узла `Debug`, чтобы убедиться, что узел исполняется.