[Модуль] MegaD (megad)
Модератор: immortal
-
- Сообщения: 43
- Зарегистрирован: Ср фев 14, 2018 10:34 am
- Благодарил (а): 3 раза
- Поблагодарили: 7 раз
Re: Модуль "MegaD"
На канале "А" отрабатывает только на включение, на канале "В" вообще не отрабатывает
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Модуль "MegaD"
Проверьте, чтобы в свойствах буква "B" была английская (а не русская "В").
В коде я точно указал английскую.
В коде я точно указал английскую.
Странно. Код, что на включение, что на выключение абсолютно одинаковый.
-
- Сообщения: 43
- Зарегистрирован: Ср фев 14, 2018 10:34 am
- Благодарил (а): 3 раза
- Поблагодарили: 7 раз
Re: Модуль "MegaD"
Создал отдельный метод "check". Код отрабатывает нормально. Если принудительно проверять состояние, лампочки приходят в норму. Возможно, нужна пауза между переключением состояния и запросом.
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Модуль "MegaD"
Вряд ли нужна пауза. По идее веб-сервер (или PHP) все выполняет последовательно и если запрос чего-то, что запрашивалось из кода, не пришел, выполнение кода не продолжается. А потом выдается ошибка, что превышен TimeOutLimit.
Но попробуйте чисто для интереса, вставьте паузу
Но на этой паузе выполнение кода будет гарантированно "подвисать", что не есть гуд.
UPD: Добавил в код метода "switch" первую строку, где Меге подается команда на переключение. Сразу как-то упустил из виду...
Но попробуйте чисто для интереса, вставьте паузу
Код: Выделить всё
sleep(1);
UPD: Добавил в код метода "switch" первую строку, где Меге подается команда на переключение. Сразу как-то упустил из виду...
-
- Сообщения: 43
- Зарегистрирован: Ср фев 14, 2018 10:34 am
- Благодарил (а): 3 раза
- Поблагодарили: 7 раз
Re: Модуль "MegaD"
Получилось в результате все не так. В модуле MegaD devices на нажатие кнопок прописал вызов метода "Check". Галочки "Skip default action" убрал. Соответственно, реакция на нажатие кнопок прописана в самой Меге. Метод "Check" начинается со sleep(1); В таком виде все работает. Без паузы не получается. Видимо, это связано с тем, что ключ работает по 1-wire.
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Модуль "MegaD"
А что произойдет, если использовать метод 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);
}
Было бы "железо", сам бы проверил...
-
- Сообщения: 43
- Зарегистрирован: Ср фев 14, 2018 10:34 am
- Благодарил (а): 3 раза
- Поблагодарили: 7 раз
Re: Модуль "MegaD"
Собственно, сейчас метод "Check" выглядит так:
Если не использовать в нем sleep, то он не отрабатывает выключение канала А. (Канал А у меня управляется механической кнопкой, канал В - сенсорной).
Если вызывать метод "switch" , то ключ работает нестабильно. То включит две лампочки вместо одной, то включит лампочку и через некоторое время выключит. Точной закономерности нет.
Sleep я добавлял между переключением и запросом состояния.
Код: Выделить всё
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); }
Если вызывать метод "switch" , то ключ работает нестабильно. То включит две лампочки вместо одной, то включит лампочку и через некоторое время выключит. Точной закономерности нет.
Sleep я добавлял между переключением и запросом состояния.
- Рейтинг: 1.16%
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Модуль "MegaD"
Спасибо за эксперимент. Работать, конечно же, будет и в таком варианте. Просто представляется, что все это можно сделать в одном методе (со слипами). Так будет более универсально: один метод и для простых выходов и для двухканального ключа. Ну это ИМХО.
-
- Сообщения: 43
- Зарегистрирован: Ср фев 14, 2018 10:34 am
- Благодарил (а): 3 раза
- Поблагодарили: 7 раз
Re: Модуль "MegaD"
Проблема в том, что в этом коде sleep вызывается после запроса состояния, а нужен он до.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); }
Что касается универсальности, то встроенное в модуль 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); }
-
- Сообщения: 1463
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Модуль "MegaD"
Не берусь утверждать, что код получился "прямее", но по крайней мере, удалось совместить паузу с обработкой переменной $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); }