a:1:{i:0;a:6:{s:5:"TITLE";s:5:"MegaD";s:5:"NOLOG";s:1:"0";s:11:"DESCRIPTION";s:104:"Класс для связи устройств MegaD с объектами системы МД
ver 2.1";s:7:"METHODS";a:4:{i:0;a:7:{s:5:"TITLE";s:15:"incomingMessage";s:11:"DESCRIPTION";s:439:"Получение обработанного сообщения от mega.php. Для каждого объекта Меги нужно указать каким именно объектам, как и что будет передано. Это важно! По задумке, сообщения от объектов класса MegaD должны быть переданы, например, объектам класса keySensors.";s:4:"CODE";s:0:"";s:11:"CALL_PARENT";s:1:"0";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2014-10-19 01:21:56";s:15:"EXECUTED_PARAMS";s:86:"a:3:{s:2:"pt";i:1;s:6:"iasked";s:5:"OFF/0";s:21:"ORIGINAL_OBJECT_TITLE";s:6:"MegaD1";}";}i:1;a:7:{s:5:"TITLE";s:9:"setOutput";s:11:"DESCRIPTION";s:344:"Отправка команды Меге на коммутацию ее выхода. Метод сформирует строку вида http://192.168.0.14/sec/?cmd=0:1, что, к примеру, означает включить канал 0. В качестве параметров требуются $params['port'] и $params['value']";s:4:"CODE";s:303:"// Expects 'output' and 'value' in $params
$cmdUrl = sprintf('http://%s/%s/?cmd=%d:%d', $this->getProperty('IpAddress'), 
  $this->getProperty('Password'), intval($params['port']),
  intval($params['value']));
$log = getLogger($this);
$log->trace('setOutput method: '.$cmdUrl);
getURL($cmdUrl, 0);";s:11:"CALL_PARENT";s:1:"0";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2014-10-17 22:25:48";s:15:"EXECUTED_PARAMS";s:80:"a:3:{s:4:"port";i:13;s:5:"value";i:0;s:21:"ORIGINAL_OBJECT_TITLE";s:6:"MegaD1";}";}i:2;a:7:{s:5:"TITLE";s:9:"getOutput";s:11:"DESCRIPTION";s:563:"Получить состояние порта и передать его объекту. Применяется, например, для периодического опроса датчика и построения графика. Метод сформирует строку вида http://192.168.0.20/sec/?pt=0&cmd=get. В качестве параметров требуются $params['port'], $params['objName']. Для установки свойства $params['propertyName'], а для запуска метода еще и $params['methodName']";s:4:"CODE";s:1434:"/* Пока что я более не вижу необходимости в этом методе. 
   Все удачно реализуется через getData и incomingMessage
   Этот метод getOutput пока оставлен "как есть"
*/
$log = getLogger($this);
$cmdUrl = sprintf("http://%s/%s/?pt=%d&cmd=get", $this->getProperty('IpAddress'), $this->getProperty('Password'), intval($params['port']));

$state = trim(file_get_contents($cmdUrl));
$log->trace(sprintf('getOutput method: %s returned %s', $cmdUrl, $state));

//Замена в ответе слов на статусы
// ...Нет отрезания счетчика!...
switch ($state) {
case 'ON':  $value = 1; break;
case 'OFF': $value = 0; break;
default:    $value = $state;
}
 
// Вызов метода с передачей свойства или просто установка свойства
if (isset($params['objName'])) {
 if (isset($params['methodName'])) {
  callMethod($params['objName'].'.'.$params['methodName'], array($params['propertyName']=>$value));
  $log->trace(sprintf('getOutput method: cm=%s set %s = %d', $params['objName'].'.'.$params['methodName'], $params['propertyName'], $value));
 } else { 
  setGlobal($params['objName'].'.'.$params['propertyName'], $value);
  $log->trace(sprintf('getOutput method: set %s = %d', $params['objName'].'.'.$params['propertyName'], $value));
 }
}";s:11:"CALL_PARENT";s:1:"0";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2014-10-19 01:22:00";s:15:"EXECUTED_PARAMS";s:138:"a:4:{s:4:"port";i:14;s:7:"objName";s:19:"sensorOutdoorAirGas";s:12:"propertyName";s:6:"status";s:21:"ORIGINAL_OBJECT_TITLE";s:6:"MegaD1";}";}i:3;a:7:{s:5:"TITLE";s:7:"getData";s:11:"DESCRIPTION";s:103:"Спросить о состоянии с передачей ответа в метод incomingMessage";s:4:"CODE";s:1517:"/* Варианты запуска
 callMethod('MegaD1.getData', array('port'=>'all'));   //Спросить сразу все.
 callMethod('MegaD1.getData', array('port'=>1));       //Спросить состояние первого порта
*/

$log = getLogger($this);
$cmdUrl = sprintf("http://%s/%s/", $this->getProperty('IpAddress'), $this->getProperty('Password'));

// Определяемся с параметрами для запроса данных у Меги
if ($params['port']=='all') { $cmdUrl .= '?cmd=all'; }
else { $cmdUrl .= sprintf("?pt=%d&cmd=get", intval($params['port'])); }

// Запрос данных у Меги и их логирование
$dt = trim(file_get_contents($cmdUrl));
$log->trace(sprintf('getData method: %s returned %s', $cmdUrl, $dt));


// Собираем массив $param_s для отправки методу incomingMessage на обработку
switch ($params['port']) {
// Передать весь ответ в параметре all
case 'all':  
  $param_s = array('all'=>$dt);
  break;
// Возможны дополнения
case 'может что то еще':
  // ...
  break;
// Передать ответ как есть с номером этого же порта
default:    
  $param_s = array('pt'=>$params['port'], 'iasked'=>$dt);
}  

// Запустить метод incomingMessage с передачей массива с параметрами
$this->callMethod('incomingMessage', $param_s);
";s:11:"CALL_PARENT";s:1:"0";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2014-10-19 01:21:56";s:15:"EXECUTED_PARAMS";s:63:"a:2:{s:4:"port";i:1;s:21:"ORIGINAL_OBJECT_TITLE";s:6:"MegaD1";}";}}s:10:"PROPERTIES";a:5:{i:0;a:4:{s:5:"TITLE";s:9:"ipAddress";s:11:"DESCRIPTION";s:122:"Нужен для отправки команд и идентификации объекта если не задан mdid";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";}i:1;a:4:{s:5:"TITLE";s:2:"id";s:11:"DESCRIPTION";s:186:"Идентификатор Меги. Может быть задан в ее настройках Вначале поиск объекта в megad.php проводится по нему.";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";}i:2;a:4:{s:5:"TITLE";s:8:"isOnline";s:11:"DESCRIPTION";s:147:"На будущее. Результат периодической проверки пингом. Чтобы разгрузить OperationalModes.";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";}i:3;a:4:{s:5:"TITLE";s:8:"password";s:11:"DESCRIPTION";s:105:"Пароль от Меги. sec по умолчанию. Нужен для отправки команд.";s:12:"KEEP_HISTORY";s:1:"0";s:8:"ONCHANGE";s:0:"";}i:4;a:4:{s:5:"TITLE";s:11:"temperature";s:11:"DESCRIPTION";s:345:"На будущее. Температура Меги с историей. Не знаю зачем это, но почему бы не полюбопытствовать. Летом в жару шкафы могут сильно нагреваться. Зимой тоже будет интересно на сколько там холодно.";s:12:"KEEP_HISTORY";s:1:"7";s:8:"ONCHANGE";s:0:"";}}s:7:"OBJECTS";a:1:{i:0;a:3:{s:5:"TITLE";s:6:"MegaD1";s:11:"DESCRIPTION";s:0:"";s:7:"METHODS";a:1:{i:0;a:7:{s:5:"TITLE";s:15:"incomingMessage";s:11:"DESCRIPTION";s:0:"";s:4:"CODE";s:9377:"/* запускается из файла megad.php с передачей всех параметров от меги
   или из метода getData, когда спрашиваем сами
*/

/* Обрабатывает нажатия, отпускания, а так же двойные и долгие нажатия в любой комбинации.
   Для этого не забудьте на самой Меге настроить нужные порты как P&R !!!
*/

/* Не нагружайте этот метод своим кодом если планируйте в дальнейшем обновлять этот класс. 
   Мой совет - просто передавайте события отсюда в свои объекты. Проще будет при обновлении.
*/   

/* План по отлову двойного и долгого нажатия: 
   При нажатии
   запускаем два разных таймера:
   _doublePressTimer на 1 секунду для контроля двойного нажатия
   _longPressTimer на 3 секунды для запуска события долгого нажатия
   Если уже существует _doublePressTimer, значит произошло событие двойное нажатие.
   
   При отпускании
   Произошло событие отпускание1. Оно произойдет в любом случае при отпускании
   Только если не было долгого нажатия - произойдет событие Отпустил2
   удаляем _longPressTimer чтобы не запустилось долгое нажатие

   Обработку ненужных событий при желании можно закоментировать. 
   События "Отпустил" нужны в том случае, если ненужно выполнять событие нажал при событии долгое нажатие.

   Замените все нужные say() на код установки свойств или запуска ВАШИХ методов.
   Играемся, тестируем, смотрим лог, пишет свои комментарии!
*/


$ot=$this->object_title;      


/* если мега передала все параметры одной строкой 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.
      say('значение входа 1 равно '.$dt[0].', счётчик '.$dt[1]);
      break;
    case 8:
      // Если есть задача периодически синхронизировать статус порта меги со статусом объекта МД.
      // Изменение статуса объекта реле таким образом не приведет к отправке команды меге на включение или выключение порта, что нам и надо.
      setGlobal('Relay1MegaD1.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 ($params['pt']) {
  case 1:
    // Сказать счетчик входа 1 и его статус
    // Не спрашивайте счетчики у выходов. Они есть только у входов 1-7.
    say('Я спросил значение входа 1 равно '.$dt[0].', счётчик '.$dt[1]);
    break;
  default:
    // Если порта нет в группах case
    say('Я спросил статус порта '.$params['pt'].', а что с ним делать пока не придумал.');
  }
  return; 
}


/* Мегадевайс сам шлет нам на сервер get сообщение о изменении статуса порта.
   Мега передаст номер порта в $params['pt'] и статус замкнули/разомкнули в $params['m'].
   ВНИМАНИЕ! в группах case нужно изменить код на свой!
*/
if (isset($params['pt'])) {

  //Параметр 'm' с меги не передается при нажатии. А при отпускании кнопки его значение = 1
  //Переводим его в статус. 1 - замкнули (нажали); 0 - разомкнули (отпустили)
  if (!isset($params['m'])) {$ms=1;} else {$ms=0;}
  
  // ВНИМАНИЕ! в группах case нужно изменить код на свой!
  switch ($params['pt']) { //pt это порт Меги. Для каждого порта своя группа команд case
  case 0: //Этот порт на Меге настроен как P
    //Задача - просто переключить объект реле
    say('Я что то переключаю');
    callMethod('Relay1MegaD1.switch');
    break;

  case 1: // P&R
    //Задача - Передать объекту sensorTest статус 1 при замыкании порта Меги
    // и статус 0 при размыкании
    say('Передаю тестовому датчику статус '.$ms);
    //callMethod('sensorTest.statusChanged', array('status'=>$ms));
    break;

  case 3: // P&R
    //Задача - Получить все события какие только можно
    if ($ms) {
      // Произойдет в любом случае
      say('Нажал!');

      if (timeOutExists($ot.'_'.$params['pt'].'_doublePressTimer')) {
        say('Двойное нажатие!');
      }

      setTimeOut($ot.'_'.$params['pt'].'_longPressTimer', "say('Долгое нажатие!');", 3);        
      setTimeOut($ot.'_'.$params['pt'].'_doublePressTimer', "", 1);        

    } else {
      // Произойдет в любом случае
      say('Отпустил 1!');

      if (timeOutExists($ot.'_'.$params['pt'].'_longPressTimer')) {
        // Произойдет только если не было длинного нажатия
        say('Отпустил 2!');
      }

      clearTimeOut($ot.'_'.$params['pt'].'_longPressTimer');    
    }  
    break;
    
  // Далее идут уже лично мои настройки. Оставил их для примера.
  case 4: // P&R
    callMethod('sensorOutdoorAirDamperClose.statusChanged' ,array('status'=>$ms));
    //say('Передаю датчику воздушной заслонки статус '.$ms);
    break;

  default:
    // Если порта нет в группах case
    say('Получено сообщение от Меги с порта '.$params['pt']);
  }
}";s:11:"CALL_PARENT";s:1:"1";s:9:"SCRIPT_ID";s:1:"0";s:8:"EXECUTED";s:19:"2014-10-19 01:21:56";s:15:"EXECUTED_PARAMS";s:44:"a:2:{s:2:"pt";i:1;s:6:"iasked";s:5:"OFF/0";}";}}}}}}