Страница 40 из 42

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

Добавлено: Ср авг 17, 2022 11:03 am
Bagir
Предлагаю ознакомится с ветками шаблонов поведения в коннекте
Весь интерес в ветках:
  • Включи > свет > (комната)
    Какой > статус > (объекта)
    Какая > температура > (комната)
Идеи в:
  • Комбинированных шаблонах типа (Включи|Выключи)
    Выполнение последнего шаблона без указания его названия если команда дана в конкретной комнате
    Объединение в общий шаблон комнат с одинаковым кодом
    Управление автоматическим режимом реле без создания отдельных шаблонов
    Вариант кода управления несколькими реле из одного шаблона по уточняющим словам в команде
    Шаблон действия на группу реле определенной локации
    Добавление в ответ как долго работает устройство или на сколько актуальны данные для свойств объектов без данных UPDATED
Если что то заинтересует, поговорим подробно. К умным колонкам это отношение не имеет. Речь тут только о шаблонах.

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

Добавлено: Пт авг 19, 2022 8:52 am
Bagir
Немного новостей, связанных с Яндексом. Навык Электронный почтальон прошел модерацию на ключевое слово "моему ЭП", теперь сообщение в квазаре может выглядеть так: "Скажи моему ЭП отправить сообщение Алисе" Это отличная новость для тех, кому не хватало 100 символов в сценарии.
И вот ещё несколько полезных плюшек: "Скажи моему ЭП отправить сообщение молча Алисе с текстом включи свет". Много рассказывать не имеет смысла, те, кто пользуются этим навыком сразу всё поймут, для остальных не интересно. Основная суть в том, чтобы создать на частые команды отдельные сценарии в квазаре. Тогда они будут работать без задержки и фразы "передай сестре" как у меня.
Я сделал такие сценарии только на свет. Теперь просто говорю: "Алиса, включи свет". Ну а где включится свет, зависит уже от ваших шаблонов поведения. Выше я привел пример как всё разрулить. Теперь свет включается именно в той комнате, от куда было это сообщение.

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

Добавлено: Пт авг 19, 2022 10:29 am
xor
Bagir писал(а):
Пт авг 19, 2022 8:52 am
Немного новостей, связанных с Яндексом. Навык Электронный почтальон прошел модерацию на ключевое слово "моему ЭП", теперь сообщение в квазаре может выглядеть так: "Скажи моему ЭП отправить сообщение Алисе" Это отличная новость для тех, кому не хватало 100 символов в сценарии.
И вот ещё несколько полезных плюшек: "Скажи моему ЭП отправить сообщение молча Алисе с текстом включи свет". Много рассказывать не имеет смысла, те, кто пользуются этим навыком сразу всё поймут, для остальных не интересно. Основная суть в том, чтобы создать на частые команды отдельные сценарии в квазаре. Тогда они будут работать без задержки и фразы "передай сестре" как у меня.
Я сделал такие сценарии только на свет. Теперь просто говорю: "Алиса, включи свет". Ну а где включится свет, зависит уже от ваших шаблонов поведения. Выше я привел пример как всё разрулить. Теперь свет включается именно в той комнате, от куда было это сообщение.
Алиса, включи свет - как сценарий - не будет конфликтовать с аналогичной командой умного дома Яндекса?

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

Добавлено: Пт авг 19, 2022 12:27 pm
Bagir
xor писал(а):
Пт авг 19, 2022 10:29 am
Алиса, включи свет - как сценарий - не будет конфликтовать с аналогичной командой умного дома Яндекса?
Не будет, у него приоритет. У меня работает.

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

Добавлено: Пт авг 19, 2022 12:33 pm
Bagir
Вообще получилась весьма неплохая связка. Типа облачный транспорт для передачи сообщений в роли Телеграмма. Я бы даже успокоился, и фиг с ней, с лишней фразой, как у меня, "Алиса, передай сестре..." для запуска навыка почтальона, но вот эта пауза, пока грузится навык, и можно продолжить говорить, ну такое конечно. А отдельные шаблоны на каждую команду не напишешь.
Может быть Яндекс когда-нибудь даст возможность получать остаток текста в шаблоне квазара, и условие "Начинается с". Но им то это зачем, нас кормить разве что :mrgreen: Так что я особо не надеюсь.

Шаблон чтобы отложить задачу на время

Добавлено: Сб сен 03, 2022 4:49 pm
Bagir
Сильно я подсел на новую игрушку. Пришла мысль из напоминалки сделать шаблон, который может отложить выполнение любой задачи на какое то время. Допустим выключить свет через пять минут, или телик через час. Вообщем что угодно, что уже настроено в шаблонах.
Суть в следующем, Создаем шаблон с большим приоритетом, чтобы он первый перехватил сообщение и прекратил дальнейшую обработку шаблонов. У меня он располагается сразу после шаблона с общим контекстом
шаблон.jpg
шаблон.jpg (18.67 КБ) 1506 просмотров
Ставим галки не проверять другие шаблоны при совпадении и Не реагировать на системные сообщения
Шаблон (.*) через (.*)
Он сработает если после обычной команды мы добавим "через какое то время". Варианты пока небольшие: х дней х часов х минут х секунд. далее будет создано задание с текстом команды и таймером чтобы отложить выполнение. По истечении таймера текст будет добавлен в чат функцией say() но от имени пользователя, который это сказал ранее, что вызовет обычную реакцию других шаблонов.
Код шаблона:

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

