Majordomo запуск функции по времени. Встроенные функции

В поле зрения нашей редакции некоторое время назад попала деятельность так называемого некоммерческого партнёрства "Вологодская Ассоциация ТСЖ (ЖСК) и Собственников Жилья".

Как говорят руководители Ассоциации ТСЖ Целями создания и деятельности Некоммерческого партнёрства "Вологодская Ассоциация ТСЖ (ЖСК) и Собственников Жилья" являются формирования системы координации, взаимного информирования и взаимодействия собственников жилья, а также представления и защиты их интересов в органах государственной власти, местного самоуправления, судебных органах.


На деле же, впрочем, как и в большинстве случаев, всё не так однозначно.

Согласно открытым данным, учредителями НП "Вологодская Ассоциация ТСЖ (ЖСК) и Собственников Жилья" являются 2 физических лица: Сухих Артём Владимирович и Иванов Николай Леонидович.


А ещё Ассоциация ТСЖ занимается и политикой, продвигает своих кандидатов на выборах затрачивая средства.

Данные лица уже не первый год агитируют собственников недвижимости переходить на самоуправление своей недвижимостью. Основной целью учредителей Ассоциации ТСЖ являются многоквартирные дома, в которых собственники недвижимости (квартир) грезят о создании собственного товарищества.

Первоначально, Ассоциация ТСЖ предлагает собственникам вою помощь при оформлении документов, необходимых для регистрации ТСЖ. Членами правления таких ТСЖ, как правило, выступают далёкие от сферы ЖКХ и управления многоквартирными домами лица, которые в силу своей материальной заинтересованности становятся полностью подконтрольными Ассоциации ТСЖ.

Результат такого сотрудничества всегда один: несамостоятельность ТСЖ в выборе контрагентов, проведение работ по завышенным ценам, вывод денежных средств, направленных на ремонт и содержания жилья подконтрольным Ассоциации ТСЖ организациям.

Схема НП"Ассоциации ТСЖ"

Что известно о данных организациях?

1. ООО УК "Сокол".

Генеральный директор и единственный учредитель организации — Баженов Александр Николаевич. Юридический адрес: г. Вологда ул. Мира, д. 17 оф. 211. По информации из открытых источников данный адрес является местом регистрации еще шести организаций, части из которых находятся в процессе ликвидации.

Представителем ООО"Сокол" является Сухих Артем Владимирович по доверенности выданной на десять лет, тот самый Сухих А.В. который совместно с Ивановым является соучредителем Ассоциации ТСЖ.

В апреле 2019 года в наш адрес поступила информация о жалобах жильцов дома №9 по улице Лаврова города Вологды на незаконный захват дома под управление ООО УК "Сокол".

Ранее в данном многоквартирном доме инициативными гражданами было создано ТСЖ, которое управляло многоквартирными домом.

Как только ООО УК "Сокол" приступило к управлению, собственники прочувствовали как говорится на себе. В результате промывки теплообменника в воду поставляемую жильцам дома попал теплоноситель, в результате чего вода окрасилась в зеленый цвет. У половины дома по сей день отсутствует горячая вода. Трубы в подвале постоянно текут. ООО УК " Сокол" не предпринимает никаких действий для того чтобы вернуть горячую воду в квартиры собственников, а также не предпринимает мер по ремонту или замене теплообменника. Уборка мест общего пользования дома низкого качества, а порой и вообще не производится. Единственное что своевременно и качественно делает ООО УК "Сокол"это раскидывает квитанции на оплату услуг по почтовым ящикам, а Сухих Артем ходит по собственникам и требует оплаты. Люди возмущены тем, что с них требуют оплату за фактически не выполненные работы.

Кроме того, ООО УК " Сокол" предпринимает попытки вывода денежных средств, якобы на ремонт одного из лифтов дома, хотя по результатам технического освидетельствования есть заключение о том, что лифт находится в надлежащем состоянии и ремонта не требует.

На данный момент ненадлежащее управление домом №9 по ул. Лаврова г. Вологда подтверждено актом проверки, проведенной в отношении ООО УК "Сокол" 28 июня 2019 года Департаментом городского хозяйства Администрации города Вологды ООО УК "Сокол" выдано предписание об устранении нарушений лицензионных требований, предъявляемых к управляющим организациям.

