Буду ждать, так как вариант с P&R меня не устраивает.Bagir писал(а):Скоро выложу вариант отлова разных нажатий для режима P. Только конечно без долгого нажатия. Его не отловить.
Подключение контроллера MegaD-328
Модератор: immortal
-
- Сообщения: 708
- Зарегистрирован: Сб авг 18, 2012 10:21 am
- Благодарил (а): 26 раз
- Поблагодарили: 183 раза
Re: Подключение контроллера MegaD-328
- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Подключение контроллера MegaD-328
Да, он сильно проигрывает при падении сервера, хоть и дает много плюсов. Если в будущем будет раздельная настройка режимов для сервера и автономки, вариант будет беспроигрышный.
Для режима P сделаю по такому же алгоритму. При первом нажатии запускается таймер на одну секунду, и заодно чистится временная переменная. Каждое нажатие пишет в переменную цифру 1. Отработавший таймер запускает код, который ко количество единичек во временной переменной определяет какое было нажатие. Простое, двойное, тройное ...
Минусы такого способа - отсрочка выполнения задачи на время таймера. Но иначе никак. Впрочем эта секунда сильно не портит ситуацию.
Для режима P сделаю по такому же алгоритму. При первом нажатии запускается таймер на одну секунду, и заодно чистится временная переменная. Каждое нажатие пишет в переменную цифру 1. Отработавший таймер запускает код, который ко количество единичек во временной переменной определяет какое было нажатие. Простое, двойное, тройное ...
Минусы такого способа - отсрочка выполнения задачи на время таймера. Но иначе никак. Впрочем эта секунда сильно не портит ситуацию.
- Kod.Begemot
- Сообщения: 358
- Зарегистрирован: Чт июн 20, 2013 5:53 pm
- Благодарил (а): 32 раза
- Поблагодарили: 42 раза
Re: Подключение контроллера MegaD-328
Свежая прошивка МегаD(3.26b1) поддерживает команду "*число" в Action, для переключения "0-значение" выхода в режиме PWM. Это удобно для тех, у кого светодиодное освещение и оно управляется мосфетом. Сделал у себя включение / выключение через MDM (с регулировкой яркости), но при неработоспособности сервера выключателем без фиксации уже не мог управлять - только включение на минимальной (2) яркости, выключения небыло. Теперь всё отлично, выключатели могут работать автономно, а могут и с сервером, и всё это живёт дружно вместе с ШИМ-выходами 
P.S. пример Action:
10:*200 - переключает ШИМ-выход между значениями 0 и 200

P.S. пример Action:
10:*200 - переключает ШИМ-выход между значениями 0 и 200
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Подключение контроллера MegaD-328
В последнем обновлении при импорте класса можно указать галочкой, чтобы не импортировались объекты, т.е. обновится только класс, а все объекты с их методами и свойствами останутся.Kod.Begemot писал(а):Уважаемые, прощу прощения за, возможно, ламерский вопрос:![]()
Вот класс обновился, загружаем обновление - и всё слетает, все настройки Мег, настройки реакции на входы и т.п. правильно?
ну понятно что можно куда-нибудь скопировать код, и потом его вставлять обратно.
- Рейтинг: 1.16%
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Подключение контроллера MegaD-328
Кстати, как еще один вариант для класса MegaD. В нем объекты MegaD1, MegaD2, MegaD3, MegaD4 и MegaD99 с примерами. Вы можете просто дать другое имя объекту своей Меги. Например MegaDgarage или MegaDkitchen. Имя абсолютно не принципиально. Главное, чтобы по нему было понятно, чей это объект.
Код методов в этом классе почти весь общий. А вот incomingMessage у каждого объекта Меги свой.
Код методов в этом классе почти весь общий. А вот incomingMessage у каждого объекта Меги свой.
-
- Сообщения: 291
- Зарегистрирован: Вт ноя 18, 2014 11:43 pm
- Откуда: Краснодарский край
- Благодарил (а): 32 раза
- Поблагодарили: 68 раз
Re: Подключение контроллера MegaD-328
До последнего обновления пробовал давать отличные имена. Все затиралось. Сейчас Сергей вроде поправил, будем проверять. 
Сергей, еще может убрать с githuba файл megad.php? А то при обновлении затирается. Вчера минут 10 пытался понять почему мега не посылает сообщения.

Сергей, еще может убрать с 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
CONNECT: http://connect.smartliving.ru/profile/311
- Kod.Begemot
- Сообщения: 358
- Зарегистрирован: Чт июн 20, 2013 5:53 pm
- Благодарил (а): 32 раза
- Поблагодарили: 42 раза
Re: Подключение контроллера MegaD-328
Подтверждаю, при каждом обновлении файл этот восстанавливаю из архива. Сколько раз делал - всё забывал написать! Спасибо 

- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Подключение контроллера MegaD-328
Я еще поигрался с копкой и разными нажатиями. Если очень часто наживать, то Мега может не успеть обработать все нажатия и отпускания, и не сообщит серверу. При этом во временной переменной получится запись, несоответствующая ни одной группе 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;
- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Отлов разных нажатий для режима P
А вот и вариант для режима 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;
- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Дверной звонок + ПинКод на открытие двери
У меня кнопка дверного звонка подключена к МД. При нажатии звучит рингтон звонка, и камера домофона делает фотку. Часто приходится выходить в сад. В это время дома может кто то оставаться, а может никого и не быть, но если я далеко не ухожу, то и нет смысла запирать дверь на глухой замок и ставить сигнализацию. Но и просто так оставлять открытой дверь тоже нельзя. Мало ли кто там шарахается, а за домом мне не видно. Именно на такой слечай и хотелось какюю нибудь простенькую экспресс открывалку двери, чтобы не таскать с собой карточку. Конечно хочется по фото. Смотришь в камеру, жмешь кнопку звонка, а дальше либо звенит звонок, либо открывается дверь, если фотка опознана и лицо есть в базе. Но уы, ничего я не нашел. Сравнение лиц на фотографиях вероятно дело будущего. Хотя странно. Телефоны уже это давно делают, и причем вполне хорошо, а для компа варианты не находятся. Думал про сканер отпечатков пальца. Уличные варианты стоят весьма дорого. Так что решил пока на это дело забить. Но есть идея! Использовать пин код на кнопке звонка. Конечно гость может его подслучать. Но гость так же момет увидеть кнопки на наборнике. К тому же никто не мешает при наборе добавить в начало несколько ложных случайных цифр, а в конце вбить правильные. Да и можно создать второй пин код, который бы отменял первый, как два набора ключей в дверях. Такой режим весьма сгодится, если объект не на охране. А вообще, вариант с простеньким пинкодом намного лучше варианта просто с открытой дверью.
Заценяйте, я результатом весьма доволен.
Заценяйте, я результатом весьма доволен.
Дверной звонок + ПинКод на открытиеПоказать
Код: Выделить всё
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;
- Рейтинг: 1.16%