Статья

Drivent и PID регулирование - не наш метод. Собственная логика регулировки CO2 в спальне с помощью оконного привода

О влиянии высокой концентрации углекислого газа (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 протокол никто не взломал и у меня не вышло 

А летом кондей. Сейчас у нас «портативный» монстр, но в следующие сезоне нам разрешили поставить сплит-систему 



https://sprut.ai/static/media/cache/00/41/62/5/10823846/83716/1000x_image.jpeg?1638137420" alt="1000x_image.jpeg?1638137420" />

Промежуточные положения не используется—открыто/закрыто. Опустилось до 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" />



Вернуться назад
Вернуться назад