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

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

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

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

Сообщение sergejey » Вт дек 30, 2014 1:45 am

triada13 писал(а):Обновление сделал час назад.
Это получается она сама себя слышит?
Да и обрабатывает собственную фразу перед тем, как выйти из контекста. Такое было, но я думал, что поправил. Перепроверю.
За это сообщение автора sergejey поблагодарил:
triada13 (Вт дек 30, 2014 8:53 am)
Рейтинг: 1.16%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Пт янв 09, 2015 12:44 am

Ну вот и я добрался до Шаблонов, и как обычно куча вопросов. Для начала я сделал простенькую схему

Общий контекст (9000)
забудь (0)
помощь (0)

(включи|выключи) (8000)
  • свет (0)
    • в холле (0)
      у подъезда (0)
СкринПоказать
Изображение

И добавил немного кода:

Общий контекст (9000) использовать как контекст - ДА
  • забудь (0)

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

    say('Контекст забыт.'); 
    помощь (0)

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

    $actions=$this->getAvailableActions();
    $total=count($actions);
    for($i=0;$i<$total;$i++) {
     say($actions[$i]);
    } 
(включи|выключи) (8000) использовать как контекст - ДА
Выполнять при совпадении:

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

say('Что именно '.$matches[1].'ть?');

По истечении времени выполнить:

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

say('Дальнейших команд нет.');
  • свет (0) использовать как контекст - ДА
    Выполнять при совпадении:

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

    say('Где?');

    По истечении времени выполнить:

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

    say('Дальнейших команд нет.');
    • в холле (0)
      Выполнять при совпадении:

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

      switch ($matches[??????]) {
        case "включи":
        say('Включаю свет у подъезда');
        break;
        
        case "выключи":
        say('Выключаю свет у подъезда');
        break;
      } 

      у подъезда (0)
      Выполнять при совпадении:

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

      switch ($matches[?????]) {
        case "включи":
        say('Включаю свет у подъезда');
        break;
        
        case "выключи":
        say('Выключаю свет у подъезда');
        break;
      } 
Получилось немного громоздкое оформление, но без него трудно понять смысл дальнейших слов. Во первых, почему у меня первый пункт (включи|выключи)? Мне не хочется делать одинаковые пункты на включение и отключение. Вместо этого хочу попробовать принимать решение на основе $matches[] сравнивая его со словами включи или выключи.

Дальше вот такой диалог тоже будет успешный:
00:15 User1: у подъезда
00:15 Alice: Где?
00:14 User1: свет
00:14 Alice: Что именно включить?
00:14 User1: включи

А вот команда "включи свет", или сразу все "включи свет у подъезда" не работает. При этом Алиса входит только в первый контекст (включи|выключи). После команды "включи", Алиса спросит "Что именно?", а после команды "свет", спросит "Где?". Очень бы хотелось при этом, чтобы команда "включи свет" задействовала сразу два контекста, но Алиса при этом спросила только "Где", т.к. ответ на первый вопрос "Что именно?" уже дан в продолжении команды.
Ну а после полной команды "включи свет у подъезда" вообще не прозвучало вопросов "Что именно?" и "Где".
То есть нужно иметь возможность отменять код при совпадении шаблона, если после этого шаблона сразу сработал следующий шаблон, который входит в его контекст.

Еще одна тема - команда "забудь" в общем контексте. Добавил ее, чтобы вывести Алису из темы разговора. В Set context when matched: ничего не выбрано, однако Алиса все равно продолжает оставаться в контексте. Тут наверное что то не так. Есть вариант

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

SQLExec("UPDATE users SET ACTIVE_CONTEXT_ID=0 WHERE 1");
но наверное Алиса и так должна забыть контекст.

Вопрос по $matches[]. Можно ли в этом массиве видеть всю историю слов? По моему примеру обязательно нужно помнить первое совпадение (включи|выключи), когда мы доберемся непосредственно до действия.

И напоследок, подскажите, как передать команду в чат с Алисой из программы распознавания речи, чтобы она была напечатала в истории сообщений от имени нужного нам пользователя
_http://localhost/command.php?qry=Привет
По имени пользователя я хочу понимать из какой комнаты мы разговариваем с Алисой. В имени пользователя в этом случае будет имя комнаты. Соответственно туда, и только туда, нужно направлять звуковые сообщения. Я читал, и вижу в таблице `users`, что Шаблоны поведения различают разных пользователей и могут вести разные контексты у разных пользователей одновременно. Следовательно в коде контекстов нам нужно видеть имя текущего пользователя, с которым она разговаривает, чтобы именно в эту комнату отправить звук. Кто подскажет, как получить это имя текущего пользователя?
За это сообщение автора Bagir поблагодарили (всего 2):
Amarok (Вт дек 08, 2015 11:22 am) • Samir77 (Чт окт 25, 2018 12:37 am)
Рейтинг: 2.33%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Сб янв 10, 2015 9:30 pm

