Итоговый тест по модулю "Данные в системах IoT"
COURSE-16-M03-QUIZ — Итоговый тест по модулю "Данные в системах IoT"
Введение
Данный тест предназначен для проверки знаний и практических навыков, полученных в Модуде 3 «Данные в системах IoT». Цель теста — оценить вашу способность работать с данными на платформе HI: от сбора с физических устройств до обработки, форматирования, хранения и подготовки к отправке в облачные сервисы.
Инструкции:- Внимательно прочитайте каждое задание.
- Ответы должны быть развернутыми и технически точными.
- В заданиях, где это требуется, используйте стандарты Академии HI, в частности «Контракт сообщения», паттерны Node-RED и методологии работы с протоколами.
- Общее количество баллов за тест: 50.
- Проходной балл для успешного завершения теста: 80% (40 баллов).
---
Задание 1: Форматирование данных по контракту (3 балла)
На универсальный вход `UI-01` контроллера HI подключен датчик температуры DS18B20. Его уникальный идентификатор (ID) в системе 1-Wire — `28-01234567abcd`. Узел Node-RED `ds18b20 in` вернул сырое значение температуры в виде строки: `"23.7"`.
Задача: Сформируйте корректное сообщение `msg.payload` в формате JSON согласно «Контракту сообщения» Академии HI. Временную метку (timestamp) можно оставить в виде заполнителя (например, `1678886400000`).Критерии оценки:
- 3 балла: Ответ представлен в формате JSON. Присутствуют и корректно заполнены все обязательные поля: `value` (число), `source`, `ts`. Добавлено опциональное поле `unit`.
- 2 балла: Ответ в формате JSON, но допущена ошибка в одном из полей (например, `value` передано как строка, а не число) или отсутствует поле `unit`.
- 1 балл: Ответ в формате JSON, но содержит только поле `value` или допущены множественные ошибки в именах полей.
- 0 баллов: Ответ не в формате JSON или не соответствует заданию.
Пример эталонного ответа:
{
"value": 23.7,
"source": "28-01234567abcd",
"ts": 1678886400000,
"unit": "°C"
}
---
Задание 2: Валидация данных (4 балла)
Инженер спроектировал поток Node-RED для чтения показаний мощности (в Ваттах) с однофазного счетчика электроэнергии, подключенного по Modbus RTU.
ASCII-схема потока:[Inject: 10s] -> [Modbus-Getter: Read Power] -> [MQTT Out: telemetry/power/meter1]
Иногда из-за помех на линии RS-485 узел `Modbus-Getter` возвращает некорректное значение (например, `0` или `-1`), которое немедленно отправляется в MQTT.
Задача:Критерии оценки:
- 4 балла: Четко описана проблема (отправка невалидных данных, искажение статистики). Предложен узел `Function` (или `Switch`) для валидации. Логика узла описана корректно: проверка значения на принадлежность к допустимому диапазону (например, `> 0`), остановка потока (`return null;`) или перенаправление в лог ошибок при невалидных данных.
- 2 балла: Проблема описана, но предложенное решение неполное (например, предложен узел, но не описана его логика).
- 1 балл: Проблема описана поверхностно, предложенное решение не решает задачу.
- 0 баллов: Ответ неверный.
Пример эталонного ответа:
Логика узла:
* Узел получает на вход сообщение от `Modbus-Getter`.
* Он проверяет, что полученное значение мощности (`msg.payload`) является числом и находится в допустимом диапазоне (например, `msg.payload >= 0`).
* Если значение корректно, узел пропускает сообщение дальше в поток.
* Если значение некорректно (не число, отрицательное), узел должен остановить дальнейшее распространение сообщения, вернув `return null;`. Дополнительно, он может сгенерировать ошибку с помощью `node.error()` для ее перехвата узлом `Catch`.
---
Задание 3: Проектирование MQTT-топиков (4 балла)
Вы проектируете систему "умный дом" для коттеджа. Необходимо разработать структуру MQTT-топиков для управления освещением в гостиной и получения данных с датчика движения в коридоре.
Устройства:- `light-livingroom-main`: Основной свет в гостиной (управление).
- `motion-corridor-1`: Датчик движения в коридоре (телеметрия).
Критерии оценки:
- 4 балла: Предложена логичная, иерархическая структура (например, `проект/место/устройство/действие`). Четко разделены топики для команд (`/set`) и состояний (`/state` или без суффикса). Все три сценария покрыты.
- 2 балла: Структура не полностью иерархическая или смешаны топики для команд и состояний.
- 1 балл: Предложены "плоские" топики без иерархии.
- 0 баллов: Ответ неверный.
Пример эталонного ответа:
Предлагается следующая структура: `project/location/device/type`
💡 Обоснование: Такая структура позволяет гибко подписываться на данные. Например, подписка на `smart-cottage/livingroom/#` позволит получить все события в гостиной, а на `smart-cottage/+/+/state` — все сообщения о состояниях устройств в доме.
---
Задание 4: Обработка ошибок (5 баллов)
Инженер создал поток для опроса Modbus-устройства. Он хочет, чтобы при любой ошибке связи (например, таймаут) в базу данных MySQL на контроллере записывалась информация об инциденте.
Задача:Критерии оценки:
- 5 баллов: Правильно назван узел `Catch`. ASCII-схема корректно показывает `Catch` -> `Function (Format SQL)` -> `mysql`. Правильно названы ключевые свойства, такие как `msg.error.message` и `msg.error.source.id` (или `msg.error.source.name`).
- 3 балла: Правильно назван узел `Catch` и нарисована схема, но неверно указаны свойства объекта ошибки.
- 1 балл: Правильно назван только узел `Catch`.
- 0 баллов: Ответ неверный.
Пример эталонного ответа:
// Поток обработки ошибок
[Catch: All nodes] -> [Function: "Prepare SQL"] -> [mysql: "Log Error DB"]
* `msg.error.message`: Текстовое описание ошибки (например, "Timeout").
* `msg.error.source.id`: Уникальный ID узла, который сгенерировал ошибку. Позволяет точно определить источник проблемы.
* `msg.topic` или `msg.payload` из оригинального сообщения (если они сохранились), чтобы понять, какая операция вызвала сбой.
---
Задание 5: Работа с Modbus (5 баллов)
Счетчик электроэнергии отдает 32-битное значение активной энергии (типа `float`) в двух последовательных 16-битных Holding-регистрах, начиная с адреса `100`.
Задача:Критерии оценки:
- 5 баллов: Все три пункта выполнены верно. Настройки `Modbus-Getter` корректны (`FC 3`, `Address 100`, `Quantity 2`). Описана необходимость работы с буфером (`msg.payload.buffer`) и указан метод (например, `buf.readFloatBE()`). Названы ошибки: неправильный порядок байт/слов (endianness) и ошибка "off-by-one".
- 3 балла: Верно выполнены два пункта из трех.
- 1 балл: Верно выполнен один пункт из трех.
- 0 баллов: Ответ неверный.
Пример эталонного ответа:
* `FC`: `FC 3: Read Holding Registers`
* `Address`: `100`
* `Quantity`: `2`
* Неправильный порядок байт/слов (Endianness): Устройство может возвращать старший и младший байты/слова в разном порядке. Если не учесть это, значение будет неверным.
* Ошибка "на единицу" (Off-by-one error): В документации может быть указан регистр `40101`, что соответствует адресу `100` в запросе. Инженеры часто ошибочно указывают `101`.
---
Задание 6: Управление состоянием (FSM) (5 баллов)
Необходимо реализовать логику работы простого кондиционера с тремя состояниями: `Off`, `Cooling`, `FanOnly`. Переходы между состояниями инициируются MQTT-командами.
Задача:Критерии оценки:
- 5 баллов: Все пункты выполнены. Указан `flow context` с персистентным хранилищем (file system). Назван узел `Switch`. Схема корректно показывает вход, проверку состояния через `Switch` и изменение состояния через `Change`.
- 3 балла: Верно выполнены два пункта. Например, указан `flow context`, но без упоминания персистентности.
- 1 балл: Верно выполнен один пункт.
- 0 баллов: Ответ неверный.
Пример эталонного ответа:
[MQTT In: cmd] -> [Switch: by flow.ac_state] --+-- (state: Off) ----> [Logic for Off] ----+-> [Change: set flow.ac_state]
|
+-- (state: Cooling) --> [Logic for Cooling]--+
|
+-- (state: FanOnly) --> [Logic for FanOnly]--+
---
Задание 7: Визуальный статус (3 балла)
Вы создали поток, который считывает температуру. Вы хотите, чтобы под узлом, который обрабатывает данные, отображался его текущий статус (например, "OK: 25.1°C" зеленым цветом или "Error" красным).
Задача:Критерии оценки:
- 3 балла: Правильно назван узел `Status`. Приведен корректный пример кода: `node.status({fill:"green", shape:"dot", text:"OK: 25.1°C"});`.
- 1 балл: Назван только узел `Status` или только приведен пример кода с ошибками.
- 0 баллов: Ответ неверный.
Пример эталонного ответа:
Пример кода:
node.status({fill:"green", shape:"dot", text:"OK: 25.1°C"});
---
Задание 8: Переиспользуемые компоненты (4 балла)
В вашем проекте умного офиса 15 одинаковых релейных модулей управляют освещением в 15 комнатах. Логика управления для каждого реле идентична: принять команду, включить реле, отправить обратную связь.
Задача:Критерии оценки:
- 4 балла: Правильно назван механизм `Subflow` (субпоток). Корректно описана параметризация через переменные окружения (`Environment Variables`) в настройках субпотока.
- 2 балла: Назван `Subflow`, но способ параметризации не описан или описан неверно.
- 0 баллов: Ответ неверный.
Пример эталонного ответа:
---
Задание 9: Диагностика физического уровня (4 балла)
После монтажа системы на объекте вы обнаружили, что ни одно из 10 устройств на шине RS-485 не отвечает на запросы контроллера HI.
Задача: Перечислите 3 наиболее вероятные причины проблемы, начиная с самых базовых (физических).Критерии оценки:
- 4 балла: Перечислены три релевантные причины из списка: перепутана полярность A/B, отсутствие/неправильная установка терминаторов, обрыв шины, отсутствие питания на устройствах, несовпадение настроек COM-порта.
- 2 балла: Перечислены одна или две релевантные причины.
- 0 баллов: Ответ неверный или причины не относятся к физическому уровню.
Пример эталонного ответа:
---
Задание 10: Хранение данных (4 балла)
Ваш поток Node-RED успешно сформировал сообщение о событии согласно «Контракту сообщения». Теперь его нужно записать в таблицу `events_log` в локальной базе данных MySQL.
Таблица `events_log`:`id (INT, PK, AI), ts (BIGINT), source (VARCHAR), value (DOUBLE), unit (VARCHAR)`
Сообщение `msg.payload`:{
"value": 23.7,
"source": "28-01234567abcd",
"ts": 1678886400000,
"unit": "°C"
}
Задача: Напишите шаблон SQL-запроса `INSERT`, который будет сформирован в узле `Function` или `Template` для записи этих данных. Используйте плейсхолдеры для значений.
Критерии оценки:
- 4 балла: SQL-запрос составлен корректно, с правильным синтаксисом `INSERT INTO`, перечислены все поля и соответствующие плейсхолдеры (например, через `{{{payload.value}}}` для узла `Template`).
- 2 балла: В SQL-запросе допущены синтаксические ошибки или пропущено одно из полей.
- 0 баллов: Ответ неверный.
Пример эталонного ответа:
Для узла `Template`:
INSERT INTO events_log (ts, source, value, unit)
VALUES ({{{payload.ts}}}, '{{{payload.source}}}', {{{payload.value}}}, '{{{payload.unit}}}');
💡 Примечание: Для строковых значений (`source`, `unit`) используются кавычки, а для числовых (`ts`, `value`) — нет. Узел `mysql` также поддерживает параметризованные запросы для защиты от SQL-инъекций, что является предпочтительным методом.
---
Задание 11: Анализ потока (5 баллов)
Инженер написал поток для включения света по датчику движения. Свет должен выключаться через 60 секунд, если новых движений не было.
ASCII-схема потока:[MQTT In: motion] -> [Change: set msg.payload="ON"] -> [Relay Out] -> [Delay: 60s] -> [Change: set msg.payload="OFF"] -> [Relay Out]
Задача:
Критерии оценки:
- 5 баллов: Проблема описана верно: свет выключится через 60 секунд после первого движения, игнорируя последующие. Для решения правильно предложен узел `Trigger`.
- 3 балла: Проблема описана верно, но предложенное решение неоптимально (например, сложная логика на `Function` с таймерами).
- 1 балл: Описана только проблема.
- 0 баллов: Ответ неверный.
Пример эталонного ответа:
---
Задание 12: Облачная интеграция (3 балла)
Контроллер HI собирает данные с сотен датчиков на объекте. Необходимо передавать эти данные в облачную платформу (например, AWS IoT, Azure IoT Hub) для долгосрочного хранения и анализа.
Задача: Какую роль в этой архитектуре выполняет MQTT-брокер, развернутый на контроллере HI или в локальной сети? Опишите его как посредника.Критерии оценки:
- 3 балла: Роль описана корректно: брокер выступает как центральный узел (хаб) для сбора данных от всех локальных потоков и как единая точка-шлюз для отправки этих данных в облако через мост (MQTT bridge). Упомянуто преимущество (отвязка продюсеров от консьюмеров).
- 1 балл: Роль описана поверхностно, без упоминания концепции моста или шлюза.
- 0 баллов: Ответ неверный.
Пример эталонного ответа:
Локальный MQTT-брокер выполняет роль шлюза (Gateway) и агрегатора.