SCN-CLIMATE-004: Управление вентиляцией по датчику CO2/влажности
Введение: Качество воздуха и цели автоматизации
ведение: Качество воздуха и цели автоматизации
Современные энергоэффективные дома хорошо сохраняют тепло, но из-за своей герметичности практически лишены естественного воздухообмена. Без контроля в таких помещениях быстро падает качество воздуха (IAQ — Indoor Air Quality). Урок COURSE-07-M06-L01 посвящен созданию сценария, который включает вентиляцию только по реальной потребности, решая проблему духоты и одновременно экономя энергоресурсы. Данный материал является логическим продолжением тем фильтрации сигналов и комплексного управления климатом.
Главные метрики микроклимата
Качество воздуха и необходимость проветривания зависят от трех базовых параметров:
Концентрация диоксида углерода (CO₂): Продукт человеческого дыхания и главный индикатор присутствия людей. Нормальным считается уровень до 800–1000 ppm (частей на миллион). Пример: в спальне с закрытым окном уровень CO₂ за ночь часто превышает 2000 ppm, что вызывает утреннюю головную боль.*- Относительная влажность (RH): Комфортный диапазон — 40–60%. Слишком сухой воздух (менее 30%) сушит слизистые. Избыточная влажность (более 60%) создает условия для роста плесени.
- Летучие органические соединения (VOC): Выделяются мебелью, отделочными материалами, бытовой химией.
Проблема классического подхода
Традиционные подходы к вентиляции — это ручное управление, работа по таймеру или постоянная фоновая работа на низкой скорости.
> ⚠️ В чем их неэффективность? Вентиляция по расписанию может работать вхолостую в пустом помещении или не справляться при наплыве гостей. При этом шум от работы вентиляторов может мешать отдыху, даже если уровень CO₂ требует коррекции.
Цели нашего сценария:Архитектура умной вентиляции
На платформе HI решение строится по трехуровневой модели, обеспечивающей передачу данных от помещения к оборудованию:
Мини-практикум: аудит вашей системы
> 💡 Мини-задание
> Перед тем как перейти к сборке логики в 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:// 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`.
Порядок настройки:* Unit-ID: Укажите Modbus-адрес датчика (например, `15`).
* FC (Function Code): Выберите функцию чтения — `FC 3: Read Holding Registers` или `FC 4: Read Input Registers` (зависит от документации датчика).
* Address: Укажите стартовый адрес регистра данных. Например, `2`.
* Quantity: Укажите количество запрашиваемых 16-битных регистров.
> 🛠 Практическое мини-задание: Чтение и парсинг данных
> Цель: Получить из "сырых" 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` (разомкнуть контакты) в узел, привязанный к аппаратному реле.
- Пропорциональное управление (Плавная регулировка 0-10В):
Подключение:* Требуется аналоговый выход `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)] --/
Пошаговая реализация
Переход от получения данных к фактической отправке команды разбит на логические шаги:
Подписываемся на топик `hi/office/room101/co2`. Node-RED автоматически распарсит JSON, если в настройках узла MQTT выбран пункт "a parsed JSON object".
На входе мы имеем сложный объект. Создаем узел `function`, который отбрасывает лишние метаданные и передает дальше только числовое значение CO₂.
// Передаем в payload только число для удобства дальнейшей обработки
msg.payload = msg.payload.value;
return msg;
Это ядро сценария. Настраиваем узел `switch` для проверки текущего значения `msg.payload`:
* Выход 1 (Порог включения): `is greater than` > `1000`
* Выход 2 (Порог выключения): `is less than` < `800`
Все значения между 800 и 1000 игнорируются узлом — поток просто останавливается, сохраняя текущее состояние системы.*
* К выходу 1 узла `switch` подключаем узел `change`, который устанавливает `msg.payload` = `true` (сформирована команда "Включить").
* К выходу 2 узла `switch` подключаем другой узел `change`, устанавливающий `msg.payload` = `false` (сформирована команда "Выключить").
После узлов `change` объединяем оба потока в один и пропускаем через узел `rbe` (Report by Exception). Он будет пропускать сообщения только в том случае, если значение изменилось (с `false` на `true` или наоборот). Это ключевой элемент, предотвращающий отправку сотен избыточных команд «Включить», пока уровень CO₂ держится выше 1000.
Узел `mqtt out` публикует итоговое значение в топик `hi/office/room101/fan/set`, на который уже подписан микроконтроллер или другой поток, замыкающий физическое реле вентилятора.
Практическое мини-задание
Чтобы убедиться в корректности логики без необходимости дуть на реальный датчик CO₂, проведите тест с помощью инъекций.
Схема тестирования:* Нажимаем 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`:
Пример:* Если 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`:- Action: `average` (скользящее среднее).
- over the last: `5` values.
Он будет усреднять последние 5 значений скорости. Теперь вентилятор будет набирать и сбрасывать обороты плавно, обеспечивая максимальный акустический комфорт в помещении.
🛠 Практическое мини-задание
Задача: Переведите логику узла `range` на управление вытяжкой в ванной комнате по датчику влажности, учитывая, что вентилятор не умеет крутиться медленнее 30%. Ваши действия:- При влажности `80%` на выходе появится примерно `76%` скорости.
- При влажности `95%` на выходе будет `100%`.
- При влажности `50%` на выходе будет... `30%`.
> ⚠️ Обратите внимание: Узел `range` с такими настройками выдаст _минимум_ 30% всегда, даже при влажности 10%! Чтобы вытяжка полностью останавливалась (0%) при влажности ниже 60%, вам потребуется усложнить Flow: добавить узел `switch`, который отсечет значения < 60 и заменит их на 0, ИЛИ использовать логику узла `function` (аналогично Шагу 3). Попробуйте реализовать оба варианта в качестве тренировки!
Итоги и лучшие практики
тоги и лучшие практики
Сценарий управления вентиляцией по уровню CO2 или влажности — ключевой элемент здорового микроклимата. В рамках этого урока мы настроили и протестировали базовый поток вычислений:
`Датчик (Modbus/Zigbee)` → `Контроллер (Node-RED)` → `Исполнитель (Реле или аналоговый выход 0-10V)`
Эта цепочка обеспечивает надежный сбор метрик и предсказуемое поведение климатической техники. Чтобы система работала незаметно для пользователя, необходимо соблюдать ряд инженерных и логических правил.
Чек-лист корректной настройки оборудования
Ошибки на физическом уровне (неверный монтаж) невозможно полностью компенсировать программно.
- Размещение датчиков:
* Нет: Рядом с окнами, дверьми, приточными решетками (из-за сквозняков датчик покажет заниженный уровень CO2); под прямым солнцем или над радиаторами (искажение температуры).
- Базовые уставки (пороги срабатывания):
* Кабинеты, гостиные, офисы: Стартовый порог можно поднять до 1000–1200 ppm (людей больше, а требования к тишине днем ниже).
UX-совет:* Выведите уставки в интерфейс пользователя (например, в дашборд Home Assistant) в виде ползунков (Input Number). Не "зашивайте" эти цифры жестко в код.
Интеграция с экосистемой и UX (Override-сценарии)
Вентиляция не должна работать в вакууме. Привяжите её к общим режимам умного дома:
- Энергосбережение (Связь с отоплением): Если вентиляция работает на 100% мощности (интенсивное проветривание), сценарий должен временно закрывать термостаты на радиаторах в этом же помещении, чтобы не "отапливать улицу".
- Режим "Никого нет" (`away`): Если датчики присутствия фиксируют пустой дом, переводите вентиляцию в дежурный режим (например, работа на 10% мощности или включение на 15 минут раз в 4 часа), игнорируя мелкие скачки CO2.
- Режим "Ночь" / "Сон": Для спален добавьте программное ограничение максимальной скорости вентилятора. Даже если CO2 поднимется до 1500 ppm, ночью вентилятор не должен раскручиваться выше 30-40%, чтобы не разбудить жильцов шумом мотора.
- Ручной перехват (Manual Override): Если пользователь включил вытяжку с физического настенного выключателя, автоматика должна "уступить". Настройте таймер: ручное включение блокирует автоматику по CO2 на 1–2 часа, после чего сценарий возвращается в штатный автоматический режим.
Практическое задание и план тестирования
Чтобы гарантировать отказоустойчивость настроенной логики, выполните небольшое задание и проверьте систему по тест-плану.
> 💡 Мини-задание: Добавьте в ваш сценарий Node-RED блокировку вентиляции по открытию окна.
> Ожидаемый результат: Добавьте узел, который проверяет статус геркона (датчика открытия окна) в комнате. Если окно находится в статусе `open`, скорость приточного вентилятора принудительно устанавливается на 0%, независимо от уровня CO2 (так как проветривание уже идет естественным путем).
Как протестировать итоговый сценарий:Ожидание:* Уровень CO2 на контроллере резко поднимется выше 1200 ppm. Реле вытяжки должно замкнуться, либо напряжение на аналоговом выходе (0-10V) должно пропорционально вырасти.
Ожидание:* Вентилятор не должен выключаться сразу при пересечении верхней границы установки (например, 1000 ppm) в обратную сторону. Он должен доработать до нижней границы (например, 800 ppm), предотвращая частые "щелчки" реле.
Ожидание:* Вытяжка продолжит работать, так как приоритет находится у ручного управления (override-режим работает корректно).
Что дальше
Освоив локальное управление (климат по отдельному параметру), вы готовы к созданию масштабных микроклиматических систем.
В следующем уроке мы разберем, как спроектировать комплексный климат-контроль. Вы узнаете, как объединить радиаторы отопления, сплит-системы (кондиционеры), теплые полы и вентиляцию в единый согласованный механизм, где устройства работают сообща, не перетягивают на себя энергоресурсы и подчиняются глобальным температурным уставкам помещения.