ГлавнаяАкадемияСценарии умного дома: режимы, состояния, приоритеты → SCN-CLIMATE-004: Управление вентиляцией по датчику CO2/влажности

SCN-CLIMATE-004: Управление вентиляцией по датчику CO2/влажности

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

Введение: Качество воздуха и цели автоматизации

ведение: Качество воздуха и цели автоматизации

Современные энергоэффективные дома хорошо сохраняют тепло, но из-за своей герметичности практически лишены естественного воздухообмена. Без контроля в таких помещениях быстро падает качество воздуха (IAQ — Indoor Air Quality). Урок COURSE-07-M06-L01 посвящен созданию сценария, который включает вентиляцию только по реальной потребности, решая проблему духоты и одновременно экономя энергоресурсы. Данный материал является логическим продолжением тем фильтрации сигналов и комплексного управления климатом.

Главные метрики микроклимата

Качество воздуха и необходимость проветривания зависят от трех базовых параметров:

Концентрация диоксида углерода (CO₂): Продукт человеческого дыхания и главный индикатор присутствия людей. Нормальным считается уровень до 800–1000 ppm (частей на миллион). Пример: в спальне с закрытым окном уровень CO₂ за ночь часто превышает 2000 ppm, что вызывает утреннюю головную боль.*

Проблема классического подхода

Традиционные подходы к вентиляции — это ручное управление, работа по таймеру или постоянная фоновая работа на низкой скорости.

> ⚠️ В чем их неэффективность? Вентиляция по расписанию может работать вхолостую в пустом помещении или не справляться при наплыве гостей. При этом шум от работы вентиляторов может мешать отдыху, даже если уровень CO₂ требует коррекции.

