Свойства класса:
Методы класса:
Объекты класса:
// это однократный будильник, выключем его
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("Отключено питание");Свойства класса:
Методы класса:
$this->setProperty('LastRun',date('Y-m-d H:i:s'));$name='Cron_'.$this->object_title;
SQLSelectOne("DELETE FROM jobs WHERE title='".$name."'");Свойства класса:
Методы класса:
//$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("updated",time());
$this->setProperty("updatedTime",date('H:i'));
if ($this->getProperty('active')) {
say("Режим ".$this->getProperty('title')." активирован.",-1);
} else {
say("Режим ".$this->getProperty('title')." выключен.",-1);
}$this->setProperty('active',1);$this->setProperty('active',0);Объекты класса:
setGlobal('minMsgLevel','2');setGlobal('minMsgLevel','1');Объекты класса:
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);
}Свойства класса:
Методы класса:
$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');
}$this->setProperty("status",0);$this->setProperty("status",1);Объекты класса:
$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");}
*/Свойства класса:
Методы класса:
$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");
$this->setProperty('SomebodyHere',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";Объекты класса:
Методы класса:
Объекты класса:
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']);
}
}Свойства класса:
Методы класса:
Объекты класса:
Свойства класса:
Объекты класса:
Объекты класса:
, Россия
© 2026 SJLab | Реквизиты: Курицын С. С. ИНН 762001394609 | Контакты | Публичный договор
SmartLiving