Подключение контроллера MegaD-328

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Подключение контроллера MegaD-328

Сообщение Bagir » Пт окт 10, 2014 8:42 pm

Zaratustra писал(а):Чувствую, что с моими большими запросами придется изучать РHP
Скажу так, что в МД без php можно обойтись, но совсем совсем недолго )) Первая же интересная железяка или хитрое решение заставит изучать php. Я сам недавно начал. Знаю на ноль целых фиг десятых. Но тем не менее пробую силы. Сейчас как раз смотрю как передать все параметры в метод МД.
в megad.php реализован только поиск нужного объекта меги, если их несколько. Сначала идет по id меги, а если не нашел, то по ip. Затем просто передает методу класса параметры. Дальше уже в игру вступает он.
По поводу передачи сразу всех параметров, это сделаю сегодня через пару часиков. Вот на что походе от меги
GET /megad.php?mdid=1&all=OFF/0;OFF/0;OFF/0;OFF/0;ON/1;OFF/0;OFF/0;OFF;ON;OFF;OFF;OFF;OFF;OFF;288;203
ключевое слово all=. Но раз уж так, то правильнее будет передать в МД вообще все полученные параметры, а обрабатывать их в классе.
По поводу вопросов: Этот класс еще новый, и в нем сейчас все пишется в debmes. Но вам это наврятли поможет для решения поставленных задач. Это скорее отладочная инфа. А все что спрашивали отлично реализуется в МД. Но с php придется подружиться. Вообще так то хватит самых базовых знаний. Потратив месяц на изучение - результатом будите ооочень довольны. Я уже не раз тут говорил, что объектная модель + язык программирования рвут в клочья любой планировщик.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Подключение контроллера MegaD-328

Сообщение Bagir » Пт окт 10, 2014 10:04 pm

Вот сыренный вариант кода метода incomingMessageПоказать

Код: Выделить всё

// запускается из файла megad.php с передачей всех параметров от меги
// Обрабатывает нажатия, отпускания, а так же двойные и долгие нажатия в любой комбинации.

// Не забудьте настроить нужные порты Меги как 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
/* универсального кода тут написать невозможно. Все будет зависеть от комплектации меги
   но с большей долей вероятности у Вас будет модуль 7I7O (7 входов 7 выходов) + 2 АЦП порта с меги.
   Разбиваем строку на массив, перебираем значения и устанавливаем нужные свойства.
*/   
if (isset($params['all'])) {
  $ps = explode(";", $params['all']);
  $i=0;
  foreach($ps as $pt) {
    $i = $i + 1;

    switch ($i) {
    case 8:
      say('значение выхода 1 '.$pt);
      break;
    case 9:
      say('значение выхода 2 '.$pt);
      break;
    }
  }
  return; 
}


//Параметр 'm' не передается при нажатии. А при отпускании кнопки его значение = 1
//Переводим его в статус. 0-не нажата 1-нажата
//$ms=!$params['m']+0;
if (!isset($params['m'])) {$ms=1;} else {$ms=0;}

 
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:
    $s = 'Получено какое то сообщение от Меги';
    if (isset($params['pt'])) { $s = $s.' порт '.$params['pt']; }
    if (isset($params['mm'])) { $s = $s.' статус 0'; }
    say($s);
  } 
и тоже сыренький megad.phpПоказать

Код: Выделить всё

