Контексты в шаблонах поведения

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

Модератор: immortal

zorg
Сообщения: 20
Зарегистрирован: Чт июл 04, 2019 8:05 am
Благодарил (а): 1 раз
Поблагодарили: 2 раза

Re: Контексты в шаблонах поведения

Сообщение zorg » Чт авг 05, 2021 5:49 pm

Добрый день. Подскажите. При не корректной команде, Алиса не говорит, неизвестная команда, раньше это нравилось, теперь немного напрягает, когда при голосовом вводе она просто молчит. Куда копать? :roll: Хочется сделать типа: Я Вас не поняла, или что-то подобное.
Аватара пользователя
tarasfrompir
Сообщения: 3208
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

Re: Контексты в шаблонах поведения

Сообщение tarasfrompir » Чт авг 05, 2021 7:50 pm

zorg писал(а):
Чт авг 05, 2021 5:49 pm
Добрый день. Подскажите. При не корректной команде, Алиса не говорит, неизвестная команда, раньше это нравилось, теперь немного напрягает, когда при голосовом вводе она просто молчит. Куда копать? :roll: Хочется сделать типа: Я Вас не поняла, или что-то подобное.
https://github.com/sergejey/majordomo/b ... nd.inc.php

вот ТУТ НАДО ВСТАВЛЯТЬ в конце где то
Спасибо нам ПОМОЖЕТ..!
Logrus
Сообщения: 1934
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 305 раз
Поблагодарили: 415 раз

Re: Контексты в шаблонах поведения

Сообщение Logrus » Чт авг 05, 2021 8:43 pm

tarasfrompir писал(а):
Чт авг 05, 2021 7:50 pm
zorg писал(а):
Чт авг 05, 2021 5:49 pm
Добрый день. Подскажите. При не корректной команде, Алиса не говорит, неизвестная команда, раньше это нравилось, теперь немного напрягает, когда при голосовом вводе она просто молчит. Куда копать? :roll: Хочется сделать типа: Я Вас не поняла, или что-то подобное.
https://github.com/sergejey/majordomo/b ... nd.inc.php

вот ТУТ НАДО ВСТАВЛЯТЬ в конце где то
это ПУ, а команды после них еще в шаблоны поведения передаются
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
nick7zmail
Сообщения: 7572
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2008 раз

Re: Контексты в шаблонах поведения

Сообщение nick7zmail » Чт авг 05, 2021 10:04 pm

Можно приоритет выставить, чтоб пу в конце обрабатывались. А вообще то что вы говорите (неизвестная команда) было в методе thiscomputer-commandrecieved

Отправлено с моего Xperia XZ1 Compact через Tapatalk

Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Logrus
Сообщения: 1934
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 305 раз
Поблагодарили: 415 раз

Re: Контексты в шаблонах поведения

Сообщение Logrus » Чт авг 05, 2021 10:20 pm

nick7zmail писал(а):
Чт авг 05, 2021 10:04 pm
Можно приоритет выставить, чтоб пу в конце обрабатывались. А вообще то что вы говорите (неизвестная команда) было в методе thiscomputer-commandrecieved

