Встроенные в MajorDoMo функции

4. Азбука, Создание модуля 4 комментария

Общие функции

DebMes($errorMessage, $logLevel) -- записывает сообщение в главный лог файл. Параметр $logLevel не является обязательным, и по умолчанию установлен как "debug".

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

sayTo (ФРАЗА, УРОВЕНЬ, НАЗНАЧЕНИЕ) - в качестве НАЗНАЧЕНИЯ можно использовать системное имя терминала и если это терминал на MajorDroid, то ему отправится команда для произношения. В любом случае из этой функции создаётся событие SAYTO (вида: processSubscriptions('SAYTO', array('level' => $level, 'message' => $ph, 'destination' => $destination));), которое может быть перехвачено сторонними модулями -- на заметку тем, кто захочет создать свой модуль для организации работы с различными устройствами доставки сообщений на определённый канал.

sayReply(ФРАЗА, УРОВЕНЬ, ОТВЕТ_НА_ЧТО) -- последние два параметра не обязательны. Эта функция ведёт себя следующим образом:

  1. Если указан параметр ОТВЕТ_НА_ЧТО, то система попытается найти терминал, с которого был запрос, содержащий данную фразу
  2. Если не указан параметр ОТВЕТ_НА_ЧТО, то система выберет терминал, с которого был любой запрос в течении последних 5 секунд
  3. Если терминал найден, то ответ будет направлен на него (с помощью той же функции sayTo)
  4. Если терминал не найден, то ответ будет озвучен в обычном порядке (аналогично просто использованию функции say).

Обсуждение на форуме последних двух функций

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 может использоваться имя

runScriptSafe($id,$data); -- выполняет скрипт безопасно в фоне

isOnLine($host) -- проверяет доступность хоста из Устройства OnLine (1/0).

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

addClass('ESP8266'); // Создаем класс
addClassObject($class, $objName); - Создать объект от родительского класса. Передаются строки
$obj=getObject($name); -- получает объект по имени $name. с полученным объектом можно работать используя следующие методы:
$obj->callMethod('method_name',$params); $obj->setProperty('property_name',$value);
$obj->getProperty('property_name');
$obj-> description; Доступ к описанию объекта
$this->object_title; -- Доступ к имени объекта

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

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

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

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

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

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

$objects=getObjectsByClass('class_name'); -- возвращает массив объектов указанного класса в виде название.Пример перебора объектов в цикле и установки значения свойств:

getObjectsByProperty($property_name,$condition=,$condition_value=); -- возвращает массив названий объектов, имеющих свойство $property_name. опционально можно задать условие, под которое попадает значение. Условия могут быть == (или =), >=, >, <=, <, <> (или !=)

Функции работы с историей

getHistoryMin($varname, $start_time, $stop_time) -- Возвращает минимальное значение за период

getHistoryMax($varname, $start_time, $stop_time) -- Возвращает максимальное значение за период

getHistoryCount($varname, $start_time, $stop_time) -- Возвращает количество значений за период

getHistorySum($varname, $start_time, $stop_time) -- Возвращает сумму значений за период

getHistoryAvg($varname, $start_time, $stop_time) -- Возвращает среднее значений за период

getHistory($varname, $start_time, $stop_time) -- Возвращает массив значений истории

getHistoryValue($varname, $start_time, $stop_time) -- Возвращает среднее значений за период

  • varname - "объект.свойство" (строка)
  • start_time - Время начало выборки, включительно (метка времени Unix)
  • stop_time - Время конца выборки, включительно (метка времени Unix)

Если нет никаких данных функция возвращает false.

Обсуждение

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

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 -- Указатель на себя. Используется в методах классов. Например:

Работа с шаблонами

описание шаблонов
addPattern($matches[1],$new_pattern,1); // добавляем описанный шаблон (описание на форуме)

context_activate($id); -- Активировать вручную нужный контекст (ступень шаблона) (вместо $id нужно вставить цифровой код шаблона -- он виден в ссылке при редактировании шаблона/контекста). context_clear(); -- позволяет сбросить текущий контекст у текущего пользователя.
clearTimeOut('user_'.context_getuser().'_contexttimeout'); -- удаление таймера события при не ответе
context_getuser(), по всей видимости возвращает id текущего пользователя.
Если нам для чего то потребуется имя, то зная id достать его из базы данных не трудно.
Полный код команды Забудь:

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

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

