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

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

Модератор: immortal

Zavoolon
Сообщения: 12
Зарегистрирован: Вс янв 15, 2017 12:51 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Модуль "MegaD"

Сообщение Zavoolon » Ср янв 25, 2017 12:35 pm

Коллеги!

Есть какой подробный мануал, как подключать Мегу? Без изысков? Направьте по назначению, или давайте создадим вместе, и выложим в шапке темы, или давайте подправим то что есть. Я смотрю, люди приходят, и каждый стучится об одно и тоже... Вот как я сейчас.

Для примера, есть Мега, у нее задействован вход I0, на вход посажена кнопка (выключатели с автовозвратом в состояние "выкл").
На выходе O7 сидит лампочка.
По порядку:
1) нужно создать объект Input_0_MegaD_XXX класса keySensors (а лучше объект специального дочернего класса MegaDInputs класса keySensors), в котором создать специальный метод inputSwitched, который вызывается каждый раз при изменении состояния привязанного входа Меги; этим методом изменяется специальное свойство buttonPressed. При этом, поскольку кнопка, свойство будет изменено только при изменении входа с состояния 1 на состояние 0 (кнопка отпущена).
2) привязать вход I0 Меги к объекту Input_0_MegaD_XXX и его методу inputSwitched.
3) создать объект Output_7_MegaD_XXX класса Relays, для которого в метод switched вписать return "7:2"
4) создать на сцене объект "выключатель", для которого указать связанный объект Output_7_MegaD_XXX
5) опять вернуться к конфигурированию Меги, выхода O7 связать с объектом Output_7_MegaD_XXX, связанным свойство указать status
6) ---???
что дальше? как связать объект Input_0_MegaD_XXX и объект Output_7_MegaD_XXX? Совершенно непонятно, ведь в случае выключателя (на сцене), привязка идет очень неявно, просто указать связанный объект... А дальше все сконфигурируется само. Как?

ЗЫ: и вообще - что может скриптовый язык? справочник есть? Список доступных переменных на входе, можно ли менять свойства связанных объектов, какие есть доступные функции... Ведь их не отладишь, приходится писать "вслепую". Тот еще геморрой... Прошу прощения, если задаю банальные вопросы, но например мне не хватает структурированного мануала. И я понимаю, что это просто PHP, но все равно, что я могу использовать, что мне дается в рамках предложенной здесь модели, подразумевающей привязывание объектов, свойств, методов....

ЗЗЫ: справочник нашел по адресу http://majordomo.smartliving.ru/Main/Pr ... gFunctions. Однако вопрос по дорожной карте, как действовать в конкретном, описанном выше случае, остался...
sega6549
Сообщения: 530
Зарегистрирован: Чт авг 20, 2015 11:32 am
Откуда: Ярославль
Благодарил (а): 61 раз
Поблагодарили: 75 раз
Контактная информация:

Re: Модуль "MegaD"

Сообщение sega6549 » Ср янв 25, 2017 1:06 pm

Zavoolon писал(а):Коллеги!

Есть какой подробный мануал, как подключать Мегу? Без изысков? Направьте по назначению, или давайте создадим вместе, и выложим в шапке темы, или давайте подправим то что есть. Я смотрю, люди приходят, и каждый стучится об одно и тоже... Вот как я сейчас.

Для примера, есть Мега, у нее задействован вход I0, на вход посажена кнопка (выключатели с автовозвратом в состояние "выкл").
На выходе O7 сидит лампочка.
По порядку:
1) нужно создать объект Input_0_MegaD_XXX класса keySensors (а лучше объект специального дочернего класса MegaDInputs класса keySensors), в котором создать специальный метод inputSwitched, который вызывается каждый раз при изменении состояния привязанного входа Меги; этим методом изменяется специальное свойство buttonPressed. При этом, поскольку кнопка, свойство будет изменено только при изменении входа с состояния 1 на состояние 0 (кнопка отпущена).
2) привязать вход I0 Меги к объекту Input_0_MegaD_XXX и его методу inputSwitched.
3) создать объект Output_7_MegaD_XXX класса Relays, для которого в метод switched вписать return "7:2"
4) создать на сцене объект "выключатель", для которого указать связанный объект Output_7_MegaD_XXX
5) опять вернуться к конфигурированию Меги, выхода O7 связать с объектом Output_7_MegaD_XXX, связанным свойство указать status
6) ---???
что дальше? как связать объект Input_0_MegaD_XXX и объект Output_7_MegaD_XXX? Совершенно непонятно, ведь в случае выключателя (на сцене), привязка идет очень неявно, просто указать связанный объект... А дальше все сконфигурируется само. Как?

