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

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

Модератор: immortal

Zaratustra
Сообщения: 9
Зарегистрирован: Пт окт 10, 2014 7:48 pm
Благодарил (а): 4 раза
Поблагодарили: 0

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

Сообщение Zaratustra » Сб окт 18, 2014 2:24 pm

Приветствую, Bagir!

Очень признателен за скрипт по обработке SRV LOOP, но заметил, что Мегадевайс не всё время передает эти данные. Не знаю причины, но через некоторое время в логах уже не отображаются эти строки.
Возникла идея запрашивать самостоятельно Мегадевайс о состоянии всех портов.
Для этого есть команда http://192.168.1.14/sec?cmd=all и в ответ он дает такую же строку, как и при SRV LOOP.
На сколько я понимаю, нужен скрипт, который выдает эту строку в сеть и обрабатывает ответ как прежде.
Этот скрипт запускается по Cron по заданным периодам.
Вы могли бы создать такой скрипт? Я уже начал изучать PHP, но пока только на уровне "чайник" :)
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Сб окт 18, 2014 3:23 pm

Да я и сам пока еще чайник :lol: Скрипт конечно напишу. Кстати, есть вариант запускать опрос из объекта onNewMinute класса Timer. Если не нужно с частотой в одну минуту, то можно повесить условие, чтобы опрашивался пореже. В общем вариант будет еще проще. В классе MegaD есть метод getOutput. Он просто пока еще не умеет спрашивать all и не понимает такой ответ. Сегодня ночью допилю его и выложу обновления. Тогда Cron вообще не потребуется, и все будет написано в стандартных методах onNewMinute и getOutput. Ближе к делу посмотрим как будет удобней. Конечно если очень нужно, его можно будет и в Cron засунуть, но я думаю, что это не потребуется.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Zaratustra
Сообщения: 9
Зарегистрирован: Пт окт 10, 2014 7:48 pm
Благодарил (а): 4 раза
Поблагодарили: 0

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

Сообщение Zaratustra » Сб окт 18, 2014 11:35 pm

Если использовать Cron, то есть возможность менять периодичность опроса.
А можно ли будет менять периодичность опроса через класс/метод?
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Сб окт 18, 2014 11:38 pm

Конечно, да как угодно. Сейчас как раз доделываю обновление. Перекроил почти все )) Посмотрим на сколько удачно получится. Постараюсь скоро выложить, но может быть сыренько... Сейчас уже оттестировать толком не успею.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Вс окт 19, 2014 1:13 am

Ну что, давайте тестить!
Несколько утверждений:
  • МегаД может сама послать нам на сервер различные get запросы, когда посчитает нужным. Например по коммутации входа, превышению температуры, или циклично. Они поступят в метод incomingMessage.
  • Мы сами можем послать (спросить) Мегу get запросом из метода getData о чем либо. Например о состоянии нужного порта или сразу всех портов. Ответ так же будет передан в метод incomingMessage
  • Метод getOutput теперь больше не нужен. Пока оставил его, но в будущем наверное уберу.
Структура метода incomingMessage:
Три больших абзаца. В каждом свое ветвление с группами Case по номерам портов.

Первый абзац для обработки сообщения со всеми портами в одной длинной строке. Сработает либо по цикличному ответу Меги, либо по запросу callMethod('MegaD1.getData', array('port'=>'all'));

Второй абзац для обработки статусов портов, которые мы сами спросили с помощью callMethod('MegaD1.getData', array('port'=>1)); Тут надо запомнить, что если мы спрашиваем состояние например первого порта, то значит эти данные нам нужны для чего то, и должна быть группа команд в Case 1: для передачи полученного ответа нужным объектам.

Третий абзац для обработки get запросов меги, когда например мы коммутируем какой то вход. В нем реализованы обработки разного вида нажатий. Простое, двойное, длинное, и отпускание после удержания. Сюда же надо будет потом добавить обработку сообщения о превышении температуры.

Получается, что все у нас расписывается в методе incomingMessage. Вот по этому я и бросил метод getOutput, выбрав на замену вариант вопроса из getData с передачей ответа в incomingMessage.
getOutput позволял просто записать значение порта в указанное свойство объекта. Но для Меги этого мало. Взять даже вариант датчика температуры/влажности. Чтобы разделить значения на два свойства, нужен хоть простенький но код. Реализовать все это можно без труда в incomingMessage.
Пока что класс на тестировании. Выкладываю только тут. Файл обновлять не надо. Жду суровой критики и железных предложений!
К вопросу о периодичности опроса. Допустим нам надо опрашивать нашу мегу раз в минуту, и получать от нее данные о всех портах. Тогда в onNewMinute пишем callMethod('MegaD1.getData', array('port'=>'all')); Если же так часто опрашивать не надо, никто не запретит написать вначале if и смотря на $m, что позволит делать опросы через необходимый интервал времени или же по любому другому условию.
Вложения
MegaD_class ver2.1.zip
(17.08 КБ) 198 скачиваний
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Zaratustra
Сообщения: 9
Зарегистрирован: Пт окт 10, 2014 7:48 pm
Благодарил (а): 4 раза
Поблагодарили: 0

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

Сообщение Zaratustra » Пн окт 20, 2014 2:32 am

Bagir, работает как часы :)