<?
/*
* Автор Казаков Сергей
* на форуме под ником Bagir
* благодарность dimitrystd на примеры
* ver 1.1
*/

 include_once("./config.php");
 include_once("./lib/loader.php");
 $session=new session("prj");
 $db=new mysql(DB_HOST, '', DB_USER, DB_PASSWORD, DB_NAME); // connecting to database
 include_once("./load_settings.php");
 if (!headers_sent()) {
  header ("HTTP/1.0: 200 OK\n");
  header ('Content-Type: text/html; charset=utf-8');
 }


 $log = getLogger(__FILE__);
 //$log->trace(sprintf('Got message from MegaDevice (mdid=%s, pt=%s, m=%s)', $params['mdid'], $params['pt'], $params['m']));
 $log->trace('Got message from MegaDevice '.serialize($params));

 $objects = getObjectsByClass('MegaD'); 
 $megaD = null;
 
 // В начале ищем объект Меги по mdid
 if (isset($params['mdid'])) {
      foreach ($objects as $obj) {
           if (trim(getGlobal($obj['TITLE'].'.id')) == $params['mdid']) {
                $megaD = $obj;
                break;
           }
      }
 } else {
      $log->error('MegaDevice has not transmitted mdid. Try to search on IP');
 }
 
 // Если не нашли по mdid, ищем по IP
 if (!isset($megaD)) {
      // Получить IP адрес MegaD
      $ip = $_SERVER['REMOTE_ADDR'];
      if (isset($ip)) {
           foreach ($objects as $obj) {
                if (trim(getGlobal($obj['TITLE'].'.ipAddress')) == $ip) {
                     $megaD = $obj;
                     break;
                }
           }
      } else {
           $log->error('Cannot determinate remote IP address of megadevice!');
      }
 }

 // Запуск метода incomingMessage с передачей ему агрументов или
 // сообщение при неудаче. Объект с нужным ID или IP не найден в классе MegaD
 if (isset($megaD)) {
      callMethod($megaD['TITLE'].'.incomingMessage', $params);

 } else { 
      $log->error('Cannot find object of MegaD class with mdid = '. $params['mdid'].' or ip = '.$ip );
 }


 $session->save();
 $db->Disconnect(); // closing database connection
?>
Завтра оттестирую и выложу в релиз.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Zaratustra
Сообщения: 9
Зарегистрирован: Пт окт 10, 2014 7:48 pm
Благодарил (а): 4 раза
Поблагодарили: 0

Re: Подключение контроллера MegaD-328

Сообщение Zaratustra » Сб окт 11, 2014 4:32 am

Bagir,
к сожалению, у меня этот код не заработал.
При этом если на старом коде раз в минуту было голосовое сообщение "Я что-то переключаю", что соответствовало порту 0, то сейчас уже ничего не произносит.
Управление выключателями с MajorDomo работает, но если изменить состояние порта через базовый Веб интерфейс самого Мегадевайса, то состояние кнопок не меняется.
При этом если управлять через Андроид-приложение - состояние кнопок в Веб-интерфейсе синхронизируется через несколько секунд (неверно это из-за того, что в параметрах кнопки я поставил автообновление 5 сек)
erandess
Сообщения: 50
Зарегистрирован: Пт окт 03, 2014 9:04 am
Благодарил (а): 2 раза
Поблагодарили: 14 раз

Re: Подключение контроллера MegaD-328

Сообщение erandess » Сб окт 11, 2014 12:02 pm

Bagir, подскажите как сделать обработку счетчиков MegaD? Хочу к ней подключить водяной счетчик.
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Подключение контроллера MegaD-328

Сообщение Bagir » Сб окт 11, 2014 7:03 pm

Zaratustra писал(а):Bagir, к сожалению, у меня этот код не заработал.
А я и не говорил, что это готовое решение. Да и в прочем готового тут просто не может быть. Система МД на столько свободна от рамок и ограничений, что я просто не могу себе позволить их устанавливать, и уходить от объектной модели.
Вот кусок кода из верхнего примера

Код: Выделить всё

