Chainik писал(а):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
(«Выполнять родительский метод» выставляем «никогда».)
Все. Круг замкнулся. Теперь наша лампочка на потолке может включаться/выключаться Мажордомо как «железным» выключателем (кнопкой), так и выключателем на сцене.
Написал все это без возможности повторить на своем стенде, так что если вдруг где-то ошибся в коде, прошу меня простить. Но общая схема, думаю, понятна.
Еще остается один момент, который стоит упомянуть. Наша лампочка может быть включена и без участия Мажордомо (самой Мегой путем выполнения сценария по умолчанию, из 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»
Также отмечу, что сам – абсолютный ноль в программировании, о чем мой ник «Chainik» красноречиво свидетельствует.
И напоследок, хочу поблагодарить автора Мажордомо Сергея за такой замечательный гибкий инструмент, в котором большинство вещей можно сделать большим количеством разнообразных способов. А лучший способ тот – который ты понимаешь
