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

Подготовка к сертификации уровня Foundation: Комплексный обзор

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

COURSE-16-M07-L01 — Подготовка к сертификации уровня Foundation: Комплексный обзор

Добро пожаловать на завершающий урок курса "Основы IoT для инженеров". На протяжении предыдущих модулей вы получили фундаментальные знания и практические навыки для работы с платформой автоматизации HI. Этот урок систематизирует изученный материал и сфокусирует ваше внимание на ключевых компетенциях, которые будут проверяться на сертификационном экзамене уровня Foundation.

Цель этого урока — не просто повторить теорию, а продемонстрировать, как отдельные компоненты — оборудование, протоколы, программная логика и стандарты — объединяются в единую, надежную систему на реальном объекте.

1. Ключевые компоненты и архитектура системы на платформе HI

Любой IoT-проект, будь то умная квартира или система мониторинга в небольшом цеху, строится на четырех основных столпах. Давайте рассмотрим их в контексте нашей экосистемы.

* Входы (Inputs): 22 универсальных входа для подключения датчиков движения ("сухой контакт"), датчиков температуры (1-Wire, DS18B20), герконов, кнопок, датчиков протечки, аналоговых сенсоров (0-10В).

* Выходы (Outputs): 22 релейных выхода для управления освещением, розетками, сервоприводами штор, клапанами отопления или вентиляции, контакторами для мощных нагрузок.

* Внешние устройства: Модули расширения, счетчики электроэнергии, панели управления, подключаемые по шинам RS-485 (Modbus), CAN, DALI; опции: LoRaWAN, Zigbee, Bluetooth, GSM.

* Сбор данных: Опрос датчиков и устройств по физическим шинам (1-Wire, RS-485, CAN, DALI).

* Обработка и логика: Выполнение сценариев автоматизации, созданных в среде Node-RED.

* Связь: Взаимодействие с другими системами, облачными платформами и пользовательскими интерфейсами по протоколам MQTT, TCP/IP.

* Хранение: Запись критичных данных, состояний и логов в локальную базу данных MySQL.

* Критические сценарии: Выполнение детерминированной логики и поддержание safe-state на дополнительном ARM32 процессоре с хранением сценариев в EEPROM.

* Локальная сеть: Ethernet и Wi-Fi для связи контроллера с локальными устройствами (например, панелями управления) и выхода в интернет.

* MQTT-брокер: Центральный узел для обмена сообщениями. Может быть развернут как на самом контроллере HI, так и на внешнем сервере.

* База данных: MySQL на борту контроллера для надежного хранения истории показаний, логов событий и ошибок.

* Сценарии в Node-RED: Потоки (flows), реализующие всю логику автоматизации.

* Панели управления (Dashboard): Визуальные интерфейсы для мониторинга и управления, созданные, например, с помощью `node-red-dashboard`.

* Системы верхнего уровня: SCADA, BMS или мобильные приложения, которые взаимодействуют с контроллером через MQTT.

Архитектура типового объекта на платформе HI:
          [ Облако / Мобильное приложение ]

^

| (MQTT, TLS)

v

[ Интернет ] <---> [ Роутер ] <---------------------> [ Панель управления ]

^ ^

| (Ethernet) | (Ethernet/Wi-Fi)

v v

+-----------------------------------------------------------------------------+

| [ Контроллер HI (Debian, Node-RED, MQTT Broker, MySQL) ] |

| | | | | |

| | (Relay) | (1-Wire) | (RS-485) | (Dry Contact) |

| v v v v |

| <Освещение> (Датчик t°C) <Счетчик энергии> (Датчик движения) |

+-----------------------------------------------------------------------------+

2. Практическое применение протоколов: MQTT и Modbus

Протоколы — это язык, на котором общаются компоненты системы. На экзамене вам потребуется продемонстрировать уверенное владение двумя ключевыми протоколами.

MQTT: Стандарт для телеметрии и команд

MQTT (Message Queuing Telemetry Transport) — это легковесный протокол для обмена сообщениями по принципу "издатель-подписчик". В нашей экосистеме он используется для:

