ГлавнаяАкадемияСценарии умного дома: режимы, состояния, приоритеты → SCN-ENERGY-005: Управление нагрузкой (отключение неприоритетных потребителей при пиковой мощности)

SCN-ENERGY-005: Управление нагрузкой (отключение неприоритетных потребителей при пиковой мощности)

Урок 4 · Сценарии умного дома: режимы, состояния, приоритеты · 30 мин · theory

Концепция управления нагрузкой (Load Shedding)

Управление нагрузкой, или Load Shedding, — это один из ключевых сценариев энергоэффективности как для частных, так и для коммерческих объектов. Его основная задача — автоматически отключать неприоритетных потребителей электроэнергии в моменты, когда общее потребление приближается к критическому или нежелательному порогу. Этот процесс позволяет избежать негативных последствий, как технических, так и финансовых.

> 💡 Подсказка: Для коммерческих объектов, таких как небольшие производства, гостиницы или офисные центры, управление пиковой мощностью может снизить ежемесячные счета на 15-30% за счет исключения штрафов за превышение заявленной мощности, которая прописывается в договоре с энергосбытовой компанией.

Что такое пиковая мощность?

Пиковая мощность (Peak Power) — это максимальное мгновенное значение мощности, потребляемой всеми электроприборами на объекте в определенный момент времени. Важно понимать, что электросеть, включая вводной кабель, автоматические выключатели и внутреннюю проводку, проектируется именно под пиковую, а не среднюю нагрузку.

