Задержка при выполнении метода getURL

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

amelnyk
Сообщения: 78
Зарегистрирован: Вт ноя 22, 2016 12:17 am
Благодарил (а): 13 раз
Поблагодарили: 2 раза

Задержка при выполнении метода getURL

Сообщение amelnyk » Сб ноя 26, 2016 1:06 am

Всем привет,
Совсем еще новичек в мажордоме, так что прошу сильно не пинать)
Я сейчас делаю тестовые связки Ардуино и Мажордома с разными девайсами, чтоб понять что к чему и можно ли это всё реализовать. Наткнулся на такую проблему:
Создан у меня обьект Light1 с методами enable(), disable(). В методе enable добавлен код:

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

say("Включен свет в гостинной", 0);
getUrl("http://192.168.0.90/command?7=ON"); 
$this->setProperty("enabled",1); 
в disable аналогичный, только с выключением. 192.168.0.90 - адрес Ардуино, на котором крутится вебсервер, и по этому запросу подаёт напряжение на 7-й пин, на которм висит лампочка.
Также есть сцена, с кнопкой, у которой два состояния. Одно из них дергает тот же метод - enable(), второе - disable().

Через Ардуино подключен еще выключатель, при нажатии которог дергаются сразу методы того же обьекта Light1:

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

GET /objects/?object=Light1&op=m&m=disable
GET /objects/?object=Light1&op=m&m=enable
В общем и целом связка работает как и хотелось бы, по выключателю или по кнопке на сцене у меня загорается лампочка.
НО, проблема в том, что если я вызывают метод enable() с ардуины, то очень долго отрабатывается метод getUrl() - загвоздка именно в нём, т.к. текст "Включен свет в гостинной" я получаю мгновенно, а свет включается секунды через 4.
Хотя если включать свет по кнопке со сцены, которая вызывает тот же метод, он всегда выполняется до 0.5 секунд.
Фактически, я дергаю одни и те же методы, просто с разных мест. В чем прикол вообще не понимаю....
Буду благодарен за помощь
amelnyk
Сообщения: 78
Зарегистрирован: Вт ноя 22, 2016 12:17 am
Благодарил (а): 13 раз
Поблагодарили: 2 раза

Re: Задержка при выполнении метода getURL

Сообщение amelnyk » Пт дек 02, 2016 12:16 am