Ключевые концепции для экзамена: `проект/объект/помещение/устройство/параметр`

Пример: `hi/office_bld1/floor2/room205/temperature/value`

Пример: `hi/cottage1/living_room/main_light/command`

    // Пример сообщения от датчика температуры

// Топик: hi/office_bld1/floor2/room205/temperature/value

{

"value": 23.5,

"unit": "°C",

"source": "1w-28-01234567abcd",

"ts": 1678886400000

}

* `QoS 0`: "Отправил и забыл". Для некритичных данных (например, температура раз в минуту).

* `QoS 1`: "Доставлено как минимум один раз". Для команд управления (включить свет).

* `QoS 2`: "Доставлено ровно один раз". Для критичных транзакций (списание средств).

Modbus RTU: Стандарт для промышленного оборудования

Modbus — это протокол типа "Master-Slave" (или "Client-Server") для работы с промышленными датчиками и исполнительными устройствами по шине RS-485.

Ключевые концепции для экзамена: * Использование витой пары.

* Соблюдение полярности (A к A, B к B).

* Установка терминирующих резисторов (120 Ом) на концах шины.

* 📋 См. стандарт `WIRING-SENS-004`.

* Правильная настройка COM-порта (`/dev/ttyS1` на контроллере HI), скорости (9600, 19200...), четности.

* Использование узлов `Modbus-Read`, `Modbus-Write`, `Modbus-Getter` для выполнения операций.

* Указание правильного `Unit-ID` (адрес устройства на шине), `FC` (код функции) и `Address` (адрес регистра).

* ⚠️ Ошибка "Off-by-one": В документации регистр `40001`, в Node-RED указываем адрес `0`.

* Таймауты: Проблемы с подключением, неверный `Unit-ID` или параметры шины.

* CRC Error: Помехи на линии, отсутствие терминаторов, неверные параметры шины.

3. Стандарты разработки в Node-RED: От потока к надежной системе

Просто соединить узлы в Node-RED недостаточно. Профессиональный инженер создает потоки, которые надежны, читаемы и легко поддерживаются. На экзамене будет оцениваться ваше следование паттернам разработки Академии HI.