// если мега передала все параметры одной строкой
// all=OFF/0;OFF/0;OFF/0;OFF/0;ON/1;OFF/0;OFF/0;OFF;ON;OFF;OFF;OFF;OFF;OFF;288;203
/* универсального кода тут написать невозможно. Все будет зависеть от комплектации меги
   но с большей долей вероятности у Вас будет модуль 7I7O (7 входов 7 выходов) + 2 АЦП порта с меги.
   Разбиваем строку на массив, перебираем значения и устанавливаем нужные свойства.
*/   
if (isset($params['all'])) {
  $ps = explode(";", $params['all']);
  $i=0;
  foreach($ps as $pt) {
    $i = $i + 1;

    switch ($i) {
    case 8:
      say('значение выхода 1 '.$pt);
      break;
    case 9:
      say('значение выхода 2 '.$pt);
      break;
    }
  }
  return; 
}
Тут для примера указаны два выхода. Этот кусок кода будет выполняться, когда мега шлет строку со всеми статусами. А дальше выполнение будет прекращено, т.к. остальной код уже для обработки сообщения по конкретному порту. По аналогии делаем остальные. А уж что делать дальше - решать уже ВАМ! Например, можно обновлять статус объекта реле. Пожалуй, я это сделаю в примере. Сегодня допилю класс, все оформлю, и выложу с этим примером.
Погодка порадовала, весь день провел в саду с домашними делами.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Подключение контроллера MegaD-328

Сообщение Bagir » Сб окт 11, 2014 7:06 pm

erandess писал(а):Bagir, подскажите как сделать обработку счетчиков MegaD? Хочу к ней подключить водяной счетчик.
Уточните задачу. Речь идет о встроенных счетчиках меги? или планируйте поднять счетчики в МД? Каким способом будет подключен водяной счетчик? Он когда считает выдает импульсы вкл-выкл-вкл-выкл?
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Подключение контроллера MegaD-328

Сообщение Bagir » Сб окт 11, 2014 9:28 pm

Добавлена возможность обработки параметра all для синхронизации статуса портов меги со статусами объектов МД.
http://smartliving.ru/forum/viewtopic.php?f=14&t=1832
За это сообщение автора Bagir поблагодарил:
Zaratustra (Вс окт 12, 2014 2:07 pm)
Рейтинг: 1.16%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
erandess
Сообщения: 50
Зарегистрирован: Пт окт 03, 2014 9:04 am
Благодарил (а): 2 раза
Поблагодарили: 14 раз

Re: Подключение контроллера MegaD-328

Сообщение erandess » Вс окт 12, 2014 9:00 am

Да, есть желание поэкспериментировать со встроенным счетчиком Меги. Водяной счетчик с герконом должен сойти за "сухой контакт", порт срабатывает на замыкание. По информации на форуме ab-blog.ru (цитирую Андрея): Любой порт типа IN (то есть вход) давно уже снабжен счетчиком и считает все срабатывания (согласно настройке: P, R, P&R). Сброс счетчика происходит командой типа http://192.168.0.14/sec/?pt=3&cnt=0. Значение счетчика сервер может запросить у устройства командой http://192.168.0.14/sec/?pt=3&cmd=get. Но и само устройство теперь способно сообщать всю информацию о своих портах на сервер (включая значения счетчиков) один раз в минуту. Config -> Megad-ID -> srv_loop. Мега считает замыкания, сервер раз каждый час считывает счетчик, обновляет некое свойство объекта (например WaterMeter.сount) и обнуляет счетчик. Можно ли увязать это с вашей обработкой портов? Уж больно красиво у вас получается.
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Подключение контроллера MegaD-328

Сообщение Bagir » Вс окт 12, 2014 9:45 am

erandess писал(а):Да, есть желание поэкспериментировать со встроенным счетчиком Меги.
Получить счетчик очень просто. Вопрос лишь в том, что с ним делать дальше. Если использовать настройку на Меге Config -> Megad-ID -> srv_loop то она будет слать сообщение с параметром all=. Его обработка сделана в последнем обновлении, но там я просто теряю счетчик. Вот кусок кода метода incomingMessage

Код: Выделить всё

