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

Практическая работа: Базовые концепции и архитектура IoT-решений

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

# Академия HI: Курс Foundation

COURSE-16-M04-LAB01 — Практическая работа: Базовые концепции и архитектура IoT-решений

Введение

Данная практическая работа предназначена для проверки и закрепления базовых знаний в области Интернета вещей (IoT). Цель работы — не просто дать правильные ответы, а продемонстрировать понимание фундаментальных концепций, способность применять их в контексте аппаратной платформы HI и мыслить как инженер-системотехник.

Каждое задание требует не только ответа по существу, но и обоснования с привязкой к реальным сценариям и компонентам экосистемы HI (контроллер, Node-RED, протоколы MQTT/Modbus, универсальные входы/релейные выходы, шины RS-485, CAN, DALI).

Инструкции по выполнению

  • Скопируйте структуру заданий в отдельный документ.
  • Заполните все требуемые поля, таблицы и текстовые описания.
  • Для заданий, требующих развернутого ответа, придерживайтесь указанного объема и структуры.
  • В своих ответах активно используйте терминологию и примеры, относящиеся к контроллеру HI и его возможностям (универсальные входы, релейные выходы, шины RS-485, CAN, Node-RED).
  • Готовый документ сдается на проверку вашему куратору.
  • ---

    Задание 1. Идентификация и применение сенсоров

    Задача: Сопоставьте типы сенсоров с их функциями и приведите конкретный пример их использования на платформе HI для решения практической задачи на типовом объекте (умный дом, офис).

    | Тип сенсора | Функция | Пример практического применения на платформе HI |

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

    | Датчик температуры | Измеряет температуру окружающей среды или объекта. | Подключение датчика DS18B20 к универсальному входу контроллера HI по шине 1-Wire. Сценарий в Node-RED считывает температуру каждые 5 минут. Если температура в помещении падает ниже 20°C, контроллер через релейный выход замыкает цепь управления клапаном на радиаторе отопления. Данные также отправляются по MQTT в топик `telemetry/living_room/temperature` для отображения в мобильном приложении. |

    | Датчик влажности | Измеряет относительную влажность воздуха. | Подключение комбинированного датчика температуры и влажности (например, Modbus RTU) к порту RS-485 контроллера HI. В Node-RED настроен опрос датчика каждые 10 минут. Если влажность превышает 70%, контроллер активирует релейный выход, управляющий вытяжным вентилятором в ванной комнате. Данные публикуются в MQTT-топик `telemetry/bathroom/humidity`. |

    | Датчик освещенности | Измеряет уровень видимого света. | Подключение фоторезистора к аналоговому входу контроллера HI. В Node-RED настроен опрос каждые 30 секунд. Если уровень освещенности падает ниже 100 люкс (например, с наступлением сумерек), контроллер включает уличное освещение через релейный выход. При повышении уровня света выше 200 люкс — выключает. |

    | Датчик движения | Регистрирует движение в зоне своего действия. | Подключение PIR-датчика (пассивного инфракрасного) к дискретному входу контроллера HI ("сухой контакт"). При обнаружении движения (изменение состояния входа) Node-RED запускает сценарий: включает свет в коридоре на 5 минут (через релейный выход) и отправляет уведомление в Telegram через MQTT-шлюз. |

    | Геркон (магнитоконтактный датчик) | Определяет состояние "открыто/закрыто" для дверей, окон. | Подключение геркона на вход "сухой контакт" контроллера HI. При открытии входной двери (размыкание контакта) Node-RED фиксирует событие, отправляет сообщение в MQTT-топик `security/main_door/status` и, если система находится в режиме охраны, активирует сирену через релейный выход. |

    ---

    Задание 2. Мониторинг состояния и диагностика

    Задача: Заполните таблицу, указав для каждого статуса устройства возможные технические причины и метод диагностики с использованием инструментов платформы HI.

    | Устройство | Статус | Возможные технические причины статуса | Метод диагностики в Node-RED / на контроллере |

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

    | Умная колонка (подключена через Wi-Fi) | Недоступна | 1. Отсутствие питания на колонке. 2. Колонка потеряла соединение с Wi-Fi роутером. 3. Проблемы с сетью Wi-Fi (отключен роутер, слабый сигнал). 4. Сбой в работе облачного сервиса колонки. 5. Неверные сетевые настройки (IP-адрес, DNS). | 1. Визуальный осмотр: Проверить индикацию питания на колонке. 2. Ping с контроллера HI: Через SSH-доступ к Debian на контроллере выполнить `ping `. Если нет ответа, проверить Wi-Fi сеть. 3. Node-RED: Если колонка интегрирована через HTTP API, проверить статус узла `http request`. Использовать узел `Catch` для перехвата ошибок HTTP-запросов. 4. Журналы: Проверить системные логи контроллера HI на предмет ошибок сети (`dmesg`, `journalctl -xe`). |

    | Счетчик электроэнергии (подключен по RS-485 Modbus) | Не отвечает | 1. Обрыв или неверная полярность (A/B) шины RS-485. 2. Отсутствие питания 230V на счетчике. 3. Несовпадение настроек Modbus (скорость, четность, стоп-биты, адрес устройства) между счетчиком и контроллером HI. 4. Некорректный Slave ID или адрес регистра в запросе Node-RED. 5. Сбой самого счетчика. 6. Отсутствие терминирующих резисторов на шине RS-485. | 1. Node-RED: Проверить статус узла `modbus-read` (должен быть `active`, а не `timeout error`). Подключить узел `Catch` для перехвата и логирования ошибок от узла Modbus. 2. Физическая проверка: Визуально проверить подключение проводов A/B (согласно `WIRING-SENS-004`), наличие питания на счетчике. 3. Конфигурация Modbus-клиента: В Node-RED проверить настройки Modbus-клиента (COM-порт, скорость, четность, стоп-биты) на соответствие документации счетчика. 4. Modbus-сканер: Использовать сторонний Modbus-сканер (например, на ПК с USB-RS485 адаптером) для проверки доступности счетчика и его адреса. 5. ASCII-схема: Сверить физическое подключение с `WIRING-SENS-004` и убедиться в наличии терминирующих резисторов. |

    | Светодиодная лента (управляется реле контроллера) | Не включается | 1. Отсутствие питания 230V на контроллере или на блоке питания светодиодной ленты. 2. Обрыв цепи между реле контроллера и блоком питания ленты. 3. Неисправность реле контроллера. 4. Неисправность блока питания светодиодной ленты. 5. Неисправность самой светодиодной ленты. 6. Ошибка в логике Node-RED (сценарий не отправляет команду на реле). | 1. Node-RED: Проверить логику потока, который должен включать ленту. Убедиться, что команда на реле отправляется (использовать узел `Debug` после узла `rpi gpio out` или `modbus-write`). 2. Визуальный осмотр: Проверить индикацию питания на контроллере и блоке питания ленты. 3. Мультиметр: Измерить напряжение на клеммах реле контроллера (при активном состоянии) и на входе блока питания ленты. 4. Node-RED Status: Проверить статус узла `rpi gpio out` (если используется) или `modbus-write` (если реле управляется по Modbus). 5. ASCII-схема: Сверить подключение с `WIRING-LIGHT-015`. |

    ---

    Задание 3. Формулировка определения IoT в контексте платформы HI

    Задача: Заполните пропуски в определении IoT и кратко поясните, как каждый из пропущенных терминов реализуется с помощью контроллера HI.

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

    * Пояснение в контексте HI: Контроллер HI является центральным узлом для подключения разнообразных физических объектов. Это могут быть датчики (температуры, влажности, движения, освещенности), исполнительные устройства (реле для управления светом, розетками, клапанами), а также более сложные системы, подключенные по шинам RS-485, CAN, DALI. Универсальные входы и релейные выходы контроллера HI позволяют напрямую интегрировать широкий спектр таких физических устройств, делая их "умными" и частью IoT-экосистемы. * Пояснение в контексте HI: Контроллер HI обладает 22 универсальными входами, способными собирать данные от различных типов датчиков: 1-Wire (температура), дискретные (состояние "сухого контакта"), аналоговые (0-10V, 4-20mA). Кроме того, через порты RS-485, CAN, DALI и Ethernet он может опрашивать Modbus-устройства, счетчики, климатические системы, получая от них телеметрические данные. Вся эта информация агрегируется в Node-RED, где может быть обработана, валидирована и сохранена (например, в MySQL) или отправлена далее по MQTT. * Пояснение в контексте HI: Контроллер HI использует протокол MQTT как основной механизм для обмена информацией как внутри локальной сети, так и с внешними облачными платформами. Node-RED позволяет легко публиковать собранные данные в MQTT-топики и подписываться на команды извне. Кроме того, контроллер поддерживает TCP/IP для HTTP-запросов, Modbus TCP, а также RS-485 для обмена данными с локальными устройствами. Это обеспечивает двустороннюю связь: контроллер не только собирает данные, но и может получать команды для управления своими 22 релейными выходами или другими подключенными устройствами.

    ---

    Лабораторная работа 1: COURSE-16-M04-LAB01-LAB01 — Мониторинг температуры и влажности с Modbus RTU

    Цель: Настроить контроллер HI для чтения данных с Modbus RTU датчика температуры и влажности, валидации данных и публикации их в MQTT. Оборудование: Сценарий (SCN-SENS-TH-001):
  • Подключить датчик к порту RS-485 контроллера HI.
  • Настроить Modbus-клиент в Node-RED.
  • Создать поток для периодического чтения температуры и влажности.
  • Валидировать полученные данные (проверить на адекватность).
  • Сформировать сообщение по "Контракту сообщения" и опубликовать в MQTT.
  • Обработать возможные ошибки связи.
  • Flow Diagram (ASCII):
    [Inject: 30s] --> [Modbus-Getter: Temp/Hum] --> [Function: Validate & Format] --> [MQTT Out: telemetry/room/temp]
    

    |

    +--> [MQTT Out: telemetry/room/hum]

    |

    +--> [Debug: Output]

    |

    +--> [Status: Node Status]

    |

    [Catch: All Errors] ------------------------------------------------------------+--> [Function: Error Logger] --> [MQTT Out: errors/modbus]

    Skeleton (Node-RED JSON):

    ```json

    [

    {

    "id": "a1b2c3d4e5f6g7h8",

    "type": "modbus-client",

    "name": "Modbus RTU RS485-1",

    "clienttype": "serial",

    "serialport": "/dev/ttyS1",

    "serialbaudrate": "9600",

    "serialdatabits": "8",

    "serialparity": "none",

    "serialstopbits": "1",

    "serialconnectiondelay": "100",

    "serialtimeout": "3000",

    "serialrtscts": "false",

    "serialxonxoff": "false",

    "serialdsrdtr": "false",

    "serialmode": "RTU",

    "serialdriver": "serialport",

    "serialserverhost": "127.0.0.1",

    "serialserverport": "502",

    "serialtype": "RTU-BUFFER",

    "tcpHost": "127.0.0.1",

    "tcpPort": "502",

    "tcpType": "DEFAULT",

    "unit_id": "1",

    "commandDelay": 1,

    "clientTimeout": 1000,

    "reconnectTimeout": 2000

    },

    {

    "id": "i9j0k1l2m3n4o5p6",

    "type": "inject",

    "z": "YOUR_FLOW_ID",

    "name": "Poll every 30s",

    "props": [

    {

    "p": "payload"

    },

    {

    "p": "topic",

    "vt": "str"

    }

    ],

    "repeat": "30",

    "crontab": "",

    "once": true,

    "onceDelay": 0.1,

    "topic": "",

    "payload": "",

    "payloadType": "date",

    "x": 100,

    "y": 100,

    "wires": [

    ["q7r8s9t0u1v2w3x4"]

    ]

    },

    {

    "id": "q7r8s9t0u1v2w3x4",

    "type": "modbus-getter",

    "z": "YOUR_FLOW_ID",

    "name": "Read Temp/Hum",

    "showStatusActivities": false,

    "showErrors": false,

    "unitid": "1",

    "fc": "4",

    "address": "0",

    "quantity": "2",

    "server": "a1b2c3d4e5f6g7h8",

    "x": 300,

    "y": 100,

    "wires": [

    ["y5z6a7b8c9d0e1f2"],

    []

    ]

    },

    {

    "id": "y5z6a7b8c9d0e1f2",

    "type": "function",

    "z": "YOUR_FLOW_ID",

    "name": "Validate & Format",

    "func": "// Контракт входящего сообщения от Modbus-Getter:\n// msg.payload = { data: [temp_raw, hum_raw], buffer: }\n\nif (!msg.payload || !Array.isArray(msg.payload.data) || msg.payload.data.length < 2) {\n node.status({fill:\"red\", shape:\"dot\", text:\"Invalid Modbus response\"});\n node.error(\"Invalid Modbus response: \" + JSON.stringify(msg.payload), msg);\n return null;\n}\n\nlet tempRaw = msg.payload.data[0]; // Предполагаем, что температура - первый регистр\nlet humRaw = msg.payload.data[1]; // Предполагаем, что влажность - второй регистр\n\n// Пример: датчик возвращает температуру 10 и влажность 10\nlet temperature = tempRaw / 10