$rnumber = 1;
while (1) {
  $rname = "Reminder_$rnumber";
  if (!timeOutExists($rname)) break;
  $rnumber++;
}

// "/(?<!\S)(....)(?!\S)/"
$parts = preg_split("/(?<=\s|^)(день|дня|дней|час|часа|часов|минут|минута|минуту|минуты|секунд|секунда|секунду|секунды)(?=\s|$)/", $matches[2],-1, PREG_SPLIT_DELIM_CAPTURE);

$s=0;
for ($i = 0; $i <= count($parts)-2; $i+=2) {
 //debmes($parts[$i+1].'='.trim(parts[$i])); 
     if (stripos($parts[$i+1], 'д') === 0) { $s+=word_to_number(trim($parts[$i]))*86400; }
 elseif (stripos($parts[$i+1], 'ч') === 0) { $s+=word_to_number(trim($parts[$i]))*3600; } 
 elseif (stripos($parts[$i+1], 'м') === 0) { $s+=word_to_number(trim($parts[$i]))*60; } 
 elseif (stripos($parts[$i+1], 'с') === 0) { $s+=word_to_number(trim($parts[$i]))*1; } 
}

$msgs=array('Задание создано', 'Сделаем', 'Постараюсь не забыть', 'Хорошо', 'Конечно');
say($msgs[array_rand($msgs)], 1); //через $s сек
setTimeOut($rname,"say('Задание: " . trim($matches[1]) . "', 0, $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));
}


Теперь о том, над чем ещё можно поработать. функция word_to_number не всегда хорошо отрабатывает замену цифр прописью, если в тексте присутствует ещё что то. Например "десять секунд", поэтому я вызываю её каждый раз после разбиения строки на массив по часам, минутам, секундам. По сути, в этом нет ничего страшного.
Сам вариант разбиения строки на массив. От моего кода у самого глаза слезятся. Идея в том, чтобы регуляркой разбить строку по ключам (часы, минуты ...) и затем умножить цифры на количество секунд в каждой группе. То есть, если бы после разбиения получить массив с фиксированной позицией дней, часов минут ... то тогда код выглядел бы очень хорошо. Так что если кто то поможет навести тут порядок, буду очень благодарен. Но тем не менее вариант уже вполне рабочий.

P. S. можно немного сократить регулярку
$parts = preg_split("/(?<=\s|^)(день|дня|дней|час\S*|минут\S*|секунд\S*)(?=\s|$)/", $matches[2],-1, PREG_SPLIT_DELIM_CAPTURE);

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

Добавлено: Пн сен 05, 2022 12:13 pm
Bagir
Вариант этой же задачи, но с использованием функции strtotime()
Я немного изменил регулярное выражение в функции word_to_number(). Теперь она работает со строками вида "десять минут пять секунд". Другими словами позволяет содержать любой текст в передаваемом параметре. В этом варианте цифры прописью заменяются все сразу.

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

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

}

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

Добавлено: Пн сен 05, 2022 3:43 pm
Bagir
sergejey писал(а):
Вт июн 09, 2015 4:00 pm
Небольшое обновление в работе шаблонов.

Захотелось мне реализовать одну интересную возможность, а именно давать условные поручения Алисе человеческим языком. Проще объяснить на примерах (голосовых) команд:
"когда я скажу привет скажи пока"
"когда откроются ворота включи свет в коридоре"
"если пойдёт дождь закрой гараж"
Поддержу своим примеров эту идею со временными шаблонами. Создаем новый шаблон с большим приоритетом. Название любое, у меня называется Условие. Шаблон: (Если|Когда) (.*) (то|тогда) (.*)
Не проверять другие шаблоны при совпадении ДА
Не реагировать на системные сообщения НЕТ

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

$new_pattern=array();
$new_pattern['ONETIME']=1; // флаг того, что шаблон будет одноразовый
$new_pattern['SKIPSYSTEM']=0; // флаг того, что шаблон не будет реагировать на системные уведомления, только пользовательские
$new_pattern['SCRIPT']='say("'.$matches[4].'",-1,'.$from_user_id.');'; // код реакции нашего шаблона
say("Добавлена реакция на слово \"".$matches[2]."\"",2); // подтверждаем то, что реакция добавлена
$s = SQLSelectOne('SELECT COUNT(*) as count FROM patterns WHERE ONETIME=1');
say("Количество временных шаблонов ".$s['count'],-1); // нужно любое сообщение, чтобы шаблон сразу не сработал на ключевое слово выше
addPattern($matches[2],$new_pattern,1); // добавляем описанный шаблон
Проверяем: Если привет то пока. При этом будет создан временный шаблон на слово Привет. Пишем Привет, система сразу один раз ответит Пока. Теперь как этим пользоваться. Если <совпадение с тем, что пишет система> то <команда, которая может быть обработана нашими шаблонами>. О практическом применении говорить не буду. Фишка есть, может и приживется, а может и нет. Но поиграться точно можно.

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

Добавлено: Вт сен 06, 2022 4:43 pm
homester
Bagir писал(а):
Пн сен 05, 2022 12:13 pm
Вариант этой же задачи, но с использованием функции strtotime()
Что-то у меня ошибка вылезла
Снимок.PNG
Снимок.PNG (7.53 КБ) 1376 просмотров

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

Добавлено: Вт сен 06, 2022 5:25 pm
Bagir
Поправил, кавычка потерялась чудным образом