Подключение контроллера MegaD-328

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

dimitrystd
Сообщения: 80
Зарегистрирован: Пн апр 01, 2013 10:20 pm
Откуда: Днепропетровск
Благодарил (а): 7 раз
Поблагодарили: 3 раза

Re: Подключение контроллера MegaD-328

Сообщение dimitrystd » Вт мар 18, 2014 12:02 am

Опять не получил нотификацию что есть ответы в теме :(

При импорте файла надо выставить галочку перезаписать
RewriteClass.png
RewriteClass.png (2.78 КБ) 17857 просмотров
Чтобы удалить класс нужно удалить все его объекты и обратить внимание на непреметный крестик :)
RemoveClass.png
RemoveClass.png (6.36 КБ) 17857 просмотров
Я месяц назад ещё сделал клас наследник AutoSwitchOffLight. Из названия думаю понятно что он делает. У него появилось два доп. свойства autoSwitchOffEnabled и autoSwitchOffTimeOut.
После импорта должно выглядеть как то так
Light.png
Light.png (28.71 КБ) 17857 просмотров
В архив положил Light клас + новый megad.php. Надеюсь заработает на стандартной инсталяции МД потому что я чтото кастомизировал под себя МД, но пытался отдавать в пулреквестах изменения.
LightClass.zip
(3.04 КБ) 384 скачивания
Stunt
Сообщения: 39
Зарегистрирован: Вс мар 16, 2014 8:17 pm
Благодарил (а): 5 раз
Поблагодарили: 2 раза

Re: Подключение контроллера MegaD-328

Сообщение Stunt » Пн мар 24, 2014 1:53 am

Настроил MD + MegaD по мануалу из этого топика, все заработало! =) Спасибо автору.
Но, как обычно, хочется большего :)
Хочется "железную" кнопку у входной двери, при нажатии на которую все выходы (7-13) MegaD переходили в состояние выкл (0).
Плюс к "железной" кнопке, кнопка в интерфейсе ВЫКЛ.ВСЕ.
pic4.jpg
pic4.jpg (52.88 КБ) 17803 просмотра
pic1.jpg
pic1.jpg (51.94 КБ) 17803 просмотра
К кнопке создал объект и метод.
pic2.jpg
pic2.jpg (56.15 КБ) 17803 просмотра
pic3.jpg
pic3.jpg (139.26 КБ) 17803 просмотра
Код метода:

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

if ($params['VALUE']) {
getURL("http://192.168.2.251/sec/?cmd=7:0;8:0;9:0",0);
}
else {
getURL("http://192.168.2.251/sec/?cmd=7:0;8:0;9:0",0);
}
Что получилось...
Первое - при нажатии на кнопку в интерфейсе отключаются порты 7,8,9 - это работает. Но, ранее включенные переключатели в интерфейсе так и отображают включенное состояние, хотя порты на самой меге отключены.

Второе - при нажатии на "железную" кнопку (подключена к порту 6 на меге), выключение портов 7,8,9 не происходит.

...и так как моих знаний хватает пока только на вдумчивый копипаст, прошу помощи у сообщества :)
vova5049
Сообщения: 64
Зарегистрирован: Пт фев 21, 2014 10:56 am
Откуда: Днепропетровск
Благодарил (а): 1 раз
Поблагодарили: 5 раз

Re: Подключение контроллера MegaD-328

Сообщение vova5049 » Пн мар 24, 2014 1:01 pm

попробуйте так:

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

if ($params['VALUE']) {
getURL("http://127.0.0.1/objects/index.php?object=Bedroom1&op=m&m=switchOff",0);
getURL("http://127.0.0.1/objects/index.php?object=Bedroom2&op=m&m=switchOff",0);
getURL("http://127.0.0.1/objects/index.php?object=Bedroom3&op=m&m=switchOff",0);
getURL("http://127.0.0.1/objects/index.php?object=Bedroom4&op=m&m=switchOff",0);
}
else {
getURL("http://127.0.0.1/objects/index.php?object=Bedroom1&op=m&m=switchOff",0);
getURL("http://127.0.0.1/objects/index.php?object=Bedroom2&op=m&m=switchOff",0);
getURL("http://127.0.0.1/objects/index.php?object=Bedroom3&op=m&m=switchOff",0);
getURL("http://127.0.0.1/objects/index.php?object=Bedroom4&op=m&m=switchOff",0);
} 
должно работать, только вместо Bedroom1- 4 поставте свои объекты.

Но насколько я понимаю, правильнее будет через вызов

callMethod("Object.Method", $params); -- вызывает метод объекта с заданными параметрами (последнее указывать не обязательно)
но я еще не научился этим пользоваться ))

.....PS.... научился :

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

