Структура MajorDoMo

структура

Структура MajorDoMo просто о «сложном».

У многих начинающих не получается подружиться с MajorDoMo, ввиду того что эта система, на первый взгляд, кажется им довольно сложной.На самом же деле структура MajorDoMo очень проста. Вся ее «сложность» это не более чем дублирование мест хранения кода, реализованное исключительно для удобства.

Давайте попробуем взглянуть на это поближе. Все что мы делаем реализуется, по большей части, с помощью PHP кода. Он, в свою очередь, состоит как из базовых функций, так и небольшого количества собственных команд MajorDoMo.

Для удобства понимания и реализации, размещать код можно в разных местах. Для понимания, я приведу простой пример такого подхода. Допустим, мы имеем необходимость выполнить некий абсолютно одинаковый код, и по нажатию кнопки в меню, и по голосовой команде. Мы можем прописать этот код непосредственно и в кнопку меню, и в голосовую команду. Громоздко не правда ли? А можем положить его в сценарий и далее уже вызывать этот сценарий абсолютно из любого места одной единственной строчкой. Вот, по сути, и весь секрет этой кажущейся сложности. 🙂

Отсюда простая формула. Если, какой то, код планируется выполнить из одного места, то прописываем его непосредственно там откуда и будем выполнять. Если же доступ к нему нужен, как минимум, из двух мест стоит уже задуматься о сценарии.

Где же эти самые места для кода?

  • Ну конечно же это Сценарии. (Меню администрирования/ОБЪЕКТЫ/Сценарии).
  • Методы (Меню администрирования/ОБЪЕКТЫ/Объекты), этого я подробно коснусь позже.
  • Меню (Меню администрирования/ОБЪЕКТЫ/Меню управления).
  • Голосовое управление (Меню администрирования/ОБЪЕКТЫ/Шаблоны поведения).
  • Визуальное управление на плане здания (Меню администрирования/ОБЪЕКТЫ/Сцены).
  • Выдергивание данных с Веб страниц (Парсинг) (Меню администрирования/ОБЪЕКТЫ/Веб-переменные).

Собственно, по большей части, этим все и ограничивается. Все остальное интуитивно понятно и схватывается на лету.

Сценарии.

Со Сценариями все понятно. В них мы прописываем код который хотим исполнять из разных мест.

Меню, Голосовое управление и Сцены.

В них мы записываем те самые заветные индикаторы, кнопочки, выключатели, регуляторы…

В них могут быть записаны:

  1. Весь код.
  2. Непосредственный переход в сценарий (путем выбора, заранее заготовленного, сценария из списка).
  3. Смешанный тип (например, когда отрабатываем кусочек кода непосредственно в кнопочке, например ее индикацию, потом переходим в сценарий и выполняем то что прописано в нем).

Парсинг.

По большей части, парсинг здесь это выдергивание данных с чужих страниц представленных в сети, путем задания начала и конца необходимого куска текста. PHP здесь выполняет скорее вспомогательную роль и применяется относительно редко.

Вот пример. Допустим, нужно с сайта, условно «Синоптик», получать температуру. Специальными символами мы указываем начало и конец нужного нам кусочка текста (пусть это будет цифра текущей температуры). Далее, с определенной, заданной нами, периодичностью эта циферка считывается и записывается в свойство. О свойствах чуток позже. Пока же, просто, знайте что считанная цифра хранится у нас в определенном месте, пока не произойдет ее изменение. Как только оно произойдет, цифра изменится и в этом месте (свойстве). Параметр (цифру температуры) записанную в свойстве мы необходимым нам образом обрабатываем. Допустим, для меню, дописываем перед выводимой цифрой слова: «На улице:» а после  «° С» .

Вот как это выглядит в коде: На улице: %ThisComputer.Sinoptik_temp%°C

На улице: и °C это просто текст.

А: ThisComputer.Sinoptik_temp как раз и есть наше свойство, где ThisComputer это класс, а Sinoptik_temp это свойство этого класса, а точка применяется в качестве разделителя. Прочтя чуть ниже все это поймете. Ах да % это ограничители для меню, в коде как правило применяются кавычки.

В результате у нас в меню, мы видим всегда актуальную температуру с сайта.

Объекты.

Ну и наконец, у нас остаются объекты, то самое место где лежат наши свойства и не только. Объекты тоже, на первый взгляд, кажутся сложной вещью. Но это только на первый взгляд. 🙂

Объект это представление чего бы то ни было, например: компьютер(как в примере выше), или будильник, или таймер, или даже Скайп… В общем, что угодно.

