Управление отоплением или теплыми полами

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
masster_alex
Сообщения: 31
Зарегистрирован: Пн апр 18, 2016 6:01 pm
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Управление отоплением или теплыми полами

Сообщение masster_alex » Чт ноя 03, 2016 6:18 pm

Здравствуйте. Подскажите как реализовать управление отоплением по слайдеру с возможностью установки гистерезиса в десятичные градуса. Majordomo получает данные о температуре с DS18B20 по ESP8266. Сделан слайдер в меню управления с шагом 0.1 градуса. Эти данные со слайдера записываются в переменную Set_temp. Делаю условия на включение и выключение реле. Но там только можно устанавливать целые значения. Как же реализовать управление гистерезисом в десятичных значениях?
SergeyM
Сообщения: 100
Зарегистрирован: Вт ноя 11, 2014 5:16 pm
Откуда: Шатура
Благодарил (а): 4 раза
Поблагодарили: 8 раз

Re: Управление отоплением или теплыми полами

Сообщение SergeyM » Чт ноя 03, 2016 11:07 pm

а почему только целыми?
СпойлерПоказать

Код: Выделить всё

//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
masster_alex
Сообщения: 31
Зарегистрирован: Пн апр 18, 2016 6:01 pm
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Re: Управление отоплением или теплыми полами

Сообщение masster_alex » Чт ноя 03, 2016 11:16 pm

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 раз.
SergeyM
Сообщения: 100
Зарегистрирован: Вт ноя 11, 2014 5:16 pm
Откуда: Шатура
Благодарил (а): 4 раза
Поблагодарили: 8 раз

Re: Управление отоплением или теплыми полами

Сообщение SergeyM » Чт ноя 03, 2016 11:27 pm

Для каждого объекта ROOM есть свойство RoomSetTemp, слайдер привязан к этому свойству, при при его изменении, а так же при изменении измеренной температуры запускается метод, приведенный в примере. Методу абсолютно все равно целые значения сравнивать или с десятичными знаками.
Windows, Debian 8, 1-Wire
Connect
masster_alex
Сообщения: 31
Зарегистрирован: Пн апр 18, 2016 6:01 pm
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Re: Управление отоплением или теплыми полами

Сообщение masster_alex » Чт ноя 03, 2016 11:44 pm

SergeyM писал(а):Для каждого объекта ROOM есть свойство RoomSetTemp, слайдер привязан к этому свойству, при при его изменении, а так же при изменении измеренной температуры запускается метод, приведенный в примере. Методу абсолютно все равно целые значения сравнивать или с десятичными знаками.
Ок. Но какой гистерезис у этого метода??? На сколько точно он будет удерживать заданную температуру? Например если я выставлю 23 градуса, сможет ли реле включаться для нагрева помещения при 22,9 и отключаться при 23,1 градуса?
SergeyM
Сообщения: 100
Зарегистрирован: Вт ноя 11, 2014 5:16 pm
Откуда: Шатура
Благодарил (а): 4 раза
Поблагодарили: 8 раз

Re: Управление отоплением или теплыми полами

Сообщение SergeyM » Пт ноя 04, 2016 7:47 am

Гистерезис метода зависит от точности данных, т.е. если температура измеряется сточность до тысячных, то и регулирование будет в тех же пределах. НО:
1. С точки зрения комфорта человека, 0.1 градуса Вы не заметите.
2. Точность датчика, того же далласа достаточно низка.
3. Инерционность системы так же надо учитывать.
4. С точки зрения оптимизации системы обработка десятичных значений требует бОльших вычислительных ресурсов и памяти, как оперативной, так и базы данных (если Вы храните историческую информацию)

Отправлено с моего SM-G900FD через Tapatalk
Windows, Debian 8, 1-Wire
Connect
TbIKBA
Сообщения: 21
Зарегистрирован: Пн фев 29, 2016 10:21 pm
Благодарил (а): 0
Поблагодарили: 3 раза

Re: Управление отоплением или теплыми полами

Сообщение TbIKBA » Сб ноя 05, 2016 2:30 am

masster_alex писал(а):
SergeyM писал(а):Для каждого объекта ROOM есть свойство RoomSetTemp, слайдер привязан к этому свойству, при при его изменении, а так же при изменении измеренной температуры запускается метод, приведенный в примере. Методу абсолютно все равно целые значения сравнивать или с десятичными знаками.
Ок. Но какой гистерезис у этого метода??? На сколько точно он будет удерживать заданную температуру? Например если я выставлю 23 градуса, сможет ли реле включаться для нагрева помещения при 22,9 и отключаться при 23,1 градуса?
Не хочу вас расстраивать, но стоит начать с того, что как минимум у вашего датчика погрешность пол градуса, это описано в его спецификации. Вам точно нужна такая точность, про которую вы спрашиваете?

Дополню предыдущее сообщение еще одним фактором - как часто вы опрашиваете датчик температуры. Если опрашивать каждую минуту, то есть какая-то вероятность, что ваша температура может подняться с 22,9 до более чем 23 градуса (на пару десятых может). Соответственно, сразу после опроса датчика реле будет выключено все равно, т.к температура превысила указанную.
masster_alex
Сообщения: 31
Зарегистрирован: Пн апр 18, 2016 6:01 pm
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Re: Управление отоплением или теплыми полами

Сообщение masster_alex » Сб ноя 05, 2016 2:44 pm

TbIKBA писал(а):
masster_alex писал(а):
SergeyM писал(а):Для каждого объекта ROOM есть свойство RoomSetTemp, слайдер привязан к этому свойству, при при его изменении, а так же при изменении измеренной температуры запускается метод, приведенный в примере. Методу абсолютно все равно целые значения сравнивать или с десятичными знаками.
Ок. Но какой гистерезис у этого метода??? На сколько точно он будет удерживать заданную температуру? Например если я выставлю 23 градуса, сможет ли реле включаться для нагрева помещения при 22,9 и отключаться при 23,1 градуса?
Не хочу вас расстраивать, но стоит начать с того, что как минимум у вашего датчика погрешность пол градуса, это описано в его спецификации. Вам точно нужна такая точность, про которую вы спрашиваете?

Дополню предыдущее сообщение еще одним фактором - как часто вы опрашиваете датчик температуры. Если опрашивать каждую минуту, то есть какая-то вероятность, что ваша температура может подняться с 22,9 до более чем 23 градуса (на пару десятых может). Соответственно, сразу после опроса датчика реле будет выключено все равно, т.к температура превысила указанную.
Как я и писал постом выше сейчас у меня управляется температура самим ESP8266 автономно через внутренний термостат прошивки. По идее меня это устраивает но не удобно перенастраивать термостат через IP этой ESP8266. Про погрешность датчика не спорю, но это не никак не влияет на плавность изменения показаний самой DS18B20 , данные о температуре так-же плавно меняются по 0.1 градуса в ту или иную сторону. Датчик у меня опрашивается каждые 10 секунд, поэтому скачков на графике в перепаде температуре я не наблюдаю.
СпойлерПоказать
Изображение
Но цель та моя в другом. Отвязаться от внутреннего термостата ESP8266 и настроить слайдер для регулировки температуры с тем-же гистерезисом в 0.3 градуса через MajorDomo.
СпойлерПоказать
Изображение
immortal
Сообщения: 1138
Зарегистрирован: Вт янв 29, 2013 9:16 am
Откуда: Белозерск
Благодарил (а): 16 раз
Поблагодарили: 400 раз
Контактная информация:

Re: Управление отоплением или теплыми полами

Сообщение immortal » Сб ноя 05, 2016 11:23 pm

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
Ответить