Отправлено с моего Xperia XZ1 Compact через Tapatalk
как плохо когда по разным норкам, вызов метода закоментирован и в тлг что сделать тс описал, правда сомневаюсь что он понял (
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
Bagir
Сообщения: 1601
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 203 раза
Поблагодарили: 367 раз

Re: Контексты в шаблонах поведения

Сообщение Bagir » Ср авг 03, 2022 8:00 pm

Ну что, сдуем пыль с довольно интересной темы? Так уж получилось, что я часто пишу тут не только для всех, но и для себя тоже. А спустя годы перечитываю. Пока никто не жаловался :D

Ох уж эти пляски с $original вплоть до голосования на эту тему. Надо бы устаканить это дело раз и навсегда. Обновился по последней Альфы.
Сделал в шаблонах тестовый контекст

Код: Выделить всё

Уровень 1 
  Уровень 2
    Уровень 3
      Уровень 4
У уровня 4 не стоит галка использовать как контекст. Он в примере последний.
Файл patterns.class.php после обновления я не редактировал.
Сейчас там склейка истории закоментированаПоказать

Код: Выделить всё

            /*
            if (context_getcurrent()) {
                $history = context_get_history() . ' ' . $history;
            }
            */
Вот что получилось:

Код: Выделить всё

debmes('ур4 original '.$original);
debmes('ур4 context_get_history '.context_get_history());
18:44:38 0.18617000 ур4 context_get_history
18:44:38 0.17697100 ур4 original Уровень 4

18:44:36 0.14097900 ур3 context_get_history Уровень 1 Уровень 2 Уровень 3
18:44:36 0.13184000 ур3 original Уровень 3

18:44:33 0.59629600 ур2 context_get_history Уровень 1 Уровень 2
18:44:33 0.58763800 ур2 original Уровень 2

18:44:31 0.42546600 ур1 context_get_history Уровень 1
18:44:31 0.41500800 ур1 original Уровень 1
Вводил команды по одной. В ответе значение переменной $original и функции context_get_history()
Как мы видим, $original содержит текст последней команды целиком. А было время, когда там собиралась история, хоть и дублировалась странным образом. Последние исправления файла patterns.class.php как раз и убирают дубли, но убирают и историю. Которая была мне так нужна для шаблона (Включи|Выключи). Не готов я отказаться от этой конструкции и разбивать на разные ветки Включи и Выключи, дублируя практически одинаковый код в них. Я ранее оставлял много примеров с $original и шаблоном (Включи|Выключи). Теперь это уже давно не работает без правки файла patterns.class.php Ну да и ладно, не сторонник я править код в файлах.
Какие теперь есть альтернативы, давайте посмотрим на функцию context_get_history() которая могла бы заменить нам $original.
И всё вроде хорошо, но вот на последнем уровне ответ context_get_history() пустой. Всё дело в том, что у уровня 4 не стоит галка использовать как контекст. Это последний уровень, но на нем как раз и нужна история, чтобы понять включать нужно или выключать. По моему это как то не правильно. Буду разбираться почему так. А пока на этом всё, как найду решение, отпишусь. Тема шаблонов снова очень актуальна для меня. Прицепил Я.колонку. Теперь управлять голосом стало удобно.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1601
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 203 раза
Поблагодарили: 367 раз

Re: Контексты в шаблонах поведения

Сообщение Bagir » Ср авг 03, 2022 8:24 pm

Вот ещё дополнение к сказанному ранее. Второй тест, только команды вводим уже не по одной, а так:
Уровень 1 Уровень 2
Уровень 3
Уровень 4
Ответ:
20:13:47 0.78936800 ур4 context_get_history
20:13:47 0.77681600 ур4 original Уровень 4
20:13:45 0.43422200 ур3 context_get_history Уровень 1 Уровень 2 Уровень 1 Уровень 2 Уровень 3
20:13:45 0.42050700 ур3 original Уровень 3
20:13:42 0.76294300 ур2 context_get_history Уровень 1 Уровень 2 Уровень 1 Уровень 2
20:13:42 0.74754800 ур2 original Уровень 1 Уровень 2
Видим, что нет первого уровня, и это понятно, он автоматом пролетел, т.к. в первой команде 1 и 2 уровень указаны вместе. Не понятно для меня почему context_get_history() сразу дублирует историю? Похоже именно по этому возникали дикие дубли в $original потому что она ранее копила ответы context_get_history()

В итоге у меня пока два вопроса к context_get_history()
1. Дубли истории при автоматическом переходе на следующий уровень контекста если команда содержит в себе его
2. Отсутствие ответа на последнем уровне.

Функция context_get_history() в файле context.inc.php

Код: Выделить всё

/**
 * Summary of context_get_history
 * @return mixed
 */
function context_get_history($user_id = 0)
{
   if (!$user_id) {
      $user_id = context_getuser();
   }
   $sqlQuery = "SELECT ID, ACTIVE_CONTEXT_ID, ACTIVE_CONTEXT_EXTERNAL, ACTIVE_CONTEXT_HISTORY
                  FROM users
                 WHERE ID = '" . (int)$user_id . "'";
   
   $user = SQLSelectOne($sqlQuery);

   if ($user['ACTIVE_CONTEXT_ID'])
      return $user['ACTIVE_CONTEXT_HISTORY'];

   return '';
}
Как видно, функция берет значение из базы SQL. Вероятно дубли уже летят туда, а на последнем уровне значение стирается раньше, чем мы получаем его. Копаем дальше...

P.S. посмотрел в myadmin, так и есть
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
xor
Сообщения: 1914
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 260 раз
Поблагодарили: 592 раза

Re: Контексты в шаблонах поведения

Сообщение xor » Ср авг 03, 2022 9:16 pm

Bagir писал(а):
Ср авг 03, 2022 8:24 pm
Как видно, функция берет значение из базы SQL. Вероятно дубли уже летят туда, а на последнем уровне значение стирается раньше, чем мы получаем его. Копаем дальше...
про оригинал - не помню, вроде, уже писал - сделал свой, чтобы делать многоуровневые шаблоны

включи или выключи/свет, музыку,.../в спальне,на улице,...
уровень (включи|выключи)

Код: Выделить всё

if(preg_match('/включи/isu', $original)){
  say('Включить что именно?',2);
  saveToCache('VAR:original.0','включи');
}elseif(preg_match('/выключи/isu', $original)){
  say('Выключить что именно?',2);
  saveToCache('VAR:original.0','выключи');
}else{
  saveToCache('VAR:original.0','');
}
уровень (свет|освещен|ламп|фонар)

Код: Выделить всё

$ss = checkFromCache("VAR:original.0");
if($ss){
 $ss = $ss.' '.mb_strtolower($original); //для красоты
}else{
 $ss = mb_strtolower($original);
}
saveToCache('VAR:original.0',$ss);
if(preg_match('/включи/isu', $ss)){
  say('Включить свет где?',2);
}elseif(preg_match('/выключи/isu', $ss)){
  say('Выключить свет где?',2);
}else{
  saveToCache('VAR:original.0','');
}
и т.д.
ps. у меня только кэш не сбрасывается по любому чиху, если это не так, можно вместо кэша ивент использовать
Аватара пользователя
Bagir
Сообщения: 1601
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 203 раза
Поблагодарили: 367 раз

Re: Контексты в шаблонах поведения

Сообщение Bagir » Ср авг 03, 2022 9:54 pm

xor писал(а):
Ср авг 03, 2022 9:16 pm
ps. у меня только кэш не сбрасывается по любому чиху, если это не так, можно вместо кэша ивент использовать
Да, я пользуюсь этой подсказкой уже давно. Большое спасибо. Только ещё добавляю и имени переменной в кеше user_id. Просто решил разобраться, почему такое происходит.
И как временный итог могу сказать следующее. Всё вроде бы так как надо, и история приклеивается функцией context_activate, но при переходе сразу на несколько уровней будет дубль. И вот с чем это связано:
Допустим мы пишем
Уровень 1
Уровень 2
на каждом шаге вызывается функция context_activate() и история собирается
было Уровень 1
стало Уровень 1 Уровень 2
Тут всё хорошо.

Но если написать сразу
Уровень 1 Уровень 2

то при переходе на второй уровень, функция context_activate() так же склеит историю, в которой уже есть "Уровень 1 Уровень 2 "
Получается Уровень 1 Уровень 2 + Уровень 1 Уровень 2
вот и ответ.
То есть, при автоматическом переходе на следующий уровень, историю уже не надо приклеивать.
Попробую разобраться.

А на второй пункт ответ тоже есть. В шаблонах на последнем уровне мы не можем пользоваться функцией context_get_history() потому что функция context_activate() уже стерла историю в SQL.
Сейчас посмотрим что можно сделать.
Последний раз редактировалось Bagir Чт авг 04, 2022 3:24 am, всего редактировалось 1 раз.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1601
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 203 раза
Поблагодарили: 367 раз

Re: Контексты в шаблонах поведения

Сообщение Bagir » Чт авг 04, 2022 3:23 am

Чтож, ситуация такая:
checkPattern() вызывается рекурсивно, если команда делает переход более чем по одному уровню шаблонов. checkPattern() каждый раз вызывает функцию context_activate() для активации следующего шаблона. context_activate() записывает в поле ACTIVE_CONTEXT_HISTORY таблицы users историю. При рекурсивных вызовах checkPattern() образуются дубли в ACTIVE_CONTEXT_HISTORY, т.к. команда уже содержит в себе весь текст. Убрать их можно, не передавая context_activate() параметр $history при рекурсивных вызовах checkPattern(). Например так:
в файле patterns.class.php добавить условие смотря на $pattern_matched. При рекурсивных вызовах он уже = 1
код не стал в тег запихивать, чтобы жирным подсветить
if ($rec['IS_CONTEXT']) {
context_activate($rec['ID'], 1, ($pattern_matched ? '' : $history),$from_user_id);
} elseif ($rec['MATCHED_CONTEXT_ID']) {
context_activate($rec['MATCHED_CONTEXT_ID'], 0, $history,$from_user_id);
} elseif (!$is_common) {
context_activate(0,0, '',$from_user_id);
}
Но толку с этого мы не получим. Колонка ACTIVE_CONTEXT_HISTORY похоже никому больше вообще не нужна. В эту колонку смотрит функция context_get_history(), которую я и хотел использовать, вначале разобравшись с дублями. Но дело в том, что при исполнении кода шаблона, контекст уже сброшен, и ACTIVE_CONTEXT_HISTORY затерто. Перехватить раньше просто так не получится. context_clear() вызываемая context_activate() на последнем уровне шаблонов, стирает ACTIVE_CONTEXT_HISTORY раньше, чем мы добираемся до него из кода в шаблоне. Соответственно придется опять делать временную переменную, что убивает смысл бороться. Проще использовать кеш.

Конечно, иметь весь текст в коде шаблона, собранный при переходе по уровням, без танцев с кешем, было бы круто.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Ответить