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

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

Модератор: immortal

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

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

Сообщение Bagir » Пн дек 08, 2014 8:54 pm

Вообще надо бы довести до ума. У Z-Wave выключателя отлавливается даже долгое нажатие после двойного. Таким образом, одна кнопка может переключать 4 канала или переключать 2 канала с возможностью их диммировния.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Jager
Сообщения: 708
Зарегистрирован: Сб авг 18, 2012 10:21 am
Благодарил (а): 26 раз
Поблагодарили: 183 раза

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

Сообщение Jager » Пн дек 08, 2014 8:59 pm

Bagir писал(а):Да, действительно есть грабли
Если без использования P&R получится реализовать 2 действия уже хорошо.
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Пн дек 08, 2014 9:07 pm

2 действия вообще не проблема. Но это ничто. А хочется как всегда много. Впрочем можно написать различные варианты. Например если не требуется диммировать, а нужно только коммутировать несколько каналов различными видами нажатия, то и логику можно упростить. Но все равно понадобится P&R. Но, в случае недоступности сервера, нажатие на выключатель будет просто коммутировать один первый канал. Скажем так, свет все равно загориться, и это хорошо, а для остальных прелестей жизни уже нужен работающий сервер.
А что касается режима только P, так тоже стоит подумать. По крайней мере если нужно только два канала одной кнопкой. то незачем использовать сложный код, отлавливающий все. Подумаем.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Jager
Сообщения: 708
Зарегистрирован: Сб авг 18, 2012 10:21 am
Благодарил (а): 26 раз
Поблагодарили: 183 раза

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

Сообщение Jager » Пн дек 08, 2014 9:55 pm

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

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

Сообщение Bagir » Пн дек 08, 2014 10:14 pm

Jager писал(а):Мои домашние категорически не хотят запоминать какие то комбинации действий, максимум две функции.
Вот как же все точно написано :) У меня такая же история. Но потихоньку все же получается приобщить к прекрасному. Приобщение проходит медленно и не безболезненно. Но все же прогресс есть.
Кстати, я накидал примерный алгоритм, как все эти нажатия сделать. Он в корне отличается от того что есть сейчас. Будет видеть абсолютно все! Режим работы P&R, но в случае недоступности сервера, кнопка на входе Меги будет коммутировать только один первый канал. Так что без "Светы" точно не останемся :D Но появилась проблема. Вот она http://smartliving.ru/forum/viewtopic.php?f=4&t=1956 Я думаю, что решаемо. Просто не хотелось бы городить огород, а сделать по красивей. В любом случае результаты скоро будут.

Для режима "P" тоже сделаю вариант обычного и двойного нажатия. В случае отсутствия сервера, кнопка так же сможет управлять одним первым каналом. Тут вроде как могу обойтись без временных переменных одним только таймером.
примерный алгоритм P&RПоказать
при нажатии
пишем 1
если таймера нет, запускаем таймер, который запустит процедуру события

При отпускании
пишем 0
если таймера нет, запускаем процеруду смобытия.



Процедура события:
если
10 - простое нажатие
стереть
выполнить

если
1010 - двойное нажатие
стереть
выполнить

если
1 - долгое нажатие
добавить -
выполнить

если
101 - долгое после двойного
добавить -
выполнить

если
-1 завершение долгого
стереть
выполнить

если
-101 - завершение долгого после двойного
стереть
выполнить
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

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

Сообщение Kod.Begemot » Пн дек 08, 2014 11:17 pm

Bagir писал(а):Но все равно понадобится P&R. Но, в случае недоступности сервера, нажатие на выключатель будет просто коммутировать один первый канал. Скажем так, свет все равно загориться, и это хорошо, а для остальных прелестей жизни уже нужен работающий сервер.
Вы имеете в виду через Action? Я ошибаюсь, или для этого нужен выключатель с фиксацией? Я так понимаю что в режиме P&R реакция есть как на нажатие так и на отпускание, значит на выключателе без фиксации не удастся свет и включать и выключать - надо либо 2 кнопки либо что-то ещё...
Я предлагаю следующее решение (писал об этом на форуме ab-log.ru) - скриптиком скачиваем 2 конфигурации меги - одну для работы с сервером (режим P&R) и другую - для работы в "автономке" - режим P. Единственная заковыка - когда запускать эти скрипты.. Но думаю можно каждый раз при старте сервера проверять режим меги, и если не соответствует серверному - прописывать то, что нужно. При завершении работы сервера - прописывать конфиг автономный. У себя хочу так сделать при работе от аккумуляторов. Вариант 2 - "микро сервер" резервный, поднятый на каком-нибудь роутере/raspberry и т.п. - мало жрущий, с минимумом функций, но с гораздо большей живучестью.
Что думаете?
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

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