Проверка связи (ping)

if (ping(gg('Arduino.IP'))) {} else {} // PING адреса, заданного в свойстве IP объекта Arduino и выполнение кода в зависимости от результата.

Функционал Public Calls в Connect-е

Есть возможность получить уникальную публичную ссылку (доступную любому в Интернете), при открытии которой вызывается заданный метод в системе. Функция доступна только тем, кто зарегистрирован в проекте CONNECT.

В разделе CONNECT панели управления есть закладка Public Calls. Самое важное в настройках -- связанный объект и метод, который будет вызван. Ссылка будет с уникальным ключём, но можно дополнительно её защитить заданным паролем. Ссылку можно открывать просто в браузере или даже из скрипта.

К ссылке можно добавлять свои параметры и они будут доступны в методе в массиве $params Важно: очень аккуратно используйте эту опцию и старайтесь не "раскидываться" ссылками, которые могут навредить, попадая в

Идеи использования:

  1. Обмен данными между несколькими системами MajorDoMo (одна система через getURL может инициировать событие в другой, причём у первой даже может не быть аккаунта в Connect-е)
  2. Интеграция со сторонними системами и интернет-сервисами (сторонняя система "дёргает" ссылку и MajorDoMo об этом узнаёт)
  3. Выдача прав на использование некоторых функций системы третьим лицам (передайте ссылку кому-нибудь, попросите добавить в закладки и объясните, что будет происходить при переходе -- реализация сценария полностью на ваше усмотрение)

getURLBackground('URL'); - Запрос URL в фоне (если не важен результат

Управление циклами (сервисами)

на форуме

Интерфейс доступен через раздел XRay->Services
Для управления циклом использются глобальные переменные.
Например, есть цикл ./scripts/cycle_ping.php. Чтобы его остановить, достаточно выполнить команду в коде:
setGlobal('cycle_pingControl','stop'); - Остановка
setGlobal('cycle_pingControl','start'); - запуск
setGlobal('cycle_pingControl','restart'); - рестарт
setGlobal('cycle_pingDisabled','1'); - Для запрета автозапуска (по-умолчанию он всегда разрешён)
setGlobal('cycle_pingAutoRestart','1'); - Для включения авто-восстановления (по-умолчанию он всегда выключен)

Работа с базой данных

Теперь если вы используете альфа версию при разработке своих сценариев, методов и модулей можно использовать PDO (PHP Data Objects). Этот класс, предоставляет методы для работы с объектами и prepared statements, которые заметно повысят вашу продуктивность! Детальней про него можно почитать вот тут: https://habr.com/post/137664/

Работа с терминалами

setTerminalMML('term_name', 0) - Установка минимального уровня важности сообщений для конкретного терминала.

Функции для разработчиков модулей

addClass('имя класса'); -  автоматическое создание свойства класса в разделе "Объекты".

addClassMethod('имя класса','имя метода,"php код"); - автоматическое создание метода.

addClassProperty('имя класса', 'имя свойства', 'хранить историю', 'имя связанного метода'); - автоматическое создание свойства класса. Четвёртый параметр необязательный, позволяет автоматически линковать метод к свойству. Полезно использовать когда необходимо каждый раз выполнять метод при изменении значения свойства.

Поделитесь в соц сетях

Теги:

 

 

4 thoughts on - Встроенные в MajorDoMo функции

  • Предлагаю добавить функцию автоматической линковки метода к свойству. Применяется для автоматического запуска метода при изменении значения свойства. Это часто используемый механизм при создании модулей.

  • Откуда вот это взялось вообще?
    При вызове любого метода (но не сценария!) доступны переменные:
    $prevRun -- время последнего вызова
    $prevRunPassed -- сколько секунд прошло с последнего вызова
    Нету ничего подобного.

  • Есть свойство condition
    К нему привязян при зименении метод OnChange.

    В самом методе есть например код $a=$this->getProperty("condition");

    Но при выполнении метода в переменной $а хранится не новое значение, либо кешированное, либо предыдущее. С чем это связано и можно ли победить?

  • пример использования $this со старого сайта потерялся тут:

    $ot=$this->object_title;
    $alive_timeout=(int)$this->getProperty("aliveTimeOut");
    if (!$alive_timeout) {
    $alive_timeout=15*60;
    }
    clearTimeOut($ot."_alive");
    setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);