/* если мега передала все параметры одной строкой 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 $pt) {
    $i = $i + 1;
    // Оторвать счетчик. Пока что у меня нет на него планов.
    $pt = explode("/", $pt);
    $pt = $pt[0]; 
    // Заменить слова на цифры    
    if ($pt == 'ON') { $pt = 1; }
    if ($pt == 'OFF') { $pt = 0; }
    // Обрабатываем значения нужных нам портов
    switch ($i) {
    case 8:
      // Если есть задача периодически синхронизировать статус порта меги со статусом объекта МД
      // Изменение статуса объекта реле таким образом не приведет к отправке команды меге на включение или выключение порта, что нам и надо.
      setGlobal('Relay1MegaD1.status',$pt); 
      break;
    case 9:
      // Просто сказать статус порта 2 для примера.
      say('значение выхода 2 '.$pt);
      break;
    }
  }
  return; 
}
 
Вот именно тут я отбрасываю счетчик. Код конечно написан совсем не в стиле php. Я только начал его изучать, и пока что сильно сказывается синтаксис VBA. Так что уж прощайте мне это, и если где можно сделать по красивей, обязательно напишите с примером!

Код: Выделить всё

    // Оторвать счетчик. Пока что у меня нет на него планов.
    $pt = explode("/", $pt);
    $pt = $pt[0]; 
можно убрать $pt = $pt[0]; и за значением статуса порта так дальше и обращаться к $pt[0], а за значением счетчика к $pt[1]. Тогда в группах case можно указать, в какое свойство объекта МД писать значения счетчика. Вечерком сделаю полный пример и обновлю класс. Файл megad.php останется тот же. Я уже писал ранее, главное чтобы класс и файл были одной версии до точки. Иначе они не совместимы. И еще подсказка, при обновлениях МД файл megad.php затирается. Я так разок сам попался ))
Еще для получения счетчика нам будет интересен метод getOutput. Его тоже перепишу вечерком чтобы по параметру раздельно возвращал статус и счетчик. С помощью него будет можно раз в установленный интервал времени самому забирать значение счетчика у меги. Или же сразу, когда это потребуется.
Если есть еще какие либо идеи, обязательно пишите, будем пробовать. Как нибудь попробуйте потестить двойное и долгое нажатие. Я хоть и давно уже прикрутил, но сам пока что нигде не использую. Там где это бы могло пригодится, пока что самой меги нету ) Заказал, скоро приедет.
Большая просьба, кто использует мой класс, жмакните спасибо в теме http://smartliving.ru/forum/viewtopic.php?f=14&t=1832 где файлы. Мне было бы очень интересно знать кому он пригодился.
За это сообщение автора Bagir поблагодарил:
odinvolk (Вс апр 29, 2018 3:09 pm)
Рейтинг: 1.16%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Подключение контроллера MegaD-328

Сообщение Bagir » Вс окт 12, 2014 10:54 am

Вот идея пришла по поводу счетчиков. Набор пин кода например на кнопке звонка. Реакция на двойное и долгое нажатие у меня есть. План такой: Двойным нажатием мы блокируем звонок скажем на 1 минуту, чтобы повторно не кричал при каждом нажатии. При этом в системе МД создается "Событие" на это время, которое разрешит отлов пин кода. Одиночными нажатиями на кнопку мы настукиваем первую цифру. Затем для ее ввода жмем и держим (долгое нажатие). Или же другой вариант, мы просто ждем, когда закончится отодвигаемый таймер после последнего нажатия, скажем, в 2 секунды. Если цифра принята, можно чем нибудь подмигнуть, или даже сказать об этом, например, в домофон. Приступаем ко вводу второй цифры. И так далее..
Суть в том, что цифру мы набираем в счетчике меги, а при переходе к следующей, сбрасываем счетчик. Вообще так то можно и просто в свойстве объекта МД цифру настукивать, чтобы не завязывать идею на мегу. В реализации этого способа не вижу никаких граблей. Но на сколько все это будет удобно и стабильно работать, пока что сказать не могу. Как поставлю Мегу в гараж, попробую сделать. Если режим охраны не включен, значит хозяева где то рядом, и почему бы и не запускать по пин коду.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Ответить