Свойства класса:
Методы класса:
$s=$params['status']; if (isset($s)) { // Если некорректные данные if (($s > 6) || ($s < 0)) { return; } // Записать в свойство объекта $this->setProperty('status',$s); } else { // Для слинкованных свойств и запуска этого метода без передачи данных $s = $this->getProperty('status'); } switch ($s) { case 0: $t='Процесс завершен'; say('Завершение процесса дистилляции'); $this->setProperty('tmaxColumn', 0); $this->setProperty('tempCube', 0); $this->setProperty('tempColumn', 0); $this->setProperty('tempStartColumn', 0); $this->setProperty('startPercentCube',0); $this->setProperty('currentPercentCube',0); //sg('cycle_alcoControl','stop'); break; case 1: $t='Разогрев куба'; $this->setProperty('tmaxColumn', 0); $this->setProperty('tempCube', 0); $this->setProperty('tempColumn', 0); sg('cycle_alcoControl','start'); break; case 2: $t='Готовность к началу'; break; case 3: $t='Работа на себя'; break; case 4: $t='Отбор головных фракций'; say('Дальнейшее переключение стадий вручную', 2); break; case 5: $t='Отбор тела'; break; case 6: $t='Отбор хвостов'; break; } // Убрать задержду для следующего сообщения $this->setProperty('notifyTime',0); // для титула переключателя в меню $this->setProperty('titleStage',$t); $this->setProperty('log',date('h:m').' '.$t); if ($s) { say("Стадия $s. $t"); }
/* $p - имя датчика $s - температура $status - стадия работы $tmax - максимальная температура колонны в разных режимов + rnd для движения живого графика */ // должно быть передано имя свойства датчика // $params['tempCube'] или $params['tempColumn'] $p = key($params); $s = current($params); $status=$this->getProperty('status'); if (isset($s)) { // Если некорректные данные if (($s > 150) || ($s < 5)) { return; } // Записать в свойство объекта $s=round($s, 2); $this->setProperty($p, $s); } else { say('не передано имя свойства'); return; } /* максимальная температура колонны расчитывается при изменении температуры куба если пришли данные колонны, то читаем её из свойства */ if ($p=='tempColumn') { $tmax=($this->getProperty('tmaxColumn')); } $ot=$this->object_title; // playsound($p.'.wav'); switch ($status.$p) { /* --------- разогрев --------- */ case '1tempCube': $tmax=40; // переключить на стадию 2 при разогреве куба до 80 градусов if ($s>80) { say('Скоро начнется процесс дисциляции', 2); $this->setProperty('log',date('h:m').' Скоро начнется процесс'); $this->callMethod('statusChanged', array('status'=>2)); } break; case '1tempColumn': // переключить на стадию 2 при неожиданном росте t колонны if ($s>$tmax) { say('Неожиданный рост температуры колонны', 2); $this->setProperty('log',date('h:m').' Неожиданный рост t колонны'); $this->callMethod('statusChanged', array('status'=>2)); } break; /* --------- готовность к началу --------- */ case '2tempCube': $tmax=50; if ($s>90) { $n='Температура близка к началу процесса дисциняции'; } break; case '2tempColumn': if ($s>$tmax) { // записать температуру куба при прогреве колонны $this->setProperty('tempStartColumn', $this->getProperty('tempCube')); say('Прогрев спиртовой колонны', 2); $this->setProperty('log',date('h:m').' Прогрев колонны'); // переключить на стадию 4 через 10 минут setTimeOut($ot.'_status_Timer',"cm('$ot.statusChanged', array('status'=>4));", 10*60); // переключить на стадию 3 $this->callMethod('statusChanged', array('status'=>3)); } break; /* --------- работа на себя --------- */ case '3tempCube': $tmax=70; break; case '3tempColumn': if ($s>$tmax) { $n='Высокая температура колонны'; } break; /* --------- головы --------- */ case '4tempCube': $tmax=73; break; case '4tempColumn': if ($s>$tmax) { $n='Высокая температура колонны'; } break; /* --------- тело --------- */ case '5tempCube': // блок расчета максимальной температуры колонны $const_tColStart = 75.4; // начальная t колонны. Определена опытным путем $const_tColEnd = 77.3; // конечная t колонны. Определена опытным путем $const_tCubStart = $this->getProperty('tempStartColumn'); // записанная температура куба при подъеме колонны $const_tCubEnd = 97.8; //завершением процесса отбора тела можно считать температуру куба 97,8 градусов $const_tColLimitUp = 0.5; // дозволенный предел превышения температуры колонны $kCol = ($const_tColEnd - $const_tColStart) / ($const_tCubEnd - $const_tCubStart); // коэффициент наклона для линии колонны $tmax = $const_tColStart + $kCol*($s - $const_tCubStart) + $const_tColLimitUp; // начало /\ подъем /\ лимит /\ if ($s>$const_tCubEnd) { $n='Температура куба на стадии завершения отбора тела'; } break; case '5tempColumn': if ($s>$tmax) { $n='Высокая температура колонны'; } if ($s<$tmax-2) { $n='Низкая температура колонны'; } break; /* --------- хвосты --------- */ case '6tempCube': $tmax=max($s-15, 78); // максивальная температура колонны принимается на 15 градусов ниже куба, либо 78 градусов if ($s>99) { $n='Максимальная температура куба. Завершите процесс'; } break; case '6tempColumn': if ($s>$tmax) { $n='Высокая температура колонны'; } break; /* --------- завершить --------- */ default: return; } // рандомные данные для графика $this->setProperty('tmaxColumn', $tmax+rand(0,100)/10000); // Уведомления с пуш не чаще 1 минуты (либо нет времени последнего уведомления) if ($n) { $lastn=$this->getProperty('notifyTime'); if (time() - $lastn > 60) { // сказать say($n, 2); // лог $this->setProperty('log',date('h:m').' '.$n); // записать время уведомления $this->setProperty('notifyTime',time()); } } // на стадии >=3 и при данных t куба вычисляем процент спирта // пишем в currentPercentCube // если не startPercentCube то пишем и туда // очень примерно, но можно подогнать под свой аппарат с великолепной точностью if ($status>=3 && $p=='tempCube') { //$Ti = ( $s - 89.03 ) / 6.54; //$ob = 16.75 - 19.05 * $Ti + 12.64 * pow($Ti,2) - 3.69 * pow($Ti,3) - 0.38 * pow($Ti,4); $Ti = ( $s - 89 ) / 6.49; $ob = 17.26 - 18.32 * $Ti + 7.81 * pow($Ti,2) - 1.77 * pow($Ti,3) + 4.81 * pow($Ti,4) - 2.95 * pow($Ti,5) - 1.43 * pow($Ti,6) + 0.8 * pow($Ti,7) + 0.05 * pow($Ti,8); $ob = round($ob,1); $this->setProperty('currentPercentCube', $ob); if ($status==3 && !($this->getProperty('startPercentCube'))) { say("В кубе $ob% спирта"); $this->setProperty('startPercentCube',$s); $this->setProperty('log',date('h:m')." В кубе $ob% спирта"); } }
Свойства класса:
Методы класса:
// Может получить параметр VALUE, а если его нет, возьмет громкость из свойства volumeLevel if (isset($params['VALUE'])) { $vl=$params['VALUE']; $this->setProperty('volumeLevel',$vl); } else { $vl=$this->getProperty('volumeLevel'); } // Громкость, как и любой другой параметр, может быть передан прямо в тексте сообщения say('-volumemaster:'.$vl." Громкость ".$vl." процентов");
Свойства класса:
Методы класса:
// say('OLD_VALUE='.$params['OLD_VALUE']); // say('NEW_VALUE='.$params['NEW_VALUE']); $t=''; $p=$this->getProperty('name'); if ($params['NEW_VALUE']==0) {$t="С провайдером $p потеряно соединение";} elseif ($params['NEW_VALUE']==1 && $params['OLD_VALUE']==0) {$t="Установлено соединения c провайдером $p";} elseif ($params['NEW_VALUE']==1 && $params['OLD_VALUE']>=2) {$t="Провайдер $p не предоставляет Интернет";} elseif ($params['NEW_VALUE']==2 && $params['OLD_VALUE']<=1) {$t="Провайдер $p, Интернет предоставлен";} elseif ($params['NEW_VALUE']==3) {$t="Провайдер $p выбран главным";} if ($t) { say($t, gg(NightMode.status)?-1:0); }
Свойства класса:
Методы класса:
Свойства класса:
Свойства класса:
Методы класса:
$this->setProperty("updated",time()); $this->setProperty("updatedTime",date("Y-m-d H:i:s",time())); // Свойство alive для класса тревожных датчиков не актуально $s=$params['status']; if (isset($s)) { $this->setProperty('status',$s); } else { $s = $this->getProperty('status'); } // у датчика есть слинкованная комната и его маркер тревоги $mark = $this->getProperty('marker'); //маркер fire smoke heat toxic gas flood freeze $linked_room = $this->getProperty('LinkedRoom'); if ($mark) { if ($linked_room) { /* получить тревожную строку у слинкованной комнаты и декодировать её в массив */ $alarms = getGlobal("$linked_room.Alarms"); $alarms_old = $alarms; /* сценарий - функция для внесения изменений с строку тревог */ $alarms = runscript('editJson', array('key'=>$mark, 'val'=>$this->id, 'js'=>$alarms, 'add'=>$s)); /* записать в свойство комнаты и вызвать метод */ if ($alarms_old != $alarms) { // setGlobal("$linked_room.Alarms", $alarms); callMethod("$linked_room.onAlarms", array('Alarms'=>$alarms)); } } else { DebMes('Внимание! объект датчика '. $this->object_title.' не имеет слинкованной комнаты'); } // if_linked_room } else { DebMes('Внимание! в объекте датчика '. $this->object_title.' не указано свойство маркер'); } // if_mark
Методы класса:
$this->setProperty("updated",time()); $this->setProperty("updatedTime",date("Y-m-d H:i:s",time())); $this->setProperty("alive",1); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=12*60*60; } clearTimeOut($ot."_alive"); setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); $s=$params['status']; if (isset($s)) { // Записать в свойство объекта $this->setProperty('status',$s); } else { // Для слинкованных свойств и запуска этого метода без передачи данных, $s = $this->getProperty('status'); } /* if ($s) { } */
Свойства класса:
Методы класса:
$this->setProperty("updated",time()); $this->setProperty("updatedTime",date("Y-m-d H:i:s",time())); $this->setProperty("alive",1); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=12*60*60; } clearTimeOut($ot."_alive"); setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); $s=$params['status']; if (isset($s)) { // Записать в свойство объекта $this->setProperty('status',$s); } else { // Для слинкованных свойств и запуска этого метода без передачи данных, $s = $this->getProperty('status'); } /* if ($s) { } */
Свойства класса:
Методы класса:
$this->setProperty("updated",time()); $this->setProperty("updatedTime",date("Y-m-d H:i:s",time())); $this->setProperty("alive",1); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=12*60*60; } setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); // say('Контрольная точка пройдена'); $s=$params['status']; if (isset($s)) { // Если некорректные данные if (($s > 100) || ($s <= 0)) { return; } // Записать в свойство объекта $this->setProperty('status',$s); } else { // Для слинкованных свойств и запуска этого метода без передачи данных, взять их из свойства. $s = $this->getProperty('status'); } // Получение среднего значения из истории //Получить id свойства $prop_id=$this->getPropertyByName('status', $this->class_id, $this->id); //Получаем VALUE_ID для следующей таблицы $pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$this->id."'"); //Получаем средние значения за последние 30 минут $start_time=time()-30*60; // 30 минут $arr_s = SQLSelectOne("SELECT avg(VALUE) as AVG_V FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' AND ADDED>='".date('Y-m-d H:i:s', $start_time)."'"); $avg_s=round($arr_s['AVG_V'], 1); $s=round($s, 1); // Сравнение if ($s-$avg_s > 10) { $d=1; } elseif ($s-$avg_s < -10) { $d=-1; } else { $d=0; } $this->setProperty('direction',$d); $this->setProperty('status',$s); // Передать данные слинкованной комнате $linked_room=$this->getProperty("LinkedRoom"); if ($linked_room) { // Получение последней записи истории комнаты $obj=getObject($linked_room); $prop_id=$obj->getPropertyByName('Humidity', $obj->class_id, $obj->id); $pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$obj->id."'"); $arr_s = SQLSelectOne("SELECT UNIX_TIMESTAMP(ADDED)as ADDED, VALUE FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' ORDER BY ADDED DESC LIMIT 1"); // Обновить если прошло больше часа. При этом на графике будет горизонтальная и вертикальная линии вместо одной наклонной. if (time()-$arr_s['ADDED'] > 60*60) { setGlobal($linked_room.'.Humidity', $arr_s['VALUE']); } // Записать новое значение setGlobal($linked_room.'.Humidity', $s); }
Свойства класса:
Методы класса:
$this->setProperty("updated",time()); $this->setProperty("updatedTime",date("Y-m-d H:i:s",time())); $this->setProperty("alive",1); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=6*60*60; } setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); // say('Контрольная точка пройдена'); $s=$params['status']; if (isset($s)) { // Если некорректные данные if (($s > 65535) || ($s < 0)) { return; } // Записать в свойство объекта $this->setProperty('status',$s); } else { // Для слинкованных свойств и запуска этого метода без передачи данных, взять их из свойства. $s = $this->getProperty('status'); } //debmes('Свет '.$this->object_title.' получено '.$s); // Передать данные слинкованной комнате $linked_room=$this->getProperty('LinkedRoom'); if ($linked_room) { // Для этого датчика слинкованой комнате передавать усредненное значение // эффективно при большом разбросе показаний датчика if ($ot=='ls_driveway') { // Определить период усреднения // чем ниже показания датчика, тем больше период усреднения, чтобы исключить большие скочки у нуля switch ($s) { case 0: $avgtime=26; break; case $s<10: $avgtime=21; break; case $s<20: $avgtime=16; break; case $s<50: $avgtime=11; break; case $s<100: $avgtime=6; break; default: $avgtime=0; } //$avgtime=1; // Получение среднего значения из истории if ($avgtime) { //Получить id свойства $pvalueid = getHistoryValueId("$ot.status"); //Получаем средние значение за требуемый период $start_time=time()-$avgtime*60; //$arr_s = SQLSelectOne("SELECT avg(VALUE) as AVG_V FROM phistory WHERE VALUE_ID=$pvalueid AND ADDED>='".date('Y-m-d H:i:s', $start_time)."'"); $arr_s = SQLSelect("SELECT VALUE FROM phistory WHERE VALUE_ID=$pvalueid AND ADDED>='".date('Y-m-d H:i:s', $start_time)."'"); //Среднее значение округлить до целых если в ответе есть данные if ($arr_s!==[]) { //echo 'SQL массив <br/>'; //print_r($arr_s); // в ответе масив массивов. нам нужено получить простой массив значений //$arr_s=array_column($arr_s, 'VALUE'); // работает с php версии 5.5.0 У меня сейчас 5.4 // альтернативный вариант функции array_column function array_column_alt($arr_u) { return $arr_u['VALUE']; } $arr_s = array_map('array_column_alt', $arr_s); // добавить в массив текущее значение // $arr_s[]=array("VALUE"=>$s); // массив уже приведен к простому $arr_s[]=$s; //echo 'МОЙ массив <br/>'; //print_r($arr_s); //debmes('Свет '.$this->object_title.' array_sum($arr_s)='.array_sum($arr_s).'count($arr_s)='.count($arr_s)); // avg $s=array_sum($arr_s)/count($arr_s); $s=round($s, 0); } //else { debmes('Свет '.$this->object_title.' Пустой массив'); } } } //debmes('Свет '.$this->object_title.' отправлено '.$s); // Передать комнате setGlobal($linked_room.'.Luminiscence', $s); }
Свойства класса:
Методы класса:
$this->setProperty("updated",time()); $this->setProperty("updatedTime",date("Y-m-d H:i:s",time())); $this->setProperty("alive",1); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=7*24*60*60; } setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); //say('Контрольная точка пройдена'); $s=$params['status']; if (isset($s)) { // Записать в свойство объекта $this->setProperty('status',$s); } else { // Для слинкованных свойств и запуска этого метода без передачи данных, взять их из свойства. $s = $this->getProperty('status'); } // Передать данные слинкованной комнате $linked_room=$this->getProperty("LinkedRoom"); if ($linked_room) { cm($linked_room.'.onActivity'); }
Свойства класса:
Методы класса:
$this->setProperty("updated",time()); $this->setProperty("updatedTime",date("Y-m-d H:i:s",time())); $this->setProperty("alive",1); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=12*60*60; } clearTimeOut($ot."_alive"); setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); $s=$params['status']; if (isset($s)) { // Записать в свойство объекта $this->setProperty('status',$s); } else { // Для слинкованных свойств и запуска этого метода без передачи данных, $s = $this->getProperty('status'); } /* if ($s) { } */
Свойства класса:
Методы класса:
$this->setProperty("updated",time()); $this->setProperty("updatedTime",date("Y-m-d H:i:s",time())); $this->setProperty("alive",1); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=12*60*60; } setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); //say('Контрольная точка пройдена'); // Получение среднего значения из истории //Получить id свойства $prop_id=$this->getPropertyByName('status', $this->class_id, $this->id); //Получаем VALUE_ID для следующей таблицы $pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$this->id."'"); //Получаем средние значения температуры за последние 30 минут $start_time=time()-30*60; // 30 минут $arr_s = SQLSelectOne("SELECT avg(VALUE) as AVG_V FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' AND ADDED>='".date('Y-m-d H:i:s', $start_time)."'"); $avg_s=round($arr_s['AVG_V'], 1); $s=$params['status']; if (isset($s)) { // Если некорректные данные if (($s > 50) || ($s < -50)) { return; } // Записать в свойство объекта $this->setProperty('status',$s); } else { // Для слинкованных свойств и запуска этого метода без передачи данных, взять их из свойства. $s = $this->getProperty('status'); } $s=round($s, 1); // Сравнение if ($s-$avg_s > 0.5) { $d=1; } elseif ($s-$avg_s < -0.5) { $d=-1; } else { $d=0; } $this->setProperty('direction',$d); // Передать данные слинкованной комнате $linked_room=$this->getProperty("LinkedRoom"); if ($linked_room) { // Если НЕ задано свойство distance, то датчик считается главным, и его данные обязательно будут переданы оъекту комнаты. // Иначе будет проведен поиск других живых датчиков с более короткой дистанцией. if (!$this->getProperty('distance')) { setGlobal($linked_room.'.Temperature', $s); } else { // Получить id свойства для работы с базой данных $alive_pid=$this->getPropertyByName('alive', $this->class_id, $this->id); $distance_pid=$this->getPropertyByName('distance', $this->class_id, $this->id); $LinkedRoom_pid=$this->getPropertyByName('LinkedRoom', $this->class_id, $this->id); $arr_s = SQLSelectOne(" SELECT VALUE FROM pvalues WHERE PROPERTY_ID = ".$distance_pid." AND OBJECT_ID IN ( SELECT OBJECT_ID FROM pvalues WHERE PROPERTY_ID = ".$LinkedRoom_pid." AND VALUE = '".$linked_room."' AND OBJECT_ID NOT IN ( SELECT OBJECT_ID FROM pvalues WHERE PROPERTY_ID = ".$alive_pid." AND VALUE = 0 ) ) ORDER BY VALUE LIMIT 1 "); //Если не найдено других живых датчиков с более короткой дистанцией if ($this->getProperty('distance') <= $arr_s['VALUE']) { setGlobal($linked_room.'.Temperature', $s); //say('Переданы данные с резервного датчика'); } } }
Свойства класса:
Методы класса:
$this->setProperty("updated",time()); $this->setProperty("updatedTime",date("Y-m-d H:i:s",time())); $this->setProperty("alive",1); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=12*60*60; } setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); //say('Контрольная точка пройдена'); // Получение среднего значения из истории //Получить id свойства $prop_id=$this->getPropertyByName('status', $this->class_id, $this->id); //Получаем VALUE_ID для следующей таблицы $pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$this->id."'"); //Получаем средние значения температуры за последние 30 минут $start_time=time()-30*60; // 30 минут $arr_s = SQLSelectOne("SELECT avg(VALUE) as AVG_V FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' AND ADDED>='".date('Y-m-d H:i:s', $start_time)."'"); $avg_s=round($arr_s['AVG_V'], 1); $s=$params['status']; if (isset($s)) { // Если некорректные данные if (($s > 120) || ($s < -50)) { return; } // Записать в свойство объекта $this->setProperty('status',$s); } else { // Для слинкованных свойств и запуска этого метода без передачи данных, взять их из свойства. $s = $this->getProperty('status'); } $s=round($s, 2); // Сравнение if ($s-$avg_s > 0.3) { $d=1; } elseif ($s-$avg_s < -0.3) { $d=-1; } else { $d=0; } $this->setProperty('direction',$d);
Свойства класса:
Методы класса:
/* Общий код метода: Установка статуса alive "Живой" Запуск метода activate при первом отклике */ $reclog = 1; // Писать логи отладки ( 0-нет, 1-только крит, 2-все ) $ot = $this->object_title; if ($reclog > 1) { debmes('Megad class log => incomingMessage method: received params '.serialize($params)); } // Безусловная установка флага "Живой" т.к. метод был вызван самой мегой, или методом getData при успешном ответе if ($this->getProperty('alive') <> 1) { if ($reclog) { debmes('Megad class log => incomingMessage method: previous alive value 0. Received params '.serialize($params)); } say("Мега $ot ответила",2); $this->callMethod('activate'); } $this->setProperty('alive', 1);
// Expects 'output' and 'value' in $params $reclog = 1; // Писать логи отладки ( 0-нет, 1-только крит, 2-все ) // Открывает лог если нужно if ($reclog) { $log = getLogger($this); } if (isset($params['command'])) { $cmd = $params['command']; } else { $cmd = intval($params['port']).':'.intval($params['value']); } /* $cmdUrl = sprintf('http://%s/%s/?cmd=%d:%d', $this->getProperty('IpAddress'), $this->getProperty('Password'), intval($params['port']), intval($params['value'])); */ $cmdUrl = sprintf('http://%s/%s/?cmd=%s', $this->getProperty('IpAddress'), $this->getProperty('Password'), $cmd); // Запись данных в лог if ($reclog == 2) { $log->trace('setOutput method: '.$cmdUrl); } getURL($cmdUrl, 0);
/* Варианты что можно спросить callMethod('MegaD99.getData', array('port'=>'all')); // спросить сразу все. callMethod('MegaD99.getData', array('port'=>0)); // состояние первого порта callMethod('MegaD99.getData', array('port'=>'tget')); // показания встроенного температурного датчика (только для версии прошивки 3.25 и до 3.52 не вкл) callMethod('MegaD99.getData', array('port'=>2, 'cmd'=>'list')); // получить массив 1WireBUS датчиков с порта 2 */ $reclog = 1; // Писать логи отладки ( 0-нет, 1-только крит, 2-все ) $ot = $this->object_title; // Проверка что есть ip адрес if (!filter_var($this->getProperty('IpAddress'), FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { if ($reclog) { debmes('Megad class error => ip address is not set for object '.$ot); } return; } // Проверка что есть пароль if (!$this->getProperty('Password')) { if ($reclog) { debmes('Megad class error => Password is not set for object '.$ot); } return; } // Сборка строки начала запроса для Меги $cmdUrl = sprintf("http://%s/%s/", $this->getProperty('IpAddress'), $this->getProperty('Password')); // Добавление дополнительных параметров запроса в зависимости от его типа switch (strval($params['port'])) { case 'tget': // Температура встроенного датчика $cmdUrl .= '?tget=1'; $ta = 1; break; case 'all': // Спросить сразу все $cmdUrl .= '?cmd=all'; $ta = 3; //Таймаут ожидания меги break; default: // Состояние указанного порта //$cmdUrl .= sprintf("?pt=%d&cmd=get", intval($params['port'])); $cmdUrl .= '?pt='.intval($params['port']); if (!isset($params['cmd'])) { $params['cmd']='get'; } $cmdUrl .= '&cmd='.$params['cmd']; $ta = 3; } // формирование массива параметров для запроса $ctx = stream_context_create(array( 'http' => array('timeout'=>$ta) ) ); // запрос данных у Меги $dt = file_get_contents($cmdUrl, 0, $ctx); // Повторный запрос при отсутствии ответа if ($dt===false) { say("Повторный запрос у Меги $ot",0); $dt = file_get_contents($cmdUrl, 0, $ctx); } // При отсутствии ответа установить флаг "НеЖивой" и завершить работу if ($dt===false) { $this->setProperty('alive',0); if ($reclog) { debmes("Megad class log => getData method: No response from $cmdUrl"); } say("Мега $ot не отвечает",2); return; } // возможно были лишние пробелы. до проверки условия $dt===false удалять нельзя. $dt = trim($dt); // Запись данных в лог if ($reclog > 1) { debmes(sprintf('Megad class log => getData method: %s returned %s', $cmdUrl, $dt)); } // Обработка ответа в зависимости от его типа, и передача его в метод incomingMessage // В методе incomingMessage безусловно будет установлен флаг "Живой" т.к. метод может быть вызван и самой мегой switch (strval($params['port'])) { // Температура внутреннего датчика case 'tget': if (strlen($dt)) { // Проверить $dt на число и Записать в свойство объекта // в 2561 мегах больше нет датчика температуры. Новые прошивки 328-х тоже больше не отвечают на tget // поэтому периодическим опросом мег мы можем только убедиться, что она отвечает (живая) if (is_numeric($dt)) { //записать в свойство температуру мени если в ответе число $this->setProperty('temperature', $dt); } elseif (stripos($dt, 'MegaD-328') !== false) { if ($reclog > 2) { debmes('Megad class log => getData method: Does not report temperature for object '.$ot); } } elseif (stripos($dt, 'MegaD-2561') !== false) { if ($reclog > 2) { debmes('Megad class log => getData method: Does not report temperature for object '.$ot); } } else { if ($reclog) { debmes('Megad class error => getData method: Failed to get data internal temperature sensor for object '.$ot); } } } // Нужно вызнать родительский метод для установки флага живой // в методах класса реакция на $params['port'] = 'tget' пропускается // Запретить выполнение кода методов объектов никак $this->callMethod('incomingMessage', array('pt'=>$params['port'], 'iasked'=>'ping')); break; // Запустить метод incomingMessage с передачей всего ответа в параметре all case 'all': $this->callMethod('incomingMessage', array('all'=>$dt)); break; // Запустить метод incomingMessage с передачей параметров как есть в параметре 'iasked' с номером указанного порта в параметре 'pt' default: $this->callMethod('incomingMessage', array('pt'=>$params['port'], 'iasked'=>$dt)); }
/* Варианты что можно спросить callMethod('MegaD3.sendCommand', array('params'=>'pt=0&cmd=get&cnt=0')); // Сбросить счетчик импульсов. */ $reclog = 1; // Писать логи отладки ( 0-нет, 1-только крит, 2-все ) $ot = $this->object_title; // Проверка что есть ip адрес if (!filter_var($this->getProperty('IpAddress'), FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { if ($reclog) { debmes('Megad class error => ip address is not set for object '.$ot); } return; } // Проверка что есть пароль if (!$this->getProperty('Password')) { if ($reclog) { debmes('Megad class error => Password is not set for object '.$ot); } return; } // Сборка строки начала запроса для Меги $cmdUrl = sprintf("http://%s/%s/?%s", $this->getProperty('IpAddress'), $this->getProperty('Password'), strval($params['params'])); // запрос данных у Меги $ta = 2; //секунд $ctx = stream_context_create(array( 'http' => array('timeout'=>$ta) ) ); $dt = trim(file_get_contents($cmdUrl, 0, $ctx)); // Живой или При отсутствии ответа установить флаг "НеЖивой" // Запись данных в лог if (isset($dt)) { $this->setProperty('alive',1); if ($reclog > 1) { debmes(sprintf('Megad class log => sendCommand method: %s returned %s', $cmdUrl, $dt)); } } else { $this->setProperty('alive',0); if ($reclog) { debmes("Megad class log => sendCommand method: No response from $cmdUrl"); } }
$ot = $this->object_title; say("Мега $ot включилась");
Свойства класса:
Методы класса:
/* Объекты могут быть двух типов. 1 Переключатель - имеет только один настраиваемый метод modeChanged. Свойство Status указывает на режим. 2 Выключатель - имеет настраиваемые методы activate и deactivate. Свойство Status может быть = 0 или 1. Оба типа существуют одновременно. Для изменения вызов метода modeChanged с указанием параметра status; либо линком (установкой) status и вызовом modeChanged без папаметров. Для типа Выключатель можно сразу просто вызывать методы activate и deactivate. */ $s=$params['status']; if (isset($s)) { // Записать в свойство объекта при его передаче в параметре $this->setProperty('status',$s); } else { // Для слинкованных свойств наоборот взять значение из объекта $s = $this->getProperty('status'); } // Вызов метода if ($s) { $this->callMethod('activate'); } else { $this->callMethod('deactivate'); }
$this->setProperty("updated",time()); $this->setProperty("updatedTime",date('H:i')); // Для типа Выключатель записать в свойство status единицу, если там был ноль // Для типа Переключатель в этом методе нет смысла, но он всё равно будет вызван из общего кода метода, // при этом в статусе полюбому будет что то отличное от нуля, и изменений не будет. if (!$this->getProperty('status')) { $this->setProperty('status',1); }
$this->setProperty("updated",time()); $this->setProperty("updatedTime",date('H:i')); //Единственное возможное новое значение свойства status при вызове этого метода $this->setProperty('status',0);
Свойства класса:
Методы класса:
$status=$this->getProperty('status'); if ($status) { $this->callMethod('turnOn'); } else { $this->callMethod('turnOff'); }
$status=$this->getProperty("status"); if ($status) { $this->callMethod('turnOff'); } else { $this->callMethod('turnOn'); }
//debmes($this->object_title.'turnOn', 'relays'); $this->setProperty('status', 1); $a=$this->getProperty('modeSwitch') ; if (is_numeric($a) && $a==0) { $this->setProperty('modeSwitch', 1); }
say('Запуск старого метода '.$this->object_title);
//$ot=$this->object_title; $this->callMethod("turnOn"); //setTimeOut($ot."_click","cm('".$ot.".turnOff');",2); $this->callMethod("turnOff");
/* вкл/выкл реле если modeSwitch число и = 0, 1, >=2 и существует таймер При этом передать указания для отмены кода личного метода. Родительский код вернет в ответе 3, если решение принято им на основании modeSwitch и таймеров, или вернет 2. Код метода объекта перезапишет на 1, если он существует. т.е. ответ логики: 3 - если modeSwitch = 0; 1; >=2 и есть таймер 2 - если нет логики объекта и родительский код не принял решение 1 - есть логика в объекте Стоит обратить внимание, что echo добавляет текст в начало ответа. */ global $do_not_execute_object_method; //ToTest $ms=$this->getProperty('modeSwitch'); if (is_numeric($ms)) { if ($ms==0) { $f=0; } elseif ($ms==1) { $f=1; } elseif ($ms>=2) { $ot = $this->object_title; // вкл/выкл при существовании таймера if (timeOutExists($ot.'_work')) { $f=1; } if (timeOutExists($ot.'_nowork')) { $f=0; } } if (isset($f)) { // переключить реле $s=$this->getProperty('status'); if ($f>$s) { $this->callMethod('turnOn'); } if ($f<$s) { $this->callMethod('turnOff'); } // запретить выполнение кода метода объекта $do_not_execute_object_method=true; return 3; } } // решение на усмотрение метода объекта при его наличии $do_not_execute_object_method=false; return 2; // если метод объекта есть, он перезапишет на 1
// debmes($this->object_title.'turnOff', 'relays'); $this->setProperty('status', 0); if ($this->getProperty('modeSwitch') == 1) { $this->setProperty('modeSwitch', 0); }
Свойства класса:
Методы класса:
$latestActivity=$this->getProperty('LatestActivity'); $this->setProperty('LatestActivity',time()); $this->setProperty('LatestActivityTime',date('H:i')); $ot=$this->object_title; /* В свойстве msAlarmLeven нужно указать цифры соответствующих режимов на которые будет реагировать объект комнаты Группа условий сработает на первой максимальной цифре, указанной в свойстве msAlarmLeven. К примеру при GuardMode.status=3 и msAlarmLeven = 12, стаботает группа 2, и выполнение кода закончится. GuardMode.status=2 и msAlarmLeven = 12, стаботает группа 2, и выполнение кода закончится. GuardMode.status=1 и msAlarmLeven = 12, стаботает группа 1. GuardMode.status=3 и msAlarmLeven = 3, стаботает группа 3. Других вариантов срабатывания нет. msAlarmLeven: 0- Пищалка 1- Сообщение о движении только в чате 2- Чат и голос 3- Тревога GuardMode.status: 0- Отключить все уведомления и сообщения (в данный момент к выбору не предложено, но технически возвожно) 1- Снят с охраны 2- Наблюдение за перриметром 3- Охрана объекта */ /* Активность будет регистрироваться каждый раз при срабатывании датчика Для уменьшения числа срабатываний можно сравнивать $latestActivity с time() На сценах можно использовать условие time() - LatestActivity <= 10 секунд например say('есть активность '.$this->getProperty("inRoomText"), 1); */ // Работать только при первом обнаружении активности if (!$this->getProperty('SomebodyHere')) { $al = $this->getProperty('msAlarmLeven'); // Обратите внимание на break; Он сработает только если выполенно условие if. Иначе выполнение кода групп case продолжится. switch (gg('GuardMode.status')) { case 3: /*** добавить тревогу security в свойство общих тревог и вызвать сценарий ***/ if (strpos($al, '3') !== false) { // получить строку общих тревог $gal = getGlobal('globalAlarms'); $gal_old = $gal; // сценарий - функция для внесения изменений в строку тревог $gal = runscript('editJson', array('key'=>'security', 'val'=>$this->id, 'js'=>$gal)); // вызвать сценарий с передачей параметра if ($gal_old != $gal) { runScript('generalAlarms', array('alarms'=>$gal)); } break; } case 2: /*** кричалка при движении в режиме охраны периметра ***/ if (strpos($al, '2') !== false) { say ('Внимание, активность '.$this->getProperty('inRoomText'), (gg('GuestsMode.status'))?2:3); break; } case 1: if (strpos($al, '1') !== false) { // Написать в чат say('Активность '.$this->getProperty("inRoomText"), -1); } if (strpos($al, '0') !== false) { // Пищалка при активности. В папке sounds должен быть wav файл с именем объекта класса ROOMS // если у объекта присутствует 0 в свойстве msAlarmLeven playSound($ot.'.wav'); } } } /* Установить (отодвинуть) таймер активности в комнате. Свойство объекта комнаты класса Rooms может быть не задано вовсе, тогда таймаут активности будет принят как 10 минут. Задано простым числом, или задано последовательностью из 5 чисел, разделенных ; для разных режимов работы энергопотребления */ $idl = $this->getProperty("IdleDelay"); if (strpos($idl, ';')) { $activity_timeout=explode(";", $idl); $activity_timeout= $activity_timeout[(int)gg('EconomMode.status')+2]; } elseif ($idl) { $activity_timeout=(int)$idl; } else { $activity_timeout=10*60; } setTimeOut($ot."_activity_timeout", "callMethod('$ot.onIdle');", $activity_timeout); // Только при первой активности if (!$this->getProperty('SomebodyHere')) { /* Установить активность в комнате */ $this->setProperty('SomebodyHere',1); /* Декативировать режим "Никого нет" В этом методе возможна только деактивация режима Решение об активации режима будет принято в методе onIdle после перебора всех комнат */ switch ($this->location_id) { case 1: if (gg('NobodyHomeMode.status')) { debmes('RVC => ROOMS-onActivity => Активность '.$this->getProperty("inRoomText"). '. Деактивация режима'); cm('NobodyHomeMode.deactivate'); } break; case 2: if (gg('NobodyBathMode.status')) { debmes('RVC => ROOMS-onActivity => Активность '.$this->getProperty("inRoomText"). '. Деактивация режима'); cm('NobodyBathMode.deactivate'); } break; } }
$this->setProperty('SomebodyHere',0); // Определяем метод по лакации // 2-баня 1-дом switch ($this->location_id) { case 1: $ot='NobodyHomeMode'; break; case 2: $ot='NobodyBathMode'; break; default: $ot=0; } // Перебор объектов комнат если наша локация if ($ot) { $objects=getObjectsByClass('Rooms'); foreach($objects as $obj) { $obj=getObject($obj['TITLE']); echo '<br />'.$obj->object_title.' '.$obj->location_id.' '.$obj->getProperty('SomebodyHere'); // Если есть активность, сбросить метод и завершить цикл if ($obj->getProperty('SomebodyHere')) { // локация перебираемого оьъекта = текущему оьъекту if ($obj->location_id==$this->location_id) { $ot=0; break; } } } } // Условие активации метода if ($ot ) { if (!gg("$ot.status")) { cm("$ot.activate"); } }
say('Это случилось'); /* $rooms=getObjectsByClass("Rooms"); $total=count($rooms); for($i=0;$i<$total;$i++) { $rooms[$i]['room']=getGlobal($rooms[$i]['TITLE'].'.Title'); if (!$rooms[$i]['room']) { $rooms[$i]['room']=$rooms[$i]['TITLE']; } $rooms[$i]['active']=getGlobal($rooms[$i]['TITLE'].'.SomebodyHere'); $rooms[$i]['time']=getGlobal($rooms[$i]['TITLE'].'.LatestActivity'); $rooms[$i]['diff']=time()-$rooms[$i]['time']; } function cmp($a, $b) { if ($a['diff'] == $b['diff']) { return 0; } return ($a['diff'] < $b['diff']) ? -1 : 1; } usort($rooms,"cmp"); if (!$rooms[0]['active']) { $somebodyHomeText="Никого нет дома. Были в ".date('H:i',$rooms[0]['time'])." (".$rooms[0]['room'].")"; } else { $res_rooms=array(); for($i=0;$i<$total;$i++) { if ($rooms[$i]['active']) { $res_rooms[]=$rooms[$i]['room']; } } $somebodyHomeText="Кто-то дома: ".implode(", ",$res_rooms); } setGlobal('somebodyHomeText',$somebodyHomeText); */ /* begin injection of {SDevices} */ //require(DIR_MODULES.'devices/Rooms_updateActivityStatus.php'); /* end injection of {SDevices} */
$al = $params['Alarms']; if (isset($al)) { // Записать в свойство объекта $this->setProperty('Alarms',$al); } else { // Для слинкованных свойств и запуска этого метода без передачи данных, $al = $this->getProperty('Alarms'); } //$al - тревоги комнаты $alarms - общие $alarms = getGlobal('globalAlarms'); $alarms_old = $alarms; $alarmsKeys = (array)array_keys(json_decode($alarms, true)); $alKeys = (array)array_keys(json_decode($al, true)); /* callMethod('as_drivewayArea_freeze1.statusChanged', array('status'=>1)); 1.1 вычесть из ключей глобала ключи комнаты 1.2 попытаться удалить из ключей глобала эту разничу т.е. всё что нет у нас, но с нашим id 2 просто добавить в глобал все что у нас есть c нашим id */ /* сценарий - функция для внесения изменений с строку тревог */ $alarms = runscript('editJson', array('key'=>array_values(array_diff($alarmsKeys, $alKeys)), 'val'=>$this->id, 'js'=>$alarms, 'add'=>0)); $alarms = runscript('editJson', array('key'=>$alKeys, 'val'=>$this->id, 'js'=>$alarms, 'add'=>1)); //debMes("тревоги комнаты $al общие было $alarms_old общие стало $alarms"); /* записать в общее свойство тревоги и вызвать сценарий */ if ($alarms_old != $alarms) { // setGlobal('globalAlarms', $alarms); runScript('generalAlarms', array('alarms'=>$alarms)); }
Свойства класса:
Методы класса:
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SDevices_setUpdatedText.php'); /* end injection of {SDevices} */
require(DIR_MODULES.'devices/SDevices_logicAction.php');
require(DIR_MODULES.'devices/SDevices_statusUpdated.php');
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SDevices_keepAlive.php'); /* end injection of {SDevices} */
Свойства класса:
Методы класса:
require(DIR_MODULES.'devices/SButtons_pressed.php');
Свойства класса:
Методы класса:
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SCameras_motionDetected.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SCameras_updatePreview.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SCameras_takeSnapshot.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SCameras_takeSeries.php'); /* end injection of {SDevices} */
Свойства класса:
Методы класса:
require(DIR_MODULES.'devices/SControllers_turnOn.php');
require(DIR_MODULES.'devices/SControllers_turnOff.php');
require(DIR_MODULES.'devices/SControllers_switch.php');
Свойства класса:
Методы класса:
require(DIR_MODULES.'devices/SDimmers_levelUpdated.php');
require(DIR_MODULES.'devices/SDimmers_turnOn.php');
require(DIR_MODULES.'devices/SDimmers_turnOff.php');
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SDimmers_setLevel.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SDimmers_statusUpdated.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SDimmers_levelWorkUpdated.php'); /* end injection of {SDevices} */
Свойства класса:
Методы класса:
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SGroups_turnOn.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SGroups_statusUpdated.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SGroups_switch.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SGroups_turnOff.php'); /* end injection of {SDevices} */
Свойства класса:
Методы класса:
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SRGB_colorUpdated.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SRGB_setColor.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SRGB_turnOn.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SRGB_turnOff.php'); /* end injection of {SDevices} */
Свойства класса:
Методы класса:
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SThermostats_setTargetTemperature.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SThermostats_valueUpdated.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SThermostats_statusUpdated.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SThermostats_tempUp.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SThermostats_tempDown.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SThermostats_switchEnable.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SThermostats_enable.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ //require(DIR_MODULES.'devices/SThermostats_disable.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SThermostats_turnOn.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SThermostats_turnOff.php'); /* end injection of {SDevices} */
Свойства класса:
Методы класса:
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SCounters_valueUpdated.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SCounters_valueWorkUpdated.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SCounters_refreshStats.php'); /* end injection of {SDevices} */
Свойства класса:
Свойства класса:
Методы класса:
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SLeak_statusUpdated.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SLeak_alert.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SLeak_blockSensor.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SLeak_unblockSensor.php'); /* end injection of {SDevices} */
Свойства класса:
Методы класса:
require(DIR_MODULES.'devices/SMotions_motionDetected.php');
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SMotions_blockSensor.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SMotions_unblockSensor.php'); /* end injection of {SDevices} */
Свойства класса:
Методы класса:
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SOpenable_statusUpdated.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SOpenable_switch.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SOpenable_open.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SOpenable_close.php'); /* end injection of {SDevices} */
Свойства класса:
Методы класса:
require(DIR_MODULES.'devices/SOpenClose_statusUpdated.php');
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SOpenClose_blockSensor.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SOpenClose_unblockSensor.php'); /* end injection of {SDevices} */
Свойства класса:
Методы класса:
require(DIR_MODULES.'devices/SSensors_valueUpdated.php');
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SSensors_alert.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SSensors_blockSensor.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SSensors_unblockSensor.php'); /* end injection of {SDevices} */
Свойства класса:
Свойства класса:
Свойства класса:
Методы класса:
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SPowerSensors_valueUpdated.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SPowerSensors_loadStatusChanged.php'); /* end injection of {SDevices} */
Свойства класса:
Методы класса:
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SSmoke_statusUpdated.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SSmoke_alert.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SSmoke_blockSensor.php'); /* end injection of {SDevices} */
/* begin injection of {SDevices} */ require(DIR_MODULES.'devices/SSmoke_unblockSensor.php'); /* end injection of {SDevices} */
Свойства класса:
Методы класса:
Свойства класса:
Методы класса:
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'); }
/* Расчет целевой температуры воздуха в зависимости от времени суток В результате записывается свойство с историей 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 подачи воды $ast=$this->getProperty('airShiftTemp'); $this->setProperty('airShiftTemp', $t_desire); if ($ast <> $t_desire) { $this->callMethod('waterCalculate', array('airShiftTemp'=>$t_desire)); }
/* Расчет требуемой температуры подачи по ПЗА Учитывается уличная температура, скорость ветра, яркость солнца Коэффициенты влияния этих факторов указаны в коде */ 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 до 20 м*с. Максимальная корректировка на 40% при 20м/сек //$Tp+=$Tp*25/100 * min(max(gg('weather_now.windSpeed')/10,0),1)**3; $Tp+=$Tp*40/100 * min(max( gg('weather_now.windSpeed')/10/2 ,0),1); 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 { $pzat=$this->getProperty('pzaTemp'); $this->setProperty('pzaTemp', $Tp); if ($pzat<>$Tp) { $this->callMethod('waterCalculate', array('pzaTemp'=>$Tp)); } }
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'); }
/* Расчет температуры подачи если фактическая температура воздуха +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'); } // подумать когда и при каких условиях вызывать чтобы сократить выполнение кода $this->callMethod('workDecision'); // ToDo workDecision может возвращать статус в ответе if ($this->getProperty('status') == 0) { return; } // температура по ПАЗ 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)**3,0),2); $wrt=round($wrt); } // предельные температуры подачи и значения по умолчанию $waterMaxTemp = $this->getProperty('waterMaxTemp'); $waterMinTemp = $this->getProperty('waterMinTemp'); if (!is_numeric($waterMaxTemp)) {$waterMaxTemp = 75;} if (!is_numeric($waterMinTemp)) {$waterMinTemp = 10;} $wrt = max($wrt,$waterMinTemp); $wrt = min($wrt,$waterMaxTemp); 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)); }
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');
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'); // ToDo Решение о записи логов пока не принято // $this->setProperty('log','включаю устройство');
/* Вызывается когда меняется текущая или расчетная температура подачи, при разнице температур запускает на некоторое время мотор сервопривода в нужную сторону. по размеру разницы можно устанавливать время работы привода. */ 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'); }
// Вызывается когда меняется текущая или расчетная температура подачи, // передает другому объекту или агрегату расчетную температуру подачи. 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'); }
/* Принимает решение о работе котла или насоса, на основе текущей и требуемой температуры воздуха Запускается из метода 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; } /* Получить значение метода, запрещающего работу. В некоторых ситуациях необходимо запретить работу. Например, в данный момент у нас работает бойлер нагрева горячей воды, и предел допустимой мощности не позвоняет включить электрический. */ $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;} // Сбор данных $s = $this->getProperty('status'); $t = $this->getProperty('Title'); $n = $this->object_title; $t_desire = $this->getProperty('airShiftTemp'); $waterCurrentTemp = $this->getProperty('waterCurrentTemp'); $airCurrentTemp = $this->getProperty('airCurrentTemp'); // гистерезис и значение по умолчанию $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;} /* $waterCurrentTemp есть не у всех котлов, и может быть пуста, но в условиях она участвует. Следует момнить, что пустота всегда меньше любово числа. */ if ($s) { // бан ИЛИ t подачи больше макс ИЛИ (текущая t воздуха > заблаговременной требуемой + гистерезис И !таймер) if ($mayBanOn || $waterCurrentTemp > $waterMaxTemp || ($airCurrentTemp > $t_desire + $hyst && !timeOutExists($n.'_work'))) { $this->callMethod('turnOff'); } } else { // !бан И t подачи меньше макс И !таймер И // (t подачи меньше мин ИЛИ текущая t воздуха < заблаговременной требуемой - гистерезис) if (!$mayBanOn && $waterCurrentTemp < $waterMaxTemp && !timeOutExists($n.'_nowork') && ( (is_numeric($waterCurrentTemp) && $waterCurrentTemp < $waterMinTemp) || $airCurrentTemp < $t_desire - $hyst ) ) { $this->callMethod('turnOn'); } }
Свойства класса:
Методы класса:
$this->setProperty("updated",time()); $this->setProperty("updatedTime",date("H:i",time())); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=1*60*60; } setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); $cmdUrl = $this->getProperty("ipAddress"); if (!$cmdUrl) { return; } $cmdUrl = 'http://'.$cmdUrl; $ctx = stream_context_create(array( 'http' => array('timeout'=>1) ) ); $state = file_get_contents($cmdUrl, 0, $ctx); if (!$state) { $this->setProperty("alive",0); return; } $this->setProperty("alive",1); $value = explode('</br>',$state); // Report - 04.01.2015 14:02:18 $value[0] = substr($value[0],17,18); // I/P Voltage = 217.5 V $value[2] = substr($value[2],16,5); // I/P Fault Voltage = 217.5 V $value[3] = substr($value[3],22,5); // O/P Voltage = 217.5 V $value[4] = substr($value[4],16,5); // O/P Current = 015 % $value[5] = substr($value[5],16,3); // I/P Frequency = 50.0 Hz $value[6] = substr($value[6],18,4); // Battery Voltage = 0108 V $value[7] = substr($value[7],20,4); // Temperature = 53.2 °C $value[8] = trim(substr($value[8],16,5)); // UPS Status = 00001001 $value[9] = substr($value[9],15,8); /* battery.voltage - battery.voltage.low battery.charge = ------------------------------------------ x 100 % battery.voltage.high - battery.voltage.low */ $bh = gg('UPS.batVoltHigh'); $bl = gg('UPS.batVoltLow'); $bc = round( ($value[7] - $bl) / ($bh - $bl) *100 ); $this->setProperty('measurTime',$value[0]); $this->setProperty('inVoltage',$value[2]); $this->setProperty('faultVoltage',$value[3]); $this->setProperty('outVoltage',$value[4]); $this->setProperty('load',$value[5]); $this->setProperty('Frequency',$value[6]); $this->setProperty('batVoltage',$value[7]); $this->setProperty('inTemp',$value[8]); $this->setProperty('status',$value[9]); $this->setProperty('batCharge',$bc);
Методы класса:
//$params["LOCATION_OBJECT"], $params["LOCATION"]
//$params["LOCATION_OBJECT"], $params["LOCATION"]
Свойства класса:
Методы класса:
$msg = $this->description.' '.$this->getProperty('weatherType').'.'; $s=round($this->getProperty('temperature')); /* $i=abs($s); if ($i >= 11 and $i <= 14){ $t='ов'; } else { while ($i > 9){ $i=$i-10; } if ($i == 0 or $i >= 5 and $i <= 9) { $t='ов'; } elseif ($i == 1) { $s=''; } elseif ($i >= 2 and $i <= 4) { $t='а'; } } $msg.=' Температура '.$s.' градус'.$t.'. '; */ $msg.=' Температура '.$s.'°.'; $msg.=' Относительная влажность '.$this->getProperty('humidity').'%.'; $s=$this->getProperty('pressure'); if ($s<728) { $msg.=' Атмосферное давление пониженное.'; } elseif ($s>768) { $msg.=' Атмосферное давление повышенное.'; } else { $msg.=' Атмосферное давление нормальное.'; } $s=$this->getProperty('windSpeed'); if ($s==0) { $msg.=' Ветра не ожидается.'; } elseif ($s<3) { $msg.=' Слабый'; } elseif ($s<6) { $msg.=' Сильный'; } elseif ($s<9) { $msg.=' Очень сильный'; } else { $msg.=' Шквальный'; } if ($s) { switch (strtolower($this->getProperty('windDirection'))){ case 's': $msg.=" южный"; break; case 'n': $msg.=" северный"; break; case 'w': $msg.=" западный"; break; case 'e': $msg.=" восточный"; break; case 'sw': $msg.=" юго-западный"; break; case 'nw': $msg.=" северо-западный"; break; case 'se': $msg.=" юго-восточный"; break; case 'ne': $msg.=" северо-восточный"; break; } $msg.= ' ветер.'; } say($msg);
Свойства класса:
Методы класса:
$s=$this->object_title; // переопределить имя точки. [0] имя [1] где $s=runscript('CAPsFriendlyName',array('name'=>$s))[1]; say("Точка $s активна", 1);
$s=$this->object_title; // переопределить имя точки. [0] имя [1] где $s=runscript('CAPsFriendlyName',array('name'=>$s))[1]; say("Внимание. Точка $s не активна", 1);
Свойства класса:
Методы класса:
// *** Уведомления о статусе устройства в сети *** $n=$this->getProperty('notify'); switch ($n[0]) { case '0': $i=-1; break; case '1': $i=0; break; case '2': $i=1; break; } if (isset($i)) { // переопределить имя точки. [0] имя [1] где $t=$this->getProperty('CAPname'); $t=runscript('CAPsFriendlyName',array('name'=>$t))[1]; // получить имя девайса $s=$this->getProperty('deviceName'); if (!$s) {$s='Неизвестный девайс';} say("$s сейчас в сети. Точка доступа - $t", $i); if ($s == 'Неизвестный девайс') { say($this->getProperty('MAC'), -1); say('Последний раз в сети '.$this->getProperty('lastActive'), -1); } } // *** Буквы маркера *** $m=$this->getProperty('marker'); if (preg_match("/[fd]/i", $m, $match)) { // Включить прожекторы у подъезда, если телефон первый раз обнаружен на этой точке switch ($this->getProperty('CAPname')) { case 'CAP--Bagir-1': cm('DrivewayArea.onActivity'); break; } // Пустить своих домой if (in_array('d', $match)) { switch ($this->getProperty('CAPname')) { case 'CAP--Door': // Открыть дверь ToDo использовать функцию склонения имени say('Открываю входную дверь'); callMethod('RelayFrontDoorOpen.click'); break; } } // Активация гостевого режима if (in_array('f', $match)) { if (!gg('GuestsMode.status')) { cm('GuestsMode.activate'); } } }
// *** Уведомление *** $n=$this->getProperty('notify'); switch ($n[1]) { case '0': $i=-1; break; case '1': $i=0; break; case '2': $i=1; break; } if (isset($i)) { $s=$this->getProperty('deviceName'); if (!$s) {$s='Неизвестный девайс';} say("$s покинул сеть", $i); } // *** Маркер *** if (stripos($this->getProperty('marker'), 'f') !== false) { // Получить все объекты класса $objects = getObjectsByClass('WiFiDevice'); // перебор объектов класса WiFiDevice // Поиск первого совпадения. Устройство друга в сети foreach ($objects as $obj) { $obj=getObject($obj['TITLE']); if ($obj->getProperty('online')) { if (stripos($obj->getProperty('marker'), 'f') !== false) { $f = true; break; } } } // Отключение режима если гостей больше нет if (!$f) { if (gg('GuestsMode.status')) { cm('GuestsMode.deactivate'); } } }
// *** Уведомление о смене точки *** $n=$this->getProperty('notify'); switch ($n[2]) { case '0': $i=-1; break; case '1': $i=0; break; case '2': $i=1; break; } if (isset($i)) { // переопределить имя точки. [0] имя [1] где $t=$this->getProperty('CAPname'); $t=runscript('CAPsFriendlyName',array('name'=>$t))[1]; // Получить имя девайса $s=$this->getProperty('deviceName'); if (!$s) {$s='Неизвестный девайс';} say("$s передан точке $t", $i); } // *** Маркер *** if (stripos($this->getProperty('marker'), 'd') !== false) { switch ($this->getProperty('CAPname')) { // Открыть дверь ToDo использовать функцию склонения имени case 'CAP--Door': if ($params['oldCAPName']<>'CAP--hAPmini-1') { //запретить открытие при переходе из кухни в гараж say('Открываю входную дверь'); callMethod('RelayFrontDoorOpen.click'); } break; } }
if (preg_match("/[fd]/i", $this->getProperty('marker'), $match)) { switch ($this->getProperty('CAPname')) { case 'CAP--Bagir-1': cm('DrivewayArea.onActivity'); break; case 'CAP--SXT-1': cm('Gazebo.onActivity'); break; case 'CAP--hAPmini-1': cm('KitchenArea.onActivity'); break; } }
Свойства класса:
Методы класса:
$this->setProperty("updated",time()); //$this->setProperty("updatedTime",date("m.d.Y H:i",time())); $this->setProperty("updatedTime",date("Y-m-d H:i:s",time())); $this->setProperty("alive",1); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=24*60*60; } setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);
$this->setProperty("updated",time()); $this->setProperty("updatedTime",date("m.d.Y H:i",time())); $this->setProperty("alive",1); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=24*60*60; } setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);
Углич, Россия
На форуме: Bagir
© 2023 - Site Built By SergeJey | Реквизиты: Курицын С. С. ИНН 762001394609 | Контакты | Публичный договор
SmartLiving