Сценарии для дома: Управление световыми сценами
id: COURSE-01-M05-L01-L05
title: "Сценарии для дома: Управление световыми сценами"
level: Foundation
tags: [освещение, сценарии, Node-RED, MQTT, Wirenboard, iRidium, light scenes]
prerequisites: [COURSE-01-M02, COURSE-01-M03]
version: 1.0
status: published
# Урок: Сценарии для дома: Управление световыми сценами
В данном уроке мы переходим от управления отдельными устройствами к созданию комплексных состояний системы, известных как «сцены». Управление освещением — одна из самых востребованных и наглядных функций умного дома. Мы разберем теоретические основы, спроектируем и реализуем логику управления световой сценой "Кино" с использованием контроллера, Node-RED и оборудования Wirenboard, а также интегрируем управление с панелью визуализации iRidium.
📋 Ключевые понятия, разбираемые в уроке:
- Световая сцена
- Диммирование
- MQTT топики и payload
- Node-RED: узел `function`
- Node-RED: узел `switch`
- Контекст Node-RED (flow/global)
- Wirenboard MQTT API
- iRidium MQTT Driver
Результаты обучения:
По завершении этого урока вы сможете:
- Объяснять концепцию световых сцен и их преимущества в автоматизации.
- Проектировать и реализовывать логику управления сценами в Node-RED.
- Интегрировать управление сценами с оборудованием Wirenboard по MQTT.
- Интегрировать запуск сцен с панелей управления iRidium.
---
COURSE-01-M05-L01: Введение в световые сцены
Световая сцена — это не просто включение или выключение света. Это заранее сконфигурированный набор состояний для нескольких групп освещения в одном или нескольких помещениях, который можно активировать одной командой. Представьте себе театральную сцену: смена действия сопровождается полной сменой освещения — где-то свет гаснет, где-то плавно зажигается, меняется его цвет и интенсивность. Аналогичный принцип применяется и в умном доме.
> 💡 Подсказка: При проектировании системы всегда закладывайте диммируемые источники света и драйверы с поддержкой стандартных протоколов (например, DALI). Это значительно упростит реализацию сложных сцен и обеспечит плавную регулировку без мерцания.
Преимущества использования сцен:
Комфорт: Вместо того чтобы щелкать несколькими выключателями, пользователь одной кнопкой создает нужную атмосферу. Например, сцена "Ужин" может приглушить основной свет, включить мягкую подсветку над столом и зажечь торшер в углу.
Энергосбережение: Сцена "Никого нет" гарантированно выключает всё освещение в доме, предотвращая его работу впустую. Сцены, использующие диммирование, также потребляют меньше энергии по сравнению с работой ламп на полной мощности.
Безопасность: Сцена "Эффект присутствия" может имитировать поведение жильцов, когда они в отъезде, включая и выключая свет в разных комнатах по вечерам. Сцена "Тревога" может включить всё освещение в доме на 100% при срабатывании датчиков безопасности.
Компоненты световой сцены:
Каждый источник света в сцене описывается набором параметров:
- Состояние (On/Off): Базовый параметр — включен или выключен.
- Яркость (Dimming): Уровень яркости, обычно в процентах от 0 до 100. Это ключевой параметр для создания атмосферы.
- Цветовая температура (CCT - Correlated Color Temperature): Для светильников с изменяемой цветовой температурой. Позволяет менять оттенок света от теплого (около 2700К) до холодного (около 6500К). Теплый свет расслабляет, холодный — бодрит.
- Цвет (RGB/RGBW): Для цветных светодиодных лент. Позволяет задать любой оттенок для декоративной подсветки.
Аппаратная база и протоколы:
Для реализации сцен необходимо соответствующее оборудование, управляемое нашим контроллером:
- Реле: Для простого включения/выключения недиммируемых групп света. Наш контроллер оснащен 22 релейными выходами, которые идеально подходят для этой задачи.
- Диммеры: Устройства для регулировки яркости. Они бывают разных типов:
* TRIAC (симисторные): Для диммируемых LED-ламп 220В.
* 0-10V: Для управления драйверами светильников по аналоговому сигналу.
* DALI: Цифровой протокол для профессионального управления освещением. Требует DALI-шлюза, который может быть подключен к нашему контроллеру, например, через RS-485 (с использованием Modbus-DALI шлюза).
- RGB/CCT контроллеры: Специализированные драйверы для управления цветными и CCT-лентами. Часто управляются по протоколам Modbus или MQTT.
Интеграция с контроллером происходит через штатные протоколы. Оборудование Wirenboard, которое мы используем в примерах, работает по шине RS-485 (Modbus RTU). Утилита `wb-mqtt-serial` на контроллере, как мы рассматривали в COURSE-01-M03, автоматически представляет все устройства и их каналы управления в виде MQTT-топиков. Это позволяет нам из Node-RED управлять любым параметром (включением, яркостью) простой отправкой сообщения в нужный топик.
COURSE-01-M05-L02: Модели управления сценами в Node-RED
После того как аппаратная часть подключена и представлена в MQTT, вся логика управления сценами реализуется программно в Node-RED. Существует несколько подходов к организации этой логики.
Модели хранения конфигураций сцен:
В коде узла `function`: Самый простой, но наименее гибкий способ. Конфигурация сцены "зашита" прямо в JavaScript-коде. Подходит для 1-2 простых сцен, но становится неуправляемым при росте их числа. Любое изменение требует редактирования и развертывания потока.
В переменных контекста (`flow` или `global`): Более продвинутый вариант. При старте Node-RED специальный поток может загрузить конфигурации сцен в переменные контекста (`flow.set('scenes', ...) `). Основной поток логики затем читает эти конфигурации. Это позволяет менять сцены без редактирования основного потока, но требует механизма для обновления контекста.
Во внешних файлах (JSON): Наиболее профессиональный и масштабируемый подход. Конфигурации всех сцен хранятся в отдельном JSON-файле на файловой системе контроллера. При старте Node-RED узел `file in` считывает этот файл, узел `json` парсит его содержимое, и результат сохраняется в глобальный контекст. Преимущества:
* Легко редактировать и версионировать сцены как отдельный артефакт.
* Логика Node-RED остается чистой и не зависит от конкретных значений.
* Возможность создания внешнего UI для редактирования этого файла.
Централизованная логика "Движок сцен":
Вместо создания отдельного потока для каждой сцены, применяется централизованный подход.
Входящие триггеры: Все источники команд (физические кнопки, UI-панели, голосовые ассистенты) отправляют сообщения в один и тот же MQTT-топик, например, `home/living_room/scene/set`. В `payload` передается название сцены: `'movie_on'`, `'dinner'`, `'reading'`.
Центральный узел `function` или `subflow`: Этот узел (назовем его "Scene Engine") подписывается на топик `.../scene/set`. Получив имя сцены, он:
* Находит соответствующую конфигурацию (в своем коде, в контексте или из файла).
* Формирует массив `msg` объектов для управления каждым устройством, входящим в сцену.
* Отправляет этот массив на выход.
Исходящие команды: Массив сообщений поступает в узел `mqtt out`, который отправляет каждую команду в соответствующий MQTT-топик исполнительного устройства.
Пример структуры JSON-объекта для описания сцены:
Это пример "контракта сообщения" для конфигурации сцен. Хранение конфигурации в таком виде делает систему гибкой.
json
{
"scenes": {
"movie_on": {
"description": "Сцена для просмотра кино в гостиной",
"devices": [
{
"topic": "/devices/wb-mdm3_21/controls/Channel 1/on",
"payload": "10",
"comment": "Основной свет (люстра), яркость 10%"
},
{
"topic": "/devices/wb-mdm3_21/controls/Channel 2/on",
"payload": "30",
"comment": "Декоративная подсветка, яркость 30%"
},
{
"topic": "/devices/wb-mr6c_45/controls/K3/on",
"payload": "0",
"comment": "Торшер, выключить"
},
{
"topic": "/devices/wb-mr6c_45/controls/K4/on",
"payload": "0",
"comment": "Бра, выключить"
}
]
},
"reading": {
"description": "Сцена для чтения",
"devices": [
{
"topic": "/devices/wb-mdm3_21/controls/Channel 1/on",
"payload": "0",
"comment": "Основной свет, выключить"
},
{
"topic": "/devices/wb-mdm3_21/controls/Channel 2/on",
"payload": "0",
"comment": "Декоративная подсветка, выключить"
},
{
"topic": "/devices/wb-mr6c_45/controls/K3/on",
"payload": "1",
"comment": "Торшер, включить"
}
]
}
}
}
COURSE-01-M05-L03: Практика: Сцена 'Кино' на Wirenboard и Node-RED
Теперь реализуем сценарий "Кино" по упрощенной модели (логика внутри узла `function`) для наглядности.
> ⚠️ Внимание: При работе с обратной связью от устройств (например, отправка текущего статуса диммера в MQTT) обязательно используйте узел `RBE` (Report by Exception) после узла `mqtt in`, который слушает статусы устройств. Это предотвратит зацикливание, когда сцена запускает сама себя, получив сообщение о собственном исполнении. В данном примере мы реализуем только отправку команд, но в реальных проектах это критически важно.
Постановка задачи:
- Триггер: Сообщение в MQTT-топике `myhome/living_room/scene/set` с `payload`, равным строке `'movie_on'`.
- Действия:
1. Установить яркость диммера на канале 1 модуля `wb-mdm3_21` в 10%.
2. Установить яркость диммера на канале 2 модуля `wb-mdm3_21` в 30%.
3. Выключить реле `K3` на модуле `wb-mr6c_45` (торшер).
- Инструменты: Node-RED, MQTT-брокер, эмулятор или реальное оборудование Wirenboard.
ASCII-схема потока:
[mqtt in]─────────[switch]─┬─(movie_on)──>[function: 'Кино']───[mqtt out]
(myhome/...) (payload)│
└─(другое)────>(проигнорировать)
Шаг 1: Создание узла `mqtt in`
- Добавьте на холст узел `mqtt in`.
- Настройте его:
* Сервер: Выберите ваш MQTT-брокер (должен быть настроен ранее).
* Topic: `myhome/living_room/scene/set`
* QoS: `0`
* Output: `a string`
* Name: `Сцена гостиной`
Шаг 2: Использование узла `switch` для маршрутизации
- Добавьте узел `switch` и соедините его с выходом `mqtt in`.
- Настройте его для проверки `msg.payload`:
* Property: `msg.payload`
* Добавьте правило: `==` (строка) `movie_on`.
- У узла появится один выход. Если `payload` будет равен `'movie_on'`, сообщение пойдет дальше. В противном случае оно будет отброшено.
- Name: `Выбор сцены`
Шаг 3: Написание кода в узле `function`
Это ядро нашей логики.
- Добавьте узел `function` и соедините его с выходом узла `switch`.
- Name: `Сцена 'Кино'`
- Вставьте следующий JavaScript код:
javascript
// Определяем массив команд для сцены "Кино"
// Каждая команда - это отдельный msg объект
// с собственным topic и payload.
// Команда 1: Основной свет на 10%
const msg1 = {
topic: "/devices/wb-mdm3_21/controls/Channel 1/on",
payload: "10" // Wirenboard принимает яркость в виде строки
};
// Команда 2: Подсветка на 30%
const msg2 = {
topic: "/devices/wb-mdm3_21/controls/Channel 2/on",
payload: "30"
};
// Команда 3: Выключить торшер
const msg3 = {
topic: "/devices/wb-mr6c_45/controls/K3/on",
payload: "0" // Для реле 0 - выключено, 1 - включено
};
// Узел function может возвращать массив сообщений.
// Каждое сообщение из массива будет отправлено на выход
// как отдельное, независимое сообщение.
return [msg1, msg2, msg3];
Шаг 4: Настройка узла `mqtt out` для отправки команд
- Добавьте узел `mqtt out` и соедините его с выходом узла `function`.
- Настройте его:
* Сервер: Выберите ваш MQTT-брокер.
* Topic: Оставьте это поле пустым. В этом режиме узел будет брать топик из свойства `msg.topic` каждого входящего сообщения. Это позволяет одному узлу отправлять команды в разные топики.
* QoS: `0`
* Retain: `false`
* Name: `Команды на WB`
Теперь разверните (Deploy) поток. Чтобы протестировать его, используйте любой MQTT-клиент (например, MQTT Explorer) и отправьте сообщение `'movie_on'` в топик `myhome/living_room/scene/set`. Вы должны увидеть, как на выходы диммеров и реле отправляются соответствующие команды.
COURSE-01-M05-L04: Интеграция с визуализацией iRidium
Иметь логику — это половина дела. Пользователю нужен удобный интерфейс для ее запуска. Рассмотрим интеграцию с панелью управления, созданной в iRidium Studio.
> 🔗 Связанный материал: Подробные инструкции по настройке iRidium Server и созданию комплексных интерфейсов рассматриваются в курсе продвинутого уровня COURSE-04-M02 'Визуализация и управление'. Здесь мы рассмотрим только базовый принцип взаимодействия по MQTT.
Архитектура 'iRidium Server + Node-RED'
iRidium Server, как и Node-RED, подключается к нашему MQTT-брокеру в качестве клиента. Они не общаются друг с другом напрямую, а обмениваются сообщениями через брокер. Это обеспечивает слабую связанность и высокую надежность системы.
Шаг 1: Настройка MQTT-драйвера в iRidium Studio
В проекте iRidium для вашего объекта необходимо добавить MQTT-драйвер:
Перейдите в панель `Project Device Panel`.
Нажмите `Add Device` и найдите в базе `MQTT Client`.
В настройках драйвера укажите IP-адрес, порт (обычно 1883), логин и пароль вашего MQTT-брокера.
Шаг 2: Создание кнопки для активации сцены
Нарисуйте на странице интерфейса кнопку, например, с иконкой кинокамеры и подписью "Кино".
Перейдите в свойства кнопки, на вкладку `Programming`.
Для события `Press` (нажатие) создайте новую команду:
* Тип команды: `Send MQTT Message`.
* Topic: Укажите тот же топик, который слушает наш поток в Node-RED: `myhome/living_room/scene/set`.
* Payload: Укажите значение, которое ожидает узел `switch`: `'movie_on'`.
* Retain: `False`.
Сохраните проект и загрузите его на iRidium Server и панель управления. Теперь при нажатии на эту кнопку iRidium отправит в брокер нужное MQTT-сообщение, Node-RED его получит и выполнит сценарий.
Шаг 3: Реализация обратной связи (Feedback)
Чтобы пользователь видел, какая сцена активна в данный момент, нужна обратная связь.
В Node-RED: Модифицируем наш поток. После узла `function` добавим еще один узел `change`, который будет создавать сообщение для обратной связи.
* Установит `msg.topic` в `myhome/living_room/scene/status`.
* Установит `msg.payload` в значение имени активной сцены (в нашем случае, `'movie_on'`).
* Установит `msg.retain` в `true`. Это важно! Флаг `retain` заставит брокер хранить последнее сообщение в этом топике. Когда iRidium-панель подключится, она сразу же получит текущий статус.
* Это сообщение отправляется в тот же узел `mqtt out`.
В iRidium Studio:
* В драйвере MQTT создайте канал (`Feedback`) с топиком `myhome/living_room/scene/status`.
* Перетащите этот канал на вашу кнопку "Кино".
* Настройте состояние кнопки (например, `Active`) так, чтобы оно активировалось, когда значение в этом канале равно `'movie_on'`.
Теперь, когда сцена "Кино" активна, соответствующая кнопка на панели будет подсвечена, даже если сцена была запущена с физического выключателя или голосовой командой.
COURSE-01-M05-L05: Итоги и лучшие практики
В этом уроке мы сделали важный шаг от простого управления к оркестрации — созданию сложных состояний системы одной командой. Мы увидели, что централизованное управление сценами в Node-RED является чрезвычайно гибким и масштабируемым подходом, который отделяет логику от аппаратной реализации.
Лучшие практики для запоминания:
- №1: Используйте консистентную и иерархическую структуру MQTT-топиков.
Хороший стандарт: `объект/помещение/тип_устройства/имя_устройства/управление_или_статус`.
Пример: `myhome/living_room/light/ceiling_dimmer/set` и `myhome/living_room/light/ceiling_dimmer/status`. Это делает систему самодокументируемой и легко отлаживаемой.
- №2: Для сложных проектов выносите конфигурации сцен (JSON) в отдельные файлы.
Используйте связку узлов `inject` (при старте) -> `file in` -> `json` -> `change` (для сохранения в `global` контекст). Это значительно упрощает управление десятками сцен и позволяет изменять их без остановки и редактирования потоков Node-RED.
- №3: Активно используйте `subflows` (подпотоки) для переиспользования логики.
Если у вас есть несколько комнат с одинаковым набором сцен (например, "Утро", "Вечер", "Уборка"), вы можете упаковать логику "движка сцен" в `subflow`. Затем для каждой комнаты вы создаете экземпляр этого `subflow`, передавая ему базовый топик комнаты в качестве переменной окружения. Это следует принципу DRY (Don't Repeat Yourself).
- Совет по отладке: Используйте узел `debug` с умом.
Всегда настраивайте узел `debug` на вывод всего объекта `msg`, а не только `msg.payload`. Это позволит вам видеть, в какой `topic` уходит сообщение, какие у него другие свойства (`retain`, `qos`), и быстрее находить ошибки в маршрутизации и логике.
---
Что дальше?
В следующем уроке мы рассмотрим еще один ключевой сценарий автоматизации, связанный с обеспечением безопасности и комфорта: COURSE-01-M05-L06: Управление климатом: базовое взаимодействие с кондиционерами и теплыми полами.