callMethod("Bedroom1.switchOff");
callMethod("Bedroom2.switchOff");
callMethod("Bedroom3.switchOff");
callMethod("Bedroom4.switchOff");
 
Вложения
callMethod.png
callMethod.png (38.55 КБ) 17761 просмотр
2*MegaD328, Система на Raspberry Pi 2
Stunt
Сообщения: 39
Зарегистрирован: Вс мар 16, 2014 8:17 pm
Благодарил (а): 5 раз
Поблагодарили: 2 раза

Re: Подключение контроллера MegaD-328

Сообщение Stunt » Пн мар 24, 2014 1:51 pm

Да, кнопка в интерфейсе заработала вот с таким кодом в методе:

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

if ($params['VALUE']) {
getURL("http://127.0.0.1/objects/index.php?object=1stLivingZone_Light&op=m&m=switchOff",0);
getURL("http://127.0.0.1/objects/index.php?object=1stChilloutZone_Light&op=m&m=switchOff",0);
getURL("http://127.0.0.1/objects/index.php?object=1stKitchen_Light&op=m&m=switchOff",0);
}
else {
getURL("http://127.0.0.1/objects/index.php?object=1stLivingZone_Light&op=m&m=switchOff",0);
getURL("http://127.0.0.1/objects/index.php?object=1stChilloutZone_Light&op=m&m=switchOff",0);
getURL("http://127.0.0.1/objects/index.php?object=1stKitchen_Light&op=m&m=switchOff",0);
}
Сейчас проверю и callMethod.

А, вот "железная" кнопка молчит. Нет реакции на нажатие....

P.S. А вы по какому "учебнику" учитесь? =)

.....проверил callMethod тоже работает, на внешний раздражитель в виде "железной" кнопки по прежнему не реагирует.
vova5049
Сообщения: 64
Зарегистрирован: Пт фев 21, 2014 10:56 am
Откуда: Днепропетровск
Благодарил (а): 1 раз
Поблагодарили: 5 раз

Re: Подключение контроллера MegaD-328

Сообщение vova5049 » Пн мар 24, 2014 3:27 pm

Создал два объекта :

1. Workroom - в свойствах прописал только Workroom.outputPort , Workroom.outputDevice
2.Workroomclick в свойствах прописал только Workroomclick.inputPort , Workroomclick.inputDevice

И в методе объекта Workroomclick, switchPressed прописал код:

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

callMethod("Workroom.switchOff"); 
и поставил внизу Вызывать родительский метод: никогда

вроде все работает как нужно.
А вы по какому "учебнику" учитесь? =)
http://smartliving.ru/Main/ProgrammingFunctions
2*MegaD328, Система на Raspberry Pi 2
dimitrystd
Сообщения: 80
Зарегистрирован: Пн апр 01, 2013 10:20 pm
Откуда: Днепропетровск
Благодарил (а): 7 раз
Поблагодарили: 3 раза

Re: Подключение контроллера MegaD-328

Сообщение dimitrystd » Пн мар 24, 2014 3:33 pm

Давайте сначала расскажу идею, потом мои советы чтобы я изменил
1. Вся логика по работе с железом должна быть в классе MegaD. Т.е. если в объектах класса Light появляется код "getURL("http://127.....", то значит чтото пошло не так
2. Хоть MegaD и знает как работать с объектом и может вкл. и выкл. его, но MegaD всёравно не должен хранить статус. Это потому что статус зависит от бизнеслогики, а она может быть сложной. Другими словами MegaD не должен хранить состояния (stateless). Он просто транслирует твои хотелки в команды протокола MegaD
3. Объект класса Light описывает бизнес логику светильника. Причём свитильник может быть физический, а может как у вас быть гибридный (кнопка которая напрямую не связана с другими светильниками).

Как бы я сделал:
1. Удалил бы метод "switchAlloffLight" из объекта Light. Хотя бы по той причине что он не нужен всем светильникам. Вторая причина - если нужно изменить логику, то вперёд её менять методах switchOn, switchOff
2. Итак идём в обьект TestLight. Ищем именно его метод switchOff
3. Как вам уже правильно подсказали, код метода switchOff должен быть

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

callMethod("Bedroom1.switchOff");
callMethod("Bedroom2.switchOff");
callMethod("Bedroom3.switchOff");
callMethod("Bedroom4.switchOff");
Обязательно в настройках метода выбрать - Не выполнять базовый метод. Ничего страшного не произойдёт, но будет бесполезная работа
4. Изменения одного switchOff мало. TestLight как бы виртуальный светильник, поэтому он не может считать своё состояние из MegaD. Поэтому нужно переписать getOutputPortState
5. Идём в метод getOutputPortState светильника TestLight и пишем там чтото вроде

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