Становится непонятным, почему "Некоммерческое" партнёрство Ассоциации ТСЖ, целью которого является помощь жильцам в создании ТСЖ, действует в обратном направлении, уводя дома из ТСЖ в подконтрольные организации, которой является ООО УК "Сокол".

Руководителем ООО УК "Сокол" является директор Баженов Александр, подконтрольны Иванову Н. и Сухих А.

Следует отметить, что благодаря неравнодушным жильцам решение собственников о выборе ООО УК " Сокол" было признано Вологодским городским судом незаконным и отменено полностью.

2. ООО "СУ-35"

Участниками ООО "СУ -35" являются Бородий Ульяна Павловна и Добреля Максим Алексеевич. С последним Сухих Артем находится в постоянных деловых отношениях.

На данный момент, решением арбитражного суда Вологодской области ООО "СУ-35" признано несостоятельным (банкротом), открыта процедура конкурсного производства.

Первоначально, 10 апреля 2017 года между Сухих А.В. и ООО "СУ-35" был заключен трудовой договор, согласно которому Сухих принял на себя исполнение трудовых обязанностей заместителя директора по правовым вопросам.

Затем, после введения в отношении ООО "СУ-35" процедуры наблюдения Сухих совместно с руководством ООО "Су-35" ПРЕДПРИНЯЛ ПОПЫТКУ ВЫВОДА ДЕНЕЖНЫХ СРЕДСТВ РАСЧЕТНЫХ СЧЕТОВ. Для реализации этой попытки, без согласия временного управляющего, между ООО "СУ-35" и Сухих было заключено соглашение об изменении существующих условий договора.

Фактически, к ранее согласованному размеру ежемесячного оклада в размере 30000 рублей 00 копеек, сверх указанных выплат, за те же обязанности, которые были возложены на Сухих А.В. трудовым договором, сторонами было согласованно повышение заработной платы на 270 500 рублей ежемесячно. (811 500 рублей за период с 28.04.2018 г. по 17.07.2018 г.)

Для того, чтобы вывод денежных средств выглядел законно, 20 ноября 2018 года Сухих А.В. подал исковое заявление о взыскании с ООО "СУ-35" задолженности по заработной плате в размере 1 082 229 рублей 99 коп. Однако, Вологодский городской суд удовлетворил требования Сухих А.В. лишь частично, взыскав с ООО" СУ-35" задолженность в размере 70 117 рублей 46 копеек.

Позже, Арбитражным судом Вологодской области соглашение об изменении существующих условий трудового договора было признано недействительным. Определение суда было установлено недобросовестное поведение Сухих А.В. , выразившееся в заключении Соглашения в условиях установленного судом факта несостоятельности (банкротства) ООО "СУ-35" (в процедуре наблюдения), и согласовании условий о повышении заработной платы на выполнение за выполнение трудовых обязанностей возложенных ранее на Сухих по Трудовому договору, свидетельствующее о наличии признаков ничтожности сделки, установленных статьей 10 Гражданского кодекса РФ (сделка, совершенная в обход закона с целью причинения вреда)

3. ООО "Метпром"

Директором ООО "Метропром" является Сухих Артем Владимирович. На данный момент ООО "Метрпром" ликвидировано по решению Федеральной налоговой службы. В реестре юридических лиц в отношении ООО "Метпром" содержатся сведения о недостоверности данных об адресе юридического лица.

Недостоверность юридического адреса является одним из признаков организации "однодневки"

Что известно ещё о Сухих Артёме Владимировиче?


Являясь учредителем и юристом НП "Ассоциация ТСЖ" Сухих оказывает юридические услуги товариществам собственников жилья.

Как нам стало известно, с ТСЖ по адресу г. Вологда, Технический переулок, д. 56 у ассоциации ТСЖ в лице Сухих А.В. был заключен договор по оказанию услуг по взысканию задолженности с собственников недвижимости, задолжавших за услуги по ремонту и содержанию с нежилого помещения. Стоимость такой услуги была оценена в двадцать тысяч рублей. (по сравнению с рыночной завышена в 10 раз)однако по признанию Председателя ТСЖ услуги по взысканию задолженности оказаны не были по надуманной Сухих А.В., причине. Попытки вернуть деньги успехом не увенчались, поскольку председатель Ассоциации ТСЖ Иванов Николай всячески отрицал свою связь с Сухих, хотя на деле связь очевидна, так как Сухих является соучредителем Ассоциации. Деньги председателю так и не вернули.

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