Превышение этого пикового значения может привести к двум основным проблемам:

  • Техническая: Срабатывание главного автоматического выключателя в электрощите. Это приводит к полному обесточиванию объекта, остановке критически важных систем (например, отопительных котлов, серверов, систем безопасности) и требует ручного вмешательства для восстановления электроснабжения. В худшем случае, постоянные перегрузки ведут к перегреву проводки и риску возгорания.
  • Экономическая: Для юридических лиц стоимость электроэнергии часто складывается не только из потребленных киловатт-часов, но и из платы за максимальную заявленную мощность. Превышение этого лимита, даже на короткое время, может привести к значительным штрафам или увеличению стоимости всего потребления за расчетный период.
  • Концепция приоритезации нагрузок

    В основе сценария управления нагрузкой лежит простое, но эффективное правило: не все потребители электроэнергии одинаково важны в каждый момент времени. Систему можно научить "жертвовать" менее важными нагрузками для сохранения работоспособности более важных. Для этого все потребители на объекте разделяются на группы по приоритетам.

    📋 Ключевые понятия:

    Общий алгоритм работы сценария выглядит следующим образом:

  • Мониторинг: Система непрерывно отслеживает общую потребляемую мощность с помощью специального счетчика.
  • Анализ и решение: Как только текущая мощность превышает заданный верхний порог, система инициирует процедуру отключения.
  • Отключение (Shedding): Система начинает последовательно отключать нагрузки, двигаясь от самого низкого приоритета (4) к более высокому (3). После отключения каждой группы делается короткая пауза для оценки нового значения общей мощности.
  • Стабилизация: Процесс отключения останавливается, как только общая мощность падает ниже безопасного порога.
  • Восстановление (Restoration): Когда общая мощность на объекте естественным образом снижается (например, выключился мощный прибор) и опускается ниже нижнего порога восстановления, система начинает в обратном порядке включать ранее отключенные нагрузки.
  • Этот умный механизм позволяет максимально эффективно использовать выделенную электрическую мощность, не жертвуя работой ключевых систем.

    ---

    Архитектура и компоненты системы

    Для реализации надежного сценария управления нагрузкой требуется правильно подобранная аппаратная база, где контроллер HI выступает в роли "мозгового центра". Рассмотрим ключевые компоненты этой архитектуры.

    Центральный контроллер

    Контроллер HI является ядром системы. Его задачи:

    Счетчик электроэнергии (Средство измерения)

    Это "глаза" нашей системы. Невозможно управлять тем, что нельзя измерить. Выбор счетчика — критически важный шаг. Для наших задач подходят не бытовые счетчики с импульсным выходом, а промышленные анализаторы сети, передающие точные данные по цифровому протоколу.

    | Модель | Протокол | Шина | Преимущества |

    | ---------------------- | ------------- | ------------ | ------------------------------------------------------------------------- |

    | Wiren Board WB-MAP3E/MAP12E | Modbus RTU | RS-485 | Высокая точность, измерение множества параметров (мощность, напряжение, ток по каждой фазе), прямая совместимость с экосистемой. |

    | Eastron SDM630-Modbus | Modbus RTU | RS-485 | Популярная и надежная модель, промышленный стандарт, хорошее соотношение цены и качества. |

    | Conto-D4-Pt (ABB) | Modbus RTU / M-Bus | RS-485 | Также измеряет параметры пофазно, надежный европейский бренд. |

    | MQTT-счетчики | MQTT | TCP/IP (LAN) | Некоторые современные счетчики или шлюзы могут публиковать данные напрямую в MQTT, что упрощает интеграцию в Node-RED. |

    Основной параметр, который нам нужен, — общая активная мощность (Total Active Power). Именно её мы будем считывать с устройства, как правило, из соответствующего Modbus-регистра.

    Исполнительные устройства (Средства управления)

    Это "руки" нашей системы. Они исполняют команды контроллера, физически размыкая или замыкая цепи питания нагрузок.

    Схема потоков данных

    Визуализация потока данных помогает понять архитектуру системы в целом:

    [Счетчик Modbus] ==(RS-485)==> [Контроллер HI]

    `^`

    `| (Чтение регистра мощности)`

    `|`

    [Node-RED Flow]

    `|`

    `| (Логика: анализ, решение)`

    `v`

    [Реле контроллера / Modbus реле] ==(Проводное соединение)==> [Контактор] ==(Силовая линия)==> [Нагрузка]

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

    ---

    Определение приоритетов и конфигурация

    Прежде чем приступать к написанию кода, необходимо выполнить подготовительную работу: классифицировать нагрузки и создать гибкую конфигурацию. Жесткое кодирование параметров в узлах `function` является плохой практикой, так как любое изменение потребует вмешательства в логику потока.

    Практические рекомендации по классификации нагрузок

    Процесс классификации — это поиск баланса между комфортом и энергоэффективностью. Проведите аудит всех значимых потребителей на объекте и распределите их по группам.

    | Приоритет | Группа | Примеры нагрузок | Логика отключения |

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

    | 1 | Неотключаемые | Серверы, СКУД, видеонаблюдение, насосы отопления, холодильники, аварийное освещение. | Никогда не отключаются автоматически. |

    | 2 | Краткосрочные | Основное освещение, рабочие станции, бытовая техника (ТВ, аудио). | Отключаются в самую последнюю очередь, если ничего другое не помогло. |

    | 3 | Инерционные | Бойлер, кондиционер, конвекторы, вентиляция. | Отключение на 15-60 минут обычно не вызывает дискомфорта. |

    | 4 | Низкоприоритетные | Теплые полы, зарядка электромобиля, подогрев бассейна, сауна, обогрев ливнестоков. | Отключаются первыми при малейшем риске перегрузки. |

    Этот список должен быть задокументирован и согласован с владельцем объекта.

    Создание конфигурационного объекта

    Для хранения настроек мы будем использовать объект в контексте потока (`flow context`), который будет инициализироваться при старте Node-RED. Это позволит легко изменять параметры без редактирования кода.

    В узле `function`, подключенном к узлу `inject` (в режиме "Inject once after 0.1 seconds"), мы определим всю нашу конфигурацию.

    // Этот код выполняется один раз при запуске для инициализации конфигурации
    
    

    const config = {

    // Пороговые значения мощности в Ваттах (W)

    thresholds: {

    shed: 15000, // Верхний порог: при превышении начинаем отключать

    restore: 12000 // Нижний порог: при падении ниже него начинаем восстанавливать

    },

    // Список управляемых нагрузок

    loads: [

    {

    id: "load-01",

    name: "Теплый пол (Гостиная)",

    priority: 4, // Самый низкий приоритет

    controlTopic: "home/livingroom/floor_heating/set",

    statusTopic: "home/livingroom/floor_heating/state",

    state: "UNKNOWN", // Текущее состояние: ON, OFF, SHED_OFF (отключено автоматикой)

    manual: false // Флаг ручного управления

    },

    {

    id: "load-02",

    name: "Электрический бойлер",

    priority: 3,

    controlTopic: "home/utilityroom/boiler/set",

    statusTopic: "home/utilityroom/boiler/state",

    state: "UNKNOWN",

    manual: false

    },

    {

    id: "load-03",

    name: "Зарядка электромобиля",

    priority: 4,

    controlTopic: "home/garage/ev_charger/set",

    statusTopic: "home/garage/ev_charger/state",

    state: "UNKNOWN",

    manual: false

    },

    {

    id: "load-04",

    name: "Основная вентиляция",

    priority: 3,

    controlTopic: "home/hvac/main_ventilation/set",

    statusTopic: "home/hvac/main_ventilation/state",

    state: "UNKNOWN",

    manual: false

    }

    ]

    };

    // Сохраняем конфигурацию в контексте потока для доступа из других узлов

    flow.set("loadSheddingConfig", config);

    node.status({fill:"green", shape:"dot", text:"Конфигурация загружена"});

    return null; // Ничего не отправляем дальше

    Эта структура данных является "единым источником правды" для нашего сценария.

    * `id`, `name`: Уникальный идентификатор и понятное имя.

    * `priority`: Числовой приоритет (чем выше число, тем ниже приоритет).

    * `controlTopic`: MQTT-топик для отправки команд (`ON`/`OFF`).

    * `statusTopic`: MQTT-топик для получения обратной связи о состоянии.

    * `state`: Внутреннее состояние автомата (`ON`, `OFF`, `SHED_OFF`). `SHED_OFF` означает, что нагрузка была отключена именно сценарием управления мощностью, а не пользователем.

    * `manual`: Флаг, позволяющий исключить нагрузку из автоматического управления.

    Такой подход делает систему гибкой, масштабируемой и простой в обслуживании.

    ---

    Реализация алгоритма в Node-RED

    Теперь, когда у нас есть четкая архитектура и конфигурация, перейдем к созданию потока в Node-RED. Основная логика будет сосредоточена в одном узле `function`.

    > ⚠️ Внимание: В этом сценарии критически важно использовать два разных порога (`shed` и `restore`) для предотвращения "дребезга" системы. Мы применяем здесь паттерн "Гистерезис", который подробно разбирался в уроке `COURSE-07-M04-L01` по управлению климатом.

    1. Чтение данных с Modbus-счетчика

    Первым шагом является настройка периодического опроса счетчика. Как мы рассмотрели ранее в модуле по протоколам, для этого используется связка `Inject` + `Modbus-Getter`.

  • Узел `Inject`: Настраивается на повторение каждые 2-3 секунды. Этого интервала достаточно для своевременной реакции и, в то же время, он не создает избыточной нагрузки на шину RS-485.
  • Узел `Modbus-Getter`:
  • * Server: Выбираем преднастроенный Modbus-клиент (например, `/dev/ttyRS485-1`, 9600, 8N1).

    * Unit-ID: Адрес вашего счетчика на шине (например, `1`).

    * FC: `Read Input Registers`.

    * Address: Адрес регистра, хранящего общую активную мощность (например, `258` для WB-MAP3E). Это значение нужно взять из документации на ваш счетчик.

    * Quantity: Количество регистров для чтения (обычно 2 для 32-битного значения).

    Выход этого узла мы подаем на вход главного узла `function`.

    2. Главный узел `function`: логика отключения и восстановления

    Этот узел является сердцем сценария. Он получает данные о мощности, обращается к конфигурации из контекста и принимает решение.

    // Получаем конфигурацию из контекста потока
    

    let config = flow.get("loadSheddingConfig");

    // Если конфигурация еще не загружена, выходим

    if (!config) {

    node.status({ fill: "red", shape: "dot", text: "Конфигурация не найдена!" });

    return null;

    }

    // Получаем текущую мощность из полезной нагрузки от Modbus-узла.

    // Предполагается, что узел Modbus уже преобразовал буфер в число.

    // Если нет, здесь нужна обработка msg.payload.buffer.

    const currentPower = msg.payload;

    // Валидация входных данных

    if (typeof currentPower !== 'number' || isNaN(currentPower)) {

    node.status({ fill: "yellow", shape: "ring", text: "Некорректные данные мощности" });

    return null;

    }

    node.status({ fill: "blue", shape: "dot", text: `P: ${currentPower} W` });

    // ================== ЛОГИКА ОТКЛЮЧЕНИЯ (SHEDDING) ==================

    if (currentPower > config.thresholds.shed) {

    node.status({ fill: "red", shape: "dot", text: `ПЕРЕГРУЗКА: ${currentPower} W` });

    // 1. Найти кандидатов на отключение: те, что сейчас включены ('ON') и не в ручном режиме

    let loadsToShed = config.loads.filter(load => load.state === 'ON' && !load.manual);

    // 2. Сортировать их по приоритету (от низшего к высшему)

    loadsToShed.sort((a, b) => b.priority - a.priority);

    // 3. Если есть кого отключать, отключаем первого в списке

    if (loadsToShed.length > 0) {

    let loadToTurnOff = loadsToShed[0];

    // Помечаем, что нагрузка отключена автоматически

    loadToTurnOff.state = 'SHED_OFF';

    // Обновляем конфигурацию в контексте

    flow.set("loadSheddingConfig", config);

    // Формируем сообщение для отправки команды на отключение

    let newMsg = {

    topic: loadToTurnOff.controlTopic,

    payload: "OFF"

    };

    // Отправляем уведомление (можно на отдельный выход узла)

    node.send([newMsg, {payload: `Отключена нагрузка: ${loadToTurnOff.name}`}]);

    return; // Выходим после одного действия, чтобы переоценить мощность на следующей итерации

    }

    }

    // ================= ЛОГИКА ВОССТАНОВЛЕНИЯ (RESTORATION) ===============

    else if (currentPower < config.thresholds.restore) {

    // 1. Найти кандидатов на восстановление: те, что были отключены автоматикой ('SHED_OFF')

    let loadsToRestore = config.loads.filter(load => load.state === 'SHED_OFF' && !load.manual);

    // 2. Сортировать их по приоритету (от высшего к низшему)

    loadsToRestore.sort((a, b) => a.priority - b.priority);

    // 3. Если есть кого включать, включаем первого в списке

    if (loadsToRestore.length > 0) {

    let loadToTurnOn = loadsToRestore[0];

    // Возвращаем в нормальное состояние

    loadToTurnOn.state = 'ON';

    // Обновляем конфигурацию в контексте

    flow.set("loadSheddingConfig", config);

    // Формируем сообщение для отправки команды на включение

    let newMsg = {

    topic: loadToTurnOn.controlTopic,

    payload: "ON"

    };

    // Отправляем уведомление

    node.send([newMsg, {payload: `Восстановлена нагрузка: ${loadToTurnOn.name}`}]);

    return; // Выходим после одного действия

    }

    }

    // Если мы находимся в "мертвой зоне" гистерезиса, ничего не делаем.

    return null;

    Этот код реализует пошаговую логику: за один цикл (2-3 секунды) выполняется только одно действие — либо отключение одной группы, либо включение. Это предотвращает лавинообразные переключения и дает системе время на стабилизацию и корректное измерение новой мощности.

    ---

    Логика восстановления и обратная связь

    Корректное восстановление питания и информирование пользователя не менее важны, чем своевременное отключение. Это создает ощущение надежности и предсказуемости умного дома, а не хаотичности.

    > 🔗 Связанный материал: Логика работы с режимами AUTO/MANUAL подробно раскрыта в модуле `COURSE-07-M01` "Управление состоянием и режимами". Подход к отключению розеток по системному режиму 'Away' описан в уроке `SCN-ENERGY-001`.

    Алгоритм восстановления питания

    Как было показано в коде выше, алгоритм восстановления — это зеркальное отражение алгоритма отключения:

  • Проверка условия: Логика активируется, когда общая мощность падает ниже нижнего порога (`restore`). Это обеспечивает необходимый гистерезис.
  • Поиск кандидатов: Система ищет в своей конфигурации нагрузки, находящиеся в специальном состоянии `'SHED_OFF'`. Это гарантирует, что мы не включим то, что было выключено пользователем вручную.
  • Сортировка по приоритету: Нагрузки сортируются в порядке возрастания приоритета (т.е. от более важных к менее важным). Это логично: сначала нужно включить бойлер, и только потом, если мощность позволяет, — теплый пол.
  • Пошаговое включение: За одну итерацию включается только одна нагрузка. Система отправляет команду `ON`, меняет ее состояние в контексте на `'ON'` и ждет следующего цикла измерения мощности.
  • ℹ️ Информация: Для предотвращения резкого скачка тока при одновременном включении нескольких мощных потребителей, можно добавить между включениями небольшую задержку (5-10 секунд) с помощью узла `trigger`.

    Реализация пользовательских уведомлений

    Ничто так не раздражает пользователя, как "умный" дом, который ведет себя непредсказуемо. Если в гостиной внезапно отключился теплый пол, человек должен немедленно узнать, почему это произошло.

    В нашем главном узле `function` мы уже предусмотрели второй выход для отправки текстовых сообщений.

  • Настройте узел `function`: В его настройках укажите 2 выхода.
  • Направляйте сообщения:
  • * Первый выход используется для отправки управляющих MQTT-команд. Его мы подключаем к узлу `mqtt out`.

    * Второй выход используется для уведомлений. Его мы подключаем к узлу-отправщику сообщений (например, `node-red-contrib-telegrambot-plus` или другому, который вы используете).

    Пример потока для уведомлений:

    `[Main Function Node (Output 2)]` -> `[Telegram Sender]`

    Сообщение должно быть четким и информативным:

    Переключатель "Ручной/Авто" режим

    Иногда автоматику нужно временно отключить (например, во время ремонтных работ или при необходимости гарантированно включить все приборы). Для этого создается глобальный переключатель.

  • Создайте виртуальный переключатель в вашем интерфейсе (например, в Home Assistant или в Dashboard Node-RED), который будет публиковать в MQTT-топик `home/settings/loadshedding/mode` сообщения `AUTO` или `MANUAL`.
  • Подпишитесь на этот топик в Node-RED с помощью узла `mqtt in`.
  • Сохраняйте состояние в глобальном контексте: `global.set('loadSheddingMode', msg.payload)`.
  • Добавьте проверку в самом начале вашего главного `function`-узла:
  •     const mode = global.get('loadSheddingMode') || 'AUTO';

    if (mode === 'MANUAL') {

    node.status({fill:"grey", shape:"ring", text:"Ручной режим"});

    return null; // Если режим ручной, прекращаем выполнение любой логики

    }

    Эта простая доработка дает пользователю полный контроль над системой и повышает доверие к автоматизации.

    ---

    Итоги и лучшие практики

    Мы разработали сложный, но чрезвычайно полезный сценарий `SCN-ENERGY-005`, который является признаком профессионально спроектированной системы автоматизации. Он не только повышает безопасность и надежность электроснабжения, но и может принести прямую экономическую выгоду.

    Краткий обзор созданного сценария

  • Сбор данных: С помощью узла `Modbus-Getter` мы считываем общую потребляемую мощность с промышленного счетчика.
  • Конфигурация: Вся логика (приоритеты, пороги, управляющие топики) хранится в гибкой JSON-структуре в контексте потока, что упрощает настройку и обслуживание.
  • Основной алгоритм: Ключевой узел `function` реализует логику `Shed & Restore` (Отключение и Восстановление) с использованием гистерезиса, предотвращая "дребезг" системы.
  • Управление: Команды на отключение и включение отправляются по протоколу MQTT на исполнительные устройства (реле, контакторы).
  • Обратная связь: Система информирует пользователя о всех своих действиях через мессенджеры и позволяет временно отключить автоматику с помощью переключателя `AUTO/MANUAL`.
  • Лучшие практики и советы по внедрению

    > 💡 Подсказка для тестирования: Создайте "режим симуляции". Добавьте в поток узел `Inject` с возможностью отправлять числовые значения и узел `Slider` из палитры `node-red-dashboard`. Подключите их к главному `function`-узлу вместо Modbus-счетчика. Двигая ползунок, вы сможете имитировать рост и падение мощности и наблюдать за реакцией системы в реальном времени, не включая реальные мощные приборы.

    Что дальше

    В следующем модуле мы перейдем к рассмотрению сценариев, связанных с безопасностью и контролем доступа. Мы научимся интегрировать датчики движения и открытия, управлять замками и создавать комплексные сценарии "Имитация присутствия" для защиты объекта во время отсутствия хозяев.