a:1:{i:0;a:8:{s:5:"TITLE";s:10:"Thermostat";s:9:"PARENT_ID";s:1:"0";s:5:"NOLOG";s:1:"0";s:11:"DESCRIPTION";s:14:"ПЗА ver 1.0";s:8:"TEMPLATE";s:12208:"
";s:7:"METHODS";a:10:{i:0;a:8:{s:5:"TITLE";s:7:"refresh";s:11:"DESCRIPTION";s:51:"вызвать после изменения status";s:4:"CODE";s:347:"if (defined('THRM_LOG_LEVEL') && THRM_LOG_LEVEL != '') { $log_level = THRM_LOG_LEVEL; } else { $log_level = 0; }
if ($log_level>0) { $ot=$this->object_title; }
if ($log_level>1) { DebMes($ot.'.refresh','thrm'); }
$status=$this->getProperty('status');
if ($status) {
$this->callMethod('turnOn');
} else {
$this->callMethod('turnOff');
}";s:11:"CALL_PARENT";s:1:"0";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-21 16:52:47";s:15:"EXECUTED_PARAMS";s:42:"{"ORIGINAL_OBJECT_TITLE":"thrm_gamma_100"}";s:12:"EXECUTED_SRC";s:0:"";}i:1;a:8:{s:5:"TITLE";s:12:"airCalculate";s:11:"DESCRIPTION";s:77:"рассчитать требуемую температуру воздуха";s:4:"CODE";s:5343:"/* Расчет целевой температуры воздуха в зависимости от времени суток
В результате записывается свойство с историей airRequiredTemp
для построения графика и контроля достижения заданной температуры;
и свойство без истории airShiftTemp для расчета температуры подачи
с учетом инерции системы.
Если целевая t воздуха в свойстве airFunc задана числом,
то переменная $t_desire будет равна этому числу,
и часть кода для расчета суточной температуры не будет выполняться.
airRequiredTemp и airShiftTemp будут установлены = $t_desire
Если airFunc задана массивом, то в airRequiredTemp будет записана температура по текущему часу,
а в airShiftTemp температура со сдвигом по свойству timeShift
*/
if (defined('THRM_LOG_LEVEL') && THRM_LOG_LEVEL != '') { $log_level = THRM_LOG_LEVEL; } else { $log_level = 0; }
if ($log_level>0) { $ot=$this->object_title; }
if ($log_level>1) { DebMes($ot.'.airCalculate','thrm'); }
$h=(int)date('G',time());
$m=date('i',time());
$airFunc=$this->getProperty('airFunc');
// свойство airFunc может содержать массив из 24 цифр разделенных пробелом, либо только одну цифру.
if (is_numeric($airFunc)) {
$t_desire = $airFunc;
// логи
if ($log_level>1) { DebMes("$ot Свойство airFunc задано числом $t_desire",'thrm'); }
} else {
// логи
if ($log_level>1) { DebMes("$ot Свойство airFunc задано массивом",'thrm'); }
// Преобразовать строку в массив
$arrTemp=explode(' ', $airFunc);
// Проверить корректность массива температур
if (count($arrTemp)<>24) {
if ($log_level>0) { DebMes("$ot ИСКЛЮЧЕНИЕ в методе airCalculate объекта ".$this->object_title.' не корректный массив в свойстве airFunc','thrm'); }
say("$ot Исключение в методе airCalculate объекта ".$this->object_title);
return;
}
// Получить значение температуры текущего часа
$t_desire=$arrTemp[$h];
// следующий элемент массива
$hn=$h+1;
if ($hn>23) {$hn-=24;}
// пропорционально изменить на разницу значения следующего часа
$t_desire+=($arrTemp[$hn]-$arrTemp[$h])*$m/60;
$t_desire=round($t_desire, 1);
// логи
if ($log_level>1) {
DebMes("$ot Установленная температура текущего часа $arrTemp[$h]",'thrm');
DebMes("$ot Установленная температура следующего часа $arrTemp[$hn]",'thrm');
}
}
// логи
if ($log_level>0) {
DebMes("$ot целевая температура воздуха $t_desire",'thrm');
}
// airRequiredTemp используется в основном для построения графиков
// и показа желаемого значения температуры на элементах термостатов
$this->setProperty('airRequiredTemp', $t_desire);
// пересчитать со здвигом значение $t_desire если $airFunc не число
// иначе $t_desire останется равным числу в $airFunc
if (!is_numeric($airFunc)) {
// Смотреть в будущее чтобы успеть по причине инерционности системы
$h+=$this->getProperty('timeShift');
if ($h>23) {$h-=24;}
// Получить значение температуры текущего часа
$t_desire=$arrTemp[$h];
// следующий элемент массива
$hn=$h+1;
if ($hn>23) {$hn-=24;}
// пропорционально изменить на разницу значения следующего часа
$t_desire+=($arrTemp[$hn]-$arrTemp[$h])*$m/60;
$t_desire=round($t_desire, 1);
// логи
if ($log_level>1) {
DebMes("$ot Установленная температура будущего часа $arrTemp[$h]",'thrm');
DebMes("$ot Установленная температура следующего часа $arrTemp[$hn]",'thrm');
}
if ($log_level>0) {
DebMes("$ot Требуемая будущая температура $t_desire",'thrm');
}
}
// сохраненная будущая температура не равна расчетной будущей
// перезапись новой температуры, вызов метода расчета t подачи воды
if ($this->getProperty('airShiftTemp') <> $t_desire) {
$this->setProperty('airShiftTemp', $t_desire);
$this->callMethod('waterCalculate', array('airShiftTemp'=>$t_desire));
}";s:11:"CALL_PARENT";s:1:"0";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 21:35:00";s:15:"EXECUTED_PARAMS";s:42:"{"ORIGINAL_OBJECT_TITLE":"thrm_gamma_100"}";s:12:"EXECUTED_SRC";s:105:"/api.php/method/ClockChimeClimate.onNewMinute?m_c_s[0]=ClockChimeClimate.onNewMinute&r_s_m=1&no_session=1";}i:2;a:8:{s:5:"TITLE";s:12:"pzaCalculate";s:11:"DESCRIPTION";s:50:"рассчитать температуру ПЗА";s:4:"CODE";s:3351:"/* Расчет требуемой температуры подачи по ПЗА
Учитывается уличная температура, скорость ветра, яркость солнца
Коэффициенты влияния этих факторов указаны в коде
*/
if (defined('THRM_LOG_LEVEL') && THRM_LOG_LEVEL != '') { $log_level = THRM_LOG_LEVEL; } else { $log_level = 0; }
if ($log_level>0) { $ot=$this->object_title; }
if ($log_level>1) { DebMes($ot.'.pzaCalculate','thrm'); }
// температура улица. ВНИМАНИЕ данные берутся с объекта улицы
if (isset($params['t'])) { $t =$params['t']; } else { $t = gg('weather_now.temperature'); }
// коэффициент выбора кривой. Поднимает хвост графика. Увеличить для + в морозы
if (isset($params['k1'])) { $k1 =$params['k1']; } else { $k1 = $this->getProperty('K1'); }
// коэффициент правки всей кривой. Перемещает вверх/вниз весь график
if (isset($params['k2'])) { $k2 =$params['k2']; } else { $k2 = $this->getProperty('K2'); }
// значение по умолчанию
if (!$k1) { $k1=1.5; }
if (!$k2) { $k2=20; }
// Рассчитать изгиб кривой
$Tp = sqrt((20-$t)*$k1)*10;
if (!isset($params['t']) && $log_level>1) { DebMes("$ot Изгиб кривой $Tp",'thrm'); }
// При увеличении желаемой комнатной температуры на 1°C кривая традиционно смещается на 5°C:
$Tp = $Tp + ($k2-20)*5;
if (!isset($params['t']) && $log_level>1) { DebMes("$ot Смещение кривой $Tp",'thrm'); }
// Правка на ветер
// <3 Слабый <6 Сильный <9 Очень сильный Иначе Шквальный
// поправку вносим от 0 до 10 м*с. Корректировка на 25%
$Tp+=$Tp*25/100 * min(max(gg('weather_now.windSpeed')/10,0),1)**3;
if (!isset($params['t']) && $log_level>1) { DebMes("$ot Поправка на ветер $Tp",'thrm'); }
// Правка на солнце
// Освещенность наблюдается от 0 до 600 пунктов. Понижать t будет от 200 до 600
// Корректировка на 10%
//$Tp-=$Tp*10/100 * min(max((gg('DrivewayArea.Luminiscence')-200)/400,0),1);
$Tp-=$Tp*10/100 * min(max(gg('DrivewayArea.Luminiscence')/600,0),1)**3;
if (!isset($params['t']) && $log_level>1) { DebMes("$ot Поправка на солнце $Tp",'thrm'); }
// округлить, ограничить и записать
$Tp = round($Tp);
$Tp = min($Tp,85);
$Tp = max($Tp,20);
if (!isset($params['t']) && $log_level>0) { DebMes("$ot Итоговая t по ПЗА $Tp",'thrm'); }
// при передаче параметра t вернуть ответ для графиков или метода waterCalculate.
// Иначе установка свойства и запуск метода
if (isset($params['t'])) {
if ($log_level>0) { DebMes("$ot На запрос уличной $t отправлен ответ $Tp",'thrm'); }
return($Tp);
} else {
$this->setProperty('pzaTemp', $Tp);
$this->callMethod('waterCalculate', array('pzaTemp'=>$Tp));
}";s:11:"CALL_PARENT";s:1:"0";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 21:35:01";s:15:"EXECUTED_PARAMS";s:50:"{"t":-30,"ORIGINAL_OBJECT_TITLE":"thrm_bathhouse"}";s:12:"EXECUTED_SRC";s:253:"/api.php/method/thrm_bathhouse.waterCalculate?PROPERTY=airCurrentTemp&NEW_VALUE=20.4&OLD_VALUE=20.4&SOURCE=/api.php/script/82?raiseEvent=1&m_c_s[0]=ClockChimeWorker.onNewMinute&m_c_s[1]=Anteroom.onTempChanges.bfa3f0a7b99ee306f82e9fdc1f3c61b7&m_c_s[2]...";}i:3;a:8:{s:5:"TITLE";s:8:"mayBanOn";s:11:"DESCRIPTION";s:156:"метод может запретить работу термостата. Для этого в коде метода должен быть return true;
";s:4:"CODE";s:215:"if (defined('THRM_LOG_LEVEL') && THRM_LOG_LEVEL != '') { $log_level = THRM_LOG_LEVEL; } else { $log_level = 0; }
if ($log_level>0) { $ot=$this->object_title; }
if ($log_level>1) { DebMes($ot.'.mayBanOn','thrm'); }";s:11:"CALL_PARENT";s:1:"0";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 21:35:01";s:15:"EXECUTED_PARAMS";s:42:"{"ORIGINAL_OBJECT_TITLE":"thrm_bathhouse"}";s:12:"EXECUTED_SRC";s:253:"/api.php/method/thrm_bathhouse.waterCalculate?PROPERTY=airCurrentTemp&NEW_VALUE=20.4&OLD_VALUE=20.4&SOURCE=/api.php/script/82?raiseEvent=1&m_c_s[0]=ClockChimeWorker.onNewMinute&m_c_s[1]=Anteroom.onTempChanges.bfa3f0a7b99ee306f82e9fdc1f3c61b7&m_c_s[2]...";}i:4;a:8:{s:5:"TITLE";s:14:"waterCalculate";s:11:"DESCRIPTION";s:56:"рассчитать температуру подачи";s:4:"CODE";s:2834:"/* Расчет температуры подачи
если фактическая температура воздуха +3 <= заблаговременной расчетной
т.е. запаздываем на 3 градуса, то берем максимальную температуру подачи из ПЗА.
иначе если температура воздуха +1 <= заблаговременной расчетной
т.е. меньше заданной на 1 градус, то берем температуру по ПЗА
иначе при приближении к заблаговременной температуре воздуха,
начинаем уменьшать t подачи
*/
if (defined('THRM_LOG_LEVEL') && THRM_LOG_LEVEL != '') { $log_level = THRM_LOG_LEVEL; } else { $log_level = 0; }
if ($log_level>0) { $ot=$this->object_title; }
if ($log_level>1) { DebMes($ot.'.waterCalculate','thrm'); }
// температура по ПАЗ
if (isset($params['pzaTemp'])) { $pzat=$params['pzaTemp']; } else { $pzat=$this->getProperty('pzaTemp'); }
// текущая температура воздуха (возможно выцепить без обращения к db)
$act = $this->getProperty('airCurrentTemp');
// заблаговременный расчет требуемой температуры воздуха
if (isset($params['airShiftTemp'])) { $ast=$params['airShiftTemp']; } else { $ast=$this->getProperty('airShiftTemp'); }
if ($act+3<=$ast) {
$t='максимальная t подачи из ПЗА';
$wrt=$this->callMethod('pzaCalculate', array('t'=>-30)); // Получить максимальную температуру по ПЗА;
}
elseif ($act+1<=$ast) {
$t='t подачи по ПЗА';
$wrt=$pzat;
}
else {
$t='коррекция t при приближении';
// 15% от температуры ПЗА * коэффициент приближения
// после превышения до 1 градуса ещё 15 процентов упеньшения подачи
// коррекция идет по логарифмической шкале
$wrt=$pzat;
$wrt-=$pzat*15/100 * min(max((1-$ast+$act)**2,0),2);
$wrt=round($wrt);
}
if ($log_level>0) { DebMes("$ot $t $wrt",'thrm'); }
if ($this->getProperty('waterRequiredTemp') <> $wrt) {
$this->setProperty('waterRequiredTemp', $wrt);
// Запуск исполняющих методов
$this->callMethod('setTemperature', array('waterRequiredTemp'=>$wrt));
$this->callMethod('positionServo', array('waterRequiredTemp'=>$wrt));
}
// подумать когда и при каких условиях вызывать чтобы сократить выполнение кода
$this->callMethod('workDecision');";s:11:"CALL_PARENT";s:1:"0";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 21:35:01";s:15:"EXECUTED_PARAMS";s:154:"{"PROPERTY":"airCurrentTemp","NEW_VALUE":"20.4","OLD_VALUE":"20.4","raiseEvent":"1","r_s_m":"1","no_session":"1","ORIGINAL_OBJECT_TITLE":"thrm_bathhouse"}";s:12:"EXECUTED_SRC";s:253:"/api.php/method/thrm_bathhouse.waterCalculate?PROPERTY=airCurrentTemp&NEW_VALUE=20.4&OLD_VALUE=20.4&SOURCE=/api.php/script/82?raiseEvent=1&m_c_s[0]=ClockChimeWorker.onNewMinute&m_c_s[1]=Anteroom.onTempChanges.bfa3f0a7b99ee306f82e9fdc1f3c61b7&m_c_s[2]...";}i:5;a:8:{s:5:"TITLE";s:7:"turnOff";s:11:"DESCRIPTION";s:36:"управление вкл/выкл";s:4:"CODE";s:670:"if (defined('THRM_LOG_LEVEL') && THRM_LOG_LEVEL != '') { $log_level = THRM_LOG_LEVEL; } else { $log_level = 0; }
if ($log_level>0) { $ot=$this->object_title; }
if ($log_level>1) { DebMes($ot.'.turnOff','thrm'); }
$this->setProperty('status',0);
$n = $this->object_title;
// Время минимальной работы
$mintimeoff = $this->getProperty('mintimeoff');
if ( !is_numeric($mintimeoff) ) {$mintimeoff = 20*60;}
// установить таймер паузы
setTimeOut($n.'_nowork', "debmes('Tаймер $n закончен'); cm('$n.workDecision');", $mintimeoff);
// Удалить таймер работы
clearTimeOut($n.'_work');";s:11:"CALL_PARENT";s:1:"0";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 06:55:00";s:15:"EXECUTED_PARAMS";s:38:"{"ORIGINAL_OBJECT_TITLE":"thrm_alpha"}";s:12:"EXECUTED_SRC";s:105:"/api.php/method/ClockChimeClimate.onNewMinute?m_c_s[0]=ClockChimeClimate.onNewMinute&r_s_m=1&no_session=1";}i:6;a:8:{s:5:"TITLE";s:6:"turnOn";s:11:"DESCRIPTION";s:36:"управление вкл/выкл";s:4:"CODE";s:664:"if (defined('THRM_LOG_LEVEL') && THRM_LOG_LEVEL != '') { $log_level = THRM_LOG_LEVEL; } else { $log_level = 0; }
if ($log_level>0) { $ot=$this->object_title; }
if ($log_level>1) { DebMes($ot.'.turnOn','thrm'); }
$this->setProperty('status',1);
$n = $this->object_title;
// Время минимальной работы
$mintimeon = $this->getProperty('mintimeon');
if ( !is_numeric($mintimeon) ) {$mintimeon = 15*60;}
//установить таймер работы
setTimeOut($n.'_work', "debmes('Tаймер $n закончен'); cm('$n.workDecision');", $mintimeon);
// Удалить таймер паузы
clearTimeOut($n.'_nowork');";s:11:"CALL_PARENT";s:1:"0";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 09:43:21";s:15:"EXECUTED_PARAMS";s:38:"{"ORIGINAL_OBJECT_TITLE":"thrm_alpha"}";s:12:"EXECUTED_SRC";s:253:"/api.php/method/thrm_alpha.waterCalculate?PROPERTY=airCurrentTemp&NEW_VALUE=23.3&OLD_VALUE=23.4&SOURCE=/api.php/script/69?raiseEvent=1&m_c_s[0]=Livingroom.onTempChanges.cb8af5c4f4859f09821fdb2b7b2c552e&m_c_s[1]=script.69&r_s_s=1&no_session=1&raiseEve...";}i:7;a:8:{s:5:"TITLE";s:13:"positionServo";s:11:"DESCRIPTION";s:47:"управление сервоприводом";s:4:"CODE";s:641:"/* Вызывается когда меняется текущая или расчетная температура подачи,
при разнице температур запускает на некоторое время мотор сервопривода в нужную сторону.
по размеру разницы можно устанавливать время работы привода.
*/
if (defined('THRM_LOG_LEVEL') && THRM_LOG_LEVEL != '') { $log_level = THRM_LOG_LEVEL; } else { $log_level = 0; }
if ($log_level>0) { $ot=$this->object_title; }
if ($log_level>1) { DebMes($ot.'.positionServo','thrm'); }";s:11:"CALL_PARENT";s:1:"0";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 21:35:01";s:15:"EXECUTED_PARAMS";s:156:"{"PROPERTY":"waterCurrentTemp","NEW_VALUE":"33.8","OLD_VALUE":"33.8","raiseEvent":"1","r_s_m":"1","no_session":"1","ORIGINAL_OBJECT_TITLE":"thrm_bathhouse"}";s:12:"EXECUTED_SRC";s:253:"/api.php/method/thrm_bathhouse.positionServo?PROPERTY=waterCurrentTemp&NEW_VALUE=33.8&OLD_VALUE=33.8&SOURCE=/api.php/method/ClockChimeWorker.onNewMinute?m_c_s[0]=ClockChimeWorker.onNewMinute&r_s_m=1&no_session=1&raiseEvent=1&m_c_s[0]=ClockChimeWorker...";}i:8;a:8:{s:5:"TITLE";s:14:"setTemperature";s:11:"DESCRIPTION";s:60:"установка требуемой температуры";s:4:"CODE";s:483:"// Вызывается когда меняется текущая или расчетная температура подачи,
// передает другому объекту или агрегату расчетную температуру подачи.
if (defined('THRM_LOG_LEVEL') && THRM_LOG_LEVEL != '') { $log_level = THRM_LOG_LEVEL; } else { $log_level = 0; }
if ($log_level>0) { $ot=$this->object_title; }
if ($log_level>1) { DebMes($ot.'.setTemperature','thrm'); }";s:11:"CALL_PARENT";s:1:"0";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 21:06:23";s:15:"EXECUTED_PARAMS";s:65:"{"waterRequiredTemp":55,"ORIGINAL_OBJECT_TITLE":"thrm_gamma_100"}";s:12:"EXECUTED_SRC";s:253:"/api.php/method/thrm_gamma_100.waterCalculate?PROPERTY=airCurrentTemp&NEW_VALUE=22.8&OLD_VALUE=22.9&SOURCE=/api.php/script/69?raiseEvent=1&m_c_s[0]=Livingroom.onTempChanges.882d9945277e9d36342bf6f7962e29c4&m_c_s[1]=script.69&r_s_s=1&no_session=1&rais...";}i:9;a:8:{s:5:"TITLE";s:12:"workDecision";s:11:"DESCRIPTION";s:124:"Принять решение о работе котла или насоса.
Аналог метода logic по сути";s:4:"CODE";s:3825:"/* Принимает решение о работе котла или насоса, на основе текущей и требуемой температуры воздуха
Запускается из метода airCalculate, а так же может быть вызван при необходимости проверки решения
о работе котла из других элементов системы
*/
if (defined('THRM_LOG_LEVEL') && THRM_LOG_LEVEL != '') { $log_level = THRM_LOG_LEVEL; } else { $log_level = 0; }
if ($log_level>0) { $ot=$this->object_title; }
if ($log_level>1) { DebMes($ot.'.workDecision','thrm'); }
// Не выполнять логику если установлен ручной режим
if (!$this->getProperty('auto')) {
if ($log_level>0) { DebMes("$ot Выполнение запрещено. auto режим не выбран",'thrm'); }
return;
}
// Сбор данных
$s = $this->getProperty('status');
$t = $this->getProperty('Title');
$n = $this->object_title;
$t_desire = $this->getProperty('airShiftTemp');
// гистерезис и значение по умолчанию
$hyst = $this->getProperty('hysteresis');
if (!is_numeric($hyst)) {$hyst = 0.2;}
// предельные температуры подачи и значения по умолчанию
$waterMaxTemp = $this->getProperty('waterMaxTemp');
$waterMinTemp = $this->getProperty('waterMinTemp');
if (!is_numeric($waterMaxTemp)) {$waterMaxTemp = 75;}
if (!is_numeric($waterMinTemp)) {$waterMinTemp = 10;}
// Текущая температура подачи. Если данных нет,
// то принять за 25, чтобы исключить влияние на решение
$waterCurrentTemp = $this->getProperty('waterCurrentTemp');
if (!is_numeric($waterCurrentTemp)) {$waterCurrentTemp = 25;}
/* Получить значение метода, запрещающего работу. В некоторых ситуациях необходимо запретить работу.
Например, в данный момент у нас работает бойлер нагрева горячей воды,
и предел допустимой мощности не позвоняет включить электрический.
*/
$mayBanOn = intval($this->callmethod('mayBanOn'));
// При запрете метод вернет 2. Преобразовать ответ в true / false
if ($log_level>1) { DebMes("$ot метод mayBanOn вернул $mayBanOn",'thrm'); }
if ($mayBanOn == 2) {$mayBanOn = true;} else {$mayBanOn = false;}
if ($s) {
// текущая t воздуха >= заблаговременной требуемой + гистерезис
if ($this->getProperty('airCurrentTemp') >= $t_desire + $hyst || $mayBanOn || $waterCurrentTemp > $waterMaxTemp) {
// Если существует таймер
if (timeOutExists($n.'_work') && !$mayBanOn && $waterCurrentTemp < $waterMaxTemp) {
if ($log_level>0) { DebMes("$ot Обеспечение минимального времени работы котла $t",'thrm'); }
} else {
$this->callMethod('turnOff');
}
}
} else {
// текущая t воздуха <= заблаговременной требуемой - гистерезис
if (($this->getProperty('airCurrentTemp') <= $t_desire - $hyst || $waterCurrentTemp < $waterMinTemp) && !$mayBanOn) {
// Если существует таймер паузы
if (timeOutExists($n.'_nowork')) {
if ($log_level>0) { DebMes("$ot Обеспечение минимальной паузы перед включением котла $t",'thrm'); }
} else {
$this->callMethod('turnOn');
}
}
}";s:11:"CALL_PARENT";s:1:"0";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 21:35:01";s:15:"EXECUTED_PARAMS";s:42:"{"ORIGINAL_OBJECT_TITLE":"thrm_bathhouse"}";s:12:"EXECUTED_SRC";s:253:"/api.php/method/thrm_bathhouse.waterCalculate?PROPERTY=airCurrentTemp&NEW_VALUE=20.4&OLD_VALUE=20.4&SOURCE=/api.php/script/82?raiseEvent=1&m_c_s[0]=ClockChimeWorker.onNewMinute&m_c_s[1]=Anteroom.onTempChanges.bfa3f0a7b99ee306f82e9fdc1f3c61b7&m_c_s[2]...";}}s:10:"PROPERTIES";a:18:{i:0;a:12:{s:5:"TITLE";s:5:"Title";s:11:"DESCRIPTION";s:39:"Имя комнаты или котла";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:1;a:12:{s:5:"TITLE";s:7:"pzaTemp";s:11:"DESCRIPTION";s:34:"температура по ПЗА";s:12:"KEEP_HISTORY";s:1:"7";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:2;a:12:{s:5:"TITLE";s:16:"waterCurrentTemp";s:11:"DESCRIPTION";s:43:"текущая t теплоносителя";s:12:"KEEP_HISTORY";s:1:"7";s:8:"ONCHANGE";s:13:"positionServo";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:3;a:12:{s:5:"TITLE";s:17:"waterRequiredTemp";s:11:"DESCRIPTION";s:47:"расчетная t теплоносителя";s:12:"KEEP_HISTORY";s:1:"7";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:4;a:12:{s:5:"TITLE";s:7:"airFunc";s:11:"DESCRIPTION";s:162:"массив из 24 цифр (0...23 час) разделенных пробелом, либо только одну цифру желаемой t воздуха";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:5;a:12:{s:5:"TITLE";s:9:"timeShift";s:11:"DESCRIPTION";s:100:"временной сдвиг по причине инерционности системы (час)";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:6;a:12:{s:5:"TITLE";s:12:"airShiftTemp";s:11:"DESCRIPTION";s:103:"заблаговременный расчет требуемой температуры воздуха ";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:7;a:12:{s:5:"TITLE";s:15:"airRequiredTemp";s:11:"DESCRIPTION";s:56:"требуемая температура воздуха";s:12:"KEEP_HISTORY";s:1:"7";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:8;a:12:{s:5:"TITLE";s:14:"airCurrentTemp";s:11:"DESCRIPTION";s:52:"текущая температура воздуха";s:12:"KEEP_HISTORY";s:1:"7";s:8:"ONCHANGE";s:14:"waterCalculate";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:9;a:12:{s:5:"TITLE";s:6:"status";s:11:"DESCRIPTION";s:40:"работает или выключен";s:12:"KEEP_HISTORY";s:1:"7";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:10;a:12:{s:5:"TITLE";s:4:"auto";s:11:"DESCRIPTION";s:104:"разрешить автоматическое управление (переключение) реле";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:11;a:12:{s:5:"TITLE";s:2:"K1";s:11:"DESCRIPTION";s:90:"коэффициент отопительной кривой (по умолчанию 1.2)";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:12;a:12:{s:5:"TITLE";s:2:"K2";s:11:"DESCRIPTION";s:80:"сдвиг климатической кривой (по умолчанию 20) ";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:13;a:12:{s:5:"TITLE";s:10:"hysteresis";s:11:"DESCRIPTION";s:157:"Гистерезис. Отклонение вверх и вниз от расчетной температуры воздуха. По умолчанию 0.2 ";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:14;a:12:{s:5:"TITLE";s:9:"mintimeon";s:11:"DESCRIPTION";s:118:"Минимальное время работы после включения. По умолчанию 15*60 т.е. 900";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:15;a:12:{s:5:"TITLE";s:10:"mintimeoff";s:11:"DESCRIPTION";s:117:"Минимальное время паузы после включения. По умолчанию 20*60 т.е. 1200";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:16;a:12:{s:5:"TITLE";s:12:"waterMinTemp";s:11:"DESCRIPTION";s:81:"Минимальная t теплоносителя. По умолчанию 10°";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}i:17;a:12:{s:5:"TITLE";s:12:"waterMaxTemp";s:11:"DESCRIPTION";s:83:"Максимальная t теплоносителя. По умолчанию 75°";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";s:6:"SYSTEM";s:0:"";s:8:"DATA_KEY";s:1:"0";s:9:"DATA_TYPE";s:1:"0";s:15:"VALIDATION_TYPE";s:1:"0";s:18:"VALIDATION_NUM_MIN";s:0:"";s:18:"VALIDATION_NUM_MAX";s:0:"";s:15:"VALIDATION_LIST";s:0:"";s:15:"VALIDATION_CODE";N;}}s:7:"OBJECTS";a:6:{i:0;a:6:{s:5:"TITLE";s:9:"thrm_beta";s:11:"DESCRIPTION";s:38:"Газовый котел Подвал";s:11:"LOCATION_ID";s:2:"19";s:12:"KEEP_HISTORY";s:1:"0";s:6:"SYSTEM";s:0:"";s:7:"METHODS";a:2:{i:0;a:8:{s:5:"TITLE";s:6:"turnOn";s:11:"DESCRIPTION";s:0:"";s:4:"CODE";s:127:"say('Включаю газовый котёл в подвале');
callMethod('MegaD4.setOutput',array('port'=>8,'value'=>1));";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-05-05 03:25:53";s:15:"EXECUTED_PARAMS";s:30:"{"method":"%thrm_beta.turnOn"}";s:12:"EXECUTED_SRC";s:41:"/objects/?method=%thrm_beta.workDecision&";}i:1;a:8:{s:5:"TITLE";s:7:"turnOff";s:11:"DESCRIPTION";s:0:"";s:4:"CODE";s:131:"say('Выключаю газовый котёл в подвале');
callMethod('MegaD4.setOutput',array('port'=>8,'value'=>0));
";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-21 16:52:45";s:15:"EXECUTED_PARAMS";s:31:"{"method":"%thrm_beta.turnOff"}";s:12:"EXECUTED_SRC";s:0:"";}}}i:1;a:6:{s:5:"TITLE";s:12:"thrm_kitchen";s:11:"DESCRIPTION";s:35:"Теплый пол на кухне";s:11:"LOCATION_ID";s:1:"5";s:12:"KEEP_HISTORY";s:1:"0";s:6:"SYSTEM";s:0:"";s:7:"METHODS";a:1:{i:0;a:8:{s:5:"TITLE";s:13:"positionServo";s:11:"DESCRIPTION";N;s:4:"CODE";s:1013:"$ot=$this->object_title;
$ct=$this->getProperty('waterCurrentTemp');
$rt=$this->getProperty('waterRequiredTemp');
$t=abs($rt-$ct);
// функцией перевести разницу температур во время вращения сервопривода
// ToDo подогнать по ситуации
$c=round($t^1.3/3, 0);
// ограничить максимальным временем вращения
$c=min($c,60);
if ($c) {
if ($ct<$rt) {
// текущая меньше расчетной
// включить реле открытия привода на $c секунд
// callMethod('MegaD4.setOutput',array('port'=>Х,'value'=>1));
// setTimeOut($ot.'_servo1_stop',"cm('MegaD4.setOutput',array('port'=>Х,'value'=>0));", $c);
} else {
// текущая больше расчетной
// callMethod('MegaD4.setOutput',array('port'=>Y,'value'=>1));
// setTimeOut($ot.'_servo2_stop',"cm('MegaD4.setOutput',array('port'=>Y,'value'=>0));", $c);
}
}";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 20:30:02";s:15:"EXECUTED_PARAMS";s:24:"{"waterRequiredTemp":26}";s:12:"EXECUTED_SRC";s:253:"/api.php/method/DrivewayArea.onTempChanges?PROPERTY=Temperature&NEW_VALUE=-5&OLD_VALUE=-5&SOURCE=/api.php/method/ClockChimeWorker.onNewMinute?m_c_s[0]=ClockChimeWorker.onNewMinute&r_s_m=1&no_session=1&raiseEvent=1&m_c_s[0]=ClockChimeWorker.onNewMinut...";}}}i:2;a:6:{s:5:"TITLE";s:10:"thrm_alpha";s:11:"DESCRIPTION";s:36:"Газовый котел Кухня";s:11:"LOCATION_ID";s:1:"5";s:12:"KEEP_HISTORY";s:1:"0";s:6:"SYSTEM";s:0:"";s:7:"METHODS";a:3:{i:0;a:8:{s:5:"TITLE";s:6:"turnOn";s:11:"DESCRIPTION";N;s:4:"CODE";s:125:"say('Включаю газовый котёл на кухне');
callMethod('MegaD4.setOutput',array('port'=>7,'value'=>1));";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 09:43:21";s:15:"EXECUTED_PARAMS";s:31:"{"method":"%thrm_alpha.turnOn"}";s:12:"EXECUTED_SRC";s:253:"/api.php/method/thrm_alpha.waterCalculate?PROPERTY=airCurrentTemp&NEW_VALUE=23.3&OLD_VALUE=23.4&SOURCE=/api.php/script/69?raiseEvent=1&m_c_s[0]=Livingroom.onTempChanges.cb8af5c4f4859f09821fdb2b7b2c552e&m_c_s[1]=script.69&r_s_s=1&no_session=1&raiseEve...";}i:1;a:8:{s:5:"TITLE";s:7:"turnOff";s:11:"DESCRIPTION";N;s:4:"CODE";s:127:"say('Выключаю газовый котёл на кухне');
callMethod('MegaD4.setOutput',array('port'=>7,'value'=>0));";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 06:55:00";s:15:"EXECUTED_PARAMS";s:32:"{"method":"%thrm_alpha.turnOff"}";s:12:"EXECUTED_SRC";s:105:"/api.php/method/ClockChimeClimate.onNewMinute?m_c_s[0]=ClockChimeClimate.onNewMinute&r_s_m=1&no_session=1";}i:2;a:8:{s:5:"TITLE";s:14:"setTemperature";s:11:"DESCRIPTION";N;s:4:"CODE";s:1897:"if (defined('THRM_LOG_LEVEL') && THRM_LOG_LEVEL != '') { $log_level = THRM_LOG_LEVEL; } else { $log_level = 0; }
if ($log_level>0) { $ot=$this->object_title; }
if (isset($params['waterRequiredTemp'])) { $wrt=$params['waterRequiredTemp']; } else { $wrt=$this->getProperty('waterRequiredTemp'); }
if (!isOnline('MyHeat')) {
DebMes("$ot Выполнение прервано, контроллер не в сети",'thrm');
return;
}
curl_setopt_array($ch = curl_init(), array(
CURLOPT_URL => "https://my2.myheat.net/api/request/",
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POSTFIELDS => json_encode(array(
"action" => "setEnvGoal",
"deviceId" => "3744",
"objId" => "24",
"login" => gg('myHeatApiLogin'),
"key" => gg('myHeatApiKey'),
//"changeMode" => "0",
"goal" => $wrt,
))
));
$res=curl_exec($ch);
if (curl_errno($ch) > 0) {
// say("Ошибка запроса curl при попытке отправки целевой температуры контроллеру");
if ($log_level>0) { DebMes("$ot Ошибка запроса curl при попытке отправки целевой температуры контроллеру",'thrm'); }
sg('myheaterror','curl_error '.curl_error($ch));
die('Ошибка curl: ' . curl_error($ch));
}
curl_close($ch);
$array = json_decode($res, true);
if ($array["err"]===0) {
// say("Установка целевой температуры ".$wrt.'°');
if ($log_level>1) { DebMes("$ot Установка целевой температуры ".$wrt.'°','thrm'); }
sg('myheaterror','');
} else {
say("Контрллер не подтвердил получение данных");
if ($log_level>1) { DebMes("$ot Контрллер не подтвердил получение данных",'thrm'); }
sg('myheaterror','myheat_error '.$array["err"]);
}";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 21:06:23";s:15:"EXECUTED_PARAMS";s:24:"{"waterRequiredTemp":56}";s:12:"EXECUTED_SRC";s:253:"/api.php/method/thrm_alpha.waterCalculate?PROPERTY=airCurrentTemp&NEW_VALUE=22.8&OLD_VALUE=22.9&SOURCE=/api.php/script/69?raiseEvent=1&m_c_s[0]=Livingroom.onTempChanges.882d9945277e9d36342bf6f7962e29c4&m_c_s[1]=script.69&r_s_s=1&no_session=1&raiseEve...";}}}i:3;a:6:{s:5:"TITLE";s:13:"thrm_gamma_50";s:11:"DESCRIPTION";s:34:"Электро котёл 1 дом";s:11:"LOCATION_ID";s:2:"10";s:12:"KEEP_HISTORY";s:1:"0";s:6:"SYSTEM";s:0:"";s:7:"METHODS";a:3:{i:0;a:8:{s:5:"TITLE";s:6:"turnOn";s:11:"DESCRIPTION";s:0:"";s:4:"CODE";s:59:"callMethod('MegaD3.setOutput',array('port'=>7,'value'=>1));";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-21 16:52:46";s:15:"EXECUTED_PARAMS";s:34:"{"method":"%thrm_gamma_50.turnOn"}";s:12:"EXECUTED_SRC";s:0:"";}i:1;a:8:{s:5:"TITLE";s:7:"turnOff";s:11:"DESCRIPTION";s:0:"";s:4:"CODE";s:59:"callMethod('MegaD3.setOutput',array('port'=>7,'value'=>0));";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-19 20:05:13";s:15:"EXECUTED_PARAMS";s:35:"{"method":"%thrm_gamma_50.turnOff"}";s:12:"EXECUTED_SRC";s:23:"Job: thrm_gamma_50_work";}i:2;a:8:{s:5:"TITLE";s:8:"mayBanOn";s:11:"DESCRIPTION";N;s:4:"CODE";s:141:"// уровень энергопотребления не ниже повышенного
if (gg('EconomMode.status') < 1) {
return 2;
}";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 21:34:52";s:15:"EXECUTED_PARAMS";N;s:12:"EXECUTED_SRC";s:253:"/api.php/method/thrm_gamma_50.waterCalculate?PROPERTY=airCurrentTemp&NEW_VALUE=22.8&OLD_VALUE=22.8&SOURCE=/api.php/script/69?raiseEvent=1&m_c_s[0]=Bedroom.onTempChanges.3b9960d951e9ca71357f4ffd588b4e46&m_c_s[1]=script.69&r_s_s=1&no_session=1&raiseEve...";}}}i:4;a:6:{s:5:"TITLE";s:14:"thrm_bathhouse";s:11:"DESCRIPTION";s:46:"Электрический котел Баня";s:11:"LOCATION_ID";s:2:"21";s:12:"KEEP_HISTORY";s:1:"0";s:6:"SYSTEM";s:0:"";s:7:"METHODS";a:3:{i:0;a:8:{s:5:"TITLE";s:7:"turnOff";s:11:"DESCRIPTION";s:0:"";s:4:"CODE";s:258:"say('Выключаю электрический котёл в бане');
callMethod('MegaD7.setOutput',array('port'=>28,'value'=>0));
// Проверить логику электрического котла
callMethod('thrm_gamma_100.workDecision');";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-21 16:52:46";s:15:"EXECUTED_PARAMS";s:36:"{"method":"%thrm_bathhouse.turnOff"}";s:12:"EXECUTED_SRC";s:0:"";}i:1;a:8:{s:5:"TITLE";s:6:"turnOn";s:11:"DESCRIPTION";s:0:"";s:4:"CODE";s:256:"say('Включаю электрический котёл в бане');
callMethod('MegaD7.setOutput',array('port'=>28,'value'=>1));
// Проверить логику электрического котла
callMethod('thrm_gamma_100.workDecision');";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-23 07:43:22";s:15:"EXECUTED_PARAMS";s:35:"{"method":"%thrm_bathhouse.turnOn"}";s:12:"EXECUTED_SRC";s:46:"/objects/?method=%thrm_bathhouse.workDecision&";}i:2;a:8:{s:5:"TITLE";s:8:"mayBanOn";s:11:"DESCRIPTION";N;s:4:"CODE";s:129:"// уровень энергопотребления не ниже нормы
if (gg('EconomMode.status') < 0) {
return 2;
}";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 21:35:01";s:15:"EXECUTED_PARAMS";N;s:12:"EXECUTED_SRC";s:253:"/api.php/method/thrm_bathhouse.waterCalculate?PROPERTY=airCurrentTemp&NEW_VALUE=20.4&OLD_VALUE=20.4&SOURCE=/api.php/script/82?raiseEvent=1&m_c_s[0]=ClockChimeWorker.onNewMinute&m_c_s[1]=Anteroom.onTempChanges.bfa3f0a7b99ee306f82e9fdc1f3c61b7&m_c_s[2]...";}}}i:5;a:6:{s:5:"TITLE";s:14:"thrm_gamma_100";s:11:"DESCRIPTION";s:34:"Электро котёл 2 дом";s:11:"LOCATION_ID";s:2:"10";s:12:"KEEP_HISTORY";s:1:"0";s:6:"SYSTEM";s:0:"";s:7:"METHODS";a:3:{i:0;a:8:{s:5:"TITLE";s:7:"turnOff";s:11:"DESCRIPTION";N;s:4:"CODE";s:59:"callMethod('MegaD3.setOutput',array('port'=>8,'value'=>0));";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 03:09:29";s:15:"EXECUTED_PARAMS";s:36:"{"method":"%thrm_gamma_100.turnOff"}";s:12:"EXECUTED_SRC";s:253:"/api.php/method/thrm_gamma_100.waterCalculate?PROPERTY=airCurrentTemp&NEW_VALUE=23.4&OLD_VALUE=23.3&SOURCE=/api.php/script/69?raiseEvent=1&m_c_s[0]=Bedroom.onTempChanges.e0d2916dfc05a5613466599e5f88575e&m_c_s[1]=script.69&r_s_s=1&no_session=1&raiseEv...";}i:1;a:8:{s:5:"TITLE";s:6:"turnOn";s:11:"DESCRIPTION";N;s:4:"CODE";s:59:"callMethod('MegaD3.setOutput',array('port'=>8,'value'=>1));";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 00:20:59";s:15:"EXECUTED_PARAMS";s:35:"{"method":"%thrm_gamma_100.turnOn"}";s:12:"EXECUTED_SRC";s:253:"/api.php/method/thrm_gamma_100.waterCalculate?PROPERTY=airCurrentTemp&NEW_VALUE=22.6&OLD_VALUE=22.7&SOURCE=/api.php/method/KitchenArea.onTempChanges?PROPERTY=Temperature&NEW_VALUE=21.1&OLD_VALUE=22.2&SOURCE=&raiseEvent=1&m_c_s[0]=KitchenArea.onTempCh...";}i:2;a:8:{s:5:"TITLE";s:8:"mayBanOn";s:11:"DESCRIPTION";N;s:4:"CODE";s:466:"// разрешить работу 2-ой ступени электрокотла дома только если:
// не работает электрокотел в бане или не работает большой бойлер
if (gg('thrm_bathhouse.status') && gg('RelayBoiler4.status')) {
return 2;
}
// уровень энергопотребления не ниже максимального
if (gg('EconomMode.status') < 2) {
return 2;
}";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2020-12-24 21:34:52";s:15:"EXECUTED_PARAMS";N;s:12:"EXECUTED_SRC";s:253:"/api.php/method/thrm_gamma_100.waterCalculate?PROPERTY=airCurrentTemp&NEW_VALUE=22.8&OLD_VALUE=22.8&SOURCE=/api.php/script/69?raiseEvent=1&m_c_s[0]=Bedroom.onTempChanges.3b9960d951e9ca71357f4ffd588b4e46&m_c_s[1]=script.69&r_s_s=1&no_session=1&raiseEv...";}}}}}}