О влиянии высокой концентрации углекислого газа (CO2) в помещении, я писал в цикле статей про климат. А так как у меня умный дом, то и за микроклиматом у себя в квартире я следил довольно пристально. И мне надоело постоянно проветривать спальню перед сном, или держать окно открытым в режиме микропроветривания (особенно зимой). Причем я даже пытался обойтись "малой кровью" и проводил эксперименты с клапаном для проветривания, но это не особо помогало. Поэтому я решил вопрос кардинально, благо у меня в руках оказался привод для открытия окна Drivent.Итак, исходное состояние:
- датчик CO2 Senseair S8;
- датчик температуры BME280;
- привод окна Drivent.
Датчики работают под управлением ESPEasy на nodeMCU v.3. Место замера - недалеко от изголовья кровати, дабы замерять фактическое состояние именно там, где необходимо.Привод установлен на окне в спальне и регулировка осуществляется по показаниям уровня CO2. На начальном этапе, контроля температуры не было, так как было не до того.Первоначально была попытка использовать алгоритм ПИД регулирования. Она привела к состояниям постоянного перерегулирования системы, которая не достигала состояния покоя ни по показателям CO2, ни по состоянию привода (он постоянно туда-сюда двигался). Поверьте мне, я даже математическую модель считал... Но при пропорциональном коэффициенте равном единице, без использования других параметров (а так советуют все статьи по первоначальной настройке регулятора) - система не достигала покоя никогда. Смена временных интервалов с увеличением до нескольких часов и т.д. и т.п. - не помогала.
Я занимался мучением привода почти месяц (хороший такой краш тест устроил), так же, как и настройкой ПИД компонента в Node Red. Кроме того, что система постоянно подвергалась регулировке, меня не устраивало много других факторов. Во-первых, система не приходила в покой вообще никогда, по причине постоянно меняющейся внешней среды. CO2 оставался в желаемом коридоре - это факт, но достигалось это постоянной работой привода на открытие и закрытие окна.К тому же у ПИД регулятора не было нужных мне настроек, например, с добавлением пороговых показателей и коридора значений.В итоге мне это надоело, и я решил, что надо разработать собственную логику, которая не дергала бы привод все время, но давала необходимый результат.Еще одной предпосылкой к разработке собственного решения меня привел тот факт, что во время вынужденного простоя привода (я его отключил по определенным причинам), окно было открыто где-то на 15% постоянно. И это привело к довольно ожидаемому результату, который, в общем-то, и был целевым. Постоянное нормальное состояние уровня CO2 в комнате.
Это, по-сути и стало последней каплей в этой битве с ПИД регулировкой и сподвигло меня "запилить" свою логику.Так как я далеко не программист, то мне помог наш прекрасный чатик по Node Red, а благодаря абсолютно неоценимой помощи Андрея Ошева, все это превратилось в рабочую модель, которая сейчас проходит обкатку и мне нравится результат.
Логика работы
Так как инертность системы небольшая, то есть реакция наступает практически сразу после оказанного воздействия, опрос датчика CO2 производится с периодичностью раз в 10 секунд. Это избыточно, но мне хотелось наблюдать над раскачкой системы, если она произойдет.
Опять же, так как система реагирует быстро, то показания могут гулять вверх и вниз довольно оперативно, и основная проблема регулирования заключается в том, что если мы берем просто определенный период времени, то мы можем случайным образом попасть на снижение, повышение или горизонталь значений CO2. Соответственно, принятие решения о том, открывать окно, дабы снизить CO2 или прикрыть, так как все ок - будет делаться каждый раз, когда будут поступать показания и привод будет дергаться туда-сюда постоянно. Правда через заданные промежутки времени, но все равно часто. Это и есть основная проблема PID регулирования. На каждый входящий параметр осуществляется действие. Меня это не устраивало. Поэтому я решил, что надо отслеживать тенденцию показаний уровня углекислого газа, и в зависимости от нее принимать решение. Поэтому мы будем действовать в несколько этапов.
Первое действие, которое производится с показаниями - сборка массива из 20 последовательных данных. Это требуется для того, чтобы понять, что происходит с уровнем CO2 и что нам нужно сделать в дальнейшем.
Эти 20 параметров анализируются следующим образом:
- каждый элемент массива сравнивается с предыдущим, путем вычитания (из значения под номером 2 вычитается значение 1, из 3 вычитается 2 и так далее);
- подсчитывается количество отрицательных, положительных и нулевых значений;
- сравнивается их количество, и в зависимости от того, каких больше, выдается результат;
- дополнительно из всех 20 значений вычисляется среднее, чтобы использовать его как текущее показание CO2 в дальнейшем.
Это позволяет понять, повышается или понижается уровень CO2. Также есть еще и стабильные показания, когда в течение долгого времени уровень не меняется или меняется незначительно. Поэтому на выходе мы получаем понимание того, что происходит: повышение, понижение или покой.
Следующим этапом мы настраиваем параметры комфортной среды и пограничных условий работы системы.
В качестве исходных данных берутся следующие значения:
- текущее положение окна;
- скорость ветра;
- минимально допустимая температура в помещении;
- текущая температура в помещении;
- состояние регулирования окна (включено оно или нет);
- состояние показаний CO2 из предыдущего шага (повышение, снижение или покой);
- следующий уровень открытия окна;
- шаг регулирования окна;
- верхний и нижний пределы для окна (обычно от 0 до 100%);
- собственно, само показание CO2 усредненное в прошлом шаге.
А теперь немного пояснений на тему того, зачем все это. Положения окна - понятно: текущее, предыдущее и следующее, нужны для управления приводом.
От скорости ветра зависит шаг регулировки, так как в моих условиях - чем выше ветер, тем быстрее снижается уровень углекислого газа, а значит, тем меньше надо открывать окно за один проход.
Состояние регулировки проверяется для того, чтобы я имел возможность просто открыть окно на нужный мне процент вручную и система не занималась регулировкой, пока я не позволю.
Что касается температуры в помещении, то на личном опыте я понял, что мне комфортно спать при температуре не ниже определенного порога. Соответственно, я не хочу, чтобы она опускалась ниже. Поэтому если уровень CO2 позволяет мне подержать окно закрытым, чтобы воздух нагрелся, то окно закрывается и ждет либо достижения максимума содержания газа в воздухе, либо его нагрева до приемлемых значений, чтобы продолжать работать системе для проветривания.
Состояние показаний CO2 из предыдущего шага используется для того, чтобы понять, в какую сторону воздействовать на привод: открывать, закрывать или ничего не делать.
Соответственно, со всеми этими пороговыми значениями мы работаем следующим образом (блок схему я начал рисовать, но как-то ниасилил):
- если CO2 больше 800, но состояние "покой", то меняем состояние на "повышение" (открывает окно на следующий шаг), чтобы не зависало на повышенных показаниях;
- если CO2 находится между 600 и 700, то в любом случае объявляется состояние покоя (это целевой коридор показаний);
- если CO2 меньше 600 и состояние "покой", то меняем состояние на "понижение" (прикрывает окно на следующий шаг);
- если CO2 больше 800 или меньше 500, то шаг изменения открытия окна устанавливается в 5%;
- если CO2 находится в промежутке от 500 до 800, то шаг изменения открытия окна устанавливается в 2%;
- если скорость ветра больше 7 м/с, то шаг изменения открытия окна делится на 2, с округлением до целого значения;
- если состояние открытия окна - "повышение", то к текущему состоянию прибавляется шаг. Если состояние - "понижение", то от текущего состояния отнимается шаг. Если система в покое, то ничего не происходит;
- если температура в комнате ниже лимита или равна ему, а CO2 меньше 1000ppm, то окно закрывается полностью и дальше начинает по предыдущим условиям открываться понемногу, опять же при условии, что температура выше допустимой.
Вот в общем-то и вся логика.
Все это приводит к довольно спокойной и неслышной работе привода в течение суток, и не позволяет даже при холодном внешнем воздухе довести температуру в комнате до не комфортной. Хотя я предполагаю, что при отрицательных температурах на улице, в комнате все-таки будет холоднее, чем хочется. Но это будем регулировать уже следующей зимой.
В итоге, все это меня радует уже скоро неделю, и меня устраивает почти все.
Выглядит ситуация сейчас примерно таким образом:
Регулировка осуществляется плавно, пограничные параметры не нарушаются, хотя замеры немного нетипичны и уровень СО2 довольно высокий, в сравнении с обычным состоянием, но я грешу на тепло и то, что в моем вентиляционном стояке все дружно решили проветрить квартиры, поэтому тяги почти нет и сквозняк практически не ощущается. Но даже в таких, довольно тяжелых условиях, система работает стабильно и без особых раскачек.
Ну и напоследок - флоу для Node Red, в котором это все расписано (перед импортом флоу в свой нодеред, его надо прогнать через HTML декодер, чтобы заменить HTML вставки). Там, в принципе, все довольно понятно, правда для использования потребуется много телодвижений по формированию глобальных переменных, которые у меня собираются в разных местах (потому в общем-то и глобальные).Ну а вся боль и страдания от моих мучений, освещалась в официальном чате Drivent, где коллективно обсуждались варианты решения тех или иных проблем.
Можно попробовать подогревать воздух кондиционером при допустимой температуре работы внешнего блока
для этого надо иметь кондиционер :) к тому же есть обратный вариант... лето, кондиционер и открытое окно - несовместимы... так что тут тоже надо думать, но это просто уже дополнительные переменные.... может я все таки соберусь поставить себе кондей наконец. Особенно если Haier засветит бюджетную управляемую модель, как рассказывал Олег на вчерашнем стриме
отопление чаще всего центральное и очень часто нерегулируемое. В этом случае бессмысленно. К тому же отключать отопление и открывать окно с минусовым воздухом - чревато разморозкой системы. Я как то раз устроил по молодости такое.
А вот открывать окно при работающем кондиционере - свихнет ему мозги и смысла никакого кроме бесполезной траты ресурсов :)
По моему это все мифы и приквеличения. Полчасика приоткрытой форточки ничего не сломает, ни кондей, ни батареи. Проблема скорее в том, что можно забыть так на сутки
Сам привод не совсем конечно для спальни. Посмотрел видео, привод изрядно жужжит. В ночи все слышнее.
Было бы здорово на каких-нибудь бесшумных движках. У меня терморегуляторы на 220В, даже припав ухом не слышно как шток толкают.
с определенными настройками он практически бесшумен. Жужжит он при стандартных параметрах напряжения, но если выставить 24В питания и 6В самому мотору, то он очень тихий
терморегуляторы только открытие и закрытие без промежуточных ?
Да, там или открыто или закрыто. В зависимости от выставленного температурного коридора sonoff basic открывает или закрывает. Все просто и совсем бесшумно.
сонофф бесшумный ? да лаааадно :)))) хотя я полагаю он не в спальне стоит конечно. Но два положения это два положения... можно конечно гистерезис замутить, но инертность системы большая да... в общем окном получается точнее рулить показаниями. Но это не про отопление. Бесшумных оконных приводов я не встречал, но вот бризеры вполне себе бесшумные. И мы сегодня описанную в статье логику прикрутили к 150й модели бризера Xiaomi. Так что посмотрим на результат.
Бесшумный! Чтоб мне провалиться ) Просто он стоит под подоконником в метрах 4-х от кровати. У меня чуткий сон, но я его за зиму не слышал ни разу. А всякое жужжанье услышу мгновенно.
Гистерезисы мутить бессмысленно. Я изучал графики, после этого принял решение так и оставить. Оговорюсь - вариант не для экономии, потому что даже в лютую зиму у меня окно в откидном положении всю ночь. Привычка. Зато сплю как танк )
Температурный коридор: включение меньше 18 градусов, выключение - больше 19. В среднем за ночь цикла 3-4. Остывают очень медленно, нагреваются мгновенно, а потом идет набор 1-2 градусов за час-полтора. Так как зима была теплая, большей частью система находилась в покое.
Но если рулить еще и окном, тут уж сразу, ясное дело, появляется существенная экономия средств.
Норм
Норм
Вроде оставлял комментарий, пропал куда-то. А не слишком ли жарко в спальне? По западным исследованиям лучшая температура для крепкого сна 16-20 градусов Цельсия.
с учетом обдувающего ветерка - норм :)))) комфортная 18, это если спишь под одеялом... а я не люблю кутаться :))) так что мне комфортно 22.2, хотя я экспериментировал и с более низкими температурами, но на фоне легкого прохладного бриза - 22.2 мой уровень комфорта
Я просто гистерезис сделал…
Теперь усложняю систему выводя много новых входных переменных кроме СО2: температура снаружи и внутри, сила и направление ветра, присутствие в комнате,
Совместно с окном работает очиститель воздуха, потому что соседи черти регулярно смолят и просто так открывать окно нельзя
Поэтому добавляется ещё:
- загрязнение воздуха, ночь/день (очиститель может сильно шуметь), влажность
Хата съёмная, бризер поставить не вышло
зимой включается увлажнитель, а батареи у нас выкручены в минимум, на 2 этаже они и так греют чисто пластиковыми трубами :) Увлажнитель никак на управляется, всегда включён, boneco, Bluetooth протокол никто не взломал и у меня не вышло
А летом кондей. Сейчас у нас «портативный» монстр, но в следующие сезоне нам разрешили поставить сплит-систему
Промежуточные положения не используется—открыто/закрыто. Опустилось до 500, закрыли поднялось до 600 открыли
Когда никого нет закрыто, когда подходим к дому, открывается и крутит пропеллерами а робот пылесос прячется в норку
Но потенциал улучшений ещё бесконечный. Большинство перечисленных параметров ещё не принимается в расчёт
но самое грустное, что СО2 опускается медленно, движения воздуха не ощущается, но девушку продувает
движений мало, коридор более менее выдерживается. Поавда датчик у меня не sensair а mh19zb или как там его, к его показаниям есть подозрения
https://sprut.ai/static/media/cache/00/41/62/5/10823900/83719/1000x_image.png?1638138065" alt="1000x_image.png?1638138065" />https://sprut.ai/static/media/cache/00/41/62/5/10823900/83720/1000x_image.png?1638138065" alt="1000x_image.png?1638138065" />