В декабре 2016 года Сухих А.В. от имени ТСЖ подал исковое заявление к одному из застройщиков о взыскании стоимости работ, необходимых для устранения недостатков, допущенных при постройке дома. В декабре 2018 года Арбитражным судом вологодской области в удовлетворении исковых требований было отказано в полном объеме. в своем решении суд указал следующее:

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

Итог такого иска оказался для ТСЖ печальным. Поверив в обещания Ассоциации ТСЖ и надеясь на высокую квалификацию Сухих А.В. ТСЖ взамен денежных средств на устранение строительных недостатков получило лишь судебные расходы в виде государственной пошлины в размере 43 003 руб., огромные расходы на проведение строительной экспертизы, стоимость которой превышала 100 000 рублей, расходы на оплату услуг "высококлассного специалиста" Сухих А.В., а также двухлетнюю судебную тяжбу с заранее известным результатом. В результате обогатилось лишь "Некоммерческое партнёрство "Ассоциации ТСЖ"

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

Результат работы Ассоциации ТСЖ предсказуем и весьма печален. Собственники получают мнимую независимость и мнимую власть над своим имуществом, а Ассоциация ТСЖ и подконтрольные ей организации обогащаются за счет собственников жилья. Ответственность за все действия при этом, в силу действующего законодательства, лежит на самом ТСЖ, а ассоциация при этом ответственности за свои действия не несет ни в каком объеме.

Продолжение следует.

say($ph,$level) -- говорит фразу (использует глобальные переменные $voicemode [именно говорить] и $commandLine [преобразует ответ в echo utf2win(), иначе просто echo]). $level указывает уровень важности фразы (в зависимости от текущих настроек минимального уровня произношения, фраза может быть либо озвучена голосом либо просто записана в историю сообщений).

processCommand($command) -- отправляет текстовую команду на исполнение (например, "скажи сколько время"). Сами команды настраиваются методе ThisComputer->commandReceived.

getGlobal($varname); -- получения значения глобального свойства

setGlobal($varname,$value); -- установка глобального свойства

processLine($line); -- запуск скрипта синхронизации

getRandomLine($filename); -- взятие случайной строки из текстового файла. $filename может быть сокращённым, например file1 и тогда будет браться файл./texts/file1.txt

playSound($filename); -- проигрывание файла (mp3,wav,etc.). $filename может быть сокращённым, например file1 и тогда будет браться файл./sounds/file1.mp3

playMedia($path); -- играть музыку из каталога $path. Пример

runScript($id,$data); -- выполняет скрипт с заданным id. В качестве id может использоваться имя

getLogger($context = null); -- возвращает объект логера. Примеры использования логера

Работа с объектами

$obj=getObject($name); -- получает объект по имени $name. с полученным объектом можно работать используя следующие методы:
$obj->callMethod("method_name",$params);
$obj->setProperty("property_name",$value);
$obj->getProperty("property_name");

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

$command="Сколько время"; callMethod("ThisComputer.commandReceived",array("command"=>$command));

cm

$value=getGlobal("Object.Property"); -- получения значения свойства объекта

gg -- альтернативное имя предыдущей функции

setGlobal("Object.Property",$value); -- установка значения свойства объекта

sg -- альтернативное имя предыдущей функции

$objects=getObjectsByClass("class_name"); -- возвращает массив объектов указанного класса в виде название.Пример перебора объектов в цикле и установки значения свойств: $objects=getObjectsByClass("class_name"); foreach($objects as $obj) { setGlobal($obj["TITLE"].".property_name",1); }

Время/интервалы

time() -- возвращает текущее время в формате timestamp.

timeConvert($tm) -- конвертирует время из hh:mm в формат time() на сегодняшнее число

timeNow($tm) -- возвращает в текстовом виде время типа "16 часов 40 минут". Если $tm не задан, то возвращает текущее время. $tm в формате time.

isWeekEnd() -- выходной да/нет = 1/0 isWeekDay() -- будний день да/нет = 1/0

timeIs($tm) -- проверяет совпадает ли текущее время с передаваемым в формате hh:mm