Если в сети несколько Мегадевайсов и срабатывает вход на одном MegaD, можно ли активировать выход на другом MegaD?
Я так понимаю, что для этого достаточно прописать реакцию в методе IncomingMesagge того устройства, чей вход мы обрабатываем?
В реакции можно вызывать метод любого другого устройства.
У меня пока один девайс и нет возможности проверить)
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Пн окт 20, 2014 9:22 am

Zaratustra писал(а):Если в сети несколько Мегадевайсов и срабатывает вход на одном MegaD, можно ли активировать выход на другом MegaD?
Да, конечно! Этот класс прежде всего и разрабатывал чтобы управлять сразу несколькими Мегами. IncomingMesagge настраивается для каждой Меги отдельно. А getData общий для всех, и определяет имя по объекту.
Прописать реакцию в методе IncomingMesagge можно. Если там пара строк кода, то почему бы и нет. Но сильно загружать этот метод не советую. У Меги еще много всяких подарков, и далеко не все реализовано в классе. Так что будем еще обновлять и не раз.
Вообще я выбрал для себя так:
Класс MegaD только лишь как связующий для Меги и объектов МД. В нем (в методе IncomingMesagge) я просто указываю куда отправить данные. Он и так получается немного нагружен обработками различных нажатий и вариантов.
Для всех входов Меги я создал отдельные объекты в классе keySensors. А для всех выходов в классе Relays. Да, возможно это будет немного нагружено. Зато просто и понятно, и я в любой момент могу заменить датчик, подключенный к Меге например на беспроводной Z-Wave, или наоборот, если протяну туда провода. То есть я не привязываю логику своих условий конкретно к методу меги. Логика работы дома завязана на сенсоры в классе keySensors и на реле в классе Relays. А такие игрушки как МегаД и Z-Wave, имеют у меня свои классы, передают данные объектам keySensors и получают указания от объектов Relays.
Мне показалось это идеальным вариантов. Во первых он стандартный. keySensors и Relays есть у всех, и при обсуждении чего либо все прекрасно представляют о чем идет речь. Ну а от куда именно поступают данные и куда затем уходит управления - дело индивидуальное.
И еще плюс. Разделив логику со своими классами keySensors и Relays с одной стороны, и железо со связующими классами MegaD и Z-Wave с другой, я могу легко отлаживать логику, подсовывая нужные данные в keySensors и смотря выход на Relays независимо от работы железа. Так же отдельно могу смотреть и на работу железной стороны.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Zaratustra
Сообщения: 9
Зарегистрирован: Пт окт 10, 2014 7:48 pm
Благодарил (а): 4 раза
Поблагодарили: 0

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

Сообщение Zaratustra » Пн окт 20, 2014 10:59 pm

Bagir, приведите пожалуйста, пример, как у Вас настроена система через Reay и keySensors.
Хотя бы для одного выхода-входа.
На данный момент у меня в классе Relays созданы 7 объектов (на каждый выход) и в методе IncomingMessage в "case" я вызываю определенный метод "callMethod('Megad1_1.switch');"
А как прописывать входы и потом реакцию на них?
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Пн окт 20, 2014 11:16 pm

Сейчас у меня дома осталась только одна Мега. С нетерпением жду когда же наша доблестная почта все же доставит мне еще парочку. Мега Управляет системой вентиляции. Все выходы задействованы. А вот вход используется пока только один. Не все еще оборудование успел установить. Вход подключен к сенсору заслонки воздуховода притока уличного воздуха.
Посмотреть все можно у меня в коннекте http://connect.smartliving.ru/profile/220 Тут почти всегда самые последние данные. Класс Меги кстати, тоже можно всегда взять от туда целиком, или посмотреть изменения.
Вот кусочек кода передачи данных от сенсора заслонки из incomingMessage

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

  // Далее идут уже лично мои настройки. Оставил их для примера.
  case 4: // P&R
    callMethod('sensorOutdoorAirDamperClose.statusChanged' ,array('status'=>$ms));
    //say('Передаю датчику воздушной заслонки статус '.$ms);
    break;
При срабатывании сенсора (сухой контакт) статус входа меги передается объекту sensorOutdoorAirDamperClose класса keySensors.
Для управления выходами меги, в классе Relays созданы 7 объектов RelayVentilation1-7. В их методах turnOn и turnOff передается команда вкл или выкл таким кодом

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

callMethod('MegaD1.setOutput',array('port'=>12,'value'=>1));
Обязательно полазайте у меня в коннекте! По этому описанию будет несложно понять что к чему по части меги. Будут вопросы, обязательно пишите. Чем смогу всегда помогу ))
За это сообщение автора Bagir поблагодарил:
Zaratustra (Пн окт 20, 2014 11:47 pm)
Рейтинг: 1.16%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
zelevova
Сообщения: 291
Зарегистрирован: Вт ноя 18, 2014 11:43 pm
Откуда: Краснодарский край
Благодарил (а): 32 раза
Поблагодарили: 68 раз

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

Сообщение zelevova » Чт ноя 20, 2014 9:03 pm

Bagir, подскажи. С новым классом версии 2.1 файл megad.php версии 2.0 использовать?
Последний раз редактировалось zelevova Вт дек 02, 2014 5:10 pm, всего редактировалось 1 раз.
Majordomo (GitHub) на cubietruck + MegaD + 1-wire
CONNECT: http://connect.smartliving.ru/profile/311
Ответить