Подключение контроллера MegaD-328
Модератор: immortal
- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Подключение контроллера MegaD-328
Вообще надо бы довести до ума. У Z-Wave выключателя отлавливается даже долгое нажатие после двойного. Таким образом, одна кнопка может переключать 4 канала или переключать 2 канала с возможностью их диммировния.
-
- Сообщения: 708
- Зарегистрирован: Сб авг 18, 2012 10:21 am
- Благодарил (а): 26 раз
- Поблагодарили: 183 раза
Re: Подключение контроллера MegaD-328
Если без использования P&R получится реализовать 2 действия уже хорошо.Bagir писал(а):Да, действительно есть грабли
- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Подключение контроллера MegaD-328
2 действия вообще не проблема. Но это ничто. А хочется как всегда много. Впрочем можно написать различные варианты. Например если не требуется диммировать, а нужно только коммутировать несколько каналов различными видами нажатия, то и логику можно упростить. Но все равно понадобится P&R. Но, в случае недоступности сервера, нажатие на выключатель будет просто коммутировать один первый канал. Скажем так, свет все равно загориться, и это хорошо, а для остальных прелестей жизни уже нужен работающий сервер.
А что касается режима только P, так тоже стоит подумать. По крайней мере если нужно только два канала одной кнопкой. то незачем использовать сложный код, отлавливающий все. Подумаем.
А что касается режима только P, так тоже стоит подумать. По крайней мере если нужно только два канала одной кнопкой. то незачем использовать сложный код, отлавливающий все. Подумаем.
-
- Сообщения: 708
- Зарегистрирован: Сб авг 18, 2012 10:21 am
- Благодарил (а): 26 раз
- Поблагодарили: 183 раза
Re: Подключение контроллера MegaD-328
Опытным путем установлено что все это многообразие нужно только гикам, вроде нас. Мои домашние категорически не хотят запоминать какие то комбинации действий, максимум две функции.Bagir писал(а):По крайней мере если нужно только два канала одной кнопкой. то незачем использовать сложный код, отлавливающий все. Подумаем.
- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Подключение контроллера MegaD-328
Вот как же все точно написаноJager писал(а):Мои домашние категорически не хотят запоминать какие то комбинации действий, максимум две функции.

Кстати, я накидал примерный алгоритм, как все эти нажатия сделать. Он в корне отличается от того что есть сейчас. Будет видеть абсолютно все! Режим работы P&R, но в случае недоступности сервера, кнопка на входе Меги будет коммутировать только один первый канал. Так что без "Светы" точно не останемся

