[Модуль] MegaD (megad)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

Harmer
Сообщения: 20
Зарегистрирован: Ср фев 14, 2018 10:34 am
Благодарил (а): 3 раза
Поблагодарили: 3 раза

Re: Модуль "MegaD"

Сообщение Harmer » Чт авг 02, 2018 4:25 pm

На канале "А" отрабатывает только на включение, на канале "В" вообще не отрабатывает
Chainik
Сообщения: 769
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 85 раз
Поблагодарили: 215 раз

Re: Модуль "MegaD"

Сообщение Chainik » Чт авг 02, 2018 4:42 pm

Проверьте, чтобы в свойствах буква "B" была английская (а не русская "В").
В коде я точно указал английскую.
Harmer писал(а):
Чт авг 02, 2018 4:25 pm
На канале "А" отрабатывает только на включение, на канале "В" вообще не отрабатывает
Странно. Код, что на включение, что на выключение абсолютно одинаковый.
Harmer
Сообщения: 20
Зарегистрирован: Ср фев 14, 2018 10:34 am
Благодарил (а): 3 раза
Поблагодарили: 3 раза

Re: Модуль "MegaD"

Сообщение Harmer » Чт авг 02, 2018 4:51 pm

Создал отдельный метод "check". Код отрабатывает нормально. Если принудительно проверять состояние, лампочки приходят в норму. Возможно, нужна пауза между переключением состояния и запросом.
Chainik
Сообщения: 769
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 85 раз
Поблагодарили: 215 раз

Re: Модуль "MegaD"

Сообщение Chainik » Чт авг 02, 2018 5:00 pm

Вряд ли нужна пауза. По идее веб-сервер (или PHP) все выполняет последовательно и если запрос чего-то, что запрашивалось из кода, не пришел, выполнение кода не продолжается. А потом выдается ошибка, что превышен TimeOutLimit.
Но попробуйте чисто для интереса, вставьте паузу

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

sleep(1);
Но на этой паузе выполнение кода будет гарантированно "подвисать", что не есть гуд.

UPD: Добавил в код метода "switch" первую строку, где Меге подается команда на переключение. Сразу как-то упустил из виду...
Harmer
Сообщения: 20
Зарегистрирован: Ср фев 14, 2018 10:34 am
Благодарил (а): 3 раза
Поблагодарили: 3 раза

Re: Модуль "MegaD"

Сообщение Harmer » Пт авг 03, 2018 11:02 am

Получилось в результате все не так. В модуле MegaD devices на нажатие кнопок прописал вызов метода "Check". Галочки "Skip default action" убрал. Соответственно, реакция на нажатие кнопок прописана в самой Меге. Метод "Check" начинается со sleep(1); В таком виде все работает. Без паузы не получается. Видимо, это связано с тем, что ключ работает по 1-wire.
Chainik
Сообщения: 769
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 85 раз
Поблагодарили: 215 раз

Re: Модуль "MegaD"

Сообщение Chainik » Пт авг 03, 2018 11:35 am

А что произойдет, если использовать метод switch в том виде, в котором приводил я? Изменится ли что-нибудь, если при этом в кусок кода метода switch добавить sleep?

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

$Port = $this->getProperty('Port');
$Letter = substr($Port, -1);
if ($Letter == "A") {
$state = substr($state,0,2);
sleep(1);
}
if ($Letter == "B") {
$state = substr($state, -2);
sleep(1);
}
Просто кажется, что плодим "лишние сущности". Да и вообще было бы неплохо понять, почему не срабатывает так, как должно...
Было бы "железо", сам бы проверил...
Harmer
Сообщения: 20
Зарегистрирован: Ср фев 14, 2018 10:34 am
Благодарил (а): 3 раза
Поблагодарили: 3 раза

Re: Модуль "MegaD"

Сообщение Harmer » Пт авг 03, 2018 12:23 pm

Собственно, сейчас метод "Check" выглядит так:

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

sleep(1);
$state = file_get_contents("http://".$this->getProperty('ipAddress')."/".$this->getProperty('Password')."/?pt=".$this->getProperty('Port')."&cmd=get");

$Port = $this->getProperty('Port');
$Letter = substr($Port, -1);
if ($Letter == "A") {
$state = substr($state,0,2);
}
if ($Letter == "B") {
$state = substr($state, -2);
}


