Управление отоплением или теплыми полами
Модератор: immortal
-
- Сообщения: 31
- Зарегистрирован: Пн апр 18, 2016 6:01 pm
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
Управление отоплением или теплыми полами
Здравствуйте. Подскажите как реализовать управление отоплением по слайдеру с возможностью установки гистерезиса в десятичные градуса. Majordomo получает данные о температуре с DS18B20 по ESP8266. Сделан слайдер в меню управления с шагом 0.1 градуса. Эти данные со слайдера записываются в переменную Set_temp. Делаю условия на включение и выключение реле. Но там только можно устанавливать целые значения. Как же реализовать управление гистерезисом в десятичных значениях?
-
- Сообщения: 100
- Зарегистрирован: Вт ноя 11, 2014 5:16 pm
- Откуда: Шатура
- Благодарил (а): 4 раза
- Поблагодарили: 8 раз
Re: Управление отоплением или теплыми полами
а почему только целыми?
СпойлерПоказать
Код: Выделить всё
//say ($x);
// получить тек. температуру,заданную и линк на реле
$x = $this->getProperty('Temperature');
//say ($x);
if (!$x) return;
//-----------------------------------------------------------------------------------------
// не больше и не меньше
if ($x<12) {$x=12;} elseif ($x>30) {$x=30;}
// расчет величины цветовой шкалы
$x = round( ($x-12)*42,5 );
$hcolor = '#';
// расчет r
$y = $x-255;
if ($y < 0) {$y = 0;} elseif ($y > 255) {$y = 255;}
$y = dechex($y);
if (strlen($y) == 1) {$y = '0'.$y;}
$hcolor = $hcolor.$y;
// расчет g
$y = 255-$x;
if ($y < 0) {$y = 0;} elseif ($y > 255) {$y = 255;}
$y = dechex($y);
if (strlen($y) == 1) {$y = '0'.$y;}
$hcolor = $hcolor.$y;
// расчет b
$y = 765-$x;
if ($y < 0) {$y = 0;} elseif ($y > 255) {$y = 255;}
$y = dechex($y);
if (strlen($y) == 1) {$y = '0'.$y;}
$hcolor = $hcolor.$y;
// установить свойство цвета температуры
$this->setProperty('TempHEX', $hcolor);
//----------------------------------------------------------------------------------------
$x = $this->getProperty('Temperature');
$RST = $this->getProperty('RoomSetTemp');
$LRT = $this->getProperty('LinkedRelay_T');
$status=gg($LRT.'.status');
$ot=$this->object_title;
$RFT_status= gg('ESP_RF_send.alive');
$heat_status=gg('Heating.status');
//say ($x." - ".$RST." - ".$LRT." - ".$ot." - ".$status);
//if (($RFT_status==1) && ($heat_status==1)){
if ($heat_status==1){
$Tsensors=array();
$Tsensors['Livingroom']="отопление в столовой";
//$Tsensors['sauna']="датчик температуры в сауне";
$Tsensors['WC']="подогрев полов в туалете";
//$Tsensors['Temp_otopl_pr']="датчик температуры отопления прямая";
//$Tsensors['Temp_otopl_obr']="датчик температуры отопления обратка";
$Tsensors['dressing_room']="подогрев полов в предбаннике";
//$Tsensors['Temp_shower']="датчик температуры в душе";
$Tsensors['input_water']="подогрев воды на вводе";
$Tsensors['Hall_1st_floor']="подогрев полов в коридоре первого этажа";
$Tsensors['Hall_2sd_floor']="подогрев полов в коридоре второго этажа";
$Tsensors['N_Bedroom']="подогрев полов в северной спальне";
$Tsensors['S_Bedroom']="подогрев полов в южной спальне";
$Tsensors['bend']="Отопление в бендежке";
$Tsensors['henhouse']="Отопление в курятнике";
//$Tsensors['Sinoptik']="датчик температуры на улице";
//$sensors['sensorTempRemote2']="датчик температуры в спальне";
//$sensors['ws']="модуль погодной станции";
foreach($Tsensors as $k=>$v) {
if ($k==$ot) {$ot_rus =$v;}
}
if (($x<>$RST) && ($RST) && ($LRT) && ($x)){
if (($x>$RST) && ($status==1)) {sg ($LRT.'.status', '0');
$ph="Выключаю ";
say ($ph.$ot_rus,0);
}
elseif ($x>$RST) {
// say ($x." ".$RST." ".$status." ".$ot_rus);
sg ($LRT.'.status', '0');}
if (($x<$RST) && ($status==0)) {sg ($LRT.'.status', '1');
$ph="Включаю ";
say ($ph.$ot_rus,0);
}
elseif ($x<$RST) {
// say ($x." ".$RST." ".$status." ".$ot_rus);
sg ($LRT.'.status', '1');}
}
}
Windows, Debian 8, 1-Wire
Connect
Connect
-
- Сообщения: 31
- Зарегистрирован: Пн апр 18, 2016 6:01 pm
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
Re: Управление отоплением или теплыми полами
А можно поподробнее описать как у Вас это реализовано?SergeyM писал(а):а почему только целыми?СпойлерПоказатьКод: Выделить всё
//say ($x); // получить тек. температуру,заданную и линк на реле $x = $this->getProperty('Temperature'); //say ($x); if (!$x) return; //----------------------------------------------------------------------------------------- // не больше и не меньше if ($x<12) {$x=12;} elseif ($x>30) {$x=30;} // расчет величины цветовой шкалы $x = round( ($x-12)*42,5 ); $hcolor = '#'; // расчет r $y = $x-255; if ($y < 0) {$y = 0;} elseif ($y > 255) {$y = 255;} $y = dechex($y); if (strlen($y) == 1) {$y = '0'.$y;} $hcolor = $hcolor.$y; // расчет g $y = 255-$x; if ($y < 0) {$y = 0;} elseif ($y > 255) {$y = 255;} $y = dechex($y); if (strlen($y) == 1) {$y = '0'.$y;} $hcolor = $hcolor.$y; // расчет b $y = 765-$x; if ($y < 0) {$y = 0;} elseif ($y > 255) {$y = 255;} $y = dechex($y); if (strlen($y) == 1) {$y = '0'.$y;} $hcolor = $hcolor.$y; // установить свойство цвета температуры $this->setProperty('TempHEX', $hcolor); //---------------------------------------------------------------------------------------- $x = $this->getProperty('Temperature'); $RST = $this->getProperty('RoomSetTemp'); $LRT = $this->getProperty('LinkedRelay_T'); $status=gg($LRT.'.status'); $ot=$this->object_title; $RFT_status= gg('ESP_RF_send.alive'); $heat_status=gg('Heating.status'); //say ($x." - ".$RST." - ".$LRT." - ".$ot." - ".$status); //if (($RFT_status==1) && ($heat_status==1)){ if ($heat_status==1){ $Tsensors=array(); $Tsensors['Livingroom']="отопление в столовой"; //$Tsensors['sauna']="датчик температуры в сауне"; $Tsensors['WC']="подогрев полов в туалете"; //$Tsensors['Temp_otopl_pr']="датчик температуры отопления прямая"; //$Tsensors['Temp_otopl_obr']="датчик температуры отопления обратка"; $Tsensors['dressing_room']="подогрев полов в предбаннике"; //$Tsensors['Temp_shower']="датчик температуры в душе"; $Tsensors['input_water']="подогрев воды на вводе"; $Tsensors['Hall_1st_floor']="подогрев полов в коридоре первого этажа"; $Tsensors['Hall_2sd_floor']="подогрев полов в коридоре второго этажа"; $Tsensors['N_Bedroom']="подогрев полов в северной спальне"; $Tsensors['S_Bedroom']="подогрев полов в южной спальне"; $Tsensors['bend']="Отопление в бендежке"; $Tsensors['henhouse']="Отопление в курятнике"; //$Tsensors['Sinoptik']="датчик температуры на улице"; //$sensors['sensorTempRemote2']="датчик температуры в спальне"; //$sensors['ws']="модуль погодной станции"; foreach($Tsensors as $k=>$v) { if ($k==$ot) {$ot_rus =$v;} } if (($x<>$RST) && ($RST) && ($LRT) && ($x)){ if (($x>$RST) && ($status==1)) {sg ($LRT.'.status', '0'); $ph="Выключаю "; say ($ph.$ot_rus,0); } elseif ($x>$RST) { // say ($x." ".$RST." ".$status." ".$ot_rus); sg ($LRT.'.status', '0');} if (($x<$RST) && ($status==0)) {sg ($LRT.'.status', '1'); $ph="Включаю "; say ($ph.$ot_rus,0); } elseif ($x<$RST) { // say ($x." ".$RST." ".$status." ".$ot_rus); sg ($LRT.'.status', '1');} } }
У меня пока поддержание температуры в доме реализовано прямо в самой ESP8266 через встроенный термостат.
Настроено поддерживать температуру от 22,9 до 23,1 градуса Но это не удобно. Хочется управлять напрямую через MajorDomo.
Последний раз редактировалось masster_alex Чт ноя 03, 2016 11:28 pm, всего редактировалось 1 раз.
-
- Сообщения: 100
- Зарегистрирован: Вт ноя 11, 2014 5:16 pm
- Откуда: Шатура
- Благодарил (а): 4 раза
- Поблагодарили: 8 раз
Re: Управление отоплением или теплыми полами
Для каждого объекта ROOM есть свойство RoomSetTemp, слайдер привязан к этому свойству, при при его изменении, а так же при изменении измеренной температуры запускается метод, приведенный в примере. Методу абсолютно все равно целые значения сравнивать или с десятичными знаками.
Windows, Debian 8, 1-Wire
Connect
Connect
-
- Сообщения: 31
- Зарегистрирован: Пн апр 18, 2016 6:01 pm
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
Re: Управление отоплением или теплыми полами
Ок. Но какой гистерезис у этого метода??? На сколько точно он будет удерживать заданную температуру? Например если я выставлю 23 градуса, сможет ли реле включаться для нагрева помещения при 22,9 и отключаться при 23,1 градуса?SergeyM писал(а):Для каждого объекта ROOM есть свойство RoomSetTemp, слайдер привязан к этому свойству, при при его изменении, а так же при изменении измеренной температуры запускается метод, приведенный в примере. Методу абсолютно все равно целые значения сравнивать или с десятичными знаками.
-
- Сообщения: 100
- Зарегистрирован: Вт ноя 11, 2014 5:16 pm
- Откуда: Шатура
- Благодарил (а): 4 раза
- Поблагодарили: 8 раз
Re: Управление отоплением или теплыми полами
Гистерезис метода зависит от точности данных, т.е. если температура измеряется сточность до тысячных, то и регулирование будет в тех же пределах. НО:
1. С точки зрения комфорта человека, 0.1 градуса Вы не заметите.
2. Точность датчика, того же далласа достаточно низка.
3. Инерционность системы так же надо учитывать.
4. С точки зрения оптимизации системы обработка десятичных значений требует бОльших вычислительных ресурсов и памяти, как оперативной, так и базы данных (если Вы храните историческую информацию)
Отправлено с моего SM-G900FD через Tapatalk
1. С точки зрения комфорта человека, 0.1 градуса Вы не заметите.
2. Точность датчика, того же далласа достаточно низка.
3. Инерционность системы так же надо учитывать.
4. С точки зрения оптимизации системы обработка десятичных значений требует бОльших вычислительных ресурсов и памяти, как оперативной, так и базы данных (если Вы храните историческую информацию)
Отправлено с моего SM-G900FD через Tapatalk
Windows, Debian 8, 1-Wire
Connect
Connect
-
- Сообщения: 21
- Зарегистрирован: Пн фев 29, 2016 10:21 pm
- Благодарил (а): 0
- Поблагодарили: 3 раза
Re: Управление отоплением или теплыми полами
Не хочу вас расстраивать, но стоит начать с того, что как минимум у вашего датчика погрешность пол градуса, это описано в его спецификации. Вам точно нужна такая точность, про которую вы спрашиваете?masster_alex писал(а):Ок. Но какой гистерезис у этого метода??? На сколько точно он будет удерживать заданную температуру? Например если я выставлю 23 градуса, сможет ли реле включаться для нагрева помещения при 22,9 и отключаться при 23,1 градуса?SergeyM писал(а):Для каждого объекта ROOM есть свойство RoomSetTemp, слайдер привязан к этому свойству, при при его изменении, а так же при изменении измеренной температуры запускается метод, приведенный в примере. Методу абсолютно все равно целые значения сравнивать или с десятичными знаками.
Дополню предыдущее сообщение еще одним фактором - как часто вы опрашиваете датчик температуры. Если опрашивать каждую минуту, то есть какая-то вероятность, что ваша температура может подняться с 22,9 до более чем 23 градуса (на пару десятых может). Соответственно, сразу после опроса датчика реле будет выключено все равно, т.к температура превысила указанную.
-
- Сообщения: 31
- Зарегистрирован: Пн апр 18, 2016 6:01 pm
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
Re: Управление отоплением или теплыми полами
Как я и писал постом выше сейчас у меня управляется температура самим ESP8266 автономно через внутренний термостат прошивки. По идее меня это устраивает но не удобно перенастраивать термостат через IP этой ESP8266. Про погрешность датчика не спорю, но это не никак не влияет на плавность изменения показаний самой DS18B20 , данные о температуре так-же плавно меняются по 0.1 градуса в ту или иную сторону. Датчик у меня опрашивается каждые 10 секунд, поэтому скачков на графике в перепаде температуре я не наблюдаю. Но цель та моя в другом. Отвязаться от внутреннего термостата ESP8266 и настроить слайдер для регулировки температуры с тем-же гистерезисом в 0.3 градуса через MajorDomo.TbIKBA писал(а):Не хочу вас расстраивать, но стоит начать с того, что как минимум у вашего датчика погрешность пол градуса, это описано в его спецификации. Вам точно нужна такая точность, про которую вы спрашиваете?masster_alex писал(а):Ок. Но какой гистерезис у этого метода??? На сколько точно он будет удерживать заданную температуру? Например если я выставлю 23 градуса, сможет ли реле включаться для нагрева помещения при 22,9 и отключаться при 23,1 градуса?SergeyM писал(а):Для каждого объекта ROOM есть свойство RoomSetTemp, слайдер привязан к этому свойству, при при его изменении, а так же при изменении измеренной температуры запускается метод, приведенный в примере. Методу абсолютно все равно целые значения сравнивать или с десятичными знаками.
Дополню предыдущее сообщение еще одним фактором - как часто вы опрашиваете датчик температуры. Если опрашивать каждую минуту, то есть какая-то вероятность, что ваша температура может подняться с 22,9 до более чем 23 градуса (на пару десятых может). Соответственно, сразу после опроса датчика реле будет выключено все равно, т.к температура превысила указанную.
-
- Сообщения: 1138
- Зарегистрирован: Вт янв 29, 2013 9:16 am
- Откуда: Белозерск
- Благодарил (а): 16 раз
- Поблагодарили: 400 раз
- Контактная информация:
Re: Управление отоплением или теплыми полами
Там это где?masster_alex писал(а):Здравствуйте. Подскажите как реализовать управление отоплением по слайдеру с возможностью установки гистерезиса в десятичные градуса. Majordomo получает данные о температуре с DS18B20 по ESP8266. Сделан слайдер в меню управления с шагом 0.1 градуса. Эти данные со слайдера записываются в переменную Set_temp. Делаю условия на включение и выключение реле. Но там только можно устанавливать целые значения. Как же реализовать управление гистерезисом в десятичных значениях?
у меня сделано так
if(SertTemp>TempDS){
//отопление выкл
}else{
//отопление вкл
}
смысл учитывать +-0,2 градуса не вижу, скрипт выполняетя раз в минуту, при том, что реле управляют термическим сервоприводами у которых скорость включения/выключения 3 минуты
вот у меня 3 комнаты и соответственно скрипт Econom
Код: Выделить всё
//получаем свойства с датчиков
$t1=getGlobal("ThisComputer.temp1");
$t2=getGlobal("ThisComputer.temp2");
$t3=getGlobal("ThisComputer.temp3");
//получаем установки температуры
$tu1=getGlobal("ThisComputer.temp1u");
$tu2=getGlobal("ThisComputer.temp2u");
$tu3=getGlobal("ThisComputer.temp3u");
//получаем свойства режима экономии и установку температуры при режиме экономии.
$tu0=getGlobal("ThisComputer.temp_econom");
$econ=getGlobal("ThisComputer.Econom");
//проверка включен ли режим экономии
if($econ==1){
//если режим экономии включен, то установки температуры равны установке в режиме экономии
$tu1=$tu0;
$tu2=$tu0;
$tu3=$tu0;
}
if($tu1<$t1){
//если температура меньше установленной то открываем клапан
callMethod("Switch13.turnOn");
}else{
//если равна или больше то закрываем клапан
callMethod("Switch13.turnOff");
}
if($tu1<$t1){
//если температура меньше установелнной то открываем клапан
callMethod("Switch14.turnOn");
}else{
//если равна или больше то закрываем клапан
callMethod("Switch14.turnOff");
}
if($tu1<$t1){
//если температура меньше установелнной то открываем клапан
callMethod("Switch15.turnOn");
}else{
//если равна или больше то закрываем клапан
callMethod("Switch15.turnOff");
}
Lubuntu на cubieboard2 + ds9490R
DietPi на Orange Pi PC + 1wire на esp8266 с прошивкой Homes-smart.ru
DietPi на Orange Pi PC + 1wire на esp8266 с прошивкой Homes-smart.ru