... через какое то время
Код
$rnumber = 1;
while (1) {
$rname = "Reminder_$rnumber";
if (!timeOutExists($rname)) break;
$rnumber++;
}
// Заменить все цифры прописью
$s = word_to_number($matches[2]);
// привести к виду +1 day 2 hour 15 min 10 sec
$replaces = [
'часа' => 'hour', 'часов' => 'hour', 'час' => 'hour',
'минута' => 'min', 'минуты' => 'min', 'минуту' => 'min', 'минут' => 'min',
'секунда' => 'sec','секунды' => 'sec', 'секунду' => 'sec', 'секунд' => 'sec'
];
$s = '+'.strtr($s, $replaces);
$s = strtotime($s) - time();
$msgs=array('Задание создано', 'Сделаем', 'Постараюсь не забыть', 'Хорошо', 'Конечно');
say($msgs[array_rand($msgs)], 1); //через $s сек
setTimeOut($rname,"say('Задание: " . trim($matches[1]) . "', -1, $from_user_id);", $s);
function word_to_number(string $text)
{
$replaces = [
'один' => 1,
'одну' => 1,
'одна' => 1,
'два' => 2,
'две' => 2,
'три' => 3,
'четыре' => 4,
'пять' => 5,
'шесть' => 6,
'семь' => 7,
'восемь' => 8,
'девять' => 9,
'десять' => 10,
'одиннадцать' => 11,
'двенадцать' => 12,
'тринадцать' => 13,
'четырнадцать' => 14,
'пятнадцать' => 15,
'шестнадцать' => 16,
'семнадцать' => 17,
'восемнадцать' => 18,
'девятнадцать' => 19,
'двадцать' => 20,
'тридцать' => 30,
'сорок' => 40,
'пятьдесят' => 50,
'шестьдесят' => 60,
'семьдесят' => 70,
'восемьдесят' => 80,
'девяносто' => 90,
'сто' => 100,
'двести' => 200,
'триста' => 300,
'четыреста' => 400,
'пятьсот' => 500,
'шестьсот' => 600,
'семьсот' => 700,
'восемьсот' => 800,
'девятьсот' => 900
];
//return preg_replace('/0(?(?=0\s\d{2,})0)\s/', '', strtr($text, $replaces));
return preg_replace('/0(?(?=0\s\d{2,})0)\s(?=\d)/', '', strtr($text, $replaces));
}
|
Вентиляция
Код
// Гдe, id шаблона, пользователи и терминалы
$a[] = ['вытяжки в доме', 75, 'user5', 'terminal6', 'aliceKitchen'];
$a[] = ['вытяжки в бане', 75, 'user8', 'terminal8', 'aliceRestroom'];
$a[] = ['циркуляции в доме', 75, 'user9', 'aliceBedroom'];
$a[] = ['циркуляции в доме', 75, 'user2'];
$autotext = ''; $idp=0;
// Правила терминалов
foreach ($a as $v) {
if (in_array($details['source'], $v)) {
$autotext = $v[0]; $idp = $v[1]; break;
}
}
// Правила пользователей
if (!$idp) {
foreach ($a as $v) {
if (in_array('user'.$from_user_id, $v)) {
$autotext = $v[0]; $idp = $v[1]; break;
}
}
}
// Выполнить код шаблона сразу если не сказали где, или спросить место
if ($idp) {
$details["message"] = $autotext;
include_once(DIR_MODULES . 'patterns/patterns.class.php');
$pt = new patterns();
$pt->runPatternAction($idp, [], $autotext, $from_user_id, $details);
context_clear($from_user_id);
clearTimeOut('user_' . $from_user_id . '_contexttimeout');
} else {
say('Какое устройство?');
}
|
Устройство
Шаблон: (вытяж|циркул|прито)
Код
/*
Работа с одним конкретным реле
Команды управления автоматического режима
в результате будет либо изменен status реле лмбо режим modeSwitch
*/
// история контекста + текущая фраза
$ss = context_get_history($from_user_id) . ' ' . $original;
// Добавляем к фразе название локации, если его нет
if (preg_match( "/^(?!.*дом|.*бан).*$/", $ss )) {
// Получить локацию. В source с терминалов передается в виде terminal, от станций (телеграм)
if (preg_match('/^terminal(\d+)$/', $details['source'], $matches)) {
$arr = getTerminalById($matches[1]);
} else {
$arr = getTerminalsByName($details['source'])[0];
}
// добавить локацию
$ss .= ' ';
switch ($arr['LOCATION_ID']) {
case 1: $ss .= 'дома'; break;
case 2: $ss .= 'бани'; break;
default: $ss .= 'undefined';
}
}
$rooms=[];
// комнаты с одноименным названием в разных локациях
if (preg_match('/вытяж/isu', $ss)) {
if (preg_match('/дом/isu', $ss)) { $rooms += [ 'RelayVentilation7' => 'вытяжки' ]; }
if (preg_match('/бан/isu', $ss)) { $rooms += [ 'RelayVentilationBath2' => 'вытяжки' ]; }
//if (preg_match('/undefined/isu', $ss)) { $rooms += [ 'RelayVentilation7' => 'вытяжки дома' ]; }
}
if (preg_match('/циркул/isu', $ss)) {
if (preg_match('/дом/isu', $ss)) { $rooms += [ 'RelayVentilation1' => 'циркуляции воздуха' ]; }
}
if (preg_match('/прито/isu', $ss)) {
if (preg_match('/дом/isu', $ss)) { $rooms += [ 'RelayVentilation2' => 'притока уличного воздуха' ]; }
}
$t=array('вентиляцию','вентиляцией');
foreach( $rooms as $n => $w) {
// закончить если modeSwitch для реле не указан
if (preg_match('/авто/isu',$ss)) {
if (!is_numeric(gg("$n.modeSwitch"))) {
say("Авторежим управления $t[1] $w не настроен");
continue;
}
}
if (preg_match('/включи/isu',$ss)) {
if (preg_match('/авто/isu',$ss)) {
sg("$n.modeSwitch",2);
cm("$n.logic");
say("Выбрано автоматическое управление $t[1] $w");
} else {
clearTimeOut($v.'_nowork');
cm("$n.turnOn");
say("Включаю $t[0] $w");
}
} elseif (preg_match('/выключи/isu',$ss)) {
if (preg_match('/авто/isu',$ss)) {
sg("$n.modeSwitch",gg("$n.status"));
say("Автоматическое управление $t[1] $w отключено");
} else {
setTimeOut($v.'_nowork', '', 5*60);
cm("$n.turnOff");
say("Выключаю $t[0] $w");
}
} else {
say("Нет команды: $ss");
}
}
|
|
Насос
Код
say('какого устройства?');
|
место
Шаблон: (пол|рециркуляц|радиатор)
Код
/*
Работа с одним конкретным реле
Команды управления автоматического режима
в результате будет либо изменен status реле лмбо режим modeSwitch
*/
// история контекста + текущая фраза
$ss = context_get_history($from_user_id) . ' ' . $original;
// Добавляем к фразе название локации, если его нет
if (preg_match( "/^(?!.*дом|.*бан).*$/", $ss )) {
// Получить локацию. В source с терминалов передается в виде terminal, от станций (телеграм)
if (preg_match('/^terminal(\d+)$/', $details['source'], $matches)) {
$arr = getTerminalById($matches[1]);
} else {
$arr = getTerminalsByName($details['source'])[0];
}
// 1-Дом 2-Баня
switch ($arr['LOCATION_ID']) {
case 1: $ss .= ' дома'; break;
case 2: $ss .= ' бани'; break;
default: $ss .= ' default'; break;
}
}
$rooms=[];
if (preg_match('/рециркуляц/isu', $ss)) {
if (preg_match('/дом/isu', $ss)) { $rooms += [ 'RelayHomeRecirculationGWS' => 'рециркуляции воды' ]; }
if (preg_match('/бан/isu', $ss)) { $rooms += [ 'RelayBhRecirculationGWS' => 'рециркуляции воды' ]; }
if (preg_match('/default/isu', $ss)) { $rooms += [ 'RelayHomeRecirculationGWS' => 'рециркуляции воды дома' ]; }
}
if (preg_match('/радиатор/isu', $ss)) {
//if (preg_match('/дом/isu', $ss)) { $rooms += [ 'XXX' => 'отопления радиаторов' ]; }
if (preg_match('/бан/isu', $ss)) { $rooms += [ 'RelayBhPumpRadiator' => 'отопления радиаторов' ]; }
}
if (preg_match('/пол/isu', $ss)) {
//if (preg_match('/дом/isu', $ss)) { $rooms += [ 'XXX' => 'отопления теплых полов' ]; }
if (preg_match('/бан/isu', $ss)) { $rooms += [ 'RelayBhPumpFloor' => 'отопления теплых полов' ]; }
}
$t=array('насос','насосом');
foreach( $rooms as $n => $w) {
// закончить если modeSwitch для реле не указан
if (preg_match('/авто/isu',$ss)) {
if (!is_numeric(gg("$n.modeSwitch"))) {
say("Авторежим управления $t[1] $w не настроен");
continue;
}
}
if (preg_match('/включи/isu',$ss)) {
if (preg_match('/авто/isu',$ss)) {
sg("$n.modeSwitch",2);
cm("$n.logic");
say("Выбрано автоматическое управление $t[1] $w");
say("$t[0] сейчас ".(gg("$n.status") ? 'включен' : 'выключен'));
} else {
cm("$n.turnOn");
say("Включаю $t[0] $w");
}
} elseif (preg_match('/выключи/isu',$ss)) {
if (preg_match('/авто/isu',$ss)) {
sg("$n.modeSwitch",gg("$n.status"));
say("Автоматическое управление $t[1] $w отключено");
say("$t[0] сейчас ".(gg("$n.status") ? 'включен' : 'выключен'));
// насос сейчас выключен
} else {
cm("$n.turnOff");
say("Выключаю $t[0] $w");
}
} else {
say("Нет метода в команде: $ss");
}
}
saveToCache('VAR:original'.$from_user_id, '');
|
|
Режим
Код
// история контекста + текущая фраза
$ss = context_get_history($from_user_id) . ' ' . $original;
if (preg_match('/включи/isu',$ss)) {
//say ("Это случилось для включи",1);
if (preg_match('/ночной/isu',$ss)) { if (!gg('NightMode.status')) { callMethod('NightMode.activate'); } }
if (preg_match('/дневной/isu',$ss)) { if (gg('NightMode.status')) { callMethod('NightMode.deactivate'); } }
}
elseif (preg_match('/выключи/isu',$ss)) {
//say ("Это случилось для выключи",1);
if (preg_match('/ночной/isu',$ss)) { if (gg('NightMode.status')) { callMethod('NightMode.deactivate'); } }
if (preg_match('/дневной/isu',$ss)) { if (!gg('NightMode.status')) { callMethod('NightMode.activate'); } }
}
|
Свет Освещение
Код
/*
Правила терминалов приоритетнее чем правила пользователей.
Если мы сказали в терминал в гараже Саши "Открой ворота", то без разницы кто это сказал. Ворота должны открыться у гаража Саши.
А если Маша сказала "Открой ворота" в любой терминал, кроме терминалов в гаражах Саши и Маши, то ворота должны открыться в гараже Маши.
Элементы массива правил терминалов и пользователей
1. Текст добавления к команде при автоматическом переходе.
2. id шаблона на который будет совершен переход.
3+.Пользователь в формате user, терминалы terminal, имена станций
В ресурс имя терминала приходит как terminal. При пустом значении null
*/
// Гдe, id шаблона, пользователи и терминалы
$a[] = ['на кухне', 31, 'user5', 'terminal6', 'aliceKitchen'];
//$a[] = ['2 свет на кухне', 31, 'user6', 'aliceKitchen'];
$a[] = ['в зале', 48, 'user8', 'terminal8', 'aliceRestroom'];
$a[] = ['в спальне', 79, 'user9', 'aliceBedroom'];
$a[] = ['в гараже', 45, 'user10', 'aliceGarage'];
/* ToDo
\s(в|у|на|во\s.+е|у|а|ой)
saveToCache('VAR:pattern_history_user'.$from_user_id, '');
say('Такого объекта не существует');
say('Не распознанная строка: '.$original, -1);
*/
$autotext=''; $idp=0;
// Правила терминалов и пользователей. (пример для разного света в спальне)
foreach ($a as $v) {
if (in_array($details['source'], $v) && in_array('user'.$from_user_id, $v)) {
$autotext = $v[0]; $idp = $v[1]; break;
}}
// Правила терминалов
if (!$idp) {
foreach ($a as $v) {
if (in_array($details['source'], $v)) {
$autotext = $v[0]; $idp = $v[1]; break;
}}}
// Правила пользователей
if (!$idp) {
foreach ($a as $v) {
if (in_array('user'.$from_user_id, $v)) {
$autotext = $v[0]; $idp = $v[1]; break;
}}}
// Выполнить код шаблона сразу если не сказали где, или спросить место
if ($idp) {
$details["message"] = $autotext;
// возможно в будущем заменит инклайд модуля. Создан Pull reqest
// https://mjdm.ru/forum/viewtopic.php?f=24&t=1511&p=131450#p131464
// &id, [$no_action = 0], [$history = ], [$user_id = 0], [$details = 0]
//context_activate($idp, 0, $autotext, $from_user_id, $details);
include_once(DIR_MODULES . 'patterns/patterns.class.php');
$pt = new patterns();
$pt->runPatternAction($idp, array(), $autotext, $from_user_id, $details);
context_clear($from_user_id);
clearTimeOut('user_' . $from_user_id . '_contexttimeout');
} else {
say('Где именно?');
}
|
Зал
Код
/*
управление группой реле в конкретной комнате
автоматическое управление реле
ver Group 3.2
*/
// текст описания в какой комнате и массив имен объектов реле
$where = 'свет в зале';
$obja = [1=>'RelayBhZalLight1',2=>'RelayBhZalLight2',3=>'RelayBhZalLight3'];
// история контекста + текущая фраза
$ss = context_get_history($from_user_id). ' ' . $original;
//массив описаний реле; текст; флаг номера канала; имя метода; счетчик
$a=[]; $t=''; $f=''; $m=''; $i=0;
// определение вкл/выкл. Указания имя метода
if (preg_match('/включи/isu',$ss)) { $m='turnOn'; $t='Включаю'; }
elseif (preg_match('/выключи/isu',$ss)) { $m='turnOff'; $t='Выключаю';}
else { say("Нет метода в команде: $ss"); return; }
// команда авто управления
if (preg_match('/авто/isu',$ss)) { $m='logic'; $t.=' авторежим'; } //автоматическое управление
// сбор признаков объектов
if (preg_match('/(перв|1)/isu',$ss)) { array_push($a, 'первый'); $f.='1'; }
if (preg_match('/(втор|2)/isu',$ss)) { array_push($a, 'второй'); $f.='2'; }
if (preg_match('/(трет|3)/isu',$ss)) { array_push($a, 'третий'); $f.='3'; }
// ключевое слово "весь" отменяет конкретные признаки объектов
if (preg_match('/(весь|всем|полный)/isu',$ss) || count($a)==count($obja)) { $t.=' весь'; $a=[]; $f='*'; }
// если не был указан признак объекта. Раздельно для вкл/выкл.
if (count($a)==0 && !$f ) {
// можно добавить текст вначале или в конце признаком объекта
if (preg_match('/включи/isu',$ss)) { $f='1'; } //array_push($a,'второй'); array_push($a,'третий');
elseif (preg_match('/выключи/isu',$ss)) { $t.=' весь'; $f='*'; }
}
// сборка в строку с текстом нескольких признаков объектов
// вида: включаю в (комната) первый, второй и третий свет
if (count($a)) {
$t.=' ';
for($t.=$a[0], $i = 1; $i < count($a); $i++) {
if ($i < count($a)-1) {$t.=', ';} else {$t.=' и ';}
$t.=$a[$i];
}
}
// перевернуть массив для выключения в обратном порядке
if (preg_match('/выключи/isu',$ss)) { $obja = array_reverse($obja, true); };
// выполнение методов
$i=0;
foreach($obja as $k=>$v) {
if ($f=='*' || preg_match("/$k/isu",$f)) {
if (preg_match('/авто/isu',$ss)) {
if (preg_match('/включи/isu',$ss)) {
sg("$v.modeSwitch",2);
} elseif (preg_match('/выключи/isu',$ss)) {
sg("$v.modeSwitch",gg("$v.status"));
}
}
if (preg_match('/включи/isu',$ss)) { clearTimeOut($v.'_nowork'); }
if (preg_match('/выключи/isu',$ss)) { setTimeOut($v.'_nowork', '', 5*60); };
if (count($a)==1) {
cm("$v.$m");
} else {
setTimeOut('light_patterns_delayexec_'.rand(10000, 99999),"cm('$v.$m');", ++$i);
}
}
}
// финальная фраза
say("$t $where");
|
Комната
Шаблон: (ванной|туалет|подъезд|лестниц|холл|парн|парил|мыльн|мывочн|беседк|вышк|гараж|двер)
Код
/*
Работа с одним конкретным реле
Дополнительные команды:
/авто/ выбор автоматического режима работы
ToDo /на время/ включить на время, указанное в объекте комнаты
ToDo /на <указанное время>/ включить на время, указанное в команде
*/
/* ToDo
В данный момент если по тексту шаблоны первого и второго уровня совпадают,
то в истории будет дубляж текста вида "Включи свет Включи свет".
На разбор фразы повторяющийся в ней текст не оказывает влияния.
*/
// история контекста + текущая фраза
$ss = context_get_history($from_user_id) . ' ' . $original;
//$ss = checkFromCache('VAR:pattern_history_user'.$from_user_id). ' ' . $original;
//saveToCache('VAR:pattern_history_user'.$from_user_id, '');
// Добавляем к фразе название локации, если его нет
if (preg_match( "/^(?!.*дом|.*бан).*$/", $ss )) {
// Получить локацию. В source с терминалов передается в виде terminal, от станций (телеграм)
if (preg_match('/^terminal(\d+)$/', $details['source'], $matches)) {
$arr = getTerminalById($matches[1]);
} else {
$arr = getTerminalsByName($details['source'])[0];
}
// добавить локацию
$ss .= ' ';
switch ($arr['LOCATION_ID']) {
case 1: $ss .= 'дома'; break;
case 2: $ss .= 'бани'; break;
default: $ss .= 'undefined';
}
}
$rooms=[];
// Комнаты с уникальным имемем во всех локациях
if (preg_match('/подъезд/isu',$ss)) { $rooms += [ 'RelayDrivewayLight' => 'у подъезда' ]; }
if (preg_match('/двер/isu',$ss)) { $rooms += [ 'RelayStairsLight1' => 'у входной двери' ]; }
if (preg_match('/лестниц/isu',$ss)) { $rooms += [ 'RelayStairsLight2' => 'на лестнице' ]; }
if (preg_match('/холл/isu',$ss)) { $rooms += [ 'RelayStairsLight3' => 'в холле' ]; } // холл в доме, зал в бане
if (preg_match('/ванной/isu',$ss)) { $rooms += [ 'RelayBathLight' => 'в ванной комнате' ]; }
if (preg_match('/(парн|парил)/isu',$ss)) { $rooms += [ 'RelayBhLightSteamroom' => 'в парной' ]; }
if (preg_match('/(мыльн|мывочн)/isu',$ss)) { $rooms += [ 'RelayBhLightWashing' => 'в помывочной' ]; }
if (preg_match('/беседк/isu',$ss)) { $rooms += [ 'RelayBhLightArbor' => 'в беседке' ]; }
if (preg_match('/вышк/isu',$ss)) { $rooms += [ 'RelayTowerLight1' => 'на вышке' ]; }
if (preg_match('/гараж/isu',$ss)) { $rooms += [ 'RelayGarageMainLight' => 'в гараже' ]; }
// комнаты с одноименным названием в разных локациях
if (preg_match('/туалет/isu', $ss)) {
if (preg_match('/дом/isu', $ss)) { $rooms += [ 'RelayHomeWCLight' => 'в туалете' ]; }
if (preg_match('/бан/isu', $ss)) { $rooms += [ 'RelayBhWCLight' => 'в туалете' ]; }
if (preg_match('/undefined/isu', $ss)) { $rooms += [ 'RelayHomeWCLight' => 'в туалете дома' ]; }
}
$t=array('свет','светом');
foreach( $rooms as $n => $w) {
if (preg_match('/включи/isu',$ss)) {
if (preg_match('/авто/isu',$ss)) {
if (is_numeric(gg("$n.modeSwitch"))) {
sg("$n.modeSwitch",2);
cm("$n.logic");
say("Выбрано автоматическое управление $t[1] $w");
} else {
say("Авторежим управления $t[1] $w не настроен");
}
} elseif (preg_match('/на время/isu',$ss)) {
if (is_numeric(gg("$n.modeSwitch"))) {
sg("$n.modeSwitch",3);
cm("$n.logic");
// ToDo вынести код вклюения на время в отдельный метод реле.
// вызвать его тут и в настройке радиопереключателя
// ToThink вынести не в отдельный метод, а в метод логики
// ToThink вызов метода logic с передачей modeSwitch
say("Включаю $t[0] $w на время");
} else {
say("Режим включения на время $t[1] $w не настроен");
}
} else {
clearTimeOut($v.'_nowork');
cm("$n.turnOn");
say("Включаю $t[0] $w");
}
} elseif (preg_match('/выключи/isu',$ss)) {
if (preg_match('/авто/isu',$ss)) {
if (is_numeric(gg("$n.modeSwitch"))) {
sg("$n.modeSwitch",gg("$n.status"));
say("Автоматическое управление $t[1] $w отключено");
} else {
say("Авторежим управления $t[1] $w не настроен");
}
} else {
setTimeOut($v.'_nowork', '', 5*60);
cm("$n.turnOff");
say("Выключаю $t[0] $w");
}
} else {
say("Нет метода в команде: $ss");
}
}
|
Комната отдыха
Код
/*
управление группой реле в конкретной комнате
автоматическое управление реле
ver Group 3.2
*/
// текст описания в какой комнате и массив имен объектов реле
$where = 'свет в комнате отдыха';
$obja = [1=>'RelayBhLightRestroom1',2=>'RelayBhLightRestroom2'];
// история контекста + текущая фраза
$ss = context_get_history($from_user_id). ' ' . $original;
//массив описаний реле; текст; флаг номера канала; имя метода; счетчик
$a=[]; $t=''; $f=''; $m=''; $i=0;
// определение вкл/выкл. Указания имя метода
if (preg_match('/включи/isu',$ss)) { $m='turnOn'; $t='Включаю'; }
elseif (preg_match('/выключи/isu',$ss)) { $m='turnOff'; $t='Выключаю';}
else { say("Нет метода в команде: $ss"); return; }
// команда авто управления
if (preg_match('/авто/isu',$ss)) { $m='logic'; $t.=' авторежим'; } //автоматическое управление
// сбор признаков объектов
if (preg_match('/(перв|1)/isu',$ss)) { array_push($a, 'первый'); $f.='1'; }
if (preg_match('/(втор|2)/isu',$ss)) { array_push($a, 'второй'); $f.='2'; }
// ключевое слово "весь" отменяет конкретные признаки объектов
if (preg_match('/(весь|всем|полный)/isu',$ss) || count($a)==count($obja)) { $t.=' весь'; $a=[]; $f='*'; }
// если не был указан признак объекта. Раздельно для вкл/выкл.
if (count($a)==0 && !$f ) {
// можно добавить текст вначале или в конце признаком объекта
if (preg_match('/включи/isu',$ss)) { $f='1'; } //array_push($a,'второй'); array_push($a,'третий');
elseif (preg_match('/выключи/isu',$ss)) { $t.=' весь'; $f='*'; }
}
// сборка в строку с текстом нескольких признаков объектов
// вида: включаю в (комната) первый, второй и третий свет
if (count($a)) {
$t.=' ';
for($t.=$a[0], $i = 1; $i < count($a); $i++) {
if ($i < count($a)-1) {$t.=', ';} else {$t.=' и ';}
$t.=$a[$i];
}
}
// перевернуть массив для выключения в обратном порядке
if (preg_match('/выключи/isu',$ss)) { $obja = array_reverse($obja, true); };
// выполнение методов
$i=0;
foreach($obja as $k=>$v) {
if ($f=='*' || preg_match("/$k/isu",$f)) {
if (preg_match('/авто/isu',$ss)) {
if (preg_match('/включи/isu',$ss)) {
sg("$v.modeSwitch",2);
} elseif (preg_match('/выключи/isu',$ss)) {
sg("$v.modeSwitch",gg("$v.status"));
}
}
if (preg_match('/включи/isu',$ss)) { clearTimeOut($v.'_nowork'); }
if (preg_match('/выключи/isu',$ss)) { setTimeOut($v.'_nowork', '', 5*60); };
if (count($a)==1) {
cm("$v.$m");
} else {
setTimeOut('light_patterns_delayexec_'.rand(10000, 99999),"cm('$v.$m');", ++$i);
}
}
}
// финальная фраза
say("$t $where");
|
Кухня
Код
/*
управление группой реле в конкретной комнате
автоматическое управление реле
включение на время. Не тестировано
ver Group 3.21
*/
// текст описания в какой комнате и массив имен объектов реле
$where = 'свет на кухне';
$obja = [1=>'RelayKitchenLight1', 2=>'RelayKitchenLight2', 3=>'RelayKitchenLight3'];
// история контекста + текущая фраза
$ss = context_get_history($from_user_id). ' ' . $original;
// массив описаний реле; текст; флаг номера канала; имя метода; счетчик
$a=[]; $t=''; $f=''; $m=''; $i=0;
// определение вкл/выкл. Указания имя метода
if (preg_match('/включи/isu',$ss)) { $m='turnOn'; $t='Включаю'; }
elseif (preg_match('/выключи/isu',$ss)) { $m='turnOff'; $t='Выключаю';}
else { say("Нет метода в команде: $ss"); return; } //случиться если совпадение в шаблоне есть, а в коде нет
// команда авто управления
if (preg_match('/авто/isu',$ss)) { $m='logic'; $t.=' авторежим'; } //автоматическое управление
// приставка "на время". Только для объектов управления с этой кнопкой
// if (preg_match('/на время/isu',$ss)) { $m='logic'; $t.=' на время'; } //на время
// сбор признаков объектов
if (preg_match('/(перв|1|вход|начал|зад)/isu',$ss)) { array_push($a, 'первый'); $f.='1'; }
if (preg_match('/(втор|2|левый|слева)/isu',$ss)) { array_push($a, 'второй'); $f.='2';}
if (preg_match('/(трет|3|правый|справа)/isu',$ss)) { array_push($a, 'третий'); $f.='3';}
// ключевое слово "весь" отменяет конкретные признаки объектов
if (preg_match('/(весь|всем|полный)/isu',$ss) || count($a)==count($obja)) { $t.=' весь'; $a=[]; $f='*'; }
// если не был указан признак объекта. Раздельно для вкл/выкл.
if (count($a)==0 && !$f ) {
// можно добавить текст вначале или в конце признаком объекта
if (preg_match('/включи/isu',$ss)) { $f='23'; } //array_push($a,'второй'); array_push($a,'третий');
elseif (preg_match('/выключи/isu',$ss)) { $t.=' весь'; $f='*'; }
}
// сборка в строку с текстом нескольких признаков объектов
// вида: включаю в (комната) первый, второй и третий свет
if (count($a)) {
$t.=' ';
for($t.=$a[0], $i = 1; $i < count($a); $i++) {
if ($i < count($a)-1) {$t.=', ';} else {$t.=' и ';}
$t.=$a[$i];
}
}
// перевернуть массив для выключения в обратном порядке
if (preg_match('/выключи/isu',$ss)) { $obja = array_reverse($obja, true); };
// выполнение методов
$i=0;
foreach($obja as $k=>$v) {
if ($f=='*' || preg_match("/$k/isu",$f)) {
if (preg_match('/авто/isu',$ss)) {
if (preg_match('/включи/isu',$ss)) {
sg("$v.modeSwitch",2);
} elseif (preg_match('/выключи/isu',$ss)) {
sg("$v.modeSwitch",gg("$v.status"));
}
}
/*
// можно попроовать включать на время. Только для объектов управления с этой кнопкой
if (preg_match('/на время/isu',$ss)) {
if (preg_match('/включи/isu',$ss)) {
sg("$v.modeSwitch",3);
}
}
*/
if (preg_match('/включи/isu',$ss)) { clearTimeOut($v.'_nowork'); }
if (preg_match('/выключи/isu',$ss)) { setTimeOut($v.'_nowork', '', 5*60); };
if (count($a)==1) {
cm("$v.$m");
} else {
setTimeOut('light_patterns_delayexec_'.rand(10000, 99999),"cm('$v.$m');", ++$i);
}
}
}
// финальная фраза
say("$t $where");
|
Спальня
Код
/*
управление группой реле в конкретной комнате
автоматическое управление реле
ver Group 3.2
*/
// текст описания в какой комнате и массив имен объектов реле
$where = 'свет в спальне';
$obja = [1=>'RelayBedroomLight1',2=>'RelayBedroomLight2'];
// история контекста + текущая фраза
$ss = context_get_history($from_user_id). ' ' . $original;
//массив описаний реле; текст; флаг номера канала; имя метода; счетчик
$a=[]; $t=''; $f=''; $m=''; $i=0;
// определение вкл/выкл. Указания имя метода
if (preg_match('/включи/isu',$ss)) { $m='turnOn'; $t='Включаю'; }
elseif (preg_match('/выключи/isu',$ss)) { $m='turnOff'; $t='Выключаю';}
else { say("Нет метода в команде: $ss"); return; }
// команда авто управления
if (preg_match('/авто/isu',$ss)) { $m='logic'; $t.=' авторежим'; } //автоматическое управление
// сбор признаков объектов
if (preg_match('/(перв|1)/isu',$ss)) { array_push($a, 'первый'); $f.='1'; }
if (preg_match('/(втор|2)/isu',$ss)) { array_push($a, 'второй'); $f.='2'; }
// ключевое слово "весь" отменяет конкретные признаки объектов
if (preg_match('/(весь|всем|полный)/isu',$ss) || count($a)==count($obja)) { $t.=' весь'; $a=[]; $f='*'; }
// если не был указан признак объекта. Раздельно для вкл/выкл.
if (count($a)==0 && !$f ) {
// можно добавить текст вначале или в конце признаком объекта
if (preg_match('/включи/isu',$ss)) { $f='2'; } //array_push($a,'второй'); array_push($a,'третий');
elseif (preg_match('/выключи/isu',$ss)) { $t.=' весь'; $f='*'; }
}
// сборка в строку с текстом нескольких признаков объектов
// вида: включаю в (комната) первый, второй и третий свет
if (count($a)) {
$t.=' ';
for($t.=$a[0], $i = 1; $i < count($a); $i++) {
if ($i < count($a)-1) {$t.=', ';} else {$t.=' и ';}
$t.=$a[$i];
}
}
// перевернуть массив для выключения в обратном порядке
if (preg_match('/выключи/isu',$ss)) { $obja = array_reverse($obja, true); };
// выполнение методов
$i=0;
foreach($obja as $k=>$v) {
if ($f=='*' || preg_match("/$k/isu",$f)) {
if (preg_match('/авто/isu',$ss)) {
if (preg_match('/включи/isu',$ss)) {
sg("$v.modeSwitch",2);
} elseif (preg_match('/выключи/isu',$ss)) {
sg("$v.modeSwitch",gg("$v.status"));
}
}
if (preg_match('/включи/isu',$ss)) { clearTimeOut($v.'_nowork'); }
if (preg_match('/выключи/isu',$ss)) { setTimeOut($v.'_nowork', '', 5*60); };
if (count($a)==1) {
cm("$v.$m");
} else {
setTimeOut('light_patterns_delayexec_'.rand(10000, 99999),"cm('$v.$m');", ++$i);
}
}
}
// финальная фраза
say("$t $where");
|
Строение
Код
/*
Выключает реле определенной локации "location_id" (Дом, Баня ...)
Имя реле управления светом должно содержать "Light"
*/
// история контекста + текущая фраза
$ss = context_get_history($from_user_id) . ' ' . $original;
$locations=[];
if (preg_match('/дом/isu',$ss)) { $locations += [ 1 => 'в доме' ]; }
if (preg_match('/бан/isu',$ss)) { $locations += [ 2 => 'в бане' ]; }
foreach( $locations as $n => $w) {
if (preg_match('/включи/isu',$ss)) {
say('Я могу только выключить весь свет '.$w);
} elseif (preg_match('/выключи/isu',$ss)) {
// перебор объектов локации, выключение при совпадении, сбор описаний
$a=[];
$objects=getObjectsByClass('Relays');
foreach($objects as $obj) {
$obj=getObject($obj['TITLE']);
if ($obj->location_id==$n && stripos($obj->object_title, 'Light') !== false) {
if ($obj->getProperty('status')) {
array_push($a, $obj->description);
setTimeOut($obj->object_title.'_nowork', '', 5*60);
$obj->callMethod('turnOff');
}}
}
// сборка в строку с текстом нескольких признаков объектов
if (count($a)) {
$t='Выключаю ';
for($t.=$a[0], $i = 1; $i < count($a); ++$i) {
if ($i < count($a)-1) {$t.=', ';} else {$t.=' и ';}
$t.=$a[$i];
}
} else {
$t="Всё $w уже выключено";
}
// финальная фраза
say($t);
} else {
say("Нет метода в команде: $ss");
}
}
|
|
Телевизор
Шаблон: (телевизор|кинопоиск|ivi|ютуб|коди)
Код
// Гдe, id шаблона, пользователи и терминалы
$a[] = ['на кухне', 24, 'user5', 'terminal6', 'aliceKitchen'];
$a[] = ['в зале', 76, 'user8', 'terminal8', 'aliceRestroom'];
$a[] = ['в кабинете', 33, 'user2'];
$autotext = ''; $idp=0;
// Правила терминалов
foreach ($a as $v) {
if (in_array($details['source'], $v)) {
$autotext = $v[0]; $idp = $v[1]; break;
}
}
// Правила пользователей
if (!$idp) {
foreach ($a as $v) {
if (in_array('user'.$from_user_id, $v)) {
$autotext = $v[0]; $idp = $v[1]; break;
}
}
}
// Выполнить код шаблона сразу если не сказали где, или спросить место
if ($idp) {
$details["message"] = $autotext;
include_once(DIR_MODULES . 'patterns/patterns.class.php');
$pt = new patterns();
$pt->runPatternAction($idp, [], $autotext, $from_user_id, $details);
context_clear($from_user_id);
clearTimeOut('user_' . $from_user_id . '_contexttimeout');
} else {
say('Какой телевизор?');
}
|
Зал
Код
// история контекста + текущая фраза
$ss = context_get_history($from_user_id) . ' ' . $original;
saveToCache('VAR:pattern_history_user'.$from_user_id, '');
if (preg_match('/включи/isu',$ss)) {
if (preg_match('/телевизор/isu',$ss)) {
getURL(BASE_URL.ROOTHTML.'ajax/sonytv.html?id=1&key=PowerOn');
say('Включаю Телевизор');
}
elseif (preg_match('/кинопоиск/isu',$ss)) {
getURL(BASE_URL.ROOTHTML.'ajax/sonytv.html?id=1&key=app:com.sony.dtv.ru.kinopoisk.tv.ru.kinopoisk.tv.presentation.splash.SplashActivity');
say('Включаю Кинопоиск');
}
elseif (preg_match('/ivi/isu',$ss)) {
getURL(BASE_URL.ROOTHTML.'ajax/sonytv.html?id=1&key=app:com.sony.dtv.ru.ivi.client.ru.ivi.client.activity.MainActivity');
say('Включаю Иви');
}
elseif (preg_match('/ютуб/isu',$ss)) {
getURL(BASE_URL.ROOTHTML.'ajax/sonytv.html?id=1&key=app:com.sony.dtv.com.google.android.youtube.tv.com.google.android.apps.youtube.tv.activity.ShellActivity');
say('Включаю Ютуб');
}
elseif (preg_match('/коди/isu',$ss)) {
getURL(BASE_URL.ROOTHTML.'ajax/sonytv.html?id=1&key=app:com.sony.dtv.org.xbmc.kodi.org.xbmc.kodi.Splash');
say('Включаю Коди');
}
} elseif (preg_match('/выключи/isu',$ss)) {
if (preg_match('/телевизор/isu',$ss)) {
getURL(BASE_URL.ROOTHTML.'ajax/sonytv.html?id=1&key=PowerOff');
say('Выключаю Телевизор');
}
} else {
say("Нет команды: $ss");
}
|
кабинет
Код
// история контекста + текущая фраза
$ss = context_get_history($from_user_id) . ' ' . $original;
saveToCache('VAR:pattern_history_user'.$from_user_id, '');
if (preg_match('/включи/isu', $ss)) {
setGlobal('IRtransOfficeRoom.code', getGlobal('TVLG.powerOn'));
say('Включаю телевизор');
} elseif (preg_match('/выключи/isu', $ss)) {
setGlobal('IRtransOfficeRoom.code', getGlobal('TVLG.powerOff'));
say('Выключаю телевизор');
} else {
say("Нет команды: $ss");
}
|
кухня
Код
// история контекста + текущая фраза
$ss = context_get_history($from_user_id) . ' ' . $original;
saveToCache('VAR:pattern_history_user'.$from_user_id, '');
if (preg_match('/включи/isu', $ss)) {
setGlobal('IRtransOfficeRoom.code', getGlobal('TVerisson.powerOn'));
//setGlobal('IRtransOfficeRoom.code', getGlobal('playerRTC.powerOn'));
say('Включаю телевизор');
} elseif (preg_match('/выключи/isu', $ss)) {
setGlobal('IRtransOfficeRoom.code', getGlobal('TVerisson.powerOff'));
//setGlobal('IRtransOfficeRoom.code', getGlobal('playerRTC.powerOff'));
say('Выключаю телевизор');
} else {
say("Нет команды: $ss");
}
|
|
|
Мощность
Код
|
Система отоплания
Код
// история контекста + текущая фраза
//$ss = context_get_history($from_user_id) . ' ' . $original;
// Мощность системы отопления
$heatingPower=gg('heatingPower');
if ($heatingPower) { say("Мощность системы отопления $heatingPower".'%'); }
else {say('Система отопления отключена');}
|
|
Статус, Состояние
Шаблон: (статус|состояние)
Код
// история контекста + текущая фраза
$ss = context_get_history($from_user_id) . ' ' . $original;
//$ss = trim(checkFromCache('VAR:original'.$from_user_id).' '.mb_strtolower($original));
$ots=[];
if (preg_match('/насос(|а|ов) рециркуляци(и|я) (воды|гвс)/isu',$ss) ||
preg_match('/рециркуляционн(ого|ых) насос(а|ов) (воды|гвс)/isu',$ss)) {
$f=false;
if (preg_match('/бан/isu',$ss)) { $f=true; $ots[] = 'RelayBhRecirculationGWS'; }
if (preg_match('/дом/isu',$ss)) { $f=true; $ots[] = 'RelayHomeRecirculationGWS'; }
if (!$f) { $ots[] = 'RelayHomeRecirculationGWS'; $ots[] = 'RelayBhRecirculationGWS'; }
}
if (preg_match('/(общего|центрального) увлажнителя/isu',$ss)) { $ots[] = 'RelayZsocket1'; }
$locationName=[1=>'в доме', 2=>'в бане'];
foreach( $ots as $ot ) {
// моя функция получения времени изменения свойства. Ссылка на форум есть в блоге
$rec = mygetGlobalWithUpd("$ot.status");
$obj=getObject($ot);
$t = $obj->description. ' ' . $locationName[$obj->location_id];
if (is_array($rec)) {
$t .= ($rec['VALUE'] ? ' работает' : ' отключен');
$t.=' ' . round((time()-$rec['UPDATED'])/60) . ' мин';
if (!$rec['VALUE']) { $t.=' назад'; }
$ms= $obj->getProperty(modeSwitch);
if (is_numeric($ms)) {
$t .= ($ms<2 ? '. Автоматическое управление отключено' : '. Включено автоматическое управление');
}
} else {
$t = "Статус объекта $t не задан";
}
say(ucfirst($t));
}
if (!count($ots)) { say('Непонятно: '.$ss); }
//saveToCache('VAR:original'.$from_user_id, '');
|
Температура, Влажность
Шаблон: (температур|влажност)
Код
// Гдe, id шаблона, пользователи и терминалы
$a[] = ['на кухне', 43, 'user5', 'terminal6', 'aliceKitchen'];
$a[] = ['в зале', 43, 'user8', 'terminal8', 'aliceRestroom'];
$a[] = ['в спальне', 43, 'user9', 'aliceBedroom'];
$a[] = ['в гараже', 43, 'user10', 'aliceGarage'];
$a[] = ['в кабинете', 43, 'user2'];
$autotext = ''; $idp=0;
// Правила терминалов
foreach ($a as $v) {
if (in_array($details['source'], $v)) {
$autotext = $v[0]; $idp = $v[1]; break;
}
}
// Правила пользователей
if (!$idp) {
foreach ($a as $v) {
if (in_array('user'.$from_user_id, $v)) {
$autotext = $v[0]; $idp = $v[1]; break;
}
}
}
// Выполнить код шаблона сразу если не сказали где, или спросить место
if ($idp) {
$details["message"] = $autotext;
include_once(DIR_MODULES . 'patterns/patterns.class.php');
$pt = new patterns();
$pt->runPatternAction($idp, array(), $autotext, $from_user_id, $details);
context_clear($from_user_id);
clearTimeOut('user_' . $from_user_id . '_contexttimeout');
} else {
say('Где именно?');
}
|
комната
Шаблон: (кухн|гостин|спальн|кабинет|холл|зал|парн|мывочн|мыльн|предбан|подвал|гараж)
Код
// история контекста + текущая фраза
$ss = context_get_history($from_user_id) . ' ' . $original;
// Home
if (preg_match('/кухн/isu',$ss)) { $rooms[] = 'KitchenArea'; }
if (preg_match('/спальн/isu',$ss)) { $rooms[] = 'Bedroom'; }
if (preg_match('/гостин/isu',$ss)) { $rooms[] = 'Livingroom'; }
if (preg_match('/кабинет/isu',$ss)) { $rooms[] = 'OfficeRoom'; }
if (preg_match('/холл/isu',$ss)) { $rooms[] = 'HallArea'; }
// Bathhouse
if (preg_match('/зал/isu',$ss)) { $rooms[] = 'ZalRoom'; }
if (preg_match('/отдых/isu',$ss)) { $rooms[] = 'Restroom'; }
if (preg_match('/парн/isu',$ss)) { $rooms[] = 'SteamRoom'; }
if (preg_match('/(мывочн|мыльн)/isu',$ss)) { $rooms[] = 'WashingRoom'; }
if (preg_match('/предбан/isu',$ss)) { $rooms[] = 'Anteroom'; }
// Utility
if (preg_match('/подвал/isu',$ss)) { $rooms[] = 'UndergroundArea'; }
if (preg_match('/гараж/isu',$ss)) { $rooms[] = 'GarageArea'; }
$prop=[];
if (preg_match('/температур/isu',$ss)) { $prop += [ 'Temperature' => ['Температура','°'] ]; }
if (preg_match('/влажност/isu',$ss)) { $prop += [ 'Humidity' => ['Влажность','%'] ]; }
foreach( $rooms as $room ){
$obj=getObject($room);
foreach( $prop as $key => $value ){
// моя функция получения времени изменения свойства. Ссылка на форум есть в блоге
$rec = mygetGlobalWithUpd($obj->object_title . '.' . $key);
if ($rec['VALUE']) {
$t = $value[0].' '.$obj->getProperty('inRoomText').' '.str_replace('.',',',$rec['VALUE']).$value[1];
$i=time()-$rec['UPDATED'];
echo 'updated '.round($i/60).' min ';
if ($i > 60*60*5) { $t .= '. Данные давно не обновлялись, проверьте датчик'; }
elseif ($i > 60*60*2) { $t .= ', но данные уже не актуальны'; }
//else { $t .= ', данные обновлены '. round($i/60) .' мин назад'; }
} else {
$t = $value[0].' '.$obj->getProperty('inRoomText').' не указана. Данные отсутствуют';
}
say($t); //echo $t.' ';
}
}
|
строение
Код
// история контекста + текущая фраза
$ss = context_get_history($from_user_id) . ' ' . $original;
$otps=[];
if (preg_match('/дом/isu',$ss)) {
if (preg_match('/температур/isu',$ss)) { $otps += [ 'thrm_alpha.airCurrentTemp' => ['температура в доме','°'] ]; }
if (preg_match('/влажност/isu',$ss)) { $otps += [ 'ThisComputer.homeHumidity' => ['влажность в доме','%'] ]; }
}
if (preg_match('/бан/isu',$ss)) {
if (preg_match('/температур/isu',$ss)) {$otps += [ 'thrm_bathhouse.airCurrentTemp' => ['температура в бане','°'] ]; }
if (preg_match('/влажност/isu',$ss)) { $otps += [ 'ThisComputer.bhHumidity' => ['влажность в бане','%'] ]; }
}
foreach( $otps as $otp => $v ) {
// моя функция получения времени изменения свойства. Ссылка на форум есть в блоге
$rec = mygetGlobalWithUpd($otp);
if ($rec['VALUE']) {
$t = 'Средняя '.$v[0].' '.str_replace('.',',',$rec['VALUE']).$v[1];
$i=time()-$rec['UPDATED'];
if ($i > 60*60*5) { $t .= '. Данные давно не обновлялись, проверьте датчик'; }
elseif ($i > 60*60*2) { $t .= ', но данные уже не актуальны'; }
else { $t .= ', данные обновлены '. round($i/60) .' мин назад'; }
} else {
$t = $v[0].' не указана';
}
say($t);
}
|
|
|