Друзья, sergejey сотворил очередное чудо!
После сегодняшнего обновления, в коде шаблонов поведения доступна $original Сейчас расскажу как ее использовать. Но сначала давайте посмотрим на результат!
Можно давать команды по одной, и после каждой Алиса будет уточнять, что хотела бы услышать в продолжении диалога. А можно сказать все сразу!
Изображение
Более того, даже не важно в какой последовательности
Изображение
И делает все это вот такие при простых шаблона
Изображение

Теперь обо всем этом более подробно. Создадим, и настроим шаблоны так:
Изображение

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

say('Что именно?');
А можно добавить ранее услышанное слово

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

say('Что именно '.$original.'ть?');
Изображение

Тут, видя первый ответ в переменной $original, принимаем решение о включении или выключении.
Изображение

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

if (preg_match('/включи/is',$original)) {
  say('Включаю свет в коридоре');
} elseif (preg_match('/выключи/is',$original)) {
  say('Выключаю свет в коридоре');
} else {
  say('Непонятно что со светом в коридоре: '.$original);
} 
Вот и все! Теперь остается только добавить свои комнаты и устройства. В дополнение скажу, что эта новая доработка еще и отлично совмещается с голосовым вводом.
За это сообщение автора Bagir поблагодарили (всего 3):
jeks0n (Ср янв 14, 2015 9:11 pm) • Amarok (Вт дек 08, 2015 11:53 am) • Samir77 (Чт окт 25, 2018 12:43 am)
Рейтинг: 3.49%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Пн янв 12, 2015 11:42 pm

sergejey рассказал еще об одной интересной функции context_clear(); С новыми шаблонами общаться с Алисой стало намного интересней и полезней. Но бывает так, что нужно вывести Алису из текущего контекста. Например мы говорим о погоде, а надо сменить тему и перейти в контекст включи|выключи или какой либо другой. Для этого можно добавить глобальную команду, и назвать ее, к примеру, Забудь
Она позволяет сбросить текущий контекст у текущего пользователя.
Для удаления таймера события при не ответе, можно сделать так: clearTimeOut('user_'.context_getuser().'_contexttimeout'); Тут тоже есть интересная штуковина, а именно context_getuser(), которая по всей видимости возвращает id текущего пользователя. А если нам для чего то потребуется имя, то зная id достать его из базы данных не трудно.
Полный код команды Забудь:

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

context_clear();
clearTimeOut('user_'.context_getuser().'_contexttimeout');
say('Контекст забыт.'); 
СкринПоказать
Изображение
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение Amarok » Вт янв 13, 2015 5:40 am

Совсем запутался((
Моя Алиска живёт на Proxmox в Debian 12
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Вт янв 13, 2015 8:56 am

Посмотрите у меня в коннекте. Там в самом начале находится глобальный контекст и в нем есть эта команда Забудь и ранее предложенная sergejey команда Помощь
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Ср янв 14, 2015 3:40 pm

sergejey писал(а):
BlackWarrior писал(а):кстати, оно регистрозависимо оказывается(((((((((
Там стоит опция регистро-независимости, но, возможно, для русского языка оно некорректно работает, надо будет попробовать разобраться. Но вообще я использую всегда нижний регистр и программы распознавания, на сколько я знаю, всегда в нижнем регистре передают.
А вот и славно! Фразы, которые говорит Алиса, начинаются с заглавной буквы. И у них нет шансов вызвать ложное совпадение с командами пользователя.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение Amarok » Чт янв 15, 2015 7:51 am

Предлагаю Забудь прировнять к Ой всё :D
Моя Алиска живёт на Proxmox в Debian 12
triada13
Сообщения: 242
Зарегистрирован: Вт мар 11, 2014 8:36 pm
Откуда: Челябинск
Благодарил (а): 107 раз
Поблагодарили: 7 раз

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

Сообщение triada13 » Чт янв 15, 2015 8:01 am

BlackWarrior писал(а):Предлагаю Забудь прировнять к Ой всё :D
Или к: "а, ладно, проехали"
Majordomo на Orange Pi Zero.
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

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

Сообщение Ivan » Чт янв 15, 2015 8:21 am

Или "*дура*" :)
У меня когда не срабатывает на 4 раз, я пользуюсь шаблоном: "повтори. Я дура!"

Конечно глупо издеваться над бездушными алгоритмами, но подымает настроение.

Особо в прошлом году всем понравилась ёлочка. Детям просто прикольно. Для взрослых "Раз Два Три. Дура ёлочка гори"

PS. По моему у меня это слово должно включать контекст. "Сам такую сделал" :)
За это сообщение автора Ivan поблагодарил:
triada13 (Чт янв 15, 2015 8:48 am)
Рейтинг: 1.16%
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Ответить