Для режима "P" тоже сделаю вариант обычного и двойного нажатия. В случае отсутствия сервера, кнопка так же сможет управлять одним первым каналом. Тут вроде как могу обойтись без временных переменных одним только таймером.
примерный алгоритм P&RПоказать
при нажатии
пишем 1
если таймера нет, запускаем таймер, который запустит процедуру события
При отпускании
пишем 0
если таймера нет, запускаем процеруду смобытия.
Процедура события:
если
10 - простое нажатие
стереть
выполнить
если
1010 - двойное нажатие
стереть
выполнить
если
1 - долгое нажатие
добавить -
выполнить
если
101 - долгое после двойного
добавить -
выполнить
если
-1 завершение долгого
стереть
выполнить
если
-101 - завершение долгого после двойного
стереть
выполнить
пишем 1
если таймера нет, запускаем таймер, который запустит процедуру события
При отпускании
пишем 0
если таймера нет, запускаем процеруду смобытия.
Процедура события:
если
10 - простое нажатие
стереть
выполнить
если
1010 - двойное нажатие
стереть
выполнить
если
1 - долгое нажатие
добавить -
выполнить
если
101 - долгое после двойного
добавить -
выполнить
если
-1 завершение долгого
стереть
выполнить
если
-101 - завершение долгого после двойного
стереть
выполнить
- Kod.Begemot
- Сообщения: 358
- Зарегистрирован: Чт июн 20, 2013 5:53 pm
- Благодарил (а): 32 раза
- Поблагодарили: 42 раза
Re: Подключение контроллера MegaD-328
Вы имеете в виду через Action? Я ошибаюсь, или для этого нужен выключатель с фиксацией? Я так понимаю что в режиме P&R реакция есть как на нажатие так и на отпускание, значит на выключателе без фиксации не удастся свет и включать и выключать - надо либо 2 кнопки либо что-то ещё...Bagir писал(а):Но все равно понадобится P&R. Но, в случае недоступности сервера, нажатие на выключатель будет просто коммутировать один первый канал. Скажем так, свет все равно загориться, и это хорошо, а для остальных прелестей жизни уже нужен работающий сервер.
Я предлагаю следующее решение (писал об этом на форуме ab-log.ru) - скриптиком скачиваем 2 конфигурации меги - одну для работы с сервером (режим P&R) и другую - для работы в "автономке" - режим P. Единственная заковыка - когда запускать эти скрипты.. Но думаю можно каждый раз при старте сервера проверять режим меги, и если не соответствует серверному - прописывать то, что нужно. При завершении работы сервера - прописывать конфиг автономный. У себя хочу так сделать при работе от аккумуляторов. Вариант 2 - "микро сервер" резервный, поднятый на каком-нибудь роутере/raspberry и т.п. - мало жрущий, с минимумом функций, но с гораздо большей живучестью.
Что думаете?
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Подключение контроллера MegaD-328
Аналогичная ситуация, причём я сам забываю какая кнопка/комбинация за что отвечает, если их больше однойJager писал(а):Опытным путем установлено что все это многообразие нужно только гикам, вроде нас. Мои домашние категорически не хотят запоминать какие то комбинации действий, максимум две функции.Bagir писал(а):По крайней мере если нужно только два канала одной кнопкой. то незачем использовать сложный код, отлавливающий все. Подумаем.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Подключение контроллера MegaD-328
Попробовал сейчас и выпал с осадок. Я даже не предполагал, что в режиме P&R выход будет второй раз переключаться при отпускании кнопки. Напишу Андрею, может что подскажет, или добавит вариант. А сейчас действительно беда. Без сервера свет будет гореть только пока держишь кнопку. Блин. Я в расстройстве. P&R очень полезная штука, но убивает автономку. Вариант с заменой настроек как то пугает своей надежностью. Посмотрим, что скажет Андрей.Jager писал(а):Вы имеете в виду через Action?
Kod.Begemot писал(а):причём я сам забываю какая кнопка/комбинация за что отвечает
Да впрочем и я так же. Но все же некоторые штуки запоминаются, если их сделать интуитивно понятными. Сейчас, из подобных выкрутасов, у меня только один двойной z-wave выключатель. Он управляет четырьмя вентиляторами притока и вытяжки с возможностью их диммирования. Блок диммирования пока не установлен, но код написан, и события ловятся. Вроде даже уже почти привык к нему ))
Еще по задумке пульт для поднятия ворот будет так же управлять и откатными воротами. Комбинация долгого нажатия и отпускания тоже не останется без дела. Например немного приоткрыть ворота или решетку.
Посмотрим потом на сколько это будет удобно. Конечно можно повесить вместо одного такого выключателя два отдельных, которые будут выполнять только одну задачу. Но тогда уж + 2 отдельных диммера к ним. И того целая стена в кнопках )) Тоже вариант не очень. Нужно сделать по возможности просто. А все доп функции, это уже по желанию. Либо все же придется запомнить как накликать выключатель, либо лезть в планшетку и включать там.
- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Подключение контроллера MegaD-328
Есть хорошая новость. По ранее предложенному алгоритму, и с помощью временной переменной, хранимой в Event, я сейчас отлавливаю любую комбинацию нажатий. Да хоть тройное с удержанием. И вижу отпускание даже с уточнением после какой именно комбинации нажатий оно было. В общем, все распишем по кодам, и будет как в выключателях Z-Wave, чтобы не путаться.
А на счет тройного нажатия, так пусть тоже будет до кучи. Код это нисколько не нагрузит. Вот например люстра с тремя секциями. короткие нажатия в 1, 2, 3 клика включают или выключают свою секцию. Долгое нажатие включает или выключает сразу все. Выглядит вполне съедобно. Но без P&R в этом варианте никак. Не смогу увидеть отпускание, а значит про диммирование или выключение сразу всех секций можно забыть.
Для варианта просто P тоже все отлично. вижу 1,2,3, да вообще хоть сколько нажатий. Суть в том, что успеть нажать их надо за установленный интервал времени. Пока остановился на 1 секунде.
Примеры постараюсь до оформить сегодня и завтра все выложу. На свет P&R и автономки, так еще поборемся. Если Андрей согласиться помочь, готовьтесь прошивать Меги ))
А на счет тройного нажатия, так пусть тоже будет до кучи. Код это нисколько не нагрузит. Вот например люстра с тремя секциями. короткие нажатия в 1, 2, 3 клика включают или выключают свою секцию. Долгое нажатие включает или выключает сразу все. Выглядит вполне съедобно. Но без P&R в этом варианте никак. Не смогу увидеть отпускание, а значит про диммирование или выключение сразу всех секций можно забыть.
Для варианта просто P тоже все отлично. вижу 1,2,3, да вообще хоть сколько нажатий. Суть в том, что успеть нажать их надо за установленный интервал времени. Пока остановился на 1 секунде.
Примеры постараюсь до оформить сегодня и завтра все выложу. На свет P&R и автономки, так еще поборемся. Если Андрей согласиться помочь, готовьтесь прошивать Меги ))
- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Подключение контроллера MegaD-328
Пока что не буду спешить и выкладывать обновление класса целиком. Надо еще по тестировать. Ловите кусочек кода, кому нужна обработка разных нажатий. В коде метода incomingMessage нужного объекта Меги, ищем большой блок с этим вот комментарием в начале Добавляем группу case с нужным номером порта Меги, на котором висит кнопка. В моем случае это так же и остался порт 3. Старый код смело стирайте. Новый вариант работает намного лучше.
Добавить свой код нужно только в самом конце. Предлагаю два варианта на выбор. Запускать свой метод или скрипт, передавая в него код комбинации в переменной $dt, и уже в своем коде организовать блок switch () с разбором нужных комбинаций, или же прямо в имеющемся блоке switch () запускать свой код вместо say()
Но есть одно большое НО! В этом коде я использую свою функцию registeredEventDetails() чтобы из базы данных получать детали события Event. Вот ссыль на эту тему http://smartliving.ru/forum/viewtopic.p ... 956#p16106
Если кто еще не в курсе, предлагаю освоить момент, как писать и добавлять свои функции в МД. Это очень просто. Открываем на диске путь где лежат файлы МД. Забираемся вот сюда ...\majordomo\lib\ Создаем там файлик, например my.class.php Пишем в него код своей функции Вот как бы и все. Теперь функция из этого файла будет доступна из любого места. Во вложении я прицепил свой файлик my.class.php В нем есть эта и еще несколько других полезных дополнительных функций. Возможно они будут тоже вам интересны.
Весь этот код обработки комбинаций нажатий так же можно посмотреть у меня в CONNECT Объект: MegaD99
Тестируйте и пишите!
Код: Выделить всё
/* Мегадевайс сам шлет нам на сервер get сообщение о изменении статуса порта.
Мега передаст номер порта в $params['pt'] и статус замкнули/разомкнули в $params['m'].
ВНИМАНИЕ! в группах 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) {
// создать таймер с рекурсивным вызовом
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;
Но есть одно большое НО! В этом коде я использую свою функцию 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;
}
}
?>
Весь этот код обработки комбинаций нажатий так же можно посмотреть у меня в CONNECT Объект: MegaD99
Тестируйте и пишите!
- Вложения
-
- my.class.zip
- my.class.php
- (1.13 КБ) 164 скачивания