Свойства класса:
Методы класса:
Объекты класса:
// это однократный будильник, выключем его sg("AlarmOne.AlarmOn","0"); say("Доброе утро!Пора вставать!Всем удачного дня и отличного настроения!",-1); if (gg("isDark")) { sg("L1ch.status","1"); sg('L1ch.statusText','Освещение со стены ВКЛючено по будильнику'); sg('L1ch.time',timeNow()); } sg("R0ch.status","1"); sg('R0ch.statusText','Розетка Алисии ВКЛючена по будильнику'); sg('R0ch.time',timeNow()); sleep(1); sg("R1ch.status","1"); sg('R1ch.statusText','Розетка Алёны ВКЛючена по будильнику'); sg('R1ch.time',timeNow()); sg("L1b.status","1"); sg('L1b.statusText','Свет в ванной ВКЛючен по будильнику'); sg('L1b.time',timeNow()); sleep(1); sg("L3b.status","1"); sg('L3b.statusText','Свет в холле ВКЛючен по будильнику'); sg('L3b.time',timeNow()); SetTimeOut("AlarmOne",'sg("L3b.status","0");',60);
Свойства класса:
Методы класса:
$volume=round(65535*$params['VALUE']/100); $this->setProperty('volumeLevel',$params['VALUE']); safe_exec('..\\apps\\nircmd\\nircmdc setsysvolume '.$volume); say("Изменилась громкость до ".$params['VALUE']." процентов");
Объекты класса:
$command=$params['command']; $short_command=''; $dt=recognizeTime($command,$short_command); if (preg_match('/скажи сколько врем/is',$command)) { if ($dt>0) { addScheduledJob("command".$dt,"processCommand('".$short_command."');",$dt); say('Задача принята',2); return; } global $voicemode; $voicemode='on'; say('Сейчас '.timeNow(),2); } elseif (preg_match('/сколько время/is',$command)) { if ($dt>0) { addScheduledJob("command".$dt,"processCommand('".$short_command."');",$dt); say('Задача принята'); echo $short_command; return; } say('Сейчас '.timeNow()); } elseif (preg_match('/повтори (.+)/is',$command,$m) || preg_match('/скажи (.+)/is',$command,$m)) { if ($dt>0) { addScheduledJob("command".$dt,"processCommand('".$short_command."');",$dt); say('Задача принята',2); return; } global $voicemode; $voicemode='on'; say($m[1],2); } else { say('Неизвестная команда...',2); }
say("Отключено питание");
Свойства класса:
Методы класса:
$name='Cron_'.$this->object_title; SQLSelectOne("DELETE FROM jobs WHERE title='".$name."'");
$this->setProperty('LastRun',date('Y-m-d H:i:s'));
Свойства класса:
Методы класса:
//$params['t'] $this->setProperty("updated",time()); $this->setProperty("updatedTime",date("H:i",time())); $this->setProperty("alive",1); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=30*60; } clearTimeOut($ot."_alive"); setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); if (!isset($params['h'])) { return; } $old_temp=$this->getProperty('humidity'); $t=round($params['h'],1); if ($t>100) return; $this->setProperty('humidity',$t); if ($params['uptime']) { $this->setProperty('uptime',$params['uptime']); } if ($t>$old_temp) { $d=1; } elseif ($t<$old_temp) { $d=-1; } else { $d=0; } $this->setProperty('direction',$d); $linked_room=$this->getProperty("LinkedRoom"); if ($linked_room) { setGlobal($linked_room.'.Humidity',$t); }
Объекты класса:
Свойства класса:
Методы класса:
$this->setProperty('status',$params['status']); $this->setProperty('updatedTimestamp',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);
Объекты класса:
Свойства класса:
Методы класса:
$this->setProperty('status',$params['status']); // выставляем статус сенсора $this->setProperty('updatedTimestamp',time()); // выставляем время срабатывания сенсора $this->setProperty('alive',1); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=24*60*60; } clearTimeOut($ot."_alive"); setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); if ($params['status']) { $this->setProperty('motionDetected',1); clearTimeOut($this->object_title.'_detected'); setTimeOut($this->object_title.'_detected',"setGlobal('".$this->object_title.".motionDetected',0);",30); $linked_room=$this->getProperty('LinkedRoom'); if ($linked_room!='') { callMethod($linked_room.'.onActivity'); } }
Объекты класса:
if(gg('NightMode.active')=="1") { sg("L2H.status","1"); sg("L3H.status","0"); sg("R2H.status","0"); sg("R3H.status","0"); SetTimeOut("LivOFF1","runScript('LivNightLight');",2*60); } SetTimeOut("LivNoMoove","runScript('LivNoOne');",30*60);
SetTimeOut("COLOFF","runScript('COL');",25*60); SetTimeOut("COZOFF","runScript('COZ');",26*60);
if (gg("isDark")) { sg("L1out.status","1"); $this->setProperty('updatedTimestamp',time()); // выставляем время срабатывания сенсора $this->setProperty('statusText','Кто-то идёт в подъезде'); $this->setProperty('motionDetected',timeNow()); SetTimeOut("L1outOFF",'sg("L1out.status","0");',1*60); }
Свойства класса:
Методы класса:
/* Общий код метода: Обработка сообщения о температуре внетреннего датчика ToDo Тревога при превышении температуты Установка статуса alive */ $reclog = 1; // Писать логи отладки ( 0-нет, 1-только крит, 2-все ) $ot=$this->object_title; // Открывает лог если нужно if ($reclog) { $log = getLogger($this); } $this->setProperty('alive',1); $alive_timeout=(int)$this->getProperty('aliveTimeOut'); if (!$alive_timeout) { $alive_timeout=15*60; } setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); /* Получение сообщения с данными температуры внутреннего датчика */ $dt=$params['tget']; if (isset($dt)) { // Проверить $dt на число и Записать в свойство объекта if (is_numeric($dt)) { $this->setProperty('temperature', $dt); } else { if ($reclog) { $log->error('Failed to get data internal temperature sensor for object '.$ot); } } // Сразу установить флаг "не живой" если в $dt ничего нет if (!strlen($dt)) { $this->setProperty('alive',0); } }
// Expects 'output' and 'value' in $params $reclog = 1; // Писать логи отладки ( 0-нет, 1-только крит, 2-все ) // Открывает лог если нужно if ($reclog) { $log = getLogger($this); } $cmdUrl = sprintf('http://%s/%s/?cmd=%d:%d', $this->getProperty('IpAddress'), $this->getProperty('Password'), intval($params['port']), intval($params['value'])); // Запись данных в лог if ($reclog == 2) { $log->trace('setOutput method: '.$cmdUrl); } getURL($cmdUrl, 0);
/* Варианты что можно спросить callMethod('MegaD99.getData', array('port'=>'all')); // спросить сразу все. callMethod('MegaD99.getData', array('port'=>1)); // состояние первого порта callMethod('MegaD99.getData', array('port'=>'tget')); // показания встроенного температурного датчика (Только для версии прошивки 3.25 и выше) */ $reclog = 1; // Писать логи отладки ( 0-нет, 1-только крит, 2-все ) $ot = $this->object_title; // Открывает лог если нужно if ($reclog) { $log = getLogger($this); } // Проверка что есть ip адрес if (!filter_var($this->getProperty('IpAddress'), FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { if ($reclog) { $log->error('ip address is not set for object '.$ot); } return; } // Проверка что есть пароль if (!$this->getProperty('Password')) { if ($reclog) { $log->error('Password address is not set for object '.$ot); } return; } // Сборка строки начала запроса для Меги $cmdUrl = sprintf("http://%s/%s/", $this->getProperty('IpAddress'), $this->getProperty('Password')); // Добавление дополнительных параметрами запроса в зависимости от его типа switch ($params['port']) { case 'all': // Спросить сразу все $cmdUrl .= '?cmd=all'; $ta = 5; //Таймаут ожидания меги break; case 'tget': // Температура встроенного датчика $cmdUrl .= '?tget=1'; $ta = 1; break; default: // Состояние указанного порта $cmdUrl .= sprintf("?pt=%d&cmd=get", intval($params['port'])); $ta = 5; } $ctx = stream_context_create(array( 'http' => array('timeout'=>$ta) ) ); // Запрос данных у Меги $dt = trim(file_get_contents($cmdUrl, 0, $ctx)); // Запись данных в лог if ($reclog == 2) { $log->trace(sprintf('getData method: %s returned %s', $cmdUrl, $dt)); } // Обработка ответа в зависимости от его типа switch ($params['port']) { // Температура внутреннего датчика case 'tget': $this->callMethod('incomingMessage', array('tget'=>$dt)); 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)); }
Объекты класса:
$ot=$this->object_title; $pt=$params['pt']; /* если мега передала все параметры одной строкой all=OFF/0;OFF/0;OFF/0;OFF/0;ON/1;OFF/0;OFF/0;OFF;ON;OFF;OFF;OFF;OFF;OFF;288;203 Смотрим на строку! Сначала идут входы (со счетчиками), потом выходы, и в конце 2 АЦП порта. Универсального кода тут написать невозможно. Все будет зависеть от комплектации меги, но с большей долей вероятности у Вас будет модуль 7I7O (7 входов 7 выходов) + 2 АЦП порта. Разбиваем строку на массив, перебираем значения и устанавливаем нужные свойства. Это условие сработает !!!_ТОЛЬКО_!!! при передаче мегой параметра all= и может пригодится для синхронизации статусов портов меги и статусов объектов МД. */ if (isset($params['all'])) { $ps = explode(";", $params['all']); $i=0; foreach($ps as $dt) { $i = $i + 1; // Разделить статус и счетчик $dt = explode("/", $dt); // Заменить слова на цифры if ($dt[0] == 'ON') { $dt[0] = 1; } if ($dt[0] == 'OFF') { $dt[0] = 0; } // Обрабатываем значения только нужных нам портов switch ($i) { case 999: // Пока мне тут ничего не нужно break; } } return; } /* Если мы сами спросили Мегу о чем то, запустив метод getData и указав номер интересующего нас порта. */ if (isset($params['iasked'])) { // Разделить статус и счетчик $dt = explode("/", $params['iasked']); // Заменить слова на цифры if ($dt[0] == 'ON') { $dt[0] = 1; } if ($dt[0] == 'OFF') { $dt[0] = 0; } // Обрабатываем значения портов, которые мы могли бы сами спросить switch ($pt) { case 999: // Пока мне тут ничего не нужно break; default: // Если порта нет в группах case, но мы все же спрашиваем его say('Я спросил статус порта '.$pt.', а что с ним делать пока не придумал.'); } return; } /* Мегадевайс сам шлет нам на сервер get сообщение о изменении статуса порта. Мега передаст номер порта в $pt и статус замкнули/разомкнули в $params['m']. */ if (isset($pt)) { //Параметр 'm' с меги не передается при нажатии. А при отпускании кнопки его значение = 1 //Переводим его в статус. 1 - замкнули (нажали); 0 - разомкнули (отпустили) if (!isset($params['m'])) {$ms=1;} else {$ms=0;} switch ($pt) { //pt это порт Меги. Для каждого порта своя группа команд case case 0: // P&R callMethod('MegaD4.setOutput',array('port'=>7,'value'=>$ms)); break; case 6: // P // Звонок + ПинКод ****************************** /* Пин код задуман длянной в 3 цифры. Это можно легко изменить при жлании. При наборе цифры 3 и более звонок не включается. Последняя цифра пин кода может быть два, и если пин правильный, то звонок не включится */ // Получаем детали события $dt = registeredEventDetails($ot.'_'.$pt.'_pin'); // Параметр doit будет добавлен только при последующем рекурсивном вызове когда отработает таймер if (!isset($params['doit'])) { // Если таймер существует if (timeOutExists($ot.'_'.$pt.'_press')) { // Удалить таймер ClearTimeOut($ot.'_'.$pt.'_press'); // Добавляем +1 $dt = $dt+1; } else { // Взять две последние цифры // Если есть способ проще, ПОПРАВЬТЕ! if (strlen($dt)>2) { $dt = substr($dt, -2); } // к двум последним цифрам приклеиваем 1 $dt = $dt.'1'; } // записать детали в событие registerEvent($ot.'_'.$pt.'_pin', $details=$dt, $expire_in=1); // создаем таймер setTimeOut($ot.'_'.$pt.'_press', "cm(".$ot.".'.incomingMessage', array('pt'=>".$pt.", 'doit'=>1));", 1); } else { // параметр doit есть. Значит это рекурсивный вызов для окончания обработки комбинации нажатия // Удалить запомненные цифры через 10 секунд setTimeOut($ot.'_'.$pt.'_clear', "clearEvent('".$ot."_".$pt."_pin');", 10); // Проверяем пинкод * * * * * * * * if ($dt == 342) { // Очистить временную переменную (чтобы пин лишний раз не был виден в X-Ray) //clearEvent($ot.'_'.$pt.'_pin'); // Событие правильный пин код callMethod('RelayFrontDoorOpen.click'); say('Пин код. Открываю входную дверь.'); } else { // Если набранная цифра меньше 3, включаем звонок if (substr($dt, -1)<3) { // Событие Звонок $filename=gg('ThisComputer.ringtoneFile'); playSound($filename); } } } break; default: // Если порта нет в группах case say('Получено сообщение от Меги с порта '.$pt); } }
$ot=$this->object_title; $pt=$params['pt']; /* если мега передала все параметры одной строкой all=OFF/0;OFF/0;OFF/0;OFF/0;ON/1;OFF/0;OFF/0;OFF;ON;OFF;OFF;OFF;OFF;OFF;288;203 Смотрим на строку! Сначала идут входы (со счетчиками), потом выходы, и в конце 2 АЦП порта. Универсального кода тут написать невозможно. Все будет зависеть от комплектации меги, но с большей долей вероятности у Вас будет модуль 7I7O (7 входов 7 выходов) + 2 АЦП порта. Разбиваем строку на массив, перебираем значения и устанавливаем нужные свойства. Это условие сработает !!!_ТОЛЬКО_!!! при передаче мегой параметра all= и может пригодится для синхронизации статусов портов меги и статусов объектов МД. */ if (isset($params['all'])) { $ps = explode(";", $params['all']); $i=0; foreach($ps as $dt) { $i = $i + 1; // Разделить статус и счетчик $dt = explode("/", $dt); // Заменить слова на цифры if ($dt[0] == 'ON') { $dt[0] = 1; } if ($dt[0] == 'OFF') { $dt[0] = 0; } // Обрабатываем значения только нужных нам портов switch ($i) { case 999: // Пока мне тут ничего не нужно break; } } return; } /* Если мы сами спросили Мегу о чем то, запустив метод getData и указав номер интересующего нас порта. */ if (isset($params['iasked'])) { // Разделить статус и счетчик $dt = explode("/", $params['iasked']); // Заменить слова на цифры if ($dt[0] == 'ON') { $dt[0] = 1; } if ($dt[0] == 'OFF') { $dt[0] = 0; } // Обрабатываем значения портов, которые мы могли бы сами спросить switch ($pt) { case 999: // Пока мне тут ничего не нужно break; default: // Если порта нет в группах case, но мы все же спрашиваем его say('Я спросил статус порта '.$pt.', а что с ним делать пока не придумал.'); } return; } /* Мегадевайс сам шлет нам на сервер get сообщение о изменении статуса порта. Мега передаст номер порта в $pt и статус замкнули/разомкнули в $params['m']. */ if (isset($pt)) { //Параметр 'm' с меги не передается при нажатии. А при отпускании кнопки его значение = 1 //Переводим его в статус. 1 - замкнули (нажали); 0 - разомкнули (отпустили) if (!isset($params['m'])) {$ms=1;} else {$ms=0;} switch ($pt) { //pt это порт Меги. Для каждого порта своя группа команд case case 999: // Пока мне тут ничего не нужно break; default: // Если порта нет в группах case say('Получено сообщение от Меги с порта '.$pt); } }
/* запускается из файла megad.php с передачей всех параметров от Меги или из метода getData, когда сами спрашиваем состояние нужного порта. Обрабатывает нажатия, отпускания, а так же двойные и долгие нажатия в любой комбинации. Для этого не забудьте на самой Меге настроить нужные порты как P&R !!! Не нагружайте этот метод своим кодом если планируйте в дальнейшем обновлять этот класс. Мой совет - просто передавайте данные отсюда в свои объекты. Проще будет при обновлении. План по отлову двойного и долгого нажатия: --- При нажатии запускаем два разных таймера _doublePressTimer на 1 секунду для контроля двойного нажатия и _longPressTimer на 3 секунды для запуска события долгого нажатия Если уже существует _doublePressTimer, значит произошло событие двойное нажатие. --- При отпускании Произошло событие отпускание1. Оно произойдет в любом случае при отпускании. Событие Отпустил2 произойдет только если не было долгого нажатия. удаляем _longPressTimer чтобы не запустилось долгое нажатие. --- Обработку ненужных событий при желании можно закоментировать. События "Отпустил" нужны в том случае, если ненужно выполнять событие нажал при событии долгое нажатие. Или требуется начать некую обработку при нажатии, а закончить при отпускании. --- Замените все нужные say() на код установки свойств или запуска ВАШИХ методов. Играемся, тестируем, смотрим лог, пишем свои комментарии! */ $ot=$this->object_title; $pt=$params['pt']; /* если мега передала все параметры одной строкой all=OFF/0;OFF/0;OFF/0;OFF/0;ON/1;OFF/0;OFF/0;OFF;ON;OFF;OFF;OFF;OFF;OFF;288;203 Смотрим на строку! Сначала идут входы (со счетчиками), потом выходы, и в конце 2 АЦП порта. Универсального кода тут написать невозможно. Все будет зависеть от комплектации меги, но с большей долей вероятности у Вас будет модуль 7I7O (7 входов 7 выходов) + 2 АЦП порта. Разбиваем строку на массив, перебираем значения и устанавливаем нужные свойства. Это условие сработает !!!_ТОЛЬКО_!!! при передаче мегой параметра all= и может пригодится например для первичной синхронизации статусов портов меги и статусов объектов МД. ВНИМАНИЕ! в группах case нужно изменить код на свой! */ if (isset($params['all'])) { $ps = explode(";", $params['all']); $i=0; foreach($ps as $dt) { $i = $i + 1; // Разделить статус и счетчик $dt = explode("/", $dt); // Заменить слова на цифры if ($dt[0] == 'ON') { $dt[0] = 1; } if ($dt[0] == 'OFF') { $dt[0] = 0; } // Обрабатываем значения только нужных нам портов switch ($i) { case 1: // Сказать счетчик входа 1 и его статус // Не спрашивайте счетчики у выходов. Они есть только у входов (1-7 при использовании модуля 7I7O). say('значение входа 1 равно '.$dt[0].', счётчик '.$dt[1]); break; case 8: // Если есть задача периодически синхронизировать статус порта меги со статусом объекта МД. // Изменение статуса объекта реле таким образом не приведет к отправке команды меге на включение или выключение порта, что нам и надо. setGlobal('Relay1MegaD99.status',$dt[0]); break; case 9: // Просто сказать статус порта 2 для примера. say('значение выхода 2 равно '.$dt[0]); break; } } return; } /* Если мы сами спросили Мегу о чем то, запустив метод getData и указав номер интересующего нас порта. ВНИМАНИЕ! в группах case нужно изменить код на свой! */ if (isset($params['iasked'])) { // Разделить статус и счетчик $dt = explode("/", $params['iasked']); // Заменить слова на цифры if ($dt[0] == 'ON') { $dt[0] = 1; } if ($dt[0] == 'OFF') { $dt[0] = 0; } // Обрабатываем значения портов, которые мы могли бы сами спросить switch ($pt) { case 14: // Сказать счетчик входа 1 и его статус // Не спрашивайте счетчики у выходов. Они есть только у входов 1-7. say('Я спросил значение входа 1 равно '.$dt[0].', счётчик '.$dt[1]); break; default: // Если порта нет в группах case, но мы все же спрашиваем его say('Я спросил статус порта '.$pt.', а что с ним делать пока не придумал.'); } return; } /* Мегадевайс сам шлет нам на сервер get сообщение о изменении статуса порта. Мега передаст номер порта в $pt и статус замкнули/разомкнули в $params['m']. ВНИМАНИЕ! в группах case нужно изменить код на свой! */ if (isset($pt)) { //Параметр 'm' с меги не передается при нажатии. А при отпускании кнопки его значение = 1 //Переводим его в статус. 1 - замкнули (нажали); 0 - разомкнули (отпустили) if (!isset($params['m'])) {$ms=1;} else {$ms=0;} // ВНИМАНИЕ! в группах case нужно изменить код на свой! switch ($pt) { //pt это порт Меги. Для каждого порта своя группа команд case case 0: //Этот порт на Меге настроен как P //Задача - просто что то запустить say('Ку Ку'); break; case 1: // P&R //Задача - Передать объекту sensorTest статус 1 при замыкании порта Мегии, и статус 0 при размыкании say('Передаю тестовому датчику статус '.$ms); //callMethod('sensorTest.statusChanged', array('status'=>$ms)); break; case 2: // P //Задача - Определить простое, двойное или тройное нажатие // Получаем детали события $dt = registeredEventDetails($ot.'_'.$pt.'_clicks'); // Параметр doit будет добавлен только при последующем рекурсивном вызове для окончания обработки комбинации нажатия if (!isset($params['doit'])) { // Добавить состояние (нажата/отпущена) и записать в детали события registerEvent($ot.'_'.$pt.'_clicks', $details=$dt.$ms, $expire_in=1); // Если таймер не существует if (!timeOutExists($ot.'_'.$pt.'_press')) { // Нажата или отпущена if ($ms) { // Сбросить временную переменную registerEvent($ot.'_'.$pt.'_clicks', $details='1', $expire_in=1); // создать таймер с рекурсивным вызовом setTimeOut($ot.'_'.$pt.'_press', "cm($ot.'.incomingMessage', array('pt'=>".$pt.", 'doit'=>1));", 1); } else { // сразу рекурсивный вызов callMethod($ot.'.incomingMessage', array('pt'=>$pt, 'doit'=>1)); } } } else { // параметр doit есть. Значит это рекурсивный вызов для окончания обработки комбинации нажатия // Очистить временную переменную // registerEvent($ot.'_'.$pt.'_clicks', $details='', $expire_in=1); // тут можно просто удалять Event clearEvent($ot.'_'.$pt.'_clicks'); // Посчитать количество циферок $dt = strlen($dt); say($dt.' нажатий'); // ВЫПОЛНИТЬ нужный метод с передачей ему $dt как число нажатий } break; case 3: // P // Звонок + ПинКод ****************************** /* Пин код задуман длянной в 3 цифры. Это можно легко изменить при жлании. При наборе цифры 3 и более звонок не включается. Последняя цифра пин кода может быть два, и если пин правильный, то звонок не включится */ // Получаем детали события $dt = registeredEventDetails($ot.'_'.$pt.'_pin'); // Параметр doit будет добавлен только при последующем рекурсивном вызове когда отработает таймер if (!isset($params['doit'])) { // Если таймер существует if (timeOutExists($ot.'_'.$pt.'_press')) { // Удалить таймер ClearTimeOut($ot.'_'.$pt.'_press'); // Добавляем +1 $dt = $dt+1; } else { // Взять две последние цифры // Если есть способ проще, ПОПРАВЬТЕ! if (strlen($dt)>2) { $dt = substr($dt, -2); } // к двум последним цифрам приклеиваем 1 $dt = $dt.'1'; } // записать детали в событие registerEvent($ot.'_'.$pt.'_pin', $details=$dt, $expire_in=1); // создаем таймер setTimeOut($ot.'_'.$pt.'_press', "cm(".$ot.".'.incomingMessage', array('pt'=>".$pt.", 'doit'=>1));", 1); } else { // параметр doit есть. Значит это рекурсивный вызов для окончания обработки комбинации нажатия // Удалить запомненные цифры через 10 секунд setTimeOut($ot.'_'.$pt.'_clear', "clearEvent('".$ot."_".$pt."_pin');", 10); // Проверяем пинкод * * * * * * * * if ($dt == 342) { // Очистить временную переменную (чтобы пин лишний раз не был виден в X-Ray) //clearEvent($ot.'_'.$pt.'_pin'); // Событие правильный пин код callMethod('RelayFrontDoorOpen.click'); say('Пин код. Открываю входную дверь.'); } else { // Если набранная цифра меньше 3, включаем звонок if (substr($dt, -1)<3) { // Событие Звонок $filename=gg('ThisComputer.ringtoneFile'); playSound($filename); } } } break; case 4: // P&R //Задача - Получить любые комбинации // Получаем детали события $dt = registeredEventDetails($ot.'_'.$pt.'_clicks'); // Параметр doit будет добавлен только при последующем рекурсивном вызове для окончания обработки комбинации нажатия if (!isset($params['doit'])) { // Добавить состояние (нажата/отпущена) и записать в детали события registerEvent($ot.'_'.$pt.'_clicks', $details=$dt.$ms, $expire_in=1); // Если таймер не существует if (!timeOutExists($ot.'_'.$pt.'_press')) { // Нажата или отпущена if ($ms) { // Сбросить временную переменную registerEvent($ot.'_'.$pt.'_clicks', $details='1', $expire_in=1); // создать таймер с рекурсивным вызовом setTimeOut($ot.'_'.$pt.'_press', "cm($ot.'.incomingMessage', array('pt'=>".$pt.", 'doit'=>1));", 1); } else { // сразу рекурсивный вызов callMethod($ot.'.incomingMessage', array('pt'=>$pt, 'doit'=>1)); } } } else { // параметр doit есть. Значит это рекурсивный вызов для окончания обработки комбинации нажатия // если справа 1 (то есть последнее действие нажал) if (substr($dt, -1)) { registerEvent($ot.'_'.$pt.'_clicks', $details=$dt.'-', $expire_in=1); } else { // registerEvent($ot.'_'.$pt.'_clicks', $details='', $expire_in=1); // тут можно просто удалять Event clearEvent($ot.'_'.$pt.'_clicks'); } /* Закомментировать или удалить этот блок switch после отладки */ switch ($dt) { //1-нажал 0-отпустил case '10': say('нажатие'); break; case '1010': say('двойное нажатие'); break; case '101010': say('тройное нажатие'); break; case '1': say('удержание'); break; case '101': say('удержание после двойного'); break; case '10101': say('удержание после тройного'); break; case '1-0': say('отпустил'); break; case '101-0': say('отпустил после двойного'); break; case '10101-0': say('отпустил после тройного'); break; default: say('непонятно'); break; } // ВЫПОЛНИТЬ нужный метод с передачей ему кода комбинации $dt } break; default: // Если порта нет в группах case say('Получено сообщение от Меги с порта '.$pt); } }
$ot=$this->object_title; $pt=$params['pt']; /* если мега передала все параметры одной строкой all=OFF/0;OFF/0;OFF/0;OFF/0;ON/1;OFF/0;OFF/0;OFF;ON;OFF;OFF;OFF;OFF;OFF;288;203 Смотрим на строку! Сначала идут входы (со счетчиками), потом выходы, и в конце 2 АЦП порта. Универсального кода тут написать невозможно. Все будет зависеть от комплектации меги, но с большей долей вероятности у Вас будет модуль 7I7O (7 входов 7 выходов) + 2 АЦП порта. Разбиваем строку на массив, перебираем значения и устанавливаем нужные свойства. Это условие сработает !!!_ТОЛЬКО_!!! при передаче мегой параметра all= и может пригодится для синхронизации статусов портов меги и статусов объектов МД. */ if (isset($params['all'])) { $ps = explode(";", $params['all']); $i=0; foreach($ps as $dt) { $i = $i + 1; // Разделить статус и счетчик $dt = explode("/", $dt); // Заменить слова на цифры if ($dt[0] == 'ON') { $dt[0] = 1; } if ($dt[0] == 'OFF') { $dt[0] = 0; } // Обрабатываем значения только нужных нам портов switch ($i) { case 999: // Пока мне тут ничего не нужно break; } } return; } /* Если мы сами спросили Мегу о чем то, запустив метод getData и указав номер интересующего нас порта. */ if (isset($params['iasked'])) { // Разделить статус и счетчик $dt = explode("/", $params['iasked']); // Заменить слова на цифры if ($dt[0] == 'ON') { $dt[0] = 1; } if ($dt[0] == 'OFF') { $dt[0] = 0; } // Обрабатываем значения портов, которые мы могли бы сами спросить switch ($pt) { case 999: // Пока мне тут ничего не нужно break; default: // Если порта нет в группах case, но мы все же спрашиваем его say('Я спросил статус порта '.$pt.', а что с ним делать пока не придумал.'); } return; } /* Мегадевайс сам шлет нам на сервер get сообщение о изменении статуса порта. Мега передаст номер порта в $pt и статус замкнули/разомкнули в $params['m']. */ if (isset($pt)) { //Параметр 'm' с меги не передается при нажатии. А при отпускании кнопки его значение = 1 //Переводим его в статус. 1 - замкнули (нажали); 0 - разомкнули (отпустили) if (!isset($params['m'])) {$ms=1;} else {$ms=0;} switch ($pt) { //pt это порт Меги. Для каждого порта своя группа команд case case 999: // Пока мне тут ничего не нужно break; default: // Если порта нет в группах case say('Получено сообщение от Меги с порта '.$pt); } }
$ot=$this->object_title; $pt=$params['pt']; /* если мега передала все параметры одной строкой all=OFF/0;OFF/0;OFF/0;OFF/0;ON/1;OFF/0;OFF/0;OFF;ON;OFF;OFF;OFF;OFF;OFF;288;203 Смотрим на строку! Сначала идут входы (со счетчиками), потом выходы, и в конце 2 АЦП порта. Универсального кода тут написать невозможно. Все будет зависеть от комплектации меги, но с большей долей вероятности у Вас будет модуль 7I7O (7 входов 7 выходов) + 2 АЦП порта. Разбиваем строку на массив, перебираем значения и устанавливаем нужные свойства. Это условие сработает !!!_ТОЛЬКО_!!! при передаче мегой параметра all= и может пригодится для синхронизации статусов портов меги и статусов объектов МД. ВНИМАНИЕ! в группах case нужно изменить код на свой! */ if (isset($params['all'])) { $ps = explode(";", $params['all']); $i=0; foreach($ps as $dt) { $i = $i + 1; // Разделить статус и счетчик $dt = explode("/", $dt); // Заменить слова на цифры if ($dt[0] == 'ON') { $dt[0] = 1; } if ($dt[0] == 'OFF') { $dt[0] = 0; } // Обрабатываем значения только нужных нам портов switch ($i) { case 999: // Пока мне тут ничего не нужно break; } } return; } /* Если мы сами спросили Мегу о чем то, запустив метод getData и указав номер интересующего нас порта. */ if (isset($params['iasked'])) { // Разделить статус и счетчик $dt = explode("/", $params['iasked']); // Заменить слова на цифры if ($dt[0] == 'ON') { $dt[0] = 1; } if ($dt[0] == 'OFF') { $dt[0] = 0; } // Обрабатываем значения портов, которые мы моглы бы сами спросить switch ($pt) { case 14: //Port A6 // Датчик газа в воздуховоде притока //setGlobal('sensorOutdoorAirGas.status', $dt[0]); callMethod('sensorOutdoorAirGas.statusChanged', array('status'=>$dt[0])); break; case 15: //Port A7 // Датчик света на улице callMethod('ls_driveway.statusChanged', array('status'=>$dt[0])); break; default: // Если порта нет в группах case say('Я спросил статус порта '.$pt.', а что с ним делать пока не придумал.'); } return; } /* Мегадевайс сам шлет нам на сервер get сообщение о изменении статуса порта. Мега передаст номер порта в $pt и статус замкнули/разомкнули в $params['m']. */ if (isset($pt)) { //Параметр 'm' с меги не передается при нажатии. А при отпускании кнопки его значение = 1 //Переводим его в статус. 1 - замкнули (нажали); 0 - разомкнули (отпустили) if (!isset($params['m'])) {$ms=1;} else {$ms=0;} switch ($pt) { //pt это порт Меги. Для каждого порта своя группа команд case case 19: // P&R // say('Подаю электричество на розетку Алисии '.$ms); // sg("R0ch.status","1"); break; default: // Если порта нет в группах case say('Получено сообщение от Меги с порта '.$pt); } }
Объекты класса:
Свойства класса:
Методы класса:
$this->setProperty('active',1);
$this->setProperty('active',0);
$this->setProperty("updated",time()); $this->setProperty("updatedTime",date('H:i')); if ($this->getProperty('active')) { say("Режим ".$this->getProperty('title')." активирован.",-1); } else { say("Режим ".$this->getProperty('title')." выключен.",-1); }
Объекты класса:
setGlobal('minMsgLevel','1');
setGlobal('minMsgLevel','2');
Объекты класса:
include_once(DIR_MODULES.'app_radio/app_radio.class.php'); $app_radio=new app_radio(); if(is_array($params)) { if(isset($params['sta'])) $app_radio->change_station($params['sta'],$app_radio); if(isset($params['cmd'])) $app_radio->control($params['cmd']); if(isset($params['vol'])) $app_radio->set_volume($params['vol'],$app_radio); } else { if($params=='play' || $params=='stop') $app_radio->control($params); else if(strpos($params, "vol")===0) $app_radio->set_volume((int)substr($params,3),$app_radio); else if(strpos($params, "sta:")===0) $app_radio->change_station(substr($params,4),$app_radio); }
Свойства класса:
Методы класса:
$this->setProperty("status",0);
$this->setProperty("status",1);
$status=$this->getProperty("status"); if ($status) { $this->callMethod('turnOff'); } else { $this->callMethod('turnOn'); }
$status=$this->getProperty("status"); if ($status) { $this->callMethod('turnOn'); } else { $this->callMethod('turnOff'); }
Объекты класса:
$this->setProperty('status',$params['VALUE']); $this->setProperty('updatedTimestamp',time()); // обновление времени последней установки статуса if ($params['VALUE']) {sg("L4H.status","1"); $this->setProperty('statusText','Свет аварийный в прихожей ВКЛючен'); SetTimeOut("AlarmLightOff",'sg("L4H.status","0");',2*60); } else {sg("L4H.status","0"); $this->setProperty('statusText','Свет аварийный в прихожей ВЫКЛючен'); ClearTimeOut("AlarmLightOff"); }
$this->setProperty('status',$params['VALUE']); $this->setProperty('updatedTimestamp',time()); // обновление времени последней установки статуса if ($params['VALUE']) { $this->setProperty('statusText','Освещение кухни ВКЛючено'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Освещение кухни ВЫКЛючено'); $this->setProperty('time',timeNow()); }
$this->setProperty('status',$params['VALUE']); $this->setProperty('updatedTimestamp',time()); // обновление времени последней установки статуса if ($params['VALUE']) { $this->setProperty('statusText','Освещение зала ВКЛючено'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Освещение в зале ВЫКЛючено'); $this->setProperty('time',timeNow()); }
$this->setProperty('status',$params['VALUE']); $this->setProperty('updatedTimestamp',time()); // обновление времени последней установки статуса if ($params['VALUE']) { $this->setProperty('statusText','Освещение холла ВКЛючено'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Освещение холла ВЫКЛючено'); $this->setProperty('time',timeNow()); }
$this->setProperty('status',$params['VALUE']); $this->setProperty('updatedTimestamp',time()); // обновление времени последней установки статуса if ($params['VALUE']) {sg("L1H.status","1"); $this->setProperty('statusText','Свет в прихожей ВКЛючен'); $this->setProperty('time',timeNow()); SetTimeOut("ComeInOff",'sg("L1H.status","0");',4*60); } else {sg("L1H.status","0"); $this->setProperty('statusText','Свет в прихожей ВЫКЛючен'); $this->setProperty('time',timeNow()); ClearTimeOut("ComeInOff"); }
$this->setProperty('status',$params['VALUE']); $this->setProperty('updatedTimestamp',time()); // обновление времени последней установки статуса if ($params['VALUE']) {sg("L2b.status","1"); $this->setProperty('statusText','Свет в туалете ВКЛючен'); $this->setProperty('time',timeNow()); SetTimeOut("WCOff",'sg("L2b.status","0");',15*60); } else {sg("L2b.status","0"); $this->setProperty('statusText','Свет в туалете ВЫКЛючен'); $this->setProperty('time',timeNow()); ClearTimeOut("WCOff"); }
$this->setProperty('status',$params['VALUE']); $this->setProperty('updatedTimestamp',time()); // обновление времени последней установки статуса if ($params['VALUE']) { $this->setProperty('statusText','Свет зеркала ВКЛючен'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Свет зеркала ВЫКЛючен'); $this->setProperty('time',timeNow()); }
$this->setProperty('status',$params['VALUE']); $this->setProperty('updatedTimestamp',time()); // обновление времени последней установки статуса if ($params['VALUE']) { $this->setProperty('statusText','Освещение ванны ВКЛючено'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Освещение ванны ВЫКЛючено'); $this->setProperty('time',timeNow()); }
$this->setProperty('status',$params['VALUE']); $this->setProperty('updatedTimestamp',time()); // обновление времени последней установки статуса if ($params['VALUE']) { $this->setProperty('statusText','Свет умывальника ВКЛючен'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Свет умывальника ВЫКЛючен'); $this->setProperty('time',timeNow()); }
$this->setProperty('status',$params['VALUE']); $this->setProperty('updatedTimestamp',time()); // обновление времени последней установки статуса if ($params['VALUE']) { $this->setProperty('statusText','Освещение детской ВКЛючено'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Освещение в комнате ВЫКЛючено'); $this->setProperty('time',timeNow()); } /*if (timeBetween('21:59',gg('SunRiseTime'))){sg("L1ch.status","0");} */
$this->setProperty('status',$params['VALUE']); $this->setProperty('updatedTimestamp',time()); // обновление времени последней установки статуса if ($params['VALUE']) { $this->setProperty('statusText','Освещение детской ВКЛючено'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Освещение комнаты ВЫКЛючено'); $this->setProperty('time',timeNow()); } /*if (timeBetween('21:59',gg('SunRiseTime'))){sg("L0ch.status","0");} */
$this->setProperty('status',$params['VALUE']); if ($params['VALUE']) { $this->setProperty('statusText','Розетка холодильника на кухне ВКЛЮЧЕНА'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Холодильника ВЫКЛЮЧЕН!!!!'); $this->setProperty('time',timeNow()); }
$this->setProperty('status',$params['VALUE']); if ($params['VALUE']) { $this->setProperty('statusText','Розетка газовой плиты на кухне ВКЛЮЧЕНА'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Розетка газовой плиты ВЫКЛЮЧЕНА'); $this->setProperty('time',timeNow()); }
$this->setProperty('status',$params['VALUE']); if ($params['VALUE']) { $this->setProperty('statusText','Розетка TV на кухне ВКЛЮЧЕНА'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','TV ВЫКЛЮЧЕН'); $this->setProperty('time',timeNow()); }
$this->setProperty('status',$params['VALUE']); if ($params['VALUE']) { $this->setProperty('statusText','Розетка зала TV ВКЛЮЧЕНА'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','TV ВЫКЛЮЧЕН'); $this->setProperty('time',timeNow()); }
$this->setProperty('status',$params['VALUE']); if ($params['VALUE']) { $this->setProperty('statusText','Розетка прихожей ВКЛЮЧЕНА'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Розетка ВЫКЛЮЧЕНА'); $this->setProperty('time',timeNow()); }
$this->setProperty('status',$params['VALUE']); if ($params['VALUE']) { $this->setProperty('statusText','Розетка зала при входе ВКЛЮЧЕНА'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Розетка при входе ВЫКЛЮЧЕНА'); $this->setProperty('time',timeNow()); }
$this->setProperty('status',$params['VALUE']); if ($params['VALUE']) { $this->setProperty('statusText','Розетка БРА холла ВКЛЮЧЕНА'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Розетка ВЫКЛЮЧЕНА'); $this->setProperty('time',timeNow()); }
$this->setProperty('status',$params['VALUE']); $this->setProperty('updatedTimestamp',time()); // обновление времени последней установки статуса if ($params['VALUE']) { $this->setProperty('statusText','Розетка умывальника ВКЛючена'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Розетка ВЫКЛючена'); $this->setProperty('time',timeNow()); }
$this->setProperty('status',$params['VALUE']); if ($params['VALUE']) { $this->setProperty('statusText','Розетка Алёны ВКЛЮЧЕНА'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Розетка ВЫКЛЮЧЕНА'); $this->setProperty('time',timeNow()); } /*if (timeBetween('21:59','06:30')){sg("R1ch.status","0");} */
$this->setProperty('status',$params['VALUE']); if ($params['VALUE']) { $this->setProperty('statusText','Розетка Алисии ВКЛЮЧЕНА'); $this->setProperty('time',timeNow()); } else { $this->setProperty('statusText','Розетка Алисии ВЫКЛЮЧЕНА'); $this->setProperty('time',timeNow()); } /*if (timeBetween('21:59','06:30')){sg("R0ch.status","0");} */
Свойства класса:
Методы класса:
$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); //echo "Updated";
$this->setProperty('SomebodyHere',0);
$latestActivity=$this->getProperty('LatestActivity'); $this->setProperty('LatestActivity',time()); $this->setProperty('LatestActivityTime',date('H:i')); $this->setProperty('SomebodyHere',1); $ot=$this->object_title; if ($this->getProperty("IdleDelay")) { $activity_timeout=(int)$this->getProperty("IdleDelay"); } else { $activity_timeout=10*60; } clearTimeOut($ot."_activity_timeout"); setTimeOut($ot."_activity_timeout","callMethod('".$ot.".onIdle');",$activity_timeout); $this->callMethod("updateActivityStatus");
Объекты класса:
Методы класса:
Объекты класса:
echo "status received: ".$params['status'];
global $voicemode; $voicemode='off'; processCommand($params['message']);
Свойства класса:
Методы класса:
Объекты класса:
$details=array(); $red_state=0; $yellow_state=0; if (!isOnline('Internet')) { $yellow_state=1; $details[]=LANG_GENERAL_NO_INTERNET_ACCESS; } if ($red_state) { $state='red'; $state_title=LANG_GENERAL_RED; } elseif ($yellow_state) { $state='yellow'; $state_title=LANG_GENERAL_YELLOW; } else { $state='green'; $state_title=LANG_GENERAL_GREEN; } $new_details=implode(". ",$details); if ($this->getProperty("stateDetails")!=$new_details) { $this->setProperty('stateDetails',$new_details); } if ($this->getProperty('stateColor')!=$state) { $this->setProperty('stateColor',$state); $this->setProperty('stateTitle',$state_title); if ($state!='green') { say(LANG_GENERAL_COMMUNICATION_STATE." ".LANG_GENERAL_CHANGED_TO." ".$state_title."."); say(implode(". ",$details)); } else { say(LANG_GENERAL_COMMUNICATION_STATE." ".LANG_GENERAL_RESTORED_TO." ".$state_title); } $this->callMethod('stateChanged'); }
$details=array(); $red_state=0; $yellow_state=0; $cycles=array('states'=>'states','main'=>'main','execs'=>'exec','scheduler'=>'scheduler'); foreach($cycles as $k=>$v) { $tm=getGlobal('ThisComputer.cycle_'.$k.'Run'); if (time()-$tm>5*60) { $red_state=1; $details[]=$v." ".LANG_GENERAL_CYCLE." ".LANG_GENERAL_STOPPED."."; } } $cycles=array('ping'=>'ping','webvars'=>'webvars'); foreach($cycles as $k=>$v) { $tm=getGlobal('ThisComputer.cycle_'.$k.'Run'); if (time()-$tm>10*60) { $yellow_state=1; $details[]=$v." ".LANG_GENERAL_CYCLE." ".LANG_GENERAL_STOPPED."."; } } if ($red_state) { $state='red'; $state_title=LANG_GENERAL_RED; } elseif ($yellow_state) { $state='yellow'; $state_title=LANG_GENERAL_YELLOW; } else { $state='green'; $state_title=LANG_GENERAL_GREEN; } $new_details=implode(". ",$details); if ($this->getProperty("stateDetails")!=$new_details) { $this->setProperty('stateDetails',$new_details); } if ($this->getProperty('stateColor')!=$state) { $this->setProperty('stateColor',$state); $this->setProperty('stateTitle',$state_title); if ($state!='green') { say(LANG_GENERAL_SYSTEM_STATE." ".LANG_GENERAL_CHANGED_TO." ".$state_title."."); say(implode(". ",$details)); } else { say(LANG_GENERAL_SYSTEM_STATE." ".LANG_GENERAL_RESTORED_TO." ".$state_title); } $this->callMethod('stateChanged'); }
$details=array(); $red_state=0; $yellow_state=0; if ($red_state) { $state='red'; $state_title=LANG_GENERAL_RED; } elseif ($yellow_state) { $state='yellow'; $state_title=LANG_GENERAL_YELLOW; } else { $state='green'; $state_title=LANG_GENERAL_GREEN; } $new_details=implode(". ",$details); if ($this->getProperty("stateDetails")!=$new_details) { $this->setProperty('stateDetails',$new_details); } if ($this->getProperty('stateColor')!=$state) { $this->setProperty('stateColor',$state); $this->setProperty('stateTitle',$state_title); if ($state!='green') { say(LANG_GENERAL_SECURITY_STATE." ".LANG_GENERAL_CHANGED_TO." ".$state_title."."); say(implode(". ",$details)); } else { say(LANG_GENERAL_SECURITY_STATE." ".LANG_GENERAL_RESTORED_TO." ".$state_title); } $this->callMethod('stateChanged'); }
Свойства класса:
Методы класса:
//$params['t'] $this->setProperty("updated",time()); $this->setProperty("updatedTime",date("H:i",time())); $this->setProperty("alive",1); $ot=$this->object_title; $alive_timeout=(int)$this->getProperty("aliveTimeOut"); if (!$alive_timeout) { $alive_timeout=30*60; } clearTimeOut($ot."_alive"); setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); if (!isset($params['t'])) { return; } $old_temp=$this->getProperty('temp'); $t=round($params['t'],1); if ($t>110) return; $this->setProperty('temp',$t); if ($params['uptime']) { $this->setProperty('uptime',$params['uptime']); } if ($t>$old_temp) { $d=1; } elseif ($t<$old_temp) { $d=-1; } else { $d=0; } $this->setProperty('direction',$d); $linked_room=$this->getProperty("LinkedRoom"); if ($linked_room) { setGlobal($linked_room.'.Temperature',$t); }
Объекты класса:
/*$tout=gg("T1Wout.temp"); $qwe=round($tout,0); sg("T1Wout.temp",$qwe); */
Свойства класса:
Объекты класса:
Свойства класса:
Методы класса:
//START openweather module $updateTime = gg('ow_setting.updateTime'); if($updateTime > 0) { $count = gg('ow_setting.countTime'); if($count >= $updateTime) { include_once(DIR_MODULES . 'app_openweather/app_openweather.class.php'); $app_openweather = new app_openweather(); $app_openweather->get_weather(gg('ow_city.id')); sg('ow_setting.countTime', 1); } else { $count++; sg('ow_setting.countTime', $count); } } // END openweather module
Объекты класса:
$h=(int)date('G',time()); $m=date('i',time()); //Записываем текущее время sg("ThisComputer.timeNow",date( "H:i", time())); if (($h==10 and $m=="30")) { RunScript('birthday'); } //Поздравляю с днем рождения // получем ЧАСЫ и МИНУТЫ отдельно $timeH=date("H", time()); $timeM=date("i", time()); sg("ThisComputer.timeH",$timeH); sg("ThisComputer.timeM",$timeM); // Сценариий выборки даты и времени if (($h==0 and $m=="00")) {RunScript('day2day');} //будильники $objects=getObjectsByClass("AlarmClock"); foreach($objects as $obj) { // переберем все будильники в системе if (gg($obj['TITLE'].".AlarmOn") && timeIs(gg($obj['TITLE'].".AlarmTime"))) { //если будильник включен и время совпало callMethod($obj['TITLE'].".AlarmRun"); // выполним метод будильника } } // Опрос температуры всех Мегадевайсов if (!($m%5)) { $objects = getObjectsByClass('MegaD'); foreach ($objects as $obj) { if (getGlobal($obj['TITLE'].'.ipAddress')) { callMethod($obj['TITLE'].'.getData', array('port'=>'tget')); } } } if (($h>=10) && getGlobal('clockChimeEnabled')) { if ($m=="00") { say(timeNow(),2); } } if (timeIs("23:00")) { callMethod("NightMode.activate"); sg('NightMode.Text','Дом в режиме "Ночь"'); say('Дом в режиме "Ночь"',-1); } else if (timeIs(gg('SunRiseTime'))) { callMethod("NightMode.deactivate"); sg('NightMode.Text','Дом в режиме "День"'); say('Дом в режиме "День"',-1); } //Если время между рассветом/закатом и закатом/рассветом if (timeBetween(getGlobal('SunRiseTime'),getGlobal('SunSetTime'))) { if (getGlobal("isDark")) {setGlobal("isDark",0); callMethod('DarknessMode.deactivate');} } else { if (!getGlobal("isDark")) { setGlobal("isDark",1); callMethod('DarknessMode.activate'); } } //Если рассвет,то if (timeIs(getGlobal('SunRiseTime'))) { runScript('SunRise'); sg("LED.status","0"); } //Если закат,то if (timeIs(getGlobal('SunSetTime'))) { say('Вот уж и вечер , солнце заходит',2); }
Методы класса:
Объекты класса:
if ($params['serial']=='' && $params['devname']!='') { $params['serial']=$params['devname']; } $device=SQLSelectOne("SELECT * FROM usbdevices WHERE SERIAL LIKE '".$params['serial']."'"); if (!$device['ID']) { // new device connected //say("Подключено новое устройство",1); $device=array(); $device['SERIAL']=$params['serial']; $device['TITLE']='устройство '.$params['devname']; $device['FIRST_FOUND']=date('Y-m-d H:i:s'); $device['LAST_FOUND']=date('Y-m-d H:i:s'); $device['LOG'].=$device['FIRST_FOUND'].' подключено (впервые)'."\n"; $device['ID']=SQLInsert('usbdevices',$device); } else { // device already in our database //say("Подключено ".$device['TITLE'],1); if ($device['USER_ID']) { $user=SQLSelectOne("SELECT * FROM users WHERE ID='".$device['USER_ID']."'"); if ($user['ID']) { //$user['NAME']; // теперь мы знаем имя пользователя, связанного с этим устройством } } $device['LAST_FOUND']=date('Y-m-d H:i:s'); $device['LOG']=$device['LAST_FOUND'].' подключено'."\n".$device['LOG']; SQLUpdate('usbdevices',$device); if ($device['SCRIPT_ID']!='') { runScript($device['SCRIPT_ID'],$params); } elseif ($device['SCRIPT']!='') { eval($device['SCRIPT']); } }
Свойства класса:
Методы класса:
Объекты класса:
Свойства класса:
Объекты класса:
Объекты класса:
, Россия
© 2025 - Site Built By SergeJey | Реквизиты: Курицын С. С. ИНН 762001394609 | Контакты | Публичный договор
SmartLiving