Краткое повторение ключевых паттернов:
  • "Контракт сообщения": Всегда используйте стандартный JSON-формат `msg.payload`. Валидируйте данные на входе.
  • "Обработка ошибок": На каждой вкладке должен быть узел `Catch`, который перехватывает ошибки и отправляет их в централизованный логгер (например, в таблицу `audit_log` в MySQL).
  • "Визуальный статус": Используйте `node.status()` для отображения текущего состояния узла (например, `OK: 22.1°C` или `Error: Timeout`). Это ускоряет диагностику в разы.
  • "Переиспользуемый компонент" (Subflow): Повторяющуюся логику (опрос датчика, управление реле) выносите в субпотоки.
  • "Конечный автомат" (FSM): Для управления сложными системами (климат, полив) используйте FSM для явного управления состояниями (`Heating`, `Cooling`, `Off`), сохраняя текущее состояние в `flow context`.
  • Пример задачи с экзамена и ее решение

    Задача: Реализовать сценарий "умного освещения" для офисного помещения. Решение с применением паттернов: ASCII-схема потока (FLOW-AUTO-LIGHT-012):
    // Поток чтения датчиков
    

    [Inject: 1s] -> [Analog In: UI-06] -> [Function: Format Light Sensor] -> [Change: Save to flow.context]

    [Digital In: UI-05] -> [RBE] -> [Function: Format Motion Sensor] -> [Change: Save to flow.context]

    // Основной поток логики

    [Inject: 5s] -> [Function: Main Logic] -> [Switch: ON/OFF?] -> [Relay Out: RL-03]

    |

    +-> [Status Node]

    // Поток обработки ошибок

    [Catch: All Nodes] -> [Function: Format Error] -> [Link Out: To Global Error Logger]

    Код узла `Function: Main Logic`:
    // Получаем последние значения из контекста потока
    

    const motion = flow.get("motion_detected") || false;

    const lastMotionTime = flow.get("last_motion_ts") || 0;

    const lightLevel = flow.get("light_level") || 1024;

    const LIGHT_THRESHOLD = 300; // Порог освещенности

    const TIMEOUT = 5 60 1000; // 5 минут в миллисекундах

    let currentState = context.get("light_state") || "OFF";

    let newState = currentState;

    // 1. Паттерн "Конечный автомат" (FSM)

    if (motion) {

    // Если есть движение и темно, нужно включить свет

    if (lightLevel < LIGHT_THRESHOLD) {

    newState = "ON";

    }

    // Обновляем время последнего движения

    flow.set("last_motion_ts", Date.now());

    } else {

    // Если нет движения, проверяем таймаут

    if (Date.now() - lastMotionTime > TIMEOUT) {

    newState = "OFF";

    }

    }

    // Если состояние не изменилось, ничего не делаем

    if (newState === currentState) {

    // 3. Паттерн "Визуальный статус"

    node.status({ fill: "grey", shape: "dot", text: `State: ${currentState}, Light: ${lightLevel}` });

    return null;

    }

    // Сохраняем новое состояние

    context.set("light_state", newState);

    // 1. Паттерн "Контракт сообщения"

    // Формируем команду для реле

    if (newState === "ON") {

    msg.payload = true;

    } else {

    msg.payload = false;

    }

    // 3. Паттерн "Визуальный статус"

    node.status({ fill: "blue", shape: "dot", text: `Switching to ${newState}` });

    // Формируем сообщение для аудита

    msg.audit = {

    source: "FLOW-AUTO-LIGHT-012",

    action: `Light ${newState}`,

    reason: motion ? "Motion detected" : "Timeout",

    ts: Date.now()

    };

    return msg;

    4. Диагностика и пусконаладка: Runbook инженера

    На объекте не все идет по плану. Умение быстро находить и устранять неисправности — ключевой навык инженера.

    📋 Мини-runbook "Если что-то пошло не так":

  • Проблема: Modbus-устройство не отвечает.
  • * Физика: Проверьте питание устройства. Проверьте полярность A/B. Убедитесь, что на концах шины есть терминаторы 120 Ом.

    * Логика: Проверьте настройки COM-порта в Node-RED. Убедитесь, что `Unit-ID` в узле `Modbus-Getter` совпадает с адресом на устройстве. Проверьте адреса регистров (помните про "off-by-one").

  • Проблема: Сценарий в Node-RED не работает или работает некорректно.
  • * Отладка: Подключите узел `Debug` ко всем выходам интересующих вас узлов. Установите его в режим "complete message object".

    * Статус: Посмотрите на статусы узлов. Красный цвет — ошибка. Желтый — подключение.

    * Контракт: Убедитесь, что `msg.payload` на входе в узел соответствует тому, что узел ожидает.

    * Логи: Проверьте центральный лог ошибок, куда пишет ваш узел `Catch`. Там будет информация об источнике ошибки и сообщении, которое ее вызвало.

  • Проблема: MQTT-сообщения не доходят.
  • * Связь: Убедитесь, что контроллер подключен к сети. Проверьте доступность MQTT-брокера (ping).

    * Настройки: Проверьте IP-адрес и порт брокера в узле `mqtt out`.

    * Авторизация: Проверьте логин/пароль и права доступа (ACL) на брокере.

    * Топик: Убедитесь, что подписчик и издатель используют абсолютно одинаковый топик. `office/light` и `office/light/` — это разные топики.

    ---

    Примеры практических заданий для самопроверки

    Эти задания помогут вам подготовиться к практической части сертификационного экзамена. Они имитируют реальные задачи, с которыми вы столкнетесь на объекте.

    EXAM-PRACTICE-01: Диагностика системы управления вентиляцией

    Задача: Вам предоставлен экспорт потока Node-RED и схема подключения `WIRING-FAULT-001` для системы управления вентиляцией. Система не работает. Необходимо найти и исправить как минимум 3 ошибки (одну в схеме подключения, две в потоке Node-RED). Оборудование: Контроллер HI, Modbus-датчик CO2, реле для управления вентилятором. Критерии оценки:
  • Найдена и описана ошибка в схеме подключения (например, отсутствие терминатора).
  • Найдена и исправлена ошибка в логике Node-RED (например, неверный оператор сравнения).
  • Найдена и исправлена ошибка конфигурации узла (например, неверный адрес регистра Modbus).
  • Система работает согласно ТЗ после исправлений.
  • EXAM-PRACTICE-02: Проектирование отказоустойчивого сценария защиты от протечек

    Задача: Спроектировать и реализовать в Node-RED сценарий управления водяным клапаном для защиты от протечек. Требования:
  • Используются два датчика протечки (дискретные входы `UI-10`, `UI-11`).
  • При срабатывании любого из датчиков, реле `RL-08`, управляющее клапаном, должно немедленно закрыться.
  • Система должна отправить тревожное MQTT-сообщение в топик `hi/security/flood/alarm`.
  • Сообщение должно соответствовать контракту `{ "source": "UI-10", "status": "ALARM", "ts": ... }`.
  • Логика должна быть вынесена в субпоток `FLOW-SAFETY-FLOOD-001`.
  • Должна быть реализована обработка ошибок и журналирование события в MySQL.
  • Критерии оценки:
  • Логика реализована корректно и вынесена в субпоток.
  • Используется стандартный контракт сообщения.
  • Реализована отправка MQTT-уведомления.
  • Присутствует обработка ошибок через узел `Catch`.
  • Тест для самопроверки (COURSE-16-M07-QUIZ)

  • Какая топология используется для шины RS-485?
  • а) Звезда

    б) Кольцо

    в) Шина

    г) Дерево

  • Для чего предназначен терминирующий резистор 120 Ом в шине RS-485?
  • а) Для увеличения скорости передачи данных

    б) Для предотвращения отражения сигнала и искажения данных

    в) Для питания устройств на шине

    г) Для ограничения тока в шине

  • В документации на Modbus-счетчик указан Holding Register `40101` для чтения мощности. Какой адрес необходимо указать в узле `Modbus-Getter`?
  • а) 40101

    б) 101

    в) 100

    г) 40100

  • Какой уровень QoS в MQTT гарантирует доставку сообщения как минимум один раз?
  • а) QoS 0

    б) QoS 1

    в) QoS 2

    г) QoS 3

  • Какой узел в Node-RED является основным инструментом для перехвата ошибок в потоке?
  • а) `Debug`

    б) `Status`

    в) `Catch`

    г) `Switch`

  • В соответствии со стандартом Академии HI, в каком формате должны передаваться данные в `msg.payload` через MQTT?
  • а) Простой текст

    б) XML

    в) JSON

    г) Бинарный массив

  • Для чего предназначен паттерн "Визуальный статус" (`node.status`)?
  • а) Для отправки email-уведомлений об ошибках

    б) Для быстрой диагностики состояния потока прямо в редакторе Node-RED

    в) Для сохранения состояния между перезагрузками

    г) Для отрисовки графиков на Dashboard

  • Вы подключили датчик движения к универсальному входу `UI-01` контроллера HI. Какой тип сигнала вы ожидаете от него?
  • а) 1-Wire

    б) Аналоговый 0-10В

    в) "Сухой контакт" (Dry Contact)

    г) Modbus

  • Что является лучшей практикой для хранения состояний сложных систем (например, климат-контроля) в Node-RED?
  • а) Использовать глобальный контекст (`global context`)

    б) Использовать контекст потока (`flow context`) с настроенным сохранением в файл или БД

    в) Записывать состояние в `msg.payload` и передавать по кругу

    г) Хранить состояние в текстовом файле через узлы `file in`/`file out`

  • Какова основная задача контроллера HI в архитектуре IoT?
  • а) Только отображение данных на панели управления

    б) Только хранение данных в облаке

    в) Сбор данных с устройств, выполнение локальной логики и связь с внешним миром

    г) Только обеспечение питания для датчиков