ЗЫ: и вообще - что может скриптовый язык? справочник есть? Список доступных переменных на входе, можно ли менять свойства связанных объектов, какие есть доступные функции... Ведь их не отладишь, приходится писать "вслепую". Тот еще геморрой... Прошу прощения, если задаю банальные вопросы, но например мне не хватает структурированного мануала. И я понимаю, что это просто PHP, но все равно, что я могу использовать, что мне дается в рамках предложенной здесь модели, подразумевающей привязывание объектов, свойств, методов....

ЗЗЫ: справочник нашел по адресу http://majordomo.smartliving.ru/Main/Pr ... gFunctions. Однако вопрос по дорожной карте, как действовать в конкретном, описанном выше случае, остался...
а через дополнение в маркете пробовали? мне кажется самый удобный вариант
Тут можно задать вопрос по MajorDoMo VK
Канал по MajorDoMo youtube
Zavoolon
Сообщения: 12
Зарегистрирован: Вс янв 15, 2017 12:51 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Модуль "MegaD"

Сообщение Zavoolon » Ср янв 25, 2017 1:24 pm

sega6549 писал(а):
Zavoolon писал(а):Коллеги!

...
а через дополнение в маркете пробовали? мне кажется самый удобный вариант
Мега установлена как дополнение через маркет, конечно. Выше я писал, что даже будучи установленной таким образом, она не "взлетела", а конкретнее - были ошибки при использовании megad-cfg.php, пришлось править код. Но это все в прошлом, а теперь хотелось бы понять, как не вылезая за рамки уже существующей экосистемы, полностью сконфигурировать работу Меги и Мажора.
И хочу-то немногого (пока) - иметь изображение квартиры и включать/выключать свет дистанционно, нажимая на изображение выключателя в соответствующем месте. Но также хочу, чтобы сервер обрабатывал сигналы от кнопок реальных, а не только виртуальных (экранных). Пока сервер управляет светом только с помощью виртуальных кнопок, нажатия реальных кнопок никак не привязаны к управлению выходами. Собственно, в этом и вопрос.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Модуль "MegaD"

Сообщение sergejey » Ср янв 25, 2017 2:05 pm

Zavoolon писал(а):
sega6549 писал(а):
Zavoolon писал(а):Коллеги!

...
а через дополнение в маркете пробовали? мне кажется самый удобный вариант
Мега установлена как дополнение через маркет, конечно. Выше я писал, что даже будучи установленной таким образом, она не "взлетела", а конкретнее - были ошибки при использовании megad-cfg.php, пришлось править код. Но это все в прошлом, а теперь хотелось бы понять, как не вылезая за рамки уже существующей экосистемы, полностью сконфигурировать работу Меги и Мажора.
И хочу-то немногого (пока) - иметь изображение квартиры и включать/выключать свет дистанционно, нажимая на изображение выключателя в соответствующем месте. Но также хочу, чтобы сервер обрабатывал сигналы от кнопок реальных, а не только виртуальных (экранных). Пока сервер управляет светом только с помощью виртуальных кнопок, нажатия реальных кнопок никак не привязаны к управлению выходами. Собственно, в этом и вопрос.
Ваша задача решается проще, чем вы написали. С помощью встроенных средств MegaD вы можете связать кнопки с реле без использования сервера. Сервер будет получать только изменения статуса реле и, соответственно, управлять реле. Привязывать сервер ко входам нет необходимости.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Модуль "MegaD"

Сообщение Chainik » Ср янв 25, 2017 2:16 pm

Zavoolon писал(а):Однако вопрос по дорожной карте, как действовать в конкретном, описанном выше случае, остался...
Мажордомо замечательно тем, что одни и те же вещи можно сделать разными способами. Вечером (по московскому времени) напишу, как эта задача решается у меня (по шагам).
Zavoolon
Сообщения: 12
Зарегистрирован: Вс янв 15, 2017 12:51 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Модуль "MegaD"

Сообщение Zavoolon » Ср янв 25, 2017 3:13 pm

sergejey писал(а):
Ваша задача решается проще, чем вы написали. С помощью встроенных средств MegaD вы можете связать кнопки с реле без использования сервера. Сервер будет получать только изменения статуса реле и, соответственно, управлять реле. Привязывать сервер ко входам нет необходимости.
Да, конечно, сейчас у меня именно так, как Вы пишете - то есть Мега сама управляет своими выходами, сервер не привязан к входам. Но замануха умного дома ведь в том, что всегда хочется сделать "немножко больше и лучше"! Например, нажимая одну кнопку, выключить все выходы всех 6 Мег в сети... Скажем, средствами самой Меги этого сделать не получится, ограничивает длина командной строки, можно отправить команду только одной Меге...
Последний раз редактировалось Zavoolon Ср янв 25, 2017 3:16 pm, всего редактировалось 1 раз.
Zavoolon
Сообщения: 12
Зарегистрирован: Вс янв 15, 2017 12:51 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Модуль "MegaD"

Сообщение Zavoolon » Ср янв 25, 2017 3:15 pm

Chainik писал(а):
Zavoolon писал(а):Однако вопрос по дорожной карте, как действовать в конкретном, описанном выше случае, остался...
Мажордомо замечательно тем, что одни и те же вещи можно сделать разными способами. Вечером (по московскому времени) напишу, как эта задача решается у меня (по шагам).
Вот спасибо! Буду ждать Вашего описания, уверен, оно поможет не только мне!
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: Модуль "MegaD"

Сообщение Victor_S » Ср янв 25, 2017 10:05 pm

Kod.Begemot писал(а):Вопрос к пользуюущимся модулем. Вот если сейчас мегу перезагрузить, состояние выходов восстановится на то, что было до перезапуска?
Увы, так и не реализована данная нужная функция в модуле...:( У же писал как-то, попробую еще раз...;)
Сергей, МегаД при первом старте(рестарте) отправляет серверу значение st=1. Крайне хотелось бы, чтобы в ответ на данную посылку модуль отправлял Меге команды на включение/выключение выходов(не являющихся "термостатами"), согласно последнему их статусу в модуле.
И еще один момент, ребята, давайте не будем валить хотелки реализуемые в 2560 в данный модуль. Дело в том, что ее разработка только-только начинается и это потенциально грозит постоянной бетой и проблемами в данном модуле. Хорошо бы хотя бы базовый функционал 328-ой довести до ума. Ее развитие прекращено и есть смысл доделать модуль...;)
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Модуль "MegaD"

Сообщение Chainik » Ср янв 25, 2017 10:12 pm

Zavoolon писал(а):Коллеги!

Есть какой подробный мануал, как подключать Мегу? Без изысков? Направьте по назначению, или давайте создадим вместе, и выложим в шапке темы, или давайте подправим то что есть. Я смотрю, люди приходят, и каждый стучится об одно и тоже... Вот как я сейчас.

Для примера, есть Мега, у нее задействован вход I0, на вход посажена кнопка (выключатели с автовозвратом в состояние "выкл").
На выходе O7 сидит лампочка.
По порядку:
1) нужно создать объект Input_0_MegaD_XXX класса keySensors (а лучше объект специального дочернего класса MegaDInputs класса keySensors), в котором создать специальный метод inputSwitched, который вызывается каждый раз при изменении состояния привязанного входа Меги; этим методом изменяется специальное свойство buttonPressed. При этом, поскольку кнопка, свойство будет изменено только при изменении входа с состояния 1 на состояние 0 (кнопка отпущена).
2) привязать вход I0 Меги к объекту Input_0_MegaD_XXX и его методу inputSwitched.
3) создать объект Output_7_MegaD_XXX класса Relays, для которого в метод switched вписать return "7:2"
4) создать на сцене объект "выключатель", для которого указать связанный объект Output_7_MegaD_XXX
5) опять вернуться к конфигурированию Меги, выхода O7 связать с объектом Output_7_MegaD_XXX, связанным свойство указать status
6) ---???
что дальше? как связать объект Input_0_MegaD_XXX и объект Output_7_MegaD_XXX? Совершенно непонятно, ведь в случае выключателя (на сцене), привязка идет очень неявно, просто указать связанный объект... А дальше все сконфигурируется само. Как?

ЗЫ: и вообще - что может скриптовый язык? справочник есть? Список доступных переменных на входе, можно ли менять свойства связанных объектов, какие есть доступные функции... Ведь их не отладишь, приходится писать "вслепую". Тот еще геморрой... Прошу прощения, если задаю банальные вопросы, но например мне не хватает структурированного мануала. И я понимаю, что это просто PHP, но все равно, что я могу использовать, что мне дается в рамках предложенной здесь модели, подразумевающей привязывание объектов, свойств, методов....

ЗЗЫ: справочник нашел по адресу http://majordomo.smartliving.ru/Main/Pr ... gFunctions. Однако вопрос по дорожной карте, как действовать в конкретном, описанном выше случае, остался...
Сразу хочу сказать, что модуль MegaD я использую только для того, чтобы «отлавливать» срабатывание входов Меги. Это несколько отличается от задуманного автором способа использования модуля, но я, видимо, что-то не допонял или не смог когда-то разобраться. Поэтому применяю несколько другой подход.

Считаем, что в модуле MegaD Мега успешно обнаружилась и вопрос подключения Меги к модулю здесь обсуждать не будем.

Итак, приступим.

Имеется Мега, Мажордомо с установленным модулем MegaD, «железный» выключатель без фиксации (кнопка) на стене, лампочка на потолке.
Допустим, адрес Меги в сети 192.168.0.14, пароль “sec”; «железный» выключатель скоммутирован со входом Меги «P0», а лампочка подключена ко выходу «P7».

Задача: включать/выключать лампочку с помощью Мажордомо как из интерфейса, так и посредством «железного» выключателя.

1. Для «железного» выключателя создаем в классе KeySensors виртуальный объект. «Обозвать» объект можно как угодно, однако название «со смыслом» облегчит нам идентификацию объекта среди однотипных. Назовем его, к примеру, «Button_014-00». При этом под 014 подразумевается окончание адреса Меги в сети, а под 00 – порт «P0», куда подключен выключатель.
Подход с названием может и не идеальный («железный» выключатель никуда со стены не денется, а адрес Меги может неоднократно меняться в процессе настройки/переделки/апгрейда, да и контакты от выключателя могут «переезжать» из одного порта в другой). Но пока для простоты «ориентирования» в объектах я для себя остановился на таком варианте присвоения имен.
У «Button_014-00» уже есть метод «statusChanged».

2. Для выхода Меги «P7» создаем виртуальный объект в классе Relays. Назовем его по аналогии «Relay_014-07». У объекта имеются свойство «status» и «штатные» методы «turnOn», «turnOff» и «switch».
Произведем настройку методов путем записи кода:
[перед сохранением введенного пользователем кода в пункте «Вызывать родительский метод» проставим радиоточку в положение «НИКОГДА».]
в «turnOn» запишем

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

file_get_contents("http://192.168.0.14/sec/?cmd=7:1");
setGlobal('Relay_014-07.status', 1);
в «turnOff» запишем

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

file_get_contents("http://192.168.0.14/sec/?cmd=7:0");
setGlobal('Relay_014-07.status', 0);
Метод «switch» можно оставить без изменений (по умолчанию будет выполняться общеклассовый метод с предустановленным кодом)

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

$status=$this->getProperty("status");
if ($status) {
 $this->callMethod('turnOff');
} else {
 $this->callMethod('turnOn');
}
ОДНАКО я все же написал бы туда свой код

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

file_get_contents("http://192.168.0.14/sec/?cmd=7:2");
$state =file_get_contents("http://192.168.0.14/sec/?pt=7&cmd=get");
$state = substr($state,0,2);
if ($state == "ON") {
 setGlobal('Relay_014-07.status', 1);
} else {
 setGlobal('Relay_014-07.status', 0);
}
3. Создаем объект на сцене типа «Выключатель». В поле «Связанный объект» выставляем «Relay_014-07».

4. В модуле MegaD у Меги на вкладке «Данные» у порта «0 Input» в поле «Связанный объект» выставляем «Button_014-00». В поле «Метод» выставляем «statusChanged».
Также я проставляю галку в поле «Skip default action», потому что не хочу, чтобы сервер запускал выполнение действия по умолчанию. Пусть действие по умолчанию выполняет сама Мега, когда сервер недоступен.

5. Возвращаемся к объекту «Button_014-00» и настраиваем его метод «statusChanged». Пишем туда код PHP

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

callMethod('Relay_014-07.switch');
(«Выполнять родительский метод» выставляем «никогда».)

Все. Круг замкнулся. Теперь наша лампочка на потолке может включаться/выключаться Мажордомо как «железным» выключателем (кнопкой), так и выключателем на сцене.

Написал все это без возможности повторить на своем стенде, так что если вдруг где-то ошибся в коде, прошу меня простить. Но общая схема, думаю, понятна.

Еще остается один момент, который стоит упомянуть. Наша лампочка может быть включена и без участия Мажордомо (самой Мегой путем выполнения сценария по умолчанию, из web-интерфейса Меги, командой из браузера и пр.). И после того, как мы включили Мажордомо, между состоянием выключателя на сцене и реальным состоянием лампочки может быть рассогласование. Конечно, при первом клике по выключателю («железному» или на сцене) синхронизация состояний восстановится.
Однако, можно принудительно проводить «сверку» состояний путем запуска скрипта в цикле, например, раз в 15 минут). Назовем скрипт «proverka».

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

$state =file_get_contents("http://192.168.0.14/sec/?pt=7&cmd=get");
$state = substr($state,0,2);
if ($state == "ON") {
 setGlobal('Relay_014-07.status', 1);
} else {
 setGlobal('Relay_014-07.status', 0);
}
setTimeOut('myTimer_proverka,'runScript("proverka ");',60*15);
А чтобы этот скрипт запустился после старта Мажордомо, можно записать в «Timer-> onNewMinute»

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

if ($m%15 == 0) {runScript("proverka");} 
Также отмечу, что сам – абсолютный ноль в программировании, о чем мой ник «Chainik» красноречиво свидетельствует.
И напоследок, хочу поблагодарить автора Мажордомо Сергея за такой замечательный гибкий инструмент, в котором большинство вещей можно сделать большим количеством разнообразных способов. А лучший способ тот – который ты понимаешь :)

Еще на ab-log появилась тема (https://ab-log.ru/forum/viewtopic.php?f=1&t=1328), где подробно показано, как можно произвести настройку освещения. Особенно рекомендую посмотреть, что написано в конце длинного первого поста после подзаголовка "ДОПОЛНЕНИЕ". Там все реализовано более или менее в соответствии с идеологией Мажордомо.
Последний раз редактировалось Chainik Сб окт 28, 2017 11:01 pm, всего редактировалось 3 раза.
За это сообщение автора Chainik поблагодарили (всего 3):
Zavoolon (Пт янв 27, 2017 12:26 pm) • Pooh (Вс янв 29, 2017 7:22 am) • avacs (Чт фев 16, 2017 4:37 pm)
Рейтинг: 3.49%
Pooh
Сообщения: 74
Зарегистрирован: Вт дек 31, 2013 2:03 pm
Откуда: Самара
Благодарил (а): 25 раз
Поблагодарили: 5 раз

Re: Модуль "MegaD"

Сообщение Pooh » Чт янв 26, 2017 9:27 am

sergejey писал(а):
Pooh писал(а):А их (14 и 15) по-другому никак и не настроишь
То, что пресетов больше нет, не знал. Как теперь отличить какой тип модуля подключен? Например, 7I7O или 14IN или 14R или MegaD-2561. Я довольно давно изучал API MegaD, так что если кто подскажет, как это лучше решить, то сразу реализую. Может быть есть какой-то более простой способ однозначно определять в каком режиме используется порт?
Кроме преображения ADC6 и ADC7 пропала температура и появились "Текущее значение 2", "Связанный объект 2" и "Связанное св-во 2"
Что это и что с этим делать?
Я вот этот комментарий не очень понял. или мелось в виду ADC14 и ADC15?
Наверное проще вручную указать какой девайс используется (7I7O или 14IN или 14R или MegaD-2561)
Насчет "Текущее значение 2", "Связанный объект 2" и "Связанное св-во 2" имелось ввиду:
СпойлерПоказать
Screenshot_3.png
Screenshot_3.png (24.97 КБ) 9970 просмотров
Ответить