timeBefore($tm) -- сравнивает время $tm (hh:mm) и текущее. Если текущее меньше, то 1 иначе 0

timeAfter($tm) -- сравнивает время $tm (hh:mm) и текущее. Если текущее больше, то 1 иначе 0

timeBetween($tm1, $tm2) -- проверяет входит ли текущее время в заданный интервал (каждое hh:mm, причем $tm1 может быть больше чем $tm2, например 23:00 05:00)

recognizeTime($text) -- функция пытается из фразы извлечь конкретное время/дату. Например $text может быть "завтра в 9:30" или "через 5 минут"

При вызове любого метода (но не сценария!) доступны переменные:

$prevRun -- время последнего вызова (в формате timestamp)

$prevRunPassed -- сколько секунд прошло с последнего вызова

$this -- Указатель на себя. Используется в методах классов. Например:

$this->setProperty("status",1); // устанавливает свойство status в 1, объекту для которого вызван

Запланированные задачи и события

AddScheduledJob("title","commands",$datetime, $expire=60); -- $expire в секундах

ClearScheduledJob("title"); -- может использоваться маска типа "title%"

SetTimeOut("title","commands", $timeout); -- $timeout в секундах (аналог AddScheduledJob("title","commands",time()+$timeout));

ClearTimeOut("title"); -- аналог ClearScheduledJob("title");

timeOutExists("title"); -- возвращает идентификатор запланированной задачи (или 0, в случае отсутствия)

registerEvent($eventName, $details="",$expire_in=365); -- регистрация события $eventName

registeredEventTime($eventName); -- возвращает время последней регистрации события $eventName (-1 если еще не было такого события)

Отправка почты

SendMail($from, $to, $subject, $body); -- отправляет электронное письмо на указанный в $to адрес

SendMail_html($from, $to, $subject, $body); -- аналогично предыдущей функции, но тело письма предполагается в формате HTML

Выскажу свое мнение о продукте может кому-то будет полезно.
Специалистам в первую очередь интеграторам наверно MajorDoMo будет не интересен, пока нет ни нормального коробочного продукта, ни нормальной тех документации, ни поддержки 7\24 ни дилерской сети ни бонусов.

Самостройшикам тоже мало вероятно что он будет интересен, глобальных отличий от скажем OpenHab или ioBroker нет.

А вот тем кто только собирается строить систему умного дома, и хочет понять чего все таки он хочет и что может умный дом наверное есть смысл повозится с системой некоторое время. Лично я уже несколько десятков знакомых подсадил на MajorDoMo.

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

Потом завожу гостей в дом и опять же голосом прошу умный дом рассказать о себе. (у меня такой демо режим настроен). УД начинает включат выключать свет, говорит прогноз погоды, включает переключает телеки, сплиты ну и еще с десяток разных понтов.

После ответа на вопрос сколько это стоит? бесплатно. Считай что клиент созрел.

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

Голосом ставить на компьютере будильник с проигрыванием при срабатывании музыки или радио
Голосом управлять медиаплеером на компе
Организовать видео наблюдение с помощью любого смартфона или планшета
Следить за передвижение и нахождением например детей по gps
Голосом управлять онлай радиостанциями на компе
Получите умный список покупок
Голосом слушать прогноз погоду на компе
Голосом задавать вопросы и получать ответы из вики
Голосом добавлять и удалять задачи из ежедневника.
Голосовые напоминания.
Голосом получать текущий курс валют по запросу
Зачитывать голосом поступающие смс
Удаленно выключать комп
Следить за зарядом батареи на смартфоне и получать сообщения о критическом снижении заряда
Голосом слушать заголовки новостей или сами новости и анотации к фильмам

Блин надоело писать, ну там еще много чего...

И все это не написан ни строки кода (весь код выложен под видео)

Последние год-полтора к нам стучится все больше интеграторов и людей из строительной сферы с просьбой научить работать с софтом и "делать Умный дом".
На текущий момент уже несколько десятков интеграторов (по всему СНГ) реализует Умные дома на Majordomo. Мы им ничего не платим (ни бонусов, ни дилерских скидок) - все верно. НО и их клиентам не нужно платить за софт. И с помощью Majordomo использовать более бюджетное оборудование.
Все это сильно удешевляет конечную стоимость для клиентов

