Main

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

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

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); -- выполняет скрипт безопасно в фоне

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

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)

$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);
}

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.

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

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

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

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

$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 достать его из базы данных не трудно.
Полный код команды Забудь:

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'); - Для включения авто-восстановления (по-умолчанию он всегда выключен)

Смотрите так же:

 

MajorDomo

Информация

Проекты

Партнёры

edit SideBar

 
 
 

 

Blix theme adapted by David Gilbert, powered by PmWiki