Анализ и проектирование базовых IoT-сценариев
COURSE-16-M03-LAB02 — Анализ и проектирование базовых IoT-сценариев
Введение
Данная лабораторная работа является практическим заданием для оценки базовых знаний, полученных в Модуле 3 «Работа с данными в IoT». Цель работы — проверить ваше умение применять теоретические концепции на практике, используя стандарты и подходы, принятые в Академии HI. Вы должны продемонстрировать навыки проектирования потоков данных, применения паттернов Node-RED и декомпозиции задач автоматизации на примере контроллера HI.
Работа состоит из семи заданий, охватывающих ключевые аспекты: от работы с сенсорами и обработки ошибок до проектирования сложных сценариев и конечных автоматов. Каждое задание требует не просто ответа, а решения, оформленного в формате, принятом для инженерной документации.
Предварительные требования
- Изучены материалы уроков COURSE-16-M01, COURSE-16-M02 и COURSE-16-M03.
- Понимание принципов работы протоколов MQTT и Modbus.
- Базовые навыки работы в среде Node-RED.
- Ознакомление со стандартами Академии: «Паттерны Node-RED», «Протоколы Modbus» и «Стандарты схем подключения».
Необходимое окружение
- Текстовый редактор с поддержкой Markdown для оформления ответов.
- Доступ к среде Node-RED на контроллере HI (для справки и проверки идей).
---
Задание 1. Формирование контракта сообщения для сенсоров
Контекст: На объекте установлены три типа датчиков, подключенных к универсальным входам (UI) и шинам данных контроллера HI. Ваша задача — определить стандартный формат сообщения (`msg.payload`), который будет использоваться для передачи их показаний в систему по протоколу MQTT, следуя паттерну «Контракт сообщения». Задача: Для каждого типа сенсора из таблицы ниже создайте корректный JSON-объект `msg.payload`, соответствующий стандарту Академии HI.| Тип сенсора | Пример ID источника (`source`) | Назначение |
| :--- | :--- | :--- |
| Датчик температуры | `temp-sens-room-01` | Измерение температуры воздуха |
| Датчик влажности | `hum-sens-room-01` | Измерение относительной влажности |
| Датчик освещенности | `light-sens-outdoor-main` | Измерение уровня освещенности |
Формат ответа: Предоставьте три блока кода с JSON-объектами для каждого сенсора. Используйте реалистичные значения и единицы измерения. Временную метку `ts` можно оставить в виде `1678886400000`. Критерии оценки:- Корректность (5 баллов): Для каждого сенсора создан валидный JSON.
- Соответствие стандарту (5 баллов): Структура JSON полностью соответствует паттерну «Контракт сообщения» (наличие полей `value`, `source`, `ts`, `unit`).
- Релевантность данных (2 балла): Приведены адекватные значения и единицы измерения (`°C`, `%`, `lux`).
---
Задание 2. Анализ состояния устройств по данным Node-RED
Контекст: В интерфейсе Node-RED вы наблюдаете за потоком, который опрашивает три Modbus-устройства. Узлы `Modbus-Getter` отображают свой статус, как показано в таблице, в соответствии с паттерном «Визуальный статус». Задача: Заполните таблицу, описав предполагаемый статус каждого устройства и наиболее вероятную техническую причину такого состояния.| Визуальный статус узла в Node-RED | Устройство | Статус (опишите словами) | Вероятная причина |
| :--- | :--- | :--- | :--- |
| `fill:"green", shape:"dot", text:"OK: 22.5 °C"` | Устройство 1 (Датчик температуры) | | |
| `fill:"red", shape:"ring", text:"Error: Timeout"` | Устройство 2 (Счетчик электроэнергии) | | |
| `fill:"yellow", shape:"ring", text:"Connecting..."` | Устройство 3 (Релейный модуль) | | |
Формат ответа: Скопируйте таблицу и заполните пустые ячейки.💡 Совет: Вспомните паттерн «Визуальный статус» и жизненный цикл узлов, работающих с внешним оборудованием. Ошибка `Timeout` часто связана с физическими проблемами.
Критерии оценки:- Корректность статуса (6 баллов): Правильно интерпретирован каждый из трех визуальных статусов.
- Логичность причины (6 баллов): Для каждого статуса указана технически правдоподобная причина (например, обрыв шины RS-485, перезагрузка устройства, штатная работа).
---
Задание 3. Проектирование архитектуры потока данных
Контекст: Классическое определение Интернета вещей гласит: «Интернет вещей (IoT) — это концепция, согласно которой физические объекты могут взаимодействовать друг с другом и передавать данные через сеть». Задача: Заполните пропуски в приведенной ниже ASCII-схеме, которая иллюстрирует это определение на примере экосистемы HI. Вместо пропусков `[ _______ ]` подставьте названия протоколов, интерфейсов или компонентов системы.// Схема потока данных от датчика до облачного сервиса
(SENS:Temp:DS18B20) <---[ 1-Wire ]--- [CTRL:HI-Core] ---[ _______ ]---> (MQTT Broker) ---[ _______ ]---> [Cloud Platform]
| |
| |
<---[ _______ ]--- [CTRL:HI-Core]
Формат ответа: Перерисуйте ASCII-схему, заполнив все три пропуска.
Критерии оценки:
- Корректность (9 баллов): Каждый из трех пропусков заполнен логичным и технически верным компонентом/протоколом из стека технологий HI (например, MQTT, Modbus, GPIO, TCP/IP).
---
Задание 4. Проектирование потока Node-RED для сценария «Я пришел домой»
Контекст: Одним из самых популярных сценариев в умном доме является «Я пришел домой». Он автоматически активирует различные системы при возвращении владельца. Задача: Спроектируйте поток Node-RED для реализации этого сценария. Условия:* Открытие входной двери (сигнал с геркона на универсальном входе `UI-05`).
* Появление смартфона владельца в локальной Wi-Fi сети (определяется по пингу IP-адреса `192.168.1.100`).
* Включить свет в прихожей (реле `RL-01`).
* Отправить команду на Modbus-термостат (Slave ID=15) для установки уставки температуры 22°C (запись значения `220` в Holding Register `40001`).
Требуемый результат:- Логика потока (5 баллов): ASCII-схема корректно отражает последовательность действий и обработку двух триггеров.
- Логика принятия решения (5 баллов): Описание логики узла `Function` является полным и реализует заданные условия.
- Контракты сообщений (2 балла): Описаны корректные `msg.payload` для управления реле и Modbus-устройством.
---
Задание 5. Реализация паттерна «Обработка ошибок»
Контекст: В системе используется поток для опроса счетчика электроэнергии по Modbus. Необходимо гарантировать, что любая ошибка связи (например, `Timeout`) будет перехвачена, стандартизирована и подготовлена для записи в системный журнал. Задача: Спроектируйте фрагмент потока Node-RED, который реализует паттерн «Обработка ошибок». Условия:
{
"level": "error",
"message": "Modbus communication failure",
"details": "Error: Timed out",
"source_node_id": "...",
"source_node_name": "...",
"ts": 1678886400000
}
Требуемый результат:
- Корректность схемы (5 баллов): Схема правильно использует узел `Catch`.
- Код обработчика (7 баллов): Код в `Function` корректно извлекает данные из `msg.error` и формирует целевой JSON.
---
Задание 6. Проектирование переиспользуемого компонента (Subflow)
Контекст: Логика валидации и форматирования показаний датчика температуры повторяется в нескольких потоках. Чтобы следовать принципу DRY (Don't Repeat Yourself), эту логику необходимо вынести в субпоток (Subflow). Задача: Спроектируйте субпоток `Validate & Format Temperature`. Условия:* Проверяет, что значение является числом и находится в допустимом диапазоне от -55 до +125 °C.
* Если валидация пройдена, формирует на первом выходе `msg` с `payload` в формате «Контракта сообщения» (см. Задание 1).
* Если валидация не пройдена, формирует на втором выходе `msg` с информацией об ошибке.
- Архитектура субпотока (5 баллов): Правильно определены входы/выходы и переменные окружения.
- Внутренняя логика (7 баллов): Схема и/или код корректно реализуют валидацию и ветвление на два выхода.
---
Задание 7. Проектирование конечного автомата (FSM) для управления климатом
Контекст: Необходимо спроектировать логику управления кондиционером, который может работать в нескольких режимах. Использование паттерна «Конечный автомат» (FSM) позволяет избежать путаницы и создать надежную систему. Задача: Спроектируйте FSM для управления климатом. Условия:* `flow.climate_state` — текущее состояние (хранится в контексте потока).
* `flow.setpoint` — уставка температуры (например, 22°C).
* `msg.payload.value` — текущая температура от датчика.
* Из `Off` в `Cooling`, если `температура > уставка + 1`.
* Из `Off` в `Heating`, если `температура < уставка - 1`.
* Из `Cooling` в `Off`, если `температура < уставка`.
* Из `Heating` в `Off`, если `температура > уставка`.
Требуемый результат:- Диаграмма состояний (4 балла): Диаграмма полна и корректна.
- Архитектура FSM в Node-RED (8 баллов): ASCII-схема логична и правильно использует узлы `Switch` и `Change` для управления состоянием на основе данных из контекста.
---
Формат сдачи работы
Подготовьте один документ в формате Markdown (`.md`), содержащий последовательные ответы на все семь заданий. Для каждого задания предоставьте требуемые артефакты: блоки кода, таблицы, ASCII-схемы.
Рубрика оценивания
| Задание | Макс. баллов | Ключевые критерии |
| :--- | :--- | :--- |
| Задание 1 | 12 | Соответствие JSON-объектов стандарту «Контракт сообщения». |
| Задание 2 | 12 | Корректная интерпретация статусов и техническая логика причин. |
| Задание 3 | 9 | Правильное заполнение архитектурной схемы компонентами стека HI. |
| Задание 4 | 12 | Логичность потока, корректность логики принятия решения. |
| Задание 5 | 12 | Правильное применение паттерна «Обработка ошибок», корректность кода. |
| Задание 6 | 12 | Корректное проектирование субпотока, реализация валидации. |
| Задание 7 | 12 | Полнота диаграммы состояний, правильная реализация FSM в Node-RED. |
| Итого | 81 | |
📋 Мини-runbook «Если не получается»
- Задание 1: Перечитайте стандарт «Паттерны Node-RED», секцию «Контракт сообщения». Убедитесь, что ваш JSON валиден, используя онлайн-валидатор.
- Задание 2: Вспомните, что `Timeout` почти всегда указывает на проблему на физическом или сетевом уровне (обрыв кабеля, выключенное устройство, неверный IP-адрес).
- Задание 4: Разбейте задачу на части. Сначала получите данные от геркона. Отдельно настройте пинг. Затем используйте узел `Trigger` или `Join` для объединения событий.
- Задание 5: Вставьте узел `Debug` после узла `Catch`, чтобы увидеть полную структуру объекта `msg.error`. Это поможет вам понять, откуда брать данные.
- Задание 7: Начните с простого. Нарисуйте состояния и стрелки переходов на бумаге. Затем перенесите эту логику в Node-RED, где главный `Switch` — это выбор текущего состояния, а вложенные `Switch` — проверка условий перехода.