Эта заметка является продолжением серии моих изысканий на тему адекватного отопления дома только теплыми полами.
Введение в проблему:
Обычные комнатные термостаты работают по гистерезису. допустим уставка в комнате составляет 23 градуса, а гистерезис - 0.25 градуса. это значит что если температура растёт то пока он не дойдет до 23.25 градусов теплый пол будет работать. а если она падает то пока она не упадет до 22.75 -теплый пол не включится.
Классический теплый пол делается в стяке 6-8 и имеет довольно сильную инерционность.
Т.е. пока температура в помещении достигнет 23.25 градусов. сама стяжка может нагреться до 28 градусов(например).и далее при отключении пола температура в помещении продолжит расти иногда такие вылеты достигают 2-3 градуса (и более бывают). пока температура воздуха упадет до 22.75 пол может остыть до 20 градусов(пол у нас находится внизу - и поэтому остывает быстрее всех частей помещения).
следующий цикл нагрева пола - пока теплоноситель разгонит стяжку, пока стяжка отдаст энергию в воздух. температура в помещении может сильно упасть.
Важную роль в этом процессе играет теплопроводность покрытия пола(кафель передает хорошо. ламинат сильно хуже. у меня ламинат)
у меня есть исследование на тему изменения температуры на поверхности стяжки, температуры поверхности ламината и воздуха на высотах: 70,120, 170, 270 см, но я так и не добрался опубликовать результаты - возможно как-нибудь позже.
Зачем при комнатных термостатах нужна погодозависимая автоматика?
Если установить температу теплоносителя 45 градусов. то энертность системы вода-стяжка-воздух позволяет нагреть стяжку до 38 градусов. и если в это время дом не треяет много тепла это неизбежно приведет к перегреву воздуха. немного на эту тему я писал тут: https://connect.smartliving.ru/profile/3802/blog40...
Уменьшение температуры теплоносителя в более теплую погоду позволяет уменьшить температурный градиент "пол-воздух" тем самым снизить отклонение темперутары воздуха.
Необходимость пид регулирования
Опыт эксплуатации показал что при использовании погодозависимой автоматики и термостатов с обычной логикой (уставка +/-0,25) удается достичь точности +/- 1-1,5 градуса от уставки. В целом адекватно. если два недостатка:
Зимой я делал закуп оборудования отопления для своего директора и оказалось, что watts делают термостаты с возможность пид-регулирования -насколько адекватно они это делают сказать не могу. систему еще не работает на реальном обьекте. но на столе она у меня полежала пощелками. судя по моим наблюдениям там используется так называемый длинный пид, т.е. датчики лежа у меня на столе при установке температуры близкой к текущей в комнате переходили в режим(приблизительно) 5 минут -работаю .5 минут не работаю. если температура шла вниз т.е 5 минут работаю, 10 минут не работаю. возможно кванты времени могли быть и 6,7 минут. но было похоже на то что всё кратно 5 минутам. Поигравшись с этой системой я наконец добрался сделать систему у себя.
Что имеется:
Сервер Мажордомо. и несколько простых устройств типа: Термостат
Термодатчики от xiaomi расположенные в каждой комнате (WSDCGQ11LM и аналоги).
важной особенностью этих датчиков является тот факт, что мы не можем спросить у датчика текущее значение.
датчик сам передает показания когда измения будут существенными, либо в любом случае в течении 1 часа. существенными изменения датчик считает изменение более чем на 0.2 градуса.
по факту ситуация лучше чем кажется на первый взгляд:
Большинство изменений температуры укладывается в 0,2 градуса.а среднее частота обновлений в районе 30 минут
это накладывает определенные головняки в работу PID-регулятора.
Реализация:
В связи с тем что данные с датчиков приходят непериодически, нужно установить квант времени досточно большой для срабатывания термоголовки, но при этом достаточно маленький чтобы иметь возможность небольшой мощности.
я выбрал величину в 6 минут. 10% от часа - 10% мощности. квант изменения мощности -10%
в Класс термомостат добавлено свойство data. а свойство threshold везде установлено в 1 градус.
раз в 6 минут вызывается скрипт.
Его логика такова:
Kp=10, т.к. квант 10% то при отклонении в 1 градус усиление =100%
Ki=5, т.к. квант времени равен 5 минутам, то интегральная составляющая соотвествует 30 минутам.
Для каждого термостата можно задать свои значения. на Ваше усмотрение.
6.Система смотрит какая сейчас необходима мощность, если она больше уже запущеной в систему мощности за последний час, то выключает отопление.
если меньше то включает отопление.
SumDt - необходимая мощность
я ограничил минимальную мощность -10% для того чтобы пол полностью не остывал. и максимальную мощность в 101%.
//Достаем из базы все термостаты (в моем случае класс называется SPWMThermostats- просто я изначально задумывал новый класс сделатью. в итоге он не нужен
$objects=getObjectsByClass("SPWMThermostats");
echo "<pre>";
foreach($objects as $obj) {
$obj=getObject($obj['TITLE']);
$value=$obj->getProperty('value');
$currentTargetValue=$obj->getProperty('currentTargetValue ');
$delta=abs($value-$currentTargetValue);
//если дельта больше 1 градуса пропускаем
if($delta>=1) continue;
echo $value." ->".$currentTargetValue;
//достаем из таблицы данные для pid
$data=json_decode($obj->getProperty('data'),true);
//если данных нет создаем данные по умолчанию
if(!is_array($data))
{
$data['E1']=0; $data['E2']=0;
$data['Kp']=10; $data['Ki']=5;
$data['SumDt']=1; $data['i']=0;
$data['statuses']=array_fill(0,10,0);
$data['status']=0;
}
//$oldStatus= $data['status'];
echo "<pre>";
print_r($data);
$data['E2']=$data['E1'];
$data['E1']=round($currentTargetValue-$value,2);
$dt = round ($data['Kp']*($data['E1']-$data['E2']+$data['E2']/ $data['Ki']),2);
$oldSumdt=$data['SumDt'];
//echo "dt=".$data['Kp']."*(".$data['E1']."-".$data['E2']."+".$data['E2']."/". $data['Ki'].")";
//var_dump($dt);
$data['SumDt']=$data['SumDt']+$dt;
if($data['SumDt']<1)$data['SumDt']=1;
if($data['SumDt']>10)$data['SumDt']=10.1;
//if(($data['SumDt']- $oldSumdt)>0)$data['status']=1;
$data['statuses'][$data['i']]=0;
echo $data['pow']=array_sum($data['statuses']);
if($data['pow']<floor($data['SumDt']))$data['status']=1;
else $data['status']=0;
$data['statuses'][$data['i']]=$data['status'];
$data['i']=(($data['i']+1)%10);
print_r($data);
$obj->setProperty('data',json_encode($data));
if($data['status'])$obj->callMethod('turnOn');else $obj->callMethod('turnOff');
}
Таким образом система отопления стала качественно другой:
Система имеет свои минусы:
Новосибирск, Россия
На форуме: stellhawk