Никто не юзает вебсервер на ардуине в связке с мажордомо? жаль(
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Задержка при выполнении метода getURL

Сообщение sergejey » Пт дек 02, 2016 1:44 pm

amelnyk писал(а):Никто не юзает вебсервер на ардуине в связке с мажордомо? жаль(
У меня дома несколько ардуин с веб-серверами на борту -- использую для релейных блоков. Никаких задержек с getURL не наблюдал.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Задержка при выполнении метода getURL

Сообщение olehs » Пт дек 02, 2016 3:32 pm

У Вас Ардуина ждет ответа от МЖД, которое ждет ответа от Ардуины. Только вот Ардуина не многозадачна (
Поменяйте логику. Ардуина должна менять в МЖД свойство enabled, а не вызывать управляющие методы.
amelnyk
Сообщения: 78
Зарегистрирован: Вт ноя 22, 2016 12:17 am
Благодарил (а): 13 раз
Поблагодарили: 2 раза

Re: Задержка при выполнении метода getURL

Сообщение amelnyk » Пт дек 02, 2016 4:51 pm

Спасибо за отклик.
Насколько я помню, я изначально как раз таки и менял непосредственно свойство enabled с Ардуины, проблему тогда и обнаружил, потом переделал на методы, не помогло.
На всякий случай, сегодня я еще раз проверю.
Хотя, может вы и правы, у меня при смене свойства enabled вызывался обработчик аля stateChanged, в котором видимо и был вызов к ардуине... жаль сейчас под рукой нету, чтоб точно глянуть. Но если так, то как тогда правильно создать свойства/методы, чтобы осуществить такое:
- есть обьект Light1, свойство enabled. Методы enabled/disabled, которые вызываются с разных мест мажордома, в обработчике которых есть запрос на ардуину, чтоб она включила нужную лампу.
- на ардуине висит выключатель, который тоже должен включить эту же лампу, но не напрямую, а через мажордомо. Можно свойства менять через пост запрос, а не гетом, чтоб не ждать выполнения всех обработчиков?
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Задержка при выполнении метода getURL

Сообщение olehs » Пт дек 02, 2016 5:07 pm

amelnyk писал(а):- на ардуине висит выключатель, который тоже должен включить эту же лампу, но не напрямую, а через мажордомо. Можно свойства менять через пост запрос, а не гетом, чтоб не ждать выполнения всех обработчиков?
Почему не напрямую, как раз напрямую, и не важно GET или POST:
- МЖД отсылает команды Ардуине через методы enable/disable, но сама МЖД свойство enabled не меняет.
- Ардуина меняет состояние реле (сама или по команде извне) и рапортует это состояние в свойство enabled. Но есть важный момент для Ардуины: она должна полностью отработать запрос от МЖД (закрыть соединение), прежде чем слать назад состояние.
За это сообщение автора olehs поблагодарил:
amelnyk (Пт дек 02, 2016 5:09 pm)
Рейтинг: 1.16%
amelnyk
Сообщения: 78
Зарегистрирован: Вт ноя 22, 2016 12:17 am
Благодарил (а): 13 раз
Поблагодарили: 2 раза

Re: Задержка при выполнении метода getURL

Сообщение amelnyk » Пт дек 02, 2016 5:19 pm

olehs писал(а): Почему не напрямую, как раз напрямую, и не важно GET или POST:
- МЖД отсылает команды Ардуине через методы enable/disable, но сама МЖД свойство enabled не меняет.
- Ардуина меняет состояние реле (сама или по команде извне) и рапортует это состояние в свойство enabled. Но есть важный момент для Ардуины: она должна полностью отработать запрос от МЖД (закрыть соединение), прежде чем слать назад состояние.
напрямую - я имел ввиду непосредственно логикой ардуины включать реле. Я этого не хочу. Нужно, чтоб логика была вся на мажордомо, которая решает включить или не включить лампочку, когда пришел сигнал от ардуино, что сработал выключатель(или к примеру датчик движеня).
пример кейса:
- к ардуине подключен датчик движения
- датчик срабатывает
- ардуина шлет запрос на мажордомо, что мол сработал такой-то датчик
- мажордомо смотрит допустим на время и отсылает ардуине запрос - включи лампочку.
- ардуино получив такой запрос подаёт напряжение на нужный пин.
как то так. без логики на самой ардуине.

Я могу при вызове метода, например

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

GET /objects/?object=Light1&op=m&m=disable
в обоработчике метода сформировать ответ, который получит ардуина? тогда не надо будет отдельно посылать на ардуину новый запрос и не будет взаимного ожидания
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Задержка при выполнении метода getURL

Сообщение olehs » Пт дек 02, 2016 5:22 pm

Вполне. Но тогда, кмк, Вам надо разделить объекты датчика и реле. Чтобы Ардуина слала именно событие датчика, а уже в ответ на команду от МЖД возвращала состояние реле.
amelnyk
Сообщения: 78
Зарегистрирован: Вт ноя 22, 2016 12:17 am
Благодарил (а): 13 раз
Поблагодарили: 2 раза

Re: Задержка при выполнении метода getURL

Сообщение amelnyk » Пт дек 02, 2016 5:33 pm

прошу прощения, но в итоге мне так и не понятно, как избавится от блокировки, когда ардуина ждет ответа от МЖД(выслав состояния датчика), который в свою очередь в обработчике изменения состояния датчика, пытается достучаться к ардуине, чтоб та включила реле...
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Задержка при выполнении метода getURL

Сообщение olehs » Пт дек 02, 2016 5:39 pm

Самый простой способ - почти как Вы и написали: МЖД в ответ на состояние датчика сразу отдает Ардуине нужное состояние реле.
Ответить