SCN-COMFORT-002: Управление шторами (восход/закат)
SCN-COMFORT-002-S01: Автоматизация по солнцу: введение
Автоматическое управление шторами, или астрономический таймер, является одним из ключевых сценариев, повышающих комфорт, энергоэффективность и безопасность современного умного дома или офиса. Выходя за рамки простого расписания, этот сценарий использует реальное положение солнца для принятия решений, что делает его гибким и не требующим сезонной перенастройки.
Преимущества данного подхода многогранны:
- Комфорт: Автоматика защищает помещения от слепящего утреннего или вечернего солнца, предотвращает выгорание мебели и создает комфортную световую среду. Утром плавное открытие штор может служить естественным будильником, синхронизированным с природными ритмами.
- Энергосбережение: В летний период своевременное закрытие штор на солнечной стороне здания значительно снижает нагрев помещений, что уменьшает нагрузку на систему кондиционирования и, как следствие, потребление электроэнергии. Зимой, наоборот, открытие штор в солнечный день позволяет использовать пассивный солнечный обогрев, сокращая затраты на отопление.
- Безопасность и эффект присутствия: Движение штор в течение дня создает видимость того, что в доме кто-то есть. Это является важным элементом сценариев безопасности, особенно когда активирован режим «Я ушел», рассмотренный нами ранее.
В основе сценария лежат астрономические события, которые служат триггерами для выполнения действий.
📋 Ключевые понятия:
- Восход (Sunrise): Момент, когда верхний край солнечного диска появляется над горизонтом.
- Закат (Sunset): Момент, когда верхний край солнечного диска скрывается за горизонтом.
- Сумерки (Dusk / Dawn): Периоды перед восходом и после заката, когда небо еще или уже освещено рассеянным солнечным светом. Различают гражданские, навигационные и астрономические сумерки. Для автоматизации чаще всего используются гражданские.
- Солнечный полдень (Solar Noon): Момент времени, когда солнце находится в наивысшей точке своей дневной траектории.
Наша цель — спроектировать и реализовать в среде Node-RED на контроллере HI надежный и гибкий сценарий `SCN-COMFORT-002`. Этот сценарий должен в автоматическом режиме открывать шторы после восхода солнца и закрывать их перед закатом. Кроме того, он должен корректно интегрироваться с другими системами умного дома, в частности, учитывать ручное управление со стороны пользователя и глобальные режимы, такие как «Я ушел».
Необходимые компоненты:---
SCN-COMFORT-002-S02: Конфигурация узла расчета солнечных событий
Для реализации автоматизации на основе астрономических событий нам потребуется специализированный узел, который будет выполнять расчеты и генерировать сообщения-триггеры. Одним из наиболее популярных и функциональных является `node-red-contrib-sun-position`.
Установка узла
Если узел еще не установлен на вашем контроллере HI, его можно добавить через интерфейс Node-RED:
После установки в палитре узлов появится новый набор, включая узел `sun-position`.
Настройка узла
Точность работы всего сценария напрямую зависит от правильной конфигурации этого узла.
> 💡 Подсказка: Для получения точных координат вашего объекта используйте онлайн-карты (например, Google Maps, Яндекс.Карты) или специализированные сервисы. Кликнув правой кнопкой мыши по нужной точке на карте, вы сможете скопировать широту и долготу. Ошибка даже в один градус широты может привести к смещению времени срабатывания на несколько минут.
Перетащите узел `sun-position` на рабочее поле и откройте его настройки, дважды кликнув по нему.
Основные параметры для конфигурации:- Name (Имя): Задайте осмысленное имя, например, «Астро-таймер: Москва» или «Солнечные события объекта».
- Latitude (Широта): Введите географическую широту вашего объекта в десятичном формате. Например, `55.7558`.
- Longitude (Долгота): Введите географическую долготу. Например, `37.6173`.
Далее необходимо настроить правила генерации событий, которые и будут запускать наш сценарий. Узел позволяет создавать множество правил. Для нашей задачи нам понадобятся как минимум два: для восхода и для заката.
Анализ выходного сообщения
Узел `sun-position` генерирует сообщения не только по настроенным событиям, но и периодически (по умолчанию каждую минуту), отправляя на свой первый выход подробную информацию о текущем положении солнца. Это сообщение соответствует "Контракту сообщения" и является основой для построения логики.
Пример сообщения (`msg.payload`) от узла `sun-position`:
{
"azimuth": 240.5,
"altitude": 15.2,
"sunInSky": true,
"astral": {
"sunrise": 1678846800000,
"sunset": 1678887600000,
"solarNoon": 1678867200000,
"dawn": 1678844400000,
"dusk": 1678890000000
}
}
Ключевые поля для нашего сценария:
- `sunInSky`: `true`, если солнце над горизонтом, иначе `false`.
- `astral.sunrise`: Временная метка (timestamp) следующего восхода в миллисекундах.
- `astral.sunset`: Временная метка следующего заката.
Когда наступает время, заданное правилом (например, `sunrise`), узел отправляет на свой второй выход сообщение, у которого `msg.topic` будет равен имени события (`sunrise`). Именно этот выход мы будем использовать как триггер.
---
SCN-COMFORT-002-S03: Базовый сценарий: Открытие на восходе, закрытие на закате
Теперь, когда у нас есть настроенный источник астрономических событий, мы можем построить базовый поток управления шторами в Node-RED.
ASCII-схема потока `FLOW-COMFORT-SUN-001`: +---------------------------+
(Срабатывает по | sun-position |
восходу/закату) --> | "Астро-таймер: Гостиная" | -- (2-й выход: События) --> [Switch: "Событие?"]
+---------------------------+
+--------------------------+ +-----------------------+ +------------------------------------------+
[Switch: "Событие?"] -- (msg.topic == "sunrise") --> | Change: "Payload=OPEN" | -> | mqtt out |
| +-----------------------+ | Topic: hi/devices/curtain_living_room/set|
| +------------------------------------------+
+-- (msg.topic == "sunset") --> | Change: "Payload=CLOSE"| -> | mqtt out |
+-----------------------+ | Topic: hi/devices/curtain_living_room/set|
Шаги по созданию потока:
* Property (Свойство): `msg.topic`
* Правило 1: `==` (строка) `sunrise` -> выход 1
* Правило 2: `==` (строка) `sunset` -> выход 2
| Команда | `msg.payload` (JSON) | Описание |
|--------------|------------------------------|-------------------------------------------|
| Открыть | `{"state": "OPEN"}` | Полностью открыть штору. |
| Закрыть | `{"state": "CLOSE"}` | Полностью закрыть штору. |
| Остановить | `{"state": "STOP"}` | Немедленно остановить движение. |
| Задать позицию| `{"position": 80}` | Установить положение в процентах (0-100). |
* Для ветки "sunrise":
1. Добавьте узел `change`.
2. Настройте правило: `Set` `msg.payload` `to` (тип J: Expression) `{"state": "OPEN"}`.
3. Соедините его с узлом `mqtt out`.
4. В узле `mqtt out` укажите MQTT-топик для управления шторой, например, `hi/devices/curtain_living_room/set`. Настройте ваш MQTT-брокер.
* Для ветки "sunset":
1. Аналогично, добавьте узел `change`.
2. Настройте правило: `Set` `msg.payload` `to` (тип J: Expression) `{"state": "CLOSE"}`.
3. Соедините его с тем же узлом `mqtt out`.
Использование смещений (offsets)
Как мы упоминали, часто требуется, чтобы шторы закрывались не в момент заката, а немного раньше. Это легко настраивается в узле `sun-position`.
Для более сложной логики, например, если смещение зависит от дня недели или другого фактора, можно использовать узел `function`.
// Пример узла function для динамического смещения
// Этот узел должен стоять ПЕРЕД узлом sun-position,
// чтобы динамически менять его конфигурацию.
// Это продвинутая техника, но полезная для понимания.
// Получаем текущую дату
const now = new Date();
const dayOfWeek = now.getDay(); // 0 = Воскресенье, 6 = Суббота
let sunriseOffset = 15; // Стандартное смещение для восхода
let sunsetOffset = -20; // Стандартное смещение для заката
// В выходные дни открываем шторы позже
if (dayOfWeek === 0 || dayOfWeek === 6) {
sunriseOffset = 60; // Через час после восхода
}
// Формируем сообщение для изменения конфигурации узла sun-position
msg.payload = {
"config": {
"rules": [
{ "event": "sunrise", "offset": sunriseOffset, "property": "topic" },
{ "event": "sunset", "offset": sunsetOffset, "property": "topic" }
]
}
};
return msg;
Этот код демонстрирует, как можно программно управлять конфигурацией узла `sun-position`, посылая на его вход специальное управляющее сообщение.
---
SCN-COMFORT-002-S04: Интеграция и приоритеты
Базовый сценарий работает, но в реальной жизни он будет конфликтовать с другими системами и действиями пользователя. Чтобы автоматизация была комфортной, а не назойливой, необходимо продумать систему приоритетов.
Проблема «конфликта автоматики»
Представьте ситуацию: на улице пасмурно, и пользователь вручную закрыл шторы, чтобы включить проектор и посмотреть кино. Через час наступает время, рассчитанное автоматикой для открытия штор. Шторы открываются, прерывая просмотр. Это плохой пользовательский опыт (UX).
Для реализации ручного управления мы применим паттерн 'Блокировка по таймеру', который является частью более общей концепции конечных автоматов, подробно рассмотренной в уроке `COURSE-07-M01-L03`.
> ⚠️ Внимание: При реализации логики ручного управления и возврата к автоматическому режиму убедитесь в отсутствии зацикливаний. Неправильно спроектированный поток может привести к тому, что команда от настенного выключателя будет немедленно отменена автоматикой, и наоборот.
Интеграция с режимом «Я ушел»
🔗 Связанный материал: Логика режима «Я ушел» была подробно рассмотрена в уроке `SCN-LIGHT-012`.
Если в доме никого нет (`away_mode` == `true`), то открытие штор утром не имеет смысла с точки зрения комфорта, но полезно для эффекта присутствия. Закрытие на закате, наоборот, обязательно для безопасности.
Логика должна быть следующей:
- Событие `sunrise`: Если `flow.get('away_mode') === true`, проигнорировать команду на открытие.
- Событие `sunset`: Выполнить команду на закрытие независимо от режима `away_mode`.
Реализация шлюза приоритетов (Priority Gate)
Создадим узел `function`, который будет стоять после узла `switch` и перед узлами `change`. Он будет решать, пропускать ли команду от астро-таймера.
Имя узла: `Priority Gate: Curtains` Код:// Получаем глобальный режим 'Я ушел'
// Предполагается, что он хранится в flow-контексте
const awayMode = flow.get('away_mode') || false;
// Проверяем, заблокирована ли автоматика ручным управлением
const isLocked = flow.get('curtain_living_room_locked') || false;
// Получаем событие от астро-таймера
const event = msg.topic;
// --- ЛОГИКА ПРИОРИТЕТОВ ---
// 1. Проверяем блокировку по таймеру. Если флаг установлен, блокируем команду.
if (isLocked === true) {
node.status({ fill: "yellow", shape: "ring", text: "Locked by manual override" });
return null; // Блокируем сообщение
}
// 2. Проверяем режим 'Я ушел'
if (awayMode === true) {
// Если мы в отъезде, на восход не реагируем, на закат - реагируем
if (event === 'sunrise') {
node.status({ fill: "grey", shape: "dot", text: "Away mode: ignoring sunrise" });
return null; // Блокируем открытие
}
}
// Если все проверки пройдены, пропускаем сообщение дальше в поток
node.status({ fill: "green", shape: "dot", text: `AUTO: ${event}` });
return msg;
Этот узел, используя паттерн "Визуальный статус", наглядно показывает причину блокировки или выполнения команды, что критически важно для отладки. Чтобы эта схема работала, необходимо реализовать логику установки флага `curtain_living_room_locked` в соответствии с паттерном, рассмотренным в уроке `COURSE-07-M01-L03`.
---
SCN-COMFORT-002-S05: Итоги и следующие шаги
В рамках этого урока мы прошли полный цикл создания интеллектуального сценария автоматизации `SCN-COMFORT-002` на платформе HI.
Резюме:- Мы научились создавать автоматизацию на основе астрономических событий, используя узел `node-red-contrib-sun-position` для точного расчета времени восхода и заката.
- Мы рассмотрели, как построить базовый поток в Node-RED для управления приводами штор по MQTT, включая формирование команд в соответствии с заранее определенным "контрактом сообщения".
- Мы обсудили критическую важность управления состоянием и приоритетами для создания комфортного и предсказуемого пользовательского опыта. Были реализованы механизмы интеграции с глобальным режимом «Я ушел» и обработка ручного управления для временного переопределения автоматики.
Созданный нами сценарий является надежной основой, но его можно и нужно развивать дальше, адаптируя под конкретные нужды объекта и пользователя.
Перспективы развития сценария
- Учет облачности и освещенности: Текущий сценарий не учитывает погоду. В пасмурный день нет смысла закрывать шторы для защиты от солнца. Интегрировав данные от локального датчика освещенности (подключенного к универсальному входу контроллера) или через API погодного сервиса, можно сделать автоматику еще умнее. Например, команда на закрытие штор днем будет выполняться, только если `sunInSky === true` И `light_level > 50000 люкс`.
- Интеграция с режимом «Кино»: При активации этого режима (например, сценарной кнопкой или голосовой командой) шторы должны немедленно закрываться, независимо от времени суток и положения солнца. Это требует добавления еще одного, более высокого уровня приоритета в наш `Priority Gate`.
- Режим «Гости»: В этом режиме можно изменить поведение автоматики, например, открывать шторы позже в гостевых комнатах или полностью отключить автоматическое закрытие, предоставив гостям полный контроль.
- Защита от перегрева: В жаркий солнечный день шторы можно закрывать превентивно, даже если в помещении еще не жарко, основываясь на прогнозе температуры и солнечном положении, чтобы не допустить эффекта парника.
Что дальше?
В следующем уроке мы продолжим изучать каталог сценариев комфорта и рассмотрим, как можно управлять климатическими системами, объединяя данные с датчиков температуры, влажности и CO2 для создания идеального микроклимата в помещении.