Страница 78 из 140

Re: Модуль "MegaD"

Добавлено: Ср авг 02, 2017 10:53 am
Ivan_A
По п.1 большое спасибо за разъяснения. Действительно, там где кнопка и нужны только короткие нажатия проще всего выставить Mode R на меге и сообщение с m=2 вообще на сервер не летит.
Что странно, но m я в скриптах отлавливал и до внесения изменений в megad.class.php.
Вот такой метод у меня работает и работал раньше
СпойлерПоказать
// первый короткий клик включает свет, второй короткий клик выключает всет и вентиляцию,
// длинный клик включает/выключает вентиляцию
// действие выполняется по отпусканию кнопки
$status=gg('Fan_sportzal.StateZone');
$status1=gg('Zone3_5.StateZone');
if($_GET['m'] == 2) { // прилетело сообщение о длинном нажатии
$this->setProperty('Long', 1);
}
else
{
if ($_GET['m'] == 1) // прилетело сообщение об отпускании клавиши
{
$lng = $this->getProperty('Long');
if ($lng == 1)
{
if ($status == 0)
{
sg('Fan_sportzal.StateZone',1);
}
else
{
sg('Fan_sportzal.StateZone',0);
}
}
else
{
if ($status1 == 0)
{
sg('Zone3_5.StateZone',1);
}
else
{
sg('Zone3_5.StateZone',0);
sg('Fan_sportzal.StateZone',0);
}
}
}
else // прилетело сообщение о нажатии выключателя
{
$this->setProperty('Long', 0);
}
}
Однако, некоторые короткие нажатия никак не отрабатываются. Стабильно работают клики дольше 0,5 сек...
Сейчас поиграюсь с сетью. Воткну в коммутатор чтоли только сервак, комп и 1 мегу...

Re: Модуль "MegaD"

Добавлено: Ср авг 02, 2017 11:32 am
rtroyakov
Посмотрите антивирусник ещё.У меня Eset блокировал Мегу как неопознанное устройство

Re: Модуль "MegaD"

Добавлено: Чт авг 03, 2017 9:38 am
Ivan_A
Всем доброе утро!
Антивирусника у меня нет, вертится все на линуксе.
Выдергивание из коммутатора всего, кроме меги сервака и ноута ситуацию никак не поменяло. Вернее, вначале скрипты вообще перестали работать, 3 часа времени ушло на то, чтобы понять, что контроллеры на сервак всегда пытаются пробиться через прописанный в них шлюз, даже несмотря на то, что они в одной подсети. Правильно это или нет, не знаю, но шлюзы в конфигурациях контроллеров посносил.
Напишу подробнее что именно сейчас у меня происходит..
На самом первом входе контроллера у меня подключена кнопка с фиксацией. Кнопка хитрая, сама кнопка не фиксируется, но выход при каждом нажатии инвертирует свое состояние. Такой D-триггер ))) По ошибке купил...
Обрабатывать нажатие пытаюсь вот таким методом:
СпойлерПоказать
//метод SwitchFix
$statusz = $this->getProperty('StateZone');
if ($_GET['m'] != 2)
{
if ($statusz == 0)
{
$this->setProperty('StateZone',1);
}
else
{
$this->setProperty('StateZone',0);
}
}
mega1.jpg
mega1.jpg (273.66 КБ) 8169 просмотров
В контроллере P&R
При первом включении свет загорелся и сразу погас. Не думаю что прошло 1,5 сек. Однако следующие включения-выключения зажигали-гасили свет стабильно. Но после паузы минут в 5 глюк снова повторился.

Стираю в контроллере действие по-умолчанию, вообще. Глюк уходит! Но это же не выход, надо как-то лечить этот баг.
Кстати, попутный вопрос - после изменений на самой меге надо пересохранять конфигурацию в мажордоме?

Re: Модуль "MegaD"

Добавлено: Чт авг 03, 2017 10:00 am
Ivan_A
Продолжаю эксперименты.
Снова прописал в меге Act 7:2 Создал для эксперимента такой метод
if ($_GET['m'] != 2)
{
file_get_contents("http://192.168.2.201/sec/?cmd=7:2");
}
Работает без глюков, действие по-умолчанию не мешает! Блин, ну не хочется строить всю систему на таких костылях. Я понимаю, что костыль можно усовершенствовать, создать каждому объекту свойство с URL и использовать один метод для всех кнопок, но это же все равно костыли...

Ладно, свет пока кое-как работает, выключатели без фиксации вроде ведут себя стабильно, сейчас поисследую задержки при включении

Re: Модуль "MegaD"

