Общие функции
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(ФРАЗА, УРОВЕНЬ, ОТВЕТ_НА_ЧТО) -- последние два параметра не обязательны. Эта функция ведёт себя следующим образом:
- Если указан параметр ОТВЕТ_НА_ЧТО, то система попытается найти терминал, с которого был запрос, содержащий данную фразу
- Если не указан параметр ОТВЕТ_НА_ЧТО, то система выберет терминал, с которого был любой запрос в течении последних 5 секунд
- Если терминал найден, то ответ будет направлен на него (с помощью той же функции sayTo)
- Если терминал не найден, то ответ будет озвучен в обычном порядке (аналогично просто использованию функции 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)
1 2 |
$command='Сколько время'; callMethod('ThisComputer.commandReceived',array('command'=>$command)); |
cm -- альтернативное имя предыдущей функции
$value=getGlobal('Object.Property'); -- получения значения свойства объекта
gg -- альтернативное имя предыдущей функции
setGlobal('Object.Property',$value); -- установка значения свойства объекта
sg -- альтернативное имя предыдущей функции
$objects=getObjectsByClass('class_name'); -- возвращает массив объектов указанного класса в виде название.Пример перебора объектов в цикле и установки значения свойств:
1 2 3 4 |
$objects=getObjectsByClass("class_name"); foreach($objects as $obj) { setGlobal($obj['TITLE'].".property_name",1); } |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$data = getHistoryMin("RainGauge1.value", -3*60*60); echo print_r($data, true)."<br/>\n"; Если минимальная температура за день меньше 5 градусов, то пора сливать воду из системы полива. if (getHistoryMin("tsrearyard.temp", strtotime("-1 day")) < 5) say("Пора сливать воду из системы полива"); Если среднесуточная температура меньше 7 градусов, то пора менять колёса на зимние. if (getHistoryAvg("tsrearyard.temp", strtotime("-1 day")) < 7) say("Пора менять колёса на зимние"); Самое интересное можно взять значение на определённом отрезке времени, даже если выборки попали между запросом (Берутся 2 точки до и после, из них делается интерполяция) if (getHistoryValue("tsrearyard.temp", strtotime("03:00")) < 0) say("Ночью была минусовая температура"); Если нет никаких данных функция возвращает false - а что делать по этому поводу решать вам. Может нужно сказать "Датчик дождя не выдавал значения за этот период" $ret = gethistorycount("ws.isRain",strtotime("-15 minute")); if ($ret === false) $ret = 0; if ($ret != 0) say(' пошёл дождь...',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 -- Указатель на себя. Используется в методах классов. Например:
1 |
$this->setProperty("status",1); // устанавливает свойство status в 1, объекту для которого вызван |
Работа с шаблонами
описание шаблонов
addPattern($matches[1],$new_pattern,1); // добавляем описанный шаблон (описание на форуме)
1 2 3 4 5 6 |
$new_pattern=array(); $new_pattern['ONETIME']=1; // флаг того, что шаблон будет одноразовый $new_pattern['SKIPSYSTEM']=1; // флаг того, что шаблон не будет реагировать на системные уведомления, только пользовательские $new_pattern['SCRIPT']='say("'.$matches[2].'",0,'.$from_user_id.');'; // код реакции нашего шаблона addPattern($matches[1],$new_pattern,1); // добавляем описанный шаблон say("Добавлена реакция на слово \"".$matches[1]."\"",2); // подтверждаем то, что реакция добавлена |
context_activate($id); -- Активировать вручную нужный контекст (ступень шаблона) (вместо $id нужно вставить цифровой код шаблона -- он виден в ссылке при редактировании шаблона/контекста). context_clear(); -- позволяет сбросить текущий контекст у текущего пользователя.
clearTimeOut('user_'.context_getuser().'_contexttimeout'); -- удаление таймера события при не ответе
context_getuser(), по всей видимости возвращает id текущего пользователя.
Если нам для чего то потребуется имя, то зная id достать его из базы данных не трудно.
Полный код команды Забудь:
1 2 3 |
context_clear(); clearTimeOut('user_'.context_getuser().'_contexttimeout'); say('Контекст забыт.'); |
Запланированные задачи и события
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 Важно: очень аккуратно используйте эту опцию и старайтесь не "раскидываться" ссылками, которые могут навредить, попадая в
Идеи использования:
- Обмен данными между несколькими системами MajorDoMo (одна система через getURL может инициировать событие в другой, причём у первой даже может не быть аккаунта в Connect-е)
- Интеграция со сторонними системами и интернет-сервисами (сторонняя система "дёргает" ссылку и MajorDoMo об этом узнаёт)
- Выдача прав на использование некоторых функций системы третьим лицам (передайте ссылку кому-нибудь, попросите добавить в закладки и объясните, что будет происходить при переходе -- реализация сценария полностью на ваше усмотрение)
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);