Цели нашего сценария:
  • «Вентиляция по требованию» (DCV): Включать систему только тогда, когда качество воздуха падает, и ровно на ту мощность, которая требуется для нормализации.
  • Энергосбережение: Минимизировать работу оборудования в пустом доме, снижая затраты на ресурсы.
  • Акустический комфорт (Учет режимов): Важная доработка сценария — интеграция с глобальным режимом `Night` (изученным в модуле M02). При активации ночного режима система должна принудительно ограничивать максимальные обороты вентиляции для тишины, даже при высоком уровне CO₂.
  • Архитектура умной вентиляции

    На платформе HI решение строится по трехуровневой модели, обеспечивающей передачу данных от помещения к оборудованию:

  • Источник данных (Датчик): Комбинированный настенный или канальный датчик. Подключается по промышленной шине (например, RS-485/Modbus) или беспроводному протоколу.
  • Логический уровень (Контроллер HI): Среда Node-RED опрашивает датчик и состояние глобального режима `Night`. Как только порог превышен, контроллер рассчитывает уставку с учетом текущих приоритетов (Качество воздуха vs Тишина).
  • Исполнительное устройство (Вентилятор/Клапан): Механизм, изменяющий воздухообмен (Дискретное реле или аналоговый выход 0-10В).
  • Мини-практикум: аудит вашей системы

    > 💡 Мини-задание

    > Перед тем как перейти к сборке логики в Node-RED, зафиксируйте физическую конфигурацию вашего проекта.

    > 1. Где автоматизируем? Выберите целевую зону (например, Спальня или Ванная).

    > 2. Что является триггером? Для спальни выберите триггер по CO₂, для ванной — по влажности (RH).

    > 3. Какие ограничения? Должна ли вентиляция снижать обороты, если активен режим `Night`?

    > 4. Чем управляем? Определите тип исполнительного устройства: Дискретное (Реле) или Аналоговое (0-10В).

    >

    > Ожидаемый результат: У вас получится короткий профиль. Например: `Зона: Спальня | Триггер: CO₂ > 900 ppm | Ограничение: Night Mode | Управление: 0-10В`.

    Аппаратная часть: Подключение датчиков и исполнителей

    ппаратная часть: Подключение датчиков и исполнителей

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

    > 💡 Подсказка: Используйте комбинированные датчики (CO2/VOC/влажность/температура) для экономии места и упрощения монтажа. Интерфейс RS-485 и протокол Modbus RTU являются промышленным стандартом де-факто для таких устройств, обеспечивая надежную передачу данных по двум проводам на большие расстояния.

    Шаг 1. Физическое подключение датчиков (RS-485)

    Для реализации сценария потребуется датчик, способный измерять как минимум концентрацию углекислого газа (CO₂).

    Ключевые этапы подключения датчика к контроллеру HI:
  • Шина данных (A/B): Используйте кабель типа «витая пара» (UTP/FTP). Подключите клеммы `A` (D+) и `B` (D-) датчика к соответствующим клеммам порта RS-485 на контроллере.
  • Питание (V+/GND): Подайте на датчик питание (обычно 12В или 24В DC), строго соблюдая полярность. Питание можно взять от клемм блока питания самого контроллера или от отдельного источника.
  • Адресация (Slave ID): Каждому устройству на шине Modbus необходимо присвоить уникальный адрес от 1 до 247. Адрес обычно устанавливается встроенными DIP-переключателями на плате датчика или с помощью утилиты от производителя.
  • Терминирование: На двух крайних концах линии RS-485 необходимо установить согласующие резисторы (терминаторы) номиналом 120 Ом. Это предотвращает искажения сигнала. Если на шине только контроллер и один датчик, терминаторы ставятся на обоих устройствах.
  • Схема подключения:
    // WIRING-SENS-011: Подключение Modbus-датчика CO2
    

    // Используется витая пара UTP Cat5e

    [Контроллер HI] (Датчик CO2, Modbus ID: 15)

    (Порт RS485-1)

    Клемма Цвет провода Клемма

    A --------(Зеленый)---------- A (D+)

    B ---------(Белый)----------- B (D-)

    GND -------(Черный)----------- GND

    +24V --------(Красный)---------- Vin

    Шаг 2. Настройка опроса датчика в Node-RED

    После завершения электромонтажа необходимо настроить программный опрос датчика, чтобы получить данные для логики сценария. Центральным элементом здесь служит узел `Modbus-Getter`.

    Порядок настройки:
  • Создайте конфигурацию Modbus-Client: В конфигурационных узлах Node-RED добавьте `modbus-client`. Укажите параметры порта RS-485 контроллера (например, Serial `/dev/ttyUSB0` или `/dev/ttyRS485-1`, скорость 9600, `8N1`).
  • Разместите `Modbus-Getter`: Этот узел будет выполнять роль мастера и запрашивать регистры.
  • Задайте параметры чтения:
  • * Unit-ID: Укажите Modbus-адрес датчика (например, `15`).

    * FC (Function Code): Выберите функцию чтения — `FC 3: Read Holding Registers` или `FC 4: Read Input Registers` (зависит от документации датчика).

    * Address: Укажите стартовый адрес регистра данных. Например, `2`.

    * Quantity: Укажите количество запрашиваемых 16-битных регистров.

  • Запустите цикл опроса: Подключите к входу `Modbus-Getter` узел `Inject`, настроенный на автоматический повтор (Repeat) каждые 15-30 секунд. Запрашивать CO₂ чаще обычно не имеет смысла из-за инерционности самого сенсора.
  • > 🛠 Практическое мини-задание: Чтение и парсинг данных

    > Цель: Получить из "сырых" Modbus-регистров готовый к использованию JSON-объект с показаниями CO2 и влажности.

    > Дано (по паспорту датчика): Адрес устройства — `15`. Значение CO₂ лежит в регистре `2`, а относительной влажности — в регистре `3` (влажность передается умноженной на 10). Функция — FC3.

    >

    > 1. В `Modbus-Getter` установите: `Unit-ID: 15`, `FC: 3`, `Address: 2`, `Quantity: 2`.

    > 2. Добавьте узел `function` сразу после Getter'а и вставьте следующий JS-код:

    >

    > // Getter возвращает массив из 2 считанных регистров: [регистр 2, регистр 3]

    > const co2_raw = msg.payload[0];

    > const hum_raw = msg.payload[1];

    >

    > // Формируем удобный объект и приводим влажность к нормальным процентам

    > msg.payload = {

    > co2: co2_raw,

    > humidity: hum_raw / 10

    > };

    > return msg;

    >

    > 3. Подключите вывод к узлу `debug`.

    > Ожидаемый результат в консоли Node-RED: Периодически появляющийся объект вида `{"co2": 850, "humidity": 45.2}`.

    Шаг 3. Подключение исполнительных механизмов

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

    Применяется для управления обычными бытовыми приточными клапанами, вытяжками в санузлах или односкоростными вентиляторами.

    Подключение:* Достаточно одного релейного выхода (Relay) на контроллере HI или модуле расширения.

    Программная логика:* Номинально отправляет булево значение `true` (замкнуть контакты, включить вентилятор) или `false` (разомкнуть контакты) в узел, привязанный к аппаратному реле.

    Используется в профессиональных вентустановках (например, с EC-двигателями или VAV-клапанами), чтобы система могла плавно увеличивать производительность без резких скачков шума.

    Подключение:* Требуется аналоговый выход `0-10V` (AO). Контроллер HI может быть оснащен соответствующим модулем.

    Программная логика:* Сценарий высчитывает требуемую интенсивность в рабочем диапазоне (например, от `0` до `10` вольт) и передает это число (Number) в узел управления аналоговым выходом. Таким образом, при росте CO₂ напряжение начнет плавно расти с 3В до 10В, равномерно разгоняя мотор.

    Базовая логика в Node-RED: Пороговое управление с гистерезисом

    азовая логика в Node-RED: Пороговое управление с гистерезисом

    Самый простой и надежный способ управления вентиляцией — пороговый. Алгоритм прост: если уровень CO₂ превысил порог — включаем вентиляцию, если опустился ниже другого порога — выключаем.

    > 💡 Что такое гистерезис?

    > Разница между порогом включения (например, 1000 ppm) и выключения (800 ppm) называется гистерезисом. Он нужен, чтобы защитить реле и двигатель вентилятора от «тактования» — постоянного включения/выключения из-за малейших колебаний показаний вокруг единственного порога (999–1001 ppm). Подробно мы разбирали этот паттерн в уроке `SCN-CLIMATE-001: Поддержание температуры (термостат с гистерезисом)`.

    Контракт данных и архитектура потока

    Предположим, наш Modbus-поллер опрашивает датчик и публикует данные в MQTT-топик `hi/office/room101/co2` в формате JSON.

    Контракт входящего сообщения:
    {
    

    "value": 1150,

    "unit": "ppm",

    "ts": 1678886400000,

    "source": "modbus-sensor-co2-room101"

    }

    Схема потока в Node-RED:
    // FLOW-CLIMATE-VENT-001: Базовое управление вентиляцией по CO2
    
    

    [Извлечь значение]

    [mqtt in] --------> [function] --------> [switch (Пороги CO2)]

    |

    |---> (Выход 1: > 1000) ---> [change (true)] ---\

    | |---> [rbe] ---> [mqtt out]

    |---> (Выход 2: < 800) ---> [change (false)] --/

    Пошаговая реализация

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

  • Получение данных (`mqtt in`):
  • Подписываемся на топик `hi/office/room101/co2`. Node-RED автоматически распарсит JSON, если в настройках узла MQTT выбран пункт "a parsed JSON object".

  • Извлечение значения (`function`):
  • На входе мы имеем сложный объект. Создаем узел `function`, который отбрасывает лишние метаданные и передает дальше только числовое значение CO₂.

        // Передаем в payload только число для удобства дальнейшей обработки

    msg.payload = msg.payload.value;

    return msg;

  • Логика гистерезиса (`switch`):
  • Это ядро сценария. Настраиваем узел `switch` для проверки текущего значения `msg.payload`:

    * Выход 1 (Порог включения): `is greater than` > `1000`

    * Выход 2 (Порог выключения): `is less than` < `800`

    Все значения между 800 и 1000 игнорируются узлом — поток просто останавливается, сохраняя текущее состояние системы.*

  • Формирование аппаратной команды (`change`):
  • * К выходу 1 узла `switch` подключаем узел `change`, который устанавливает `msg.payload` = `true` (сформирована команда "Включить").

    * К выходу 2 узла `switch` подключаем другой узел `change`, устанавливающий `msg.payload` = `false` (сформирована команда "Выключить").

  • Фильтрация дубликатов (`rbe`):
  • После узлов `change` объединяем оба потока в один и пропускаем через узел `rbe` (Report by Exception). Он будет пропускать сообщения только в том случае, если значение изменилось (с `false` на `true` или наоборот). Это ключевой элемент, предотвращающий отправку сотен избыточных команд «Включить», пока уровень CO₂ держится выше 1000.

  • Отправка команды на реле (`mqtt out`):
  • Узел `mqtt out` публикует итоговое значение в топик `hi/office/room101/fan/set`, на который уже подписан микроконтроллер или другой поток, замыкающий физическое реле вентилятора.

    Практическое мини-задание

    Чтобы убедиться в корректности логики без необходимости дуть на реальный датчик CO₂, проведите тест с помощью инъекций.

    Схема тестирования:
  • Добавьте четыре узла `inject` перед узлом `function` (или сразу перед `switch`). В каждом настройте отправку JSON формата `{"value": X}`, где X равно числам: `750`, `850`, `1050`, `1100`.
  • Подключите узел `debug` после узла `rbe`.
  • Нажимайте кнопки на узлах `inject` в следующем порядке и проверяйте результат (Тест-план):
  • * Нажимаем 850: Ничего не происходит (значение внутри «мёртвой зоны» гистерезиса).

    * Нажимаем 1100: В debug появляется `true` (превышен порог 1000 — вентиляция включилась).

    * Нажимаем 1050: Ничего не происходит (узел `rbe` заблокировал дубликат команды `true`).

    * Нажимаем 850: Ничего не происходит (вентилятор продолжает работать, пока не вытянет весь воздух).

    * Нажимаем 750: В debug появляется `false` (значение упало ниже 800 — вентиляция выключилась).

    Такая простая, но отказоустойчивая схема надежно покрывает 80% задач домашней вентиляции по требованию: когда люди в комнате — свежий воздух поступает; когда дома никого нет — вентиляция простаивает, сберегая ресурс мотора и электроэнергию.

    Расширенная логика: Пропорциональное управление скоростью

    асширенная логика: Пропорциональное управление скоростью

    Для систем с профессиональными вентустановками, поддерживающими регулировку скорости (через аналоговый вход 0-10В или ШИМ), доступна более комфортная логика — пропорциональное управление. Скорость вентилятора меняется плавно в зависимости от уровня загрязнения воздуха.

    > 💡 Подсказка: Для плавного управления скоростью используйте встроенный в Node-RED узел `range`. Он легко масштабирует диапазон CO₂ (например, 800-1500 ppm) в рабочий диапазон вентилятора (0-100%).

    Мы рассмотрим три варианта реализации: от простого ступенчатого переключения до кастомного скрипта со сглаживанием.

    Шаг 1. Многоскоростное управление (Ступенчатое)

    Промежуточный этап между простым ВКЛ/ВЫКЛ и плавной регулировкой — использование нескольких фиксированных скоростей. Этот вариант отлично подходит для большинства бытовых установок (например, рекуператоров с 3 скоростями).

    | Уровень CO₂ (ppm) | Состояние вентиляции | Действие узла Node-RED |

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

    | < 800 | Выключено (0%) | Отправить `0` |

    | 800 - 1000 | Низкая скорость (30%)| Отправить `30` |

    | 1001 - 1200 | Средняя скорость (60%)| Отправить `60` |

    | > 1200 | Высокая скорость (100%)| Отправить `100` |

    Как реализовать: Добавьте узел `switch` с четырьмя условиями-выходами. К каждому выходу подключите узел `change`, который задаст свой `msg.payload` (0, 30, 60 или 100) и передаст его на MQTT-топик вентилятора.

    Шаг 2. Плавное управление с узлом `range`

    Наиболее элегантный способ для "умных" вентиляторов — масштабирование одного диапазона значений в другой.

    Схема потока в Node-RED:
    // FLOW-CLIMATE-VENT-002: Пропорциональное управление вентиляцией
    
    

    [mqtt in]---->[function]---->[range]---->[smooth]---->[mqtt out]

    `co2` `Извлечь payload` `Масштаб` `Сглаживание` `fan/speed`

    Настройка узла `range`:
  • Action: `Scale` — масштабирование.
  • Input range: `800` to `1500` — наш "рабочий" диапазон CO₂.
  • Result range: `0` to `100` — целевой диапазон скорости в процентах.
  • Limit result to target range: Обязательно активируйте галочку.
  • Пример:* Если CO₂ упадет до `700` ppm (ниже диапазона), на выходе будет строго `0%`. Если взлетит до `1600` ppm, на выходе будет ровно `100%`.

    Если на вход узла придет `1150` ppm, он рассчитает пропорцию: `(1150 - 800) / (1500 - 800) * 100` ≈ `50%`.

    Шаг 3. Деликатная настройка с узлом `function`

    Если вам нужна более сложная логика (например, если двигатель вашей установки не может вращаться на скорости ниже 25% и останавливается), один узел `range` уже не справится. В этом случае задачу решает узел `function`.

    Пример скрипта для узла `function`:
    // Константы для настройки
    

    const MIN_CO2 = 800; // Уровень ниже которого вентиляция выключается (зона комфорта)

    const MAX_CO2 = 1500; // Уровень максимальной мощности

    const MIN_SPEED = 25; // Минимальная рабочая скорость (%), чтобы избежать остановки двигателя

    let co2 = msg.payload.value;

    let speed = 0;

    if (co2 <= MIN_CO2) {

    speed = 0; // Воздух чистый, выключаем полностью

    } else if (co2 >= MAX_CO2) {

    speed = 100; // Воздух плохой, полная мощность

    } else {

    // Вычисляем скорость внутри рабочего диапазона, учитывая MIN_SPEED

    let factor = (co2 - MIN_CO2) / (MAX_CO2 - MIN_CO2);

    speed = MIN_SPEED + factor * (100 - MIN_SPEED);

    }

    // Округляем до целого числа, так как оборудование обычно не принимает дробные скорости

    msg.payload = Math.round(speed);

    // Визуальный статус прямо под узлом в редакторе Node-RED

    node.status({ fill: "blue", shape: "dot", text: `CO2: ${co2}ppm -> Speed: ${msg.payload}%` });

    return msg;

    Этот подход позволяет учитывать аппаратные ограничения вентустановки.

    Шаг 4. Устранение резких скачков (Узел `smooth`)

    Если вы дыхнете прямо на датчик CO₂, показания моментально взлетят на сотни единиц, и вентилятор "взвоет". Чтобы этого избежать, всегда добавляйте узел `smooth` после вычислений.

    Настройки узла `smooth`:

    Он будет усреднять последние 5 значений скорости. Теперь вентилятор будет набирать и сбрасывать обороты плавно, обеспечивая максимальный акустический комфорт в помещении.

    🛠 Практическое мини-задание

    Задача: Переведите логику узла `range` на управление вытяжкой в ванной комнате по датчику влажности, учитывая, что вентилятор не умеет крутиться медленнее 30%. Ваши действия:
  • Добавьте в Flow узел `range`.
  • В поле Input range (Влажность) задайте: от `60` до `90`.
  • В поле Result range (Скорость вентилятора) задайте: от `30` до `100`.
  • Включите галочку `Limit result to target range`.
  • Ожидаемый результат (Тест-план):

    > ⚠️ Обратите внимание: Узел `range` с такими настройками выдаст _минимум_ 30% всегда, даже при влажности 10%! Чтобы вытяжка полностью останавливалась (0%) при влажности ниже 60%, вам потребуется усложнить Flow: добавить узел `switch`, который отсечет значения < 60 и заменит их на 0, ИЛИ использовать логику узла `function` (аналогично Шагу 3). Попробуйте реализовать оба варианта в качестве тренировки!

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

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

    Сценарий управления вентиляцией по уровню CO2 или влажности — ключевой элемент здорового микроклимата. В рамках этого урока мы настроили и протестировали базовый поток вычислений:

    `Датчик (Modbus/Zigbee)` → `Контроллер (Node-RED)` → `Исполнитель (Реле или аналоговый выход 0-10V)`

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

    Чек-лист корректной настройки оборудования

    Ошибки на физическом уровне (неверный монтаж) невозможно полностью компенсировать программно.

    * Да: Высота 1.5–1.7 метра от пола (соответствует уровню дыхания человека); внутренние стены помещения.

    * Нет: Рядом с окнами, дверьми, приточными решетками (из-за сквозняков датчик покажет заниженный уровень CO2); под прямым солнцем или над радиаторами (искажение температуры).

    * Жилые комнаты (спальни, детские): Оптимальный порог старта вентиляции — 800–1000 ppm.

    * Кабинеты, гостиные, офисы: Стартовый порог можно поднять до 1000–1200 ppm (людей больше, а требования к тишине днем ниже).

    UX-совет:* Выведите уставки в интерфейс пользователя (например, в дашборд Home Assistant) в виде ползунков (Input Number). Не "зашивайте" эти цифры жестко в код.

    Интеграция с экосистемой и UX (Override-сценарии)

    Вентиляция не должна работать в вакууме. Привяжите её к общим режимам умного дома:

    Практическое задание и план тестирования

    Чтобы гарантировать отказоустойчивость настроенной логики, выполните небольшое задание и проверьте систему по тест-плану.

    > 💡 Мини-задание: Добавьте в ваш сценарий Node-RED блокировку вентиляции по открытию окна.

    > Ожидаемый результат: Добавьте узел, который проверяет статус геркона (датчика открытия окна) в комнате. Если окно находится в статусе `open`, скорость приточного вентилятора принудительно устанавливается на 0%, независимо от уровня CO2 (так как проветривание уже идет естественным путем).

    Как протестировать итоговый сценарий:
  • Тест отклика датчика: Подышите прямо на корпус датчика CO2 с расстояния 5-10 см в течение 10–15 секунд.
  • Ожидание:* Уровень CO2 на контроллере резко поднимется выше 1200 ppm. Реле вытяжки должно замкнуться, либо напряжение на аналоговом выходе (0-10V) должно пропорционально вырасти.

  • Тест гистерезиса: После включения вентилятора отойдите от датчика и откройте окно, быстро проветрив комнату.
  • Ожидание:* Вентилятор не должен выключаться сразу при пересечении верхней границы установки (например, 1000 ppm) в обратную сторону. Он должен доработать до нижней границы (например, 800 ppm), предотвращая частые "щелчки" реле.

  • Тест ручного управления: Включите вытяжку с ручного выключателя или из интерфейса. Дождитесь падения CO2 до нормы.
  • Ожидание:* Вытяжка продолжит работать, так как приоритет находится у ручного управления (override-режим работает корректно).

    Что дальше

    Освоив локальное управление (климат по отдельному параметру), вы готовы к созданию масштабных микроклиматических систем.

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