if ($state == "ON") {
  $this->setProperty('Status', 1);
} else {
  $this->setProperty('Status', 0); }
Если не использовать в нем sleep, то он не отрабатывает выключение канала А. (Канал А у меня управляется механической кнопкой, канал В - сенсорной).
Если вызывать метод "switch" , то ключ работает нестабильно. То включит две лампочки вместо одной, то включит лампочку и через некоторое время выключит. Точной закономерности нет.
Sleep я добавлял между переключением и запросом состояния.
За это сообщение автора Harmer поблагодарил:
Chainik (Пт авг 03, 2018 12:36 pm)
Рейтинг: 1.37%
Chainik
Сообщения: 769
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 85 раз
Поблагодарили: 215 раз

Re: Модуль "MegaD"

Сообщение Chainik » Пт авг 03, 2018 12:39 pm

Спасибо за эксперимент. Работать, конечно же, будет и в таком варианте. Просто представляется, что все это можно сделать в одном методе (со слипами). Так будет более универсально: один метод и для простых выходов и для двухканального ключа. Ну это ИМХО.
Harmer
Сообщения: 20
Зарегистрирован: Ср фев 14, 2018 10:34 am
Благодарил (а): 3 раза
Поблагодарили: 3 раза

Re: Модуль "MegaD"

Сообщение Harmer » Пт авг 03, 2018 1:28 pm

Chainik писал(а):
Пт авг 03, 2018 11:35 am

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

$Port = $this->getProperty('Port');
$Letter = substr($Port, -1);
if ($Letter == "A") {
$state = substr($state,0,2);
sleep(1);
}
if ($Letter == "B") {
$state = substr($state, -2);
sleep(1);
}
Проблема в том, что в этом коде sleep вызывается после запроса состояния, а нужен он до.
Что касается универсальности, то встроенное в модуль MegaD-14IOR реле нормально управляется таким же способом. Если нужно именно со sleep побороться, можно попробовать такой вариант

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

$Port = $this->getProperty('Port');
$Letter = substr($Port, -1);
if ($Letter == "A") {
sleep(1);
}
if ($Letter == "B") {
sleep(1);
}

$state = file_get_contents("http://".$this->getProperty('ipAddress')."/".$this->getProperty('Password')."/?pt=".$this->getProperty('Port')."&cmd=get");

if ($Letter == "A") {
$state = substr($state,0,2);
}
if ($Letter == "B") {
$state = substr($state, -2);
}

if ($state == "ON") {
  $this->setProperty('Status', 1);
} else {
  $this->setProperty('Status', 0); }
Понимаю, что код кривой, но как сделать лучше не знаю.
Chainik
Сообщения: 769
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 85 раз
Поблагодарили: 215 раз

Re: Модуль "MegaD"

Сообщение Chainik » Пт авг 03, 2018 11:28 pm

Harmer писал(а):
Пт авг 03, 2018 1:28 pm
...
Понимаю, что код кривой, но как сделать лучше не знаю.
Не берусь утверждать, что код получился "прямее", но по крайней мере, удалось совместить паузу с обработкой переменной $state.

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

file_get_contents("http://".$this->getProperty('ipAddress')."/".$this->getProperty('Password')."/?cmd=".$this->getProperty('Port').":2");

$Port = $this->getProperty('Port');
$Letter = substr($Port, -1);
if ($Letter == "A") {
sleep(1);
$state = file_get_contents("http://".$this->getProperty('ipAddress')."/".$this->getProperty('Password')."/?pt=".$this->getProperty('Port')."&cmd=get");
$state = substr($state,0,2);
goto StatusSet;
}
if ($Letter == "B") {
sleep(1);
$state = file_get_contents("http://".$this->getProperty('ipAddress')."/".$this->getProperty('Password')."/?pt=".$this->getProperty('Port')."&cmd=get");
$state = substr($state, -2);
goto StatusSet;
}

$state = file_get_contents("http://".$this->getProperty('ipAddress')."/".$this->getProperty('Password')."/?pt=".$this->getProperty('Port')."&cmd=get");
StatusSet:
if ($state == "ON") {
  $this->setProperty('Status', 1);
} else {
  $this->setProperty('Status', 0); }
Хочется добиться универсальности от метода switch.
Ответить