$this->setProperty('enabled', true);
И снова указываем - Не выполнять базовый метод.
6. Теперь поправим кнопку в меню. Там где "Запускать Объект.Метода" надо написать TestLight.switchOff

Вот теперь все объекты выглядят по феншую. И должно работать как из вне, так из вебинтерфейса.

Про железную кнопку которая не работает. Теперь она должна заработать. Цепочка вызовов будет такая:
- megad.php
- TestLight.toggleSwitch
- TestLight.getOutputPortState
- TestLight.switchOff

P.S. Сори если не заработает, пишу по памяти.
dimitrystd
Сообщения: 80
Зарегистрирован: Пн апр 01, 2013 10:20 pm
Откуда: Днепропетровск
Благодарил (а): 7 раз
Поблагодарили: 3 раза

Re: Подключение контроллера MegaD-328

Сообщение dimitrystd » Пн мар 24, 2014 3:49 pm

Создал два объекта :
1. Workroom - в свойствах прописал только Workroom.outputPort , Workroom.outputDevice
2.Workroomclick в свойствах прописал только Workroomclick.inputPort , Workroomclick.inputDevice
И в методе объекта Workroomclick, switchPressed прописал код:
Я не очень понял идею этого примера с двумя объектами. Но да, такое возможно.
И ещё пару пояснений насчёт методов класса Light
- switchPressed - его вообще удалить нужно, забыл это сделать. Я хотел заложить сюда какое то отдельное поведение если включили именно через железную а не софтовую кнопку. Позже пришло понимание что поведение всегда должно быть одинаковым
- toggleSwitch - Просто решает что нужно вызвать Вкл или Выкл. Его должна дёргать и железная и софт кнопка
- switchOff\switchOn - ну тут всё понятно.

Так вот если я хочу из одного объекта выключить другой, то я бы менял именно switchOff. Например можно было бы обойтись одним мега длинным методом который бы делал и знал всё. Но намного легче разделить их логически и спользовать в зависимости от ситуации.
Или к примеру захочется вам взять все обьекты класса Light и вызвать switchOff в цикле, а объект Workroomclick никак не отреагирует. Начнёте костыли писать.
Stunt
Сообщения: 39
Зарегистрирован: Вс мар 16, 2014 8:17 pm
Благодарил (а): 5 раз
Поблагодарили: 2 раза

Re: Подключение контроллера MegaD-328

Сообщение Stunt » Пн мар 24, 2014 5:59 pm

ААА! Заработало! :D
По методу dimitrystd, спасибо огромное.
Скоро можно будет упаковать MegaD в щиток =)
vova5049
Сообщения: 64
Зарегистрирован: Пт фев 21, 2014 10:56 am
Откуда: Днепропетровск
Благодарил (а): 1 раз
Поблагодарили: 5 раз

Re: Подключение контроллера MegaD-328

Сообщение vova5049 » Пн мар 24, 2014 6:48 pm

Я не очень понял идею этого примера с двумя объектами
идея в том, что ............ тфу ты сам уже запутался... вобщем Workroomclick - это
отдельный обьект - железная кнопка, метод которой toggleSwitch вызывается при
нажатии, но метод вызывается не родительский, а свой, где прописано, какие вызвать
методы для выключения нужных выходов, это ведь просто отдельная кнопка на нажатие
которой нужно отреагировать, а не часть светильников. Т.е я рассматриваю кнопку не как
гибридный светильник, а просто, как кнопку.....

...А в бизнес логике я не разбираюсь ))), я не программист. Может быть я и не по феншую
предложил ), но мне так прозрачней... Я понимаю, что при развитии системы это может
вылезти боком, но Ваш постуже четыре раза прочитал, но никак не въеду........видно
рано мне еще)). С утра попробую закрепить. А toggleSwitch пока удалять не буду, если б
не он, я бы эту задачку не решил бы )). Спасибо Вам, что не гнушаетесь помогать начинающим. :geek:
2*MegaD328, Система на Raspberry Pi 2
vova5049
Сообщения: 64
Зарегистрирован: Пт фев 21, 2014 10:56 am
Откуда: Днепропетровск
Благодарил (а): 1 раз
Поблагодарили: 5 раз

Re: Подключение контроллера MegaD-328

Сообщение vova5049 » Пн мар 24, 2014 7:02 pm

И еще один нескромный вопрос к dimitrystd:
не могли бы Вы, своим авторитетным взглядом посмотреть на http://smartliving.ru/forum/viewtopic.p ... ron#p10456
и посоветовать, так сказать, архитектуру. У меня во многих светильниках будут к МегаД только кнопки подключены, а выходом будет контроллер lutron
2*MegaD328, Система на Raspberry Pi 2
Ответить