Добавлено: Чт авг 03, 2017 10:14 am
Ivan_A
А эксперимент у меня прошел довольно-таки быстро.
Вот этот код зажигает/гасит свет в 1 зоне через 0,5-1 сек, а на второй зоне через 2 сек.
СпойлерПоказать
//работает, но с задержкой включения
$statusz = $this->getProperty('StateZone');
if ($statusz == 0)
{
$this->setProperty('StateZone',1);
sg('Zone24_1.StateZone',1);
}
else
{
$this->setProperty('StateZone',0);
sg('Zone24_1.StateZone',0);
}
А вот этот код отрабатывает мгновенно и стабильно
СпойлерПоказать
$str = "http://192.168.2.203/sec/?pt=7&cmd=get";
$state=substr(file_get_contents($str),0,2);
if ($state == 'ON')
{
file_get_contents("http://192.168.2.203/sec/?cmd=7:0");
file_get_contents("http://192.168.2.207/sec/?cmd=8:0");
} else
{
file_get_contents("http://192.168.2.203/sec/?cmd=7:1");
file_get_contents("http://192.168.2.207/sec/?cmd=8:1");
}
Может это нормально и при работе с мегами не стоит пользоваться объектами, а давать ей команды и считывать статусы напрямую?

Re: Модуль "MegaD"

Добавлено: Чт авг 03, 2017 10:19 am
Chainik
Ivan_A писал(а):Обрабатывать нажатие пытаюсь вот таким методом:
СпойлерПоказать
//метод SwitchFix
$statusz = $this->getProperty('StateZone');
if ($_GET['m'] != 2)
{
if ($statusz == 0)
{
$this->setProperty('StateZone',1);
}
else
{
$this->setProperty('StateZone',0);
}
}
mega1.jpg
Можно попробовать в коде метода заменить

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

if ($_GET['m'] != 2) 
{ 
на

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

if ( $_GET['m'] == "2" ) {
return""; 
Еще можно попробовать выставить "Вызывать родительский метод" в положение "никогда".
Что касается пересохранения конфигурации Меги в модуле MegaD после изменения, то я всегда пересохраняю.

Вообще я руководствуюсь немножко другой идеологией. Перед тем, как переключить порт, я всегда запрашиваю его фактическое состояние ($state = file_get_contents("http://192.168.0.14/sec/?pt=7&cmd=get");). И только после этого дается команда на его переключение.

Ну и еще вопрос на уточнение. Файл megad.class.php модуля MegaD у вас "модернизирован" для "отлавливания" параметра "m"?

Re: Модуль "MegaD"

Добавлено: Чт авг 03, 2017 10:32 am
Ivan_A
с вашим вариантом кода сейчас поиграюсь.
По пересохранению имел в виду другое. Если я меняю в самой меге что-то, например, действие по-умолчанию, она отправляет данные о том, что что-то внутри нее поменялось на сервер или нет? Я не знаю, поэтому считаю что нет. А ведь сервер как-то должен узнать, что что-то поменялось, вот и лезу в модуль MegaD каждый раз и пересохраняюсь ничего в нем не поменяв..
Да, ваша идеология намного более правильная в плане стабильности, как я вижу из своих экспериментов. Но ее использование лишает нас всех плюсов объектно-ориентированного программирования. Зачем на каждый вход писать свой скрипт? Зачем обращаться к самой меге, если можно обратиться к свойству привязанного к ней объекта? Опять же и сетевой трафик должен уменьшиться...

Re: Модуль "MegaD"

Добавлено: Чт авг 03, 2017 10:39 am
Chainik
Насколько я понимаю модуль считывает конфигурацию только при сканировании Мег. И, соответственно, если в конфигурации мы что-то меняем, надо "перечитывать" обновленную конфигурацию в модуле. Менять там в случае изменения конфигурации ничего не нужно. Нужно только "перечитать" (Read Config).

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

Re: Модуль "MegaD"

Добавлено: Чт авг 03, 2017 10:41 am
Ivan_A
Да, вчера поправил
if ($prop['LINKED_OBJECT2'] && $prop['LINKED_METHOD2']) { // && $old_value2!=$prop['CURRENT_VALUE_STRING2']
$params=array();
$params['TITLE']=$rec['TITLE'];
$params['VALUE']=$prop['CURRENT_VALUE_STRING2'];
$params['value']=$params['VALUE'];
$params['port']=$prop['NUM'];
$params['m']=$m;
callMethod($prop['LINKED_OBJECT2'].'.'.$prop['LINKED_METHOD2'], $params);
}
Кстати, засомневался, регистр ведь не имеет значения?

Re: Модуль "MegaD"

Добавлено: Чт авг 03, 2017 10:43 am
Chainik
Не знаю, насчет регистра. Можно просто использовать везде строчную букву "m", как у Андрея.