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

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

Модератор: immortal

Jager
Сообщения: 708
Зарегистрирован: Сб авг 18, 2012 10:21 am
Благодарил (а): 26 раз
Поблагодарили: 183 раза

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

Сообщение Jager » Ср дек 10, 2014 2:44 pm

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

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

Сообщение Bagir » Ср дек 10, 2014 2:52 pm

Да, он сильно проигрывает при падении сервера, хоть и дает много плюсов. Если в будущем будет раздельная настройка режимов для сервера и автономки, вариант будет беспроигрышный.
Для режима P сделаю по такому же алгоритму. При первом нажатии запускается таймер на одну секунду, и заодно чистится временная переменная. Каждое нажатие пишет в переменную цифру 1. Отработавший таймер запускает код, который ко количество единичек во временной переменной определяет какое было нажатие. Простое, двойное, тройное ...
Минусы такого способа - отсрочка выполнения задачи на время таймера. Но иначе никак. Впрочем эта секунда сильно не портит ситуацию.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

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

Сообщение Kod.Begemot » Ср дек 10, 2014 4:54 pm

Свежая прошивка МегаD(3.26b1) поддерживает команду "*число" в Action, для переключения "0-значение" выхода в режиме PWM. Это удобно для тех, у кого светодиодное освещение и оно управляется мосфетом. Сделал у себя включение / выключение через MDM (с регулировкой яркости), но при неработоспособности сервера выключателем без фиксации уже не мог управлять - только включение на минимальной (2) яркости, выключения небыло. Теперь всё отлично, выключатели могут работать автономно, а могут и с сервером, и всё это живёт дружно вместе с ШИМ-выходами :)
P.S. пример Action:
10:*200 - переключает ШИМ-выход между значениями 0 и 200
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

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

Сообщение sergejey » Ср дек 10, 2014 5:12 pm

Kod.Begemot писал(а):Уважаемые, прощу прощения за, возможно, ламерский вопрос: :oops:
Вот класс обновился, загружаем обновление - и всё слетает, все настройки Мег, настройки реакции на входы и т.п. правильно?
ну понятно что можно куда-нибудь скопировать код, и потом его вставлять обратно.
В последнем обновлении при импорте класса можно указать галочкой, чтобы не импортировались объекты, т.е. обновится только класс, а все объекты с их методами и свойствами останутся.
За это сообщение автора sergejey поблагодарил:
zelevova (Пн дек 15, 2014 12:42 pm)
Рейтинг: 1.16%

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

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

Сообщение Bagir » Ср дек 10, 2014 5:22 pm

Кстати, как еще один вариант для класса MegaD. В нем объекты MegaD1, MegaD2, MegaD3, MegaD4 и MegaD99 с примерами. Вы можете просто дать другое имя объекту своей Меги. Например MegaDgarage или MegaDkitchen. Имя абсолютно не принципиально. Главное, чтобы по нему было понятно, чей это объект.
Код методов в этом классе почти весь общий. А вот incomingMessage у каждого объекта Меги свой.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
zelevova
Сообщения: 291
Зарегистрирован: Вт ноя 18, 2014 11:43 pm
Откуда: Краснодарский край
Благодарил (а): 32 раза
Поблагодарили: 68 раз

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

Сообщение zelevova » Ср дек 10, 2014 5:38 pm

До последнего обновления пробовал давать отличные имена. Все затиралось. Сейчас Сергей вроде поправил, будем проверять. :)

Сергей, еще может убрать с githuba файл megad.php? А то при обновлении затирается. Вчера минут 10 пытался понять почему мега не посылает сообщения.
За это сообщение автора zelevova поблагодарил:
Kod.Begemot (Ср дек 10, 2014 6:39 pm)
Рейтинг: 1.16%
Majordomo (GitHub) на cubietruck + MegaD + 1-wire
CONNECT: http://connect.smartliving.ru/profile/311
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

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

Сообщение Kod.Begemot » Ср дек 10, 2014 6:40 pm

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

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

Сообщение Bagir » Ср дек 10, 2014 8:39 pm

Я еще поигрался с копкой и разными нажатиями. Если очень часто наживать, то Мега может не успеть обработать все нажатия и отпускания, и не сообщит серверу. При этом во временной переменной получится запись, несоответствующая ни одной группе case последнего блока switch ($dt). Тогда прозвучит слово "непонятно". Но это увы не все. Может получиться так, что последнее сообщение от Меги будет о нажатии. Тогда по истечению таймера код посчитает это удержанием. А удержания то нет... И при следующем нажатии запись во временную переменную будет продолжена, а не начата заново, и потом при сравнении опять будет "непонятно". Решение есть. Надо при каждом начале нажатий новой комбинации просто для верности чистить временную переменную. С наименьшими затратами на обработку, можно добавить код сброса временной переменной

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

          // Сбросить временную переменную
          registerEvent($ot.'_'.$params['pt'].'_clicks', $details='1', $expire_in=1);
