ГлавнаяАкадемияОсновы умного дома → Сценарии для дома: Управление световыми сценами

Сценарии для дома: Управление световыми сценами

Урок · Основы умного дома · 30 мин · theory
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: Управление климатом: базовое взаимодействие с кондиционерами и теплыми полами.