IoT в умном доме: от концепции к практической реализации на платформе HI
COURSE-16-M05-L01 — IoT в умном доме: от концепции к практической реализации на платформе HI
Введение в архитектуру умного дома на платформе HI
Умный дом — это единая инженерная система, объединяющая все подсистемы здания (освещение, климат, безопасность, мультимедиа) для их автоматической и скоординированной работы. Цель — не просто дистанционное управление, а создание адаптивной, энергоэффективной и безопасной среды, которая работает автономно и предсказуемо.
В экосистеме HI центральным элементом, или «мозгом» умного дома, выступает контроллер HI. В отличие от облачных решений, он обеспечивает локальную обработку всех данных и сценариев, что гарантирует высокую скорость реакции, надежность и конфиденциальность. Контроллер на базе Debian и Node-RED становится единой точкой интеграции для всех устройств и протоколов на объекте.
Основные компоненты умного дома в экосистеме HI
Для инженера автоматизации важно понимать, как абстрактные компоненты умного дома реализуются на конкретном оборудовании.
- Центральный хаб (Мозг системы): Контроллер HI
* Надежность: Критически важные сценарии (например, защита от протечек) могут быть реализованы на уровне ПЛК с детерминированным исполнением и сохранением логики в энергонезависимой памяти (EEPROM).
* Хранение данных: Встроенная база данных MySQL используется для ведения журналов событий (audit log), хранения исторических данных с датчиков и сохранения состояний устройств между перезагрузками.
- Датчики (Органы чувств): Периферийные устройства и входы контроллера
* Датчики температуры DS18B20 (шина 1-Wire).
* Датчики движения, герконы, кнопки (режим «сухой контакт»).
* Датчики протечки, уровня CO2, давления (аналоговые входы 0-10В).
* Шинные устройства: Подключаются по промышленным протоколам.
* Метеостанции, счетчики электроэнергии, модули в/в (RS-485 Modbus).
* Датчики присутствия, комнатные панели (CAN).
* Беспроводные датчики: Интегрируются через соответствующие шлюзы.
* Датчики открытия, температуры, влажности (Zigbee, LoRaWAN).
- Исполнительные устройства (Мышцы): Выходы контроллера и шинные актуаторы
* Группы освещения (вкл/выкл).
* Розеточные группы.
* Приводы штор, ворот.
* Клапаны на радиаторах отопления или в системе водоснабжения.
* Шинное управление:
* Диммирование и управление цветом светильников (DALI).
* Управление скоростью вентиляторов, кондиционерами через шлюзы (Modbus).
- Сеть и протоколы (Нервная система)
Практические сценарии автоматизации на платформе HI
Рассмотрим реализацию типовых сценариев умного дома с использованием контроллера HI, демонстрируя применение стандартов Академии.
Сценарий 1: Адаптивное освещение в гостиной
Задача: Реализовать управление основной группой света с настенного выключателя (кнопочного типа). Одно короткое нажатие — вкл/выкл. Длинное нажатие — плавное изменение яркости (если светильник диммируемый).- Оборудование:
* Универсальный вход `UI-05` для подключения кнопки.
* Релейный выход `RL-01` для недиммируемого света ИЛИ шина DALI для диммируемого светильника.
- Схема подключения: `WIRING-LIGHT-021`
//========= WIRING-LIGHT-021: Living Room Switch & Light =========
// Dry Contact Input (Wall Switch)
(Wall_Switch_Btn) [CTRL:HI-Core]
COM ----------------- GND (на UI-блоке)
NO ----------------- UI-05
// Relay Output (Non-dimmable Light)
[CTRL:HI-Core]
L (фаза) ---<-- C (RL-01)
NO (RL-01) --<-- Фаза от автомата в щите
N (нейтраль) ---<---------------- Нейтраль от шины N
- Логика в Node-RED: `FLOW-AUTO-LIGHT-012`
// ASCII Flow Diagram
[gpio in: UI-05] -> [node-red-contrib-button-events] -> [switch: msg.payload] --+-- (short press) -> [function: Toggle] -> [gpio out: RL-01]
|
+-- (long press) -> [function: Start Dim] -> [dali control]
- Контракт сообщения (для MQTT управления):
// msg.payload для включения/выключения
{ "state": "ON" } // или "OFF"
// msg.payload для установки яркости
{ "brightness": 80 } // 0-100
- Фрагмент логики в узле `Function: Toggle`:
// Получаем текущее состояние из контекста потока
let isOn = flow.get("living_room_light_main_state") || false;
// Инвертируем состояние
isOn = !isOn;
// Сохраняем новое состояние
flow.set("living_room_light_main_state", isOn);
// Формируем сообщение для узла реле
msg.payload = isOn ? 1 : 0; // 1 для включения, 0 для выключения
// Обновляем статус для визуальной диагностики
node.status({ fill: isOn ? "green" : "red", shape: "dot", text: "State: " + (isOn ? "ON" : "OFF") });
return msg;
Сценарий 2: Защита от протечек воды
Задача: При срабатывании любого из датчиков протечки немедленно перекрыть вводные краны холодной и горячей воды, отправить PUSH-уведомление владельцу.- Оборудование:
* Универсальные входы `UI-10`, `UI-11` для датчиков протечки (режим «сухой контакт»).
* Релейные выходы `RL-15`, `RL-16` для управления электроприводами шаровых кранов (230В).
- Схема подключения: `WIRING-SAFETY-004`
//========= WIRING-SAFETY-004: Water Leakage Protection =========
// Leakage Sensor Inputs
(Leak_Sensor_Kitchen) -- UI-10 / GND
(Leak_Sensor_Bathroom) - UI-11 / GND
// Valve Actuator Outputs (230V)
[CTRL:HI-Core]
L (Open) ---<---- NO (RL-15)
L (Close) --<---- NO (RL-16)
N --------<-------------------- Нейтраль от шины N
C (RL-15) --<-- Фаза от автомата
C (RL-16) --<-- Фаза от автомата
- Логика в Node-RED: `FLOW-SAFETY-LEAK-001`
// ASCII Flow Diagram
[gpio in: UI-10] --+
|--> [function: Leak Detected] -> [exec: run plc_script] -> [mqtt out: notify]
[gpio in: UI-11] --+
- Контракт сообщения (для PUSH-уведомления через MQTT):
{
"source": "kitchen", // или "bathroom"
"ts": 1678886400000,
"message": "Обнаружена протечка воды на кухне! Водоснабжение перекрыто."
}
- Обработка ошибок и журналирование:
// В узле "function: Leak Detected"
let location = (msg.topic === "leak_sensor_kitchen") ? "Кухня" : "Ванная";
// Формируем SQL-запрос для журналирования
msg.query = `
INSERT INTO audit_log (timestamp, level, source, message)
VALUES (NOW(), 'CRITICAL', 'WaterSafety', 'Обнаружена протечка в зоне: ${location}. Вводные краны перекрыты.')
`;
// Отправляем msg на узел mysql
Интеграция с внешними системами: Голосовое управление и мобильное приложение
Контроллер HI не является изолированной системой. Благодаря MQTT, он легко интегрируется с популярными платформами.
- Голосовые помощники (Алиса, Google Assistant):
2. Специальный сервис-мост (например, `mqtt-smarthome-bridge` для Алисы) подписывается на эти топики и транслирует их в формат, понятный облаку Яндекса.
3. Когда пользователь говорит: «Алиса, включи свет в гостиной», облако Яндекса отправляет команду мосту, который публикует `msg.payload` `{ "state": "ON" }` в топик `hi/living_room/light/main/set`.
4. Контроллер HI, подписанный на этот топик, исполняет команду.
- Мобильное приложение:
Ключевые вызовы и их решение на платформе HI
| Вызов | Проблема | Решение в экосистеме HI |
| :--- | :--- | :--- |
| Совместимость | Устройства разных производителей используют разные протоколы (Zigbee, Z-Wave, Modbus, DALI). | Мультипротокольность контроллера. Контроллер HI изначально поддерживает ключевые промышленные протоколы (Modbus, CAN, DALI) и легко расширяется для поддержки других через USB-адаптеры и ПО в Node-RED. |
| Надежность | Облачный сервис недоступен — дом перестает быть "умным". Сбой ПО контроллера приводит к отказу автоматизации. | Локальное исполнение (Local First). Все сценарии работают внутри контроллера без зависимости от интернета. Функция ПЛК и EEPROM гарантируют работу критических систем (безопасность, климат) на аппаратном уровне. |
| Безопасность | Уязвимости в IoT-устройствах могут дать злоумышленникам доступ к домашней сети и управлению домом. | Сетевая изоляция и отсутствие облачной зависимости. Контроллер работает в локальной сети. Доступ извне организуется через защищенный VPN-туннель. Данные не передаются на сторонние серверы без явного разрешения. |
| Стоимость | Высокие первоначальные затраты на оборудование и инсталляцию. | Гибкость и масштабируемость. Платформа HI позволяет начать с базового набора функций (управление светом и розетками через встроенные реле) и постепенно наращивать систему, добавляя новые модули и протоколы по мере необходимости. |
План сдачи объекта заказчику: Тест-план для умной квартиры
📋 После завершения монтажа и программирования инженер обязан провести с заказчиком приемо-сдаточные испытания по следующему чек-листу:
* [ ] Датчики движения/открытия: Поставить систему на охрану и сымитировать вторжение. Убедиться, что приходит PUSH-уведомление.
* [ ] Датчики протечки: Сымитировать протечку (влажной тканью на контактах датчика). Убедиться, что краны перекрылись, и пришло уведомление.
* [ ] Сценарий «Я ушел»: Активировать сценарий. Проверить, что выключился весь свет, управляемые розетки, система климата перешла в режим «Эко», дом встал на охрану.
* [ ] Сценарий «Я дома»: Активировать сценарий. Проверить, что система снялась с охраны, включился свет в прихожей.
---
Лабораторные работы
COURSE-16-M05-LAB01: Базовое управление освещением по датчику движения
- Цель: Создать поток Node-RED, который включает свет в коридоре при обнаружении движения и выключает его через 1 минуту после прекращения движения.
- Оборудование: Контроллер HI, универсальный вход `UI-01` (для датчика движения), релейный выход `RL-01` (для лампы).
- Задание:
2. Создайте поток в Node-RED, используя узлы `rpi gpio in`, `trigger`, `rpi gpio out`.
3. Настройте узел `trigger` так, чтобы он отправлял `1` при первом сообщении, а через 1 минуту без новых сообщений отправлял `0`.
4. Добавьте узел `status` к выходу реле для отображения его состояния.
- Критерии оценки: Свет включается при срабатывании датчика. Свет выключается ровно через 60 секунд после последнего срабатывания. Статус узла `rpi gpio out` корректно отображает состояние лампы.
COURSE-16-M05-LAB02: Создание сценария «Я ушел»
- Цель: Создать комплексный сценарий, который активируется по нажатию одной кнопки у входной двери или из мобильного приложения.
- Оборудование: Контроллер HI, универсальный вход `UI-02` (для кнопки «Ушел»), релейные выходы `RL-01`...`RL-05` (свет, розетки).
- Задание:
2. Последовательно отправляет команды на выключение на 5 релейных выходов с задержкой 200 мс между командами (используйте узел `delay`).
3. Отправляет MQTT-сообщение в топик `hi/security/set` с `payload` `{"state": "ARMED"}`.
4. Записывает событие активации сценария в `audit_log` через узел `mysql`.
- Критерии оценки: Все указанные реле выключаются. В MQTT отправляются корректные сообщения. В базе данных появляется запись о событии. Поток использует паттерн "Контракт сообщения" для входящих MQTT-команд.
Тест для самопроверки (Квиз)
ID: `COURSE-16-M05-QUIZ`a) Node-RED
b) База данных MySQL
c) Функция ПЛК и EEPROM
d) MQTT-брокер
a) Modbus RTU
b) DALI
c) MQTT
d) CAN
a) UI-xx и +5V
b) UI-xx и GND
c) UI-xx и A/B
d) UI-xx и L/N
a) `switch`
b) `function`
c) `debug`
d) `catch`
a) `50`
b) `"BRIGHTNESS: 50"`
c) `{ "brightness": 50 }`
d) `{ "command": "dim", "value": 50 }`
a) Чтобы включить свет.
b) Чтобы отфильтровать ложные срабатывания.
c) Чтобы отправить команду на выключение света через заданный интервал времени после прекращения движения.
d) Чтобы записать событие в лог.
a) Все данные хранятся только локально и никогда не отправляются в интернет.
b) Все сценарии автоматизации работают на локальном контроллере и не зависят от наличия интернет-соединения.
c) Предпочтение отдается устройствам местного производства.
d) Управление возможно только из локальной сети.
a) Подключить к GND с обеих сторон кабеля.
b) Не подключать вообще.
c) Подключить к клемме PE в щите.
d) Подключить к клемме GND только со стороны контроллера.
a) `global.set()`
b) `node.status()`
c) `flow.set()` (при настроенном `contextStorage`)
d) `msg.payload`
a) Использовать 5 разных узлов `gpio out`.
b) Использовать узел `delay` в режиме "Rate Limit" между командами на выключение.
c) Написать сложный код в узле `function` с `setTimeout`.
d) Это невозможно, реле всегда срабатывают одновременно.
Мини-runbook: «Если что-то не работает»
ID: `COURSE-16-M05-RUNBOOK`| Симптом | Возможная причина | Шаг диагностики |
| :--- | :--- | :--- |
| Свет не включается по кнопке | 1. Ошибка в схеме подключения.
2. Ошибка в логике Node-RED. | 1. Проверить мультиметром замыкание между клеммами `UI-xx` и `GND` при нажатии кнопки.
2. Подключить узел `debug` к выходу узла `gpio in` и проверить, приходит ли сообщение `0` или `1` при нажатии. |
| Устройство Modbus не отвечает | 1. Несовпадение параметров шины (скорость, адрес).
2. Обрыв или неверная полярность (A/B) шины RS-485.
3. Отсутствие терминатора 120 Ом. | 1. Сверить настройки в узле `modbus-client` с документацией на устройство.
2. Поменять местами провода A и B на клеммах контроллера. Проверить целостность кабеля.
3. Убедиться, что на крайних устройствах шины установлены терминирующие резисторы. |
| Команды из мобильного приложения не доходят | 1. Контроллер или телефон не подключены к сети.
2. Ошибка в MQTT-топике или контракте сообщения.
3. Неправильно настроен MQTT-брокер. | 1. Проверить сетевые подключения. `ping` контроллера с телефона.
2. С помощью утилиты `MQTT Explorer` подписаться на нужный топик и посмотреть, какие сообщения приходят от приложения. Сравнить с тем, что ожидает Node-RED.
3. Проверить настройки `mqtt in` узла в Node-RED. |
| Сценарий «Я ушел» не выключает одну из групп света | 1. Ошибка в потоке Node-RED (неправильный узел `gpio out`).
2. "Залипло" реле. | 1. Проверить, что в потоке сценария есть команда на выключение нужного реле. Подключить `debug` к его входу.
2. Послушать, щелкает ли реле при выполнении команды. Если нет, попробовать управлять им вручную из тестового потока. |
| Датчик протечки сработал, но краны не перекрылись | 1. Отказ логики ПЛК или Node-RED.
2. Нет питания на электроприводах кранов.
3. Механическое заклинивание привода. | 1. Проверить лог `audit_log` на наличие записи о событии. Проверить статус потока `FLOW-SAFETY-LEAK-001`.
2. Проверить автомат в щите, питающий приводы. Проверить напряжение на клеммах `RL-xx`.
3. Попробовать активировать привод вручную (если предусмотрено конструкцией). |