По документации - сделали базу знаний, потиху наполяем

По Openhab/ioBroker vs Majordomo - я знаю немало кейсов когда ребята переходили с Openhab/ioBroker на нас - по той же самой причине: разницы сильной нет, а русскоязычных пользователей намного больше, и есть с кем пообщаться

У многих начинающих не получается подружиться с 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 .

    Сразу скажу, я максимально, на сколько могу, стараюсь сужать картинки чтобы их можно было рассмотреть даже на смартфоне в страничной ориентации, но не всегда это получается 🙁 . Если вы видите что текст комментариев вылазит за границы, просто, поверните смартфон на бок (Альбомная ориентация), смартфоны, они разные бывают.

    Анализируя свой блог я столкнулся с несколькими поисковыми запросами, типа: — Где находится файл menu.html или scenes.html и т.п.
    Ответы на подобные вопросы очень просты, чтобы посвящать им отдельный блог. Поэтому отвечу на них в комментариях.
    По умолчанию, все файлы формирующие внешний вид терминала находятся в папке: /templates если же у вас уже натянут сторонний скин то эти файлы следует искать в папке /templates_alt. У папки /templates_alt более высокий приоритет чем у /templates и все что в ней находится отрабатывается в первую очередь. Если же в ней чего то не достает, то движок обращается за недостающим в папку /templates. Ну и, наверное, исходя из выше сказанного, стоит отметить, что если вы собираетесь натянуть на MajorDoMo свой собственный темплейт (скин), стоит создать папку /templates_alt (если она еще не создана) и все эксперименты производить в ней. Это убережет вас от потери чего бы то ни было, полученного вами по умолчанию, в случае какой либо неудачи.

    Был и такой запрос: -MajorDoMo не принимает данные…
    MajorDoMo принимает данные, как правило, путем выполнения некоего сценария, который либо получает эти данные либо считывает их, и далее сценарий помещает их в приготовленные вами для этого свойства, откуда впоследствии необходимые вам данные считываются и используются. Запускаются эти сценарии, как правило; Либо извне, со стороны стороннего сервера (ну допустим как в случае с ESP8266, который отправляя данные запускает сценарий espdata ), так мы получаем данные (кстати, в ближайшее время, я подробнее все это расскажу в своей статье про метеостанцию). Либо по таймеру, чтобы считать данные от куда либо. Есть уже готовые механизмы, например, подобный встроен в Веб-переменные, которые опрашивают целевую страницу, с определенной периодичностью. В описываемом случае периодичность задается в поле Интервал проверки , конкретной веб-переменной. Например, таким образом мы получаем время восхода и захода солнца. Веб-переменная забирает значение времени с какого нибудь метеосайта, записывает его в свойство, ну а далее, уже в методе, мы производим обработку(проще говоря, сверяем текущее время с временем захода солнца), в результате которой Алиса, точно в нужное время, говорит нам — Солнце заходит. и при необходимости выполняет какие либо действия, ну или 🙂 запускает нужный нам сценарий.
    Так вот, если MajorDoMo не принимает какие то данные в первую очередь стоит отыскать сценарий или источник(допустим как в случае в веб-переменной) который за это отвечает и проверить его работоспособность. Для этого предусмотрены все механизмы, от элементарного запуска сценария, прямо из его настроек, путем перехода по прописанной на страничке его настроек ссылке и до анализа логов как например это имеется в веб-переменных.

    Ну и наконец третий запрос который я увидел: -MajorDoMo простые объекты
    Тут стоит отметить, что запрос был построен немножко некорректно. Несмотря на то что объектом может быть все что угодно, с недавнего времени в систему введено дополнительное понятие: Простые Устройства . Это было сделано для облегчения жизни новичкам. Честно говоря, я этим пока не пользовался, ввиду того, что работаю, как раз, на уровне тех самых объектов. Но вот направить человечка на путь истинный: (Простые Устройства) мог бы, буквально, за секунды. Так что, не стесняйтесь, регистрируйтесь и спрашивайте в комментариях. В любом случае я их рассматриваю гораздо чаще чем анализирую поисковые запросы.

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

    Запрос: Как записать значение в свойство?
    Ответ: Значение в свойство в большинстве случаев пишется автоматически, впрочем можно и вручную. Прочтите статью про Розетку Broadlink SP3 и у вас больше никогда не возникнут подобные вопросы.

    Запрос: MajorDoMo, веб переменные температура?
    Ответ: Веб переменным, наверное будет посвящена отдельная статья, чтобы дать понятие о самом, на первый взгляд, сложном, что там имеется, а именно, о фильтровании. Пока же конкретный ответ на конкретный вопрос.
    Будем брать текущую температуру с сайта Синоптик ввиду его стабильности и постоянства.
    Создаем Веб переменную с Именем: Sinoptik_temp
    В Ссылку записываем: https://sinoptik.com.ru/погода-волгоград В вашем случае волгоград меняем на ваш город.
    В Шаблон поиска:

    Связанный объект: This Compuer
    Свойство: Sinoptik_temp это свойство нужно создать в объекте This Compuer (читайте эту статью и статью про розетку SP3).
    Интервал проверки: 600
    Вот, собственно и все, теперь каждые 10 минут Мжор будет считывать, с Синоптика, текущую температуру в вашем городе, и записывать ее в свойство Sinoptik_temp, с которым вы сможете делать все что Вам угодно, отображать использовать в сценариях и т.д…

    Запрос: MajorDoMo, солнце заходит?
    Ответ: В MajorDoMo, существуют два режима, А именно, Ночной режим и режим Темное время суток. Ночной режим, включается по часам, по дефолту с 20:00 и до 8:00. Этот режим очень удобен, например, для отключения голосового оповещения. Режим, Темное время суток, включается по заходу и выключается по восходу солнца, данный режим удобен, например, для управления уличным освещением. Данные, для конкретной местности, получают путем применения Веб переменных. Которые в последствии хранятся в свойствах ThisComputer.SunRiseTime и ThisComputer.SunSetTime и обрабатываются в методе onNewMinute класса Timer.

    Запрос: MajorDoMo глобальные переменные?
    Ответ: Функции gg (getGlobal) и sg(setGlobal) говорят сами за себя, ну, а наши свойства, ввиду того что им свойственно меняться и есть эти самые глобальные переменные. Допустим мы имеем некий сценарий и нам нужно что то сделать со свойством, ну допустим, изменить пороговую температуру термостата. С помощью функции getGlobal мы забираем значение свойства в свой сценарий и записываем его в локальную переменную, пусть это будет: $temp_term. С этой локальной переменной, в нашем сценарии, мы уже, делаем, нужные нам преобразования, и наконец, записываем измененное состояние $temp_term, с помощью функции setGlobal, обратно в свойство. Ну, а со свойством, как мы уже знаем, мы можем поступать как нам угодно. Например, отобразить его значение на экране, отправить его в физический термостат, ну или, даже проговорить через динамики системы… Кстати, говоря о глобальных переменных, стоит отметить и встроенные функции системы. Надо помнить, что есть некий набор функций и переменных которые реализованы, чисто, для системы. Помните, я упоминал, что по большей части мы работаем с PHP, но есть и нечто встроенное? Посмотреть встроенные функции можно . И когда будете смотреть, обратите внимание на пункт «Управление циклами (сервисами)», там вы, как раз, и столкнетесь со встроенной глобальной переменной и поймете что методика везде одна и та же.

    Запрос: MajorDoMo html блок использовать значение из переменной?
    Ответ: Я делаю, например, так: На улице: %ESP8266003b5df7.dhtt1%°C (т.е. пишу символ ° с клавиатуры) и тогда раскладка до балды. Символ градус ставиться ALT+0176, цифры набираем на цифровой части клавиатуры (ССЫЛКА НА ВИКЕПЕДИЮ) .
    Некоторые делают, например, так:
    %KitchenMain.dhtt1%&dеg;C и тогда нужно ставить C исключительно в английской раскладке. Лично я не пробовал, но об этом говорилось: (ССЫЛКА НА ФОРУМ) .
    Внимание! Если кто надумает скопи-пастиь: %KitchenMain.dhtt1%&dеg;C имейте ввиду, чтобы оно здесь, в блоге, отображалось не как символ градуса, а как &dе g; я в коде символа заменил английскую букву е на русскую, не забудьте поменять обратно!
    Ну и так дале… Бла, бла, бла: %ОБЪЕКТ.СВОЙСТВО% бла, бла, бла. Бла, бла, бла на любом языке хоть на китайском.
    Если нужно, например отобразить влажность то делаем так: %ESP8266003b5df7.dhth1%% второй значок % будет просто символом.

    Запрос: Чтобы сценарий majordomo выполнялся каждый час?
    Ответ: Идем в метод: ОБЪЕКТЫ/Объекты/Timer/onNewMinute и в самом конце добавляем:

    If ($m=="10") {
    runScript("ИМЯ СЦЕНАРИЯ");
    }

    Не забываем нажать кнопку «Обновить»
    Сценарий будет выполняться после каждой десятой минуты часа.

    Запрос: MajorDoMo как прописать путь к другим страницам?
    Ответ:
    1. Если вы хотите чтобы ваша страница выглядела как вкладка, то вам следует перейти: Главное административное меню/НАСТРОЙКИ/Домашние страницы , кликнуть по кнопке «Новая страница» , В поле Название(*) прописать название вкладки, в списке Тип выбрать URL , в поле Ссылка , прописать адрес страницы. Для локальных страниц достаточно указывать локальный путь, например: /Template_alt/название страницы.html . Если у вас страница в собственной папке и в ней имеется индексный файл, достаточно указать только папку, например: /Kinoteatr/

    2. Допустим вы захотели вставить себе в MajorDoMo какой то сайт из Интернет, чтобы пользоваться им постоянно. Это очень просто. Для этого нужно воспользоваться приложением «Присланные ссылки» (ReadIt в маркете дополнений).
    Пример. У вас есть браузер на работе. Делаем браузерную закладку с Названием: Отправить в MJD и в поле URL прописываем:

    javascript:(function(){var host="Адрес вашего MajorDoMo "; var title=prompt("Название:", document.title); if (title!="" && title!=null) {location.href="http://"+host+"/popup/app_readit.html?ajax=1&op=add&url="+encodeURIComponent (location.href)+"&title="+encodeURIComponent(title);}}());

    НЕ ЗАБУДЬТЕ ПОМЕНЯТЬ: Адрес вашего MajorDoMo !!!
    Кладем ее на видное место, например в панель закладок(которую предварительно, естественно, надо отобразить).
    Теперь на какой бы странице вы не находились, достаточно кликнуть по этой закладке, как страница появиться у вас в MajorDoMo, во вкладке Ссылки. Обратите там (в открытой вкладке Ссылки) внимание на маленькую иконку в левом верхнем углу, кликнув по ней вы откроете меню, где сможете: Выбрать страницу которая будет отображаться постоянно во фрейме (во вкладке), Добавить новую страницу вручную(Если по каким то причинам не захотите пользоваться закладкой), ну и наконец взять ту самую ссылку для создания закладки (Внимание! Если будете брать ссылку оттуда обратите внимание на: host="mycomp" mycomp это ссылка на ваш MajorDoMo, как правило там может быть локальный IP, его нужно будет сменить либо на внешний IP, либо на доменное имя. Вообще, я бы рекомендовал вам пользоваться доменным именем, это удобнее во всех отношениях. Так, например, имея доменное имя во вне и прописав его ассоциацию в локальной сети у вас будет всего одна ссылка, которую вы сможете использовать везде, это очень удобно при работе с мобильными приложениями, Tasker и т.д. не нужно надеяться на переключение чего либо когда вы дома, а потом вне).

    3. И наконец, при желании, вы можете вставлять свою страничку прямо в сцену. Ну, например, если у вас есть некая готовая страница с группой кнопок и т.п. С возможностями ознакомиться можно здесь: (ССЫЛКА)

    Запрос: MajorDoMo запуск метода объекта?
    Ответ: Метод вызывается строкой:

    callMethod("Object.Method", $params);

    Ранее в комментарии про глобальные переменные я писал про внутренние функции и приводил (ССЫЛКУ) , там же в разделе «Работа с объектами» вы найдете и про методы.

    Запрос: Как записать значение из свойства одного объекта в свойство другого?
    Ответ: Для начала, стоит определить зачем это нужно. Это нужно, например, в том случае когда вам необходимо создать Простое устройство , допустим датчик температуры, а физически вы имеете сложное устройство, например модуль ESP, к которому подсоединено много датчиков в том числе и датчик температуры. Но, ввиду того что ESP не является простым устройством и сценарий для записи всех его датчиков составной (Т.е. значение в свойство записывается путем составления из идентификатора как объекта и, собственно, свойства. Короче код один, а данные пишутся в свойства разных ESP), прямое использование его в простых устройствах невозможно.
    Как поступить?
    1. Создадим Простое устройство , датчик температуры. На выходе мы получим пару Объект.Свойство, например: Sensor_temp01.value запомним его.
    2. Узнаем как называется датчик температуры интересующей нас ESP(допустим мы хотим использовать датчик температуры из состава BME-280, который подключен к первому модулю ESP, который у нас находится в зале), идем в свойства зального ESP и видим что датчик температуры у нас называется: ESP8256007b5b6d.bmet , запоминаем его.
    3. Создадим сценарий который будет ежеминутно записывать значение из свойства температуры ESP в свойство температуры простого устройства. Давайте назовем его: SensorAssociation
    И пропишем ему код:

    //Ежеминутно пишет данные из ESP8256007b5b6d.bmet в Sensor_temp01.value
    $templ = getGlobal("ESP8256007b5b6d.bmet");
    setGlobal(("Sensor_temp01.value"),$templ);

    Сохраним наш сценарий!

    4. Ну и наконец, поместим сценарий на ежеминутное исполнение в метод таймера: onNewMinute

    Запрос: MajorDoMo индикаторы?
    Ответ: Очень многие новички часто залипают на этом вопросе. Да, действительно, без глубокого знания структуры, а в частности шаблонов, индикаторы не так то просто найти, но зная точное место где они находятся это не составит, абсолютно, никакой проблемы. Первое о чем бы хотелось сказать, индикаторы это часть шаблона, т.е. т.н. Веб-морды или (front-end, если угодно), поэтому? именно там их и следует искать. И так, Веб-морда у нас может находиться в двух местах. 1. Если вы используете стандартный шаблон, то наверняка вам следует искать ее вот здесь: /www/templates/default.html 2. Если же у вас, как и у меня, применен альтернативный шаблон и при этом соблюдены правила, благородных веб мастеров, не говнять дефолт(то что Автор дает по умолчанию), мало ли что, а вдруг придется переделать покрасивее. То, наверняка, вам следует искать в альтернативном шаблоне: /www/templates_alt/default.html . С шаблоном мы определились, открываем в текстовом редакторе файлик: default.html и чтобы вам не шляться по увесистому тексту, в поисках нужного, ищем по файлу строчку: System.IndicatorColor это свойство (в котором значением является картинка) системного статуса, индикатор номер один! Он присутствует всегда, добавляя по его подобию свойства, в котором имеют место быть картинки, вы получите сколь угодно много необходимых индикаторов на главной странице.

    Но это еще не все. Вот на этой моей страничке (ССЫЛКА) , в качестве главной иллюстрации показан мой шаблон и если вы присмотритесь то заметите что индикаторы имеют место быть не только справа в главном шаблоне, но и так же в меню. Это не прихоть и не дурь, так как, по дефолту, кой я и использую в MajorDroid, главной страницы не увидеть, там главной страницей является меню(оговорюсь, это в моем случае, ибо при желании там по умолчанию можно и сцену вывести!) поэтому в меню вы тоже можете наблюдать дубликат индикаторов.
    Где же искать их? Все просто, вам придется сделать их самим, если в этом у вас действительно есть нужда.
    Итак, как это сделать?
    Делаем пункт меню с Названием: State и помещаем его в самый верх вашего меню(Приоритет: 100000 ), Родительским пунктом: , естественно, должен быть ROOT .
    В Типе: выберем HTML блок .
    В поле Данные: запишем следующий код:

    Это мой вариант, вы правьте под себя, что да как и где лежит, уже поймете без труда. И пардон за картинку, просто моя система так устроена что подхватывает этот код. Так что придется переписать ручками. Обратите внимание: Liquid_Crystal это шрифт имитирующий ЖК часы, именно в этом стиле выполнен мой шаблон, если захотите такой же, вам придется его себе скачать, если Вам без разницы то не найдя Liquid_Crystal система подключит Arial, ну а в верху уже пропишите.
    Ну и наконец, в пункте: Период автообновления: пропишем 10 сек.
    Сохраняем и получаем то что хотели.