в момент, когда происходит событие нажатия и таймер не существует. Это и будет начало новой комбинации. Таким образом, даже если Мега не успела обработать комбинацию нажатий, то мы в любом случае не рискуем следующей комбинацией. Она точно будет писаться "с чистого листа".
Полный код всей группы caseПоказать

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

  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) {
          // Сбросить временную переменную
          registerEvent($ot.'_'.$params['pt'].'_clicks', $details='1', $expire_in=1);
          // создать таймер с рекурсивным вызовом
          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;
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Отлов разных нажатий для режима P

Сообщение Bagir » Ср дек 10, 2014 9:13 pm

А вот и вариант для режима P. Начало я оставил точно такое же как и у кода с режимом P&R. А вот кусок кода, который выполняется после рекурсивного вызова будет совсем другой. Тут уже не нужно сравнивать, а достаточно просто посчитать количество циферок во временной переменной. Надо заметить, что в режиме P Мега видит нажатия лучше. Это и понятно, сообщений то в два раза меньше. Лично у меня получалось весьма стабильно накликивать до 6 нажатий за секунду. Конечно на практике наврятли кто то решит повесить на 6 нажатий какое то действие. Все таки 3 клика это предел границы функционала и удобства.
Но подобные игры навели на мысль, где можно это использовать. Это же пин код!
группа case для режима PПоказать

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

  case 3: // P //Задача - Определить простое, двойное или тройное нажатие
    // Получаем детали события
    $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) {
          // Сбросить временную переменную
          registerEvent($ot.'_'.$params['pt'].'_clicks', $details='1', $expire_in=1);
          // создать таймер с рекурсивным вызовом
          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 есть. Значит это рекурсивный вызов для окончания обработки комбинации нажатия
      // Очистить временную переменную
      registerEvent($ot.'_'.$params['pt'].'_clicks', $details='', $expire_in=1); // тут можно просто удалять
      // Посчитать количество циферок
      $dt = strlen($dt);
      say($dt.' нажатий');

      // ВЫПОЛНИТЬ нужный метод с передачей ему $dt как число нажатий
    }
    break; 
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Дверной звонок + ПинКод на открытие двери

Сообщение Bagir » Чт дек 11, 2014 12:30 am

У меня кнопка дверного звонка подключена к МД. При нажатии звучит рингтон звонка, и камера домофона делает фотку. Часто приходится выходить в сад. В это время дома может кто то оставаться, а может никого и не быть, но если я далеко не ухожу, то и нет смысла запирать дверь на глухой замок и ставить сигнализацию. Но и просто так оставлять открытой дверь тоже нельзя. Мало ли кто там шарахается, а за домом мне не видно. Именно на такой слечай и хотелось какюю нибудь простенькую экспресс открывалку двери, чтобы не таскать с собой карточку. Конечно хочется по фото. Смотришь в камеру, жмешь кнопку звонка, а дальше либо звенит звонок, либо открывается дверь, если фотка опознана и лицо есть в базе. Но уы, ничего я не нашел. Сравнение лиц на фотографиях вероятно дело будущего. Хотя странно. Телефоны уже это давно делают, и причем вполне хорошо, а для компа варианты не находятся. Думал про сканер отпечатков пальца. Уличные варианты стоят весьма дорого. Так что решил пока на это дело забить. Но есть идея! Использовать пин код на кнопке звонка. Конечно гость может его подслучать. Но гость так же момет увидеть кнопки на наборнике. К тому же никто не мешает при наборе добавить в начало несколько ложных случайных цифр, а в конце вбить правильные. Да и можно создать второй пин код, который бы отменял первый, как два набора ключей в дверях. Такой режим весьма сгодится, если объект не на охране. А вообще, вариант с простеньким пинкодом намного лучше варианта просто с открытой дверью.
Заценяйте, я результатом весьма доволен.
Дверной звонок + ПинКод на открытиеПоказать

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

  case 3: // P // Звонок + ПинКод
  /* 
  Пинкод задуман длинной в 3 цифры. Это можно легко изменить при жлании. 
  При наборе цифры 3 и более звонок не включается.
  Последняя цифра пинкода может быть 2, и если пин правильный, то звонок не включится
  */
    // Получаем детали события
    $dt = registeredEventDetails($ot.'_'.$params['pt'].'_pin');

    // Параметр doit будет добавлен только при последующем рекурсивном вызове когда отработает таймер
    if (!isset($params['doit'])) { 
      // Если таймер существует 
      if (timeOutExists($ot.'_'.$params['pt'].'_press')) {     
        // Удалить таймер
        ClearTimeOut($ot.'_'.$params['pt'].'_press');  
        // Добавляем +1  
        $dt = $dt+1;

      } else {
        // Взять две последние цифры
        // Если есть способ проще, ПОПРАВЬТЕ!
        if (strlen($dt)>2) { $dt = substr($dt, -2); }
        // к двум последним цифрам ВП приклеиваем 1
        $dt = $dt.'1';
      }
      // записать детали в событие
      registerEvent($ot.'_'.$params['pt'].'_pin', $details=$dt, $expire_in=1);
      // создаем таймер  
      setTimeOut($ot.'_'.$params['pt'].'_press', "cm($ot.'.incomingMessage', array('pt'=>".$params['pt'].", 'doit'=>1));", 1);

    } else { // параметр doit есть. Значит это рекурсивный вызов для проверки пинкода или включения звонка
      // Проверяем пинкод * * * * * * * * 
      if ($dt == 342) {
        // Очистить временную переменную (чтобы пин лишний раз не был виден в X-Ray)
        registerEvent($ot.'_'.$params['pt'].'_pin', $details='', $expire_in=1); // тут можно просто удалять Event
        // Событие правильный пин код
        say('пин код');
      } else {
        // Если набранная цифра меньше 3, включаем звонок      
        if (substr($dt, -1)<3) {
          // Событие Звонок
          say('звонок');
        }      
      }
    }
    break;
За это сообщение автора Bagir поблагодарил:
odinvolk (Пт фев 02, 2018 9:37 am)
Рейтинг: 1.16%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Ответить