Сообщение sergejey » Пн дек 08, 2014 11:27 pm

Jager писал(а):
Bagir писал(а):По крайней мере если нужно только два канала одной кнопкой. то незачем использовать сложный код, отлавливающий все. Подумаем.
Опытным путем установлено что все это многообразие нужно только гикам, вроде нас. Мои домашние категорически не хотят запоминать какие то комбинации действий, максимум две функции.
Аналогичная ситуация, причём я сам забываю какая кнопка/комбинация за что отвечает, если их больше одной :) Например, есть пульты Ноолайт с тремя кнопками, каждая из которых, кроме включения/выключения, может быть настроена ещё на какую-то реакцию на долгое нажатие. Так вот, меня хватает запомнить, что делает одна кнопка из трёх без каких либо комбинаций ))

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Пн дек 08, 2014 11:44 pm

Jager писал(а):Вы имеете в виду через Action?
Попробовал сейчас и выпал с осадок. Я даже не предполагал, что в режиме P&R выход будет второй раз переключаться при отпускании кнопки. Напишу Андрею, может что подскажет, или добавит вариант. А сейчас действительно беда. Без сервера свет будет гореть только пока держишь кнопку. Блин. Я в расстройстве. P&R очень полезная штука, но убивает автономку. Вариант с заменой настроек как то пугает своей надежностью. Посмотрим, что скажет Андрей.
Kod.Begemot писал(а):причём я сам забываю какая кнопка/комбинация за что отвечает

Да впрочем и я так же. Но все же некоторые штуки запоминаются, если их сделать интуитивно понятными. Сейчас, из подобных выкрутасов, у меня только один двойной z-wave выключатель. Он управляет четырьмя вентиляторами притока и вытяжки с возможностью их диммирования. Блок диммирования пока не установлен, но код написан, и события ловятся. Вроде даже уже почти привык к нему ))
Еще по задумке пульт для поднятия ворот будет так же управлять и откатными воротами. Комбинация долгого нажатия и отпускания тоже не останется без дела. Например немного приоткрыть ворота или решетку.
Посмотрим потом на сколько это будет удобно. Конечно можно повесить вместо одного такого выключателя два отдельных, которые будут выполнять только одну задачу. Но тогда уж + 2 отдельных диммера к ним. И того целая стена в кнопках )) Тоже вариант не очень. Нужно сделать по возможности просто. А все доп функции, это уже по желанию. Либо все же придется запомнить как накликать выключатель, либо лезть в планшетку и включать там.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Вт дек 09, 2014 12:29 am

Есть хорошая новость. По ранее предложенному алгоритму, и с помощью временной переменной, хранимой в Event, я сейчас отлавливаю любую комбинацию нажатий. Да хоть тройное с удержанием. И вижу отпускание даже с уточнением после какой именно комбинации нажатий оно было. В общем, все распишем по кодам, и будет как в выключателях Z-Wave, чтобы не путаться.
А на счет тройного нажатия, так пусть тоже будет до кучи. Код это нисколько не нагрузит. Вот например люстра с тремя секциями. короткие нажатия в 1, 2, 3 клика включают или выключают свою секцию. Долгое нажатие включает или выключает сразу все. Выглядит вполне съедобно. Но без P&R в этом варианте никак. Не смогу увидеть отпускание, а значит про диммирование или выключение сразу всех секций можно забыть.

Для варианта просто P тоже все отлично. вижу 1,2,3, да вообще хоть сколько нажатий. Суть в том, что успеть нажать их надо за установленный интервал времени. Пока остановился на 1 секунде.

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

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

Сообщение Bagir » Вт дек 09, 2014 2:51 am

Пока что не буду спешить и выкладывать обновление класса целиком. Надо еще по тестировать. Ловите кусочек кода, кому нужна обработка разных нажатий. В коде метода incomingMessage нужного объекта Меги, ищем большой блок с этим вот комментарием в начале

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

/* Мегадевайс сам шлет нам на сервер get сообщение о изменении статуса порта.
   Мега передаст номер порта в $params['pt'] и статус замкнули/разомкнули в $params['m'].
   ВНИМАНИЕ! в группах case нужно изменить код на свой!
*/ 
Добавляем группу case с нужным номером порта Меги, на котором висит кнопка. В моем случае это так же и остался порт 3. Старый код смело стирайте. Новый вариант работает намного лучше.
Код группыПоказать

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

  case 3: // P&R //Задача - Получить любые комбинации
    // Получаем детали события
    $dt = registeredEventDetails($ot.'_'.$params['pt'].'_clicks');
    
    // Параметр doit будет добавлен при последующем рекурсивном вызове для окончания обработки комбинации нажатия
    if (!isset($params['doit'])) { 
      // Добавить состояние (нажата/отпущена) и записать в детали события
      registerEvent($ot.'_'.$params['pt'].'_clicks', $details=$dt.$ms, $expire_in=1);
      // Если таймер не существует 
      if (!timeOutExists($ot.'_'.$params['pt'].'_press')) {
        // Нажата или отпущена
        if ($ms) {
          // создать таймер с рекурсивным вызовом
          setTimeOut($ot.'_'.$params['pt'].'_press', "cm($ot.'.incomingMessage', array('pt'=>".$params['pt'].", 'doit'=>1));", 1);
        } else {
          // сразу рекурсивный вызов
          callMethod($ot.'.incomingMessage', array('pt'=>$params['pt'], 'doit'=>1));
        }  
      }

    } else { // параметр doit есть. Значит это рекурсивный вызов для окончания обработки комбинации нажатия
      // если справа 1 (то есть последнее действие нажал)
      if (substr($dt, -1)) {
        registerEvent($ot.'_'.$params['pt'].'_clicks', $details=$dt.'-', $expire_in=1);
      } else {
        registerEvent($ot.'_'.$params['pt'].'_clicks', $details='', $expire_in=1); // тут можно просто удалять событие
      }  
      /* Закомментировать или удалить этот блок 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; 
Добавить свой код нужно только в самом конце. Предлагаю два варианта на выбор. Запускать свой метод или скрипт, передавая в него код комбинации в переменной $dt, и уже в своем коде организовать блок switch () с разбором нужных комбинаций, или же прямо в имеющемся блоке switch () запускать свой код вместо say()

Но есть одно большое НО! В этом коде я использую свою функцию registeredEventDetails() чтобы из базы данных получать детали события Event. Вот ссыль на эту тему http://smartliving.ru/forum/viewtopic.p ... 956#p16106
Если кто еще не в курсе, предлагаю освоить момент, как писать и добавлять свои функции в МД. Это очень просто. Открываем на диске путь где лежат файлы МД. Забираемся вот сюда ...\majordomo\lib\ Создаем там файлик, например my.class.php Пишем в него код своей функции
Свои функцииПоказать

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

<?php
/*
* Свои дополнительные функции
*/

// Получить детали события по его имени
function registeredEventDetails($eventName) {
 $even=SQLSelectOne("SELECT * FROM events WHERE EVENT_NAME='".$eventName."'"); 
 if (is_array ($even )) {
  return $even['DETAILS'];
 } else {
  return false;
 }
}

?>
Вот как бы и все. Теперь функция из этого файла будет доступна из любого места. Во вложении я прицепил свой файлик my.class.php В нем есть эта и еще несколько других полезных дополнительных функций. Возможно они будут тоже вам интересны.

Весь этот код обработки комбинаций нажатий так же можно посмотреть у меня в CONNECT Объект: MegaD99
Тестируйте и пишите!
Вложения
my.class.zip
my.class.php
(1.13 КБ) 164 скачивания
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Ответить