Идентичных объектов может быть множество. Ну например. Помните когда я писал как мне видится система, я говорил что у нас будет метеостанция с домашним и уличным блоками. Так вот, оба блока собираются на абсолютно одинаковых модулях ESP-12. Каждый из них это объект, а их совокупность это Класс. Здесь все, так же, делается для удобства и исключения лишней писанины, поймете дальше.

Структура здесь следующая:

1. Класс идентичных устройств, давайте условно назовем его ESP (раз мы взяли за пример модули ESP).

1.1. Этому классу можно задать свойства (если по простому, задавая в классе ESP свойство температура оно у нас автоматически появится во всех объектах класса ESP, т. е. не нужно будет создавать свойство, каждому объекту).

1.2 Этому классу, так же, можно задать и методы (т.е. выполнение некоего кода, эти методы аналогично свойствам отобразятся во всех наших объектах).

1.3. Ну и наконец, естественно, в классе есть объекты. Это уже, непосредственно, наши физические ESP: ESP-12 №1, ESP-12 №2 и т.д.

Каждый объект (ESP-12 №1, ESP-12 №2 и т.д.), в свою очередь, имеет свои собственные свойства и методы.

Свойства бывают двух видов Свойства класса и Свойства объекта их разница заключается в том что свойства прописанные в классе автоматически появляются во всех новых объектах, а свойства добавленные в объекте есть только в нем. Делается это для того чтобы, с одной стороны, избавиться от лишней писанины, а с другой обеспечить индивидуальные свойства. Методы создаются только в классе, и прописываются уже только в объекте.

Я поясню на примере:

Допустим у нас есть ESP-12 №1 и ESP-12 №2. Нам нужно мерить на обоих температуру, но помимо этого на первом нужно еще мерить влажность, а с помощью второго управлять реле.

Делаем класс ESP, в нем прописываем свойство  Температура. Оно автоматически появятся в свойствах как ESP-12 №1 так ESP-12 №2. Далее непосредственно, для ESP-12 №1, уже в его свойствах, прописываем Влажность. В свойствах же, ESP-12 №2 прописываем Реле. В результате имеем ESP-12 №1 со свойствами в которых система нам запишет значения температуры и влажности и ESP-12 №2 со свойствами в которых система нам запишет значение температуры и статус реле(0- Выкл, 1-Вкл). Ну и соответственно, методы которые помогут нам эти самые данные обрабатывать, если в этом будет какая то необходимость, заведем в классе ESP, а код в них будем уже прописывать персонально для каждого объекта.

Следует отметить что методы  могут быть вызваны откуда угодно callMethod(«Object.Method», $params); или альтернатива cm cm(«Object.Method», $params);. Свойства так же глобальны и могут вызываться из любого места. Функции sg(setGlobal) и gg (getGlobal) как раз этим и занимаются. Например строчка: getURL(gg(‘AlarmOne.UrlAlarmRing’),0);  откроет ссылку которая хранится в свойстве AlarmOne.UrlAlarmRing

Вот теперь уже точно, у Вас есть все чтобы осознать как устроен MajorDoMo.

Давайте закрепим это на конкретном примере:

Мы прошили прошивкой от wifi-iot.com наши модули ESP-12 №1 и №2. Первый из которых считывает температуру и влажность, а второй, считывает температуру и управляет реле. Обе ESP-12 с определенной периодичностью посылают данные на MajorDoMo, где их принимает некий сценарий, который раскладывает полученные данные по свойствам. Ну и наконец, мы берем эти данные из свойств и пользуемся ими уже на свое усмотрение, т. е. вставляем необходимое свойство уже там где его нужно вывести или применить.

Например, берем уличную и комнатную температуры, обрабатываем их в неком сценарии, тем самым получаем умный термостат.

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

А по утру метод который запускается из объекта Будильник, запустит нам сценарий, который после того как мы окончательно проснулись и отключили мелодию, голосом прочтет нам текущую сводку погоды. И как вы думаете откуда он возьмет цифры температур и влажности? Точно, из свойств!

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

Что дальше?

Ну, а теперь когда вы уже понимаете структуру MajorDoMo, я расскажу вам про HDMI матрицу, где мы с вами уже увидим взаимодействие устройств в MajorDoMo. Ну и наконец то, я уже перейду к более серьезному изложению, с кодом, картинками, схемами и прочими прелестями… В общем, достаточно уже голой теории, теперь по большей части будет практика.

Итак, HDMI 4×2 matrix 4K x 2K 3D.

От Ovcher