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

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

Модератор: immortal

Аватара пользователя
Bagir
Сообщения: 1601
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 203 раза
Поблагодарили: 367 раз

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

Сообщение Bagir » Ср авг 17, 2022 11:03 am

Предлагаю ознакомится с ветками шаблонов поведения в коннекте
Весь интерес в ветках:
  • Включи > свет > (комната)
    Какой > статус > (объекта)
    Какая > температура > (комната)
Идеи в:
  • Комбинированных шаблонах типа (Включи|Выключи)
    Выполнение последнего шаблона без указания его названия если команда дана в конкретной комнате
    Объединение в общий шаблон комнат с одинаковым кодом
    Управление автоматическим режимом реле без создания отдельных шаблонов
    Вариант кода управления несколькими реле из одного шаблона по уточняющим словам в команде
    Шаблон действия на группу реле определенной локации
    Добавление в ответ как долго работает устройство или на сколько актуальны данные для свойств объектов без данных UPDATED
Если что то заинтересует, поговорим подробно. К умным колонкам это отношение не имеет. Речь тут только о шаблонах.
За это сообщение автора Bagir поблагодарили (всего 2):
andrey040670 (Ср авг 17, 2022 11:22 am) • homester (Ср авг 17, 2022 3:34 pm)
Рейтинг: 2.35%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1601
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 203 раза
Поблагодарили: 367 раз

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

Сообщение Bagir » Пт авг 19, 2022 8:52 am

Немного новостей, связанных с Яндексом. Навык Электронный почтальон прошел модерацию на ключевое слово "моему ЭП", теперь сообщение в квазаре может выглядеть так: "Скажи моему ЭП отправить сообщение Алисе" Это отличная новость для тех, кому не хватало 100 символов в сценарии.
И вот ещё несколько полезных плюшек: "Скажи моему ЭП отправить сообщение молча Алисе с текстом включи свет". Много рассказывать не имеет смысла, те, кто пользуются этим навыком сразу всё поймут, для остальных не интересно. Основная суть в том, чтобы создать на частые команды отдельные сценарии в квазаре. Тогда они будут работать без задержки и фразы "передай сестре" как у меня.
Я сделал такие сценарии только на свет. Теперь просто говорю: "Алиса, включи свет". Ну а где включится свет, зависит уже от ваших шаблонов поведения. Выше я привел пример как всё разрулить. Теперь свет включается именно в той комнате, от куда было это сообщение.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
xor
Сообщения: 1914
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 260 раз
Поблагодарили: 591 раз

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

Сообщение xor » Пт авг 19, 2022 10:29 am

Bagir писал(а):
Пт авг 19, 2022 8:52 am
Немного новостей, связанных с Яндексом. Навык Электронный почтальон прошел модерацию на ключевое слово "моему ЭП", теперь сообщение в квазаре может выглядеть так: "Скажи моему ЭП отправить сообщение Алисе" Это отличная новость для тех, кому не хватало 100 символов в сценарии.
И вот ещё несколько полезных плюшек: "Скажи моему ЭП отправить сообщение молча Алисе с текстом включи свет". Много рассказывать не имеет смысла, те, кто пользуются этим навыком сразу всё поймут, для остальных не интересно. Основная суть в том, чтобы создать на частые команды отдельные сценарии в квазаре. Тогда они будут работать без задержки и фразы "передай сестре" как у меня.
Я сделал такие сценарии только на свет. Теперь просто говорю: "Алиса, включи свет". Ну а где включится свет, зависит уже от ваших шаблонов поведения. Выше я привел пример как всё разрулить. Теперь свет включается именно в той комнате, от куда было это сообщение.
Алиса, включи свет - как сценарий - не будет конфликтовать с аналогичной командой умного дома Яндекса?
Аватара пользователя
Bagir
Сообщения: 1601
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 203 раза
Поблагодарили: 367 раз

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

Сообщение Bagir » Пт авг 19, 2022 12:27 pm

xor писал(а):
Пт авг 19, 2022 10:29 am
Алиса, включи свет - как сценарий - не будет конфликтовать с аналогичной командой умного дома Яндекса?
Не будет, у него приоритет. У меня работает.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1601
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 203 раза
Поблагодарили: 367 раз

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

Сообщение Bagir » Пт авг 19, 2022 12:33 pm

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

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

Сообщение Bagir » Сб сен 03, 2022 4:49 pm

Сильно я подсел на новую игрушку. Пришла мысль из напоминалки сделать шаблон, который может отложить выполнение любой задачи на какое то время. Допустим выключить свет через пять минут, или телик через час. Вообщем что угодно, что уже настроено в шаблонах.
Суть в следующем, Создаем шаблон с большим приоритетом, чтобы он первый перехватил сообщение и прекратил дальнейшую обработку шаблонов. У меня он располагается сразу после шаблона с общим контекстом
шаблон.jpg
шаблон.jpg (18.67 КБ) 318 просмотров
Ставим галки не проверять другие шаблоны при совпадении и Не реагировать на системные сообщения
Шаблон (.*) через (.*)
Он сработает если после обычной команды мы добавим "через какое то время". Варианты пока небольшие: х дней х часов х минут х секунд. далее будет создано задание с текстом команды и таймером чтобы отложить выполнение. По истечении таймера текст будет добавлен в чат функцией 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);
За это сообщение автора Bagir поблагодарили (всего 3):
andrey040670 (Сб сен 03, 2022 5:06 pm) • Chainik (Сб сен 03, 2022 7:43 pm) • homester (Вс сен 04, 2022 2:42 am)
Рейтинг: 3.53%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1601
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 203 раза
Поблагодарили: 367 раз

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

Сообщение Bagir » Пн сен 05, 2022 12:13 pm

Вариант этой же задачи, но с использованием функции 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));

}
Последний раз редактировалось Bagir Вт сен 06, 2022 5:22 pm, всего редактировалось 1 раз.
За это сообщение автора Bagir поблагодарили (всего 2):
andrey040670 (Пн сен 05, 2022 1:02 pm) • homester (Вт сен 06, 2022 3:04 am)
Рейтинг: 2.35%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1601
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 203 раза
Поблагодарили: 367 раз

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

Сообщение Bagir » Пн сен 05, 2022 3:43 pm

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); // добавляем описанный шаблон
Проверяем: Если привет то пока. При этом будет создан временный шаблон на слово Привет. Пишем Привет, система сразу один раз ответит Пока. Теперь как этим пользоваться. Если <совпадение с тем, что пишет система> то <команда, которая может быть обработана нашими шаблонами>. О практическом применении говорить не буду. Фишка есть, может и приживется, а может и нет. Но поиграться точно можно.
За это сообщение автора Bagir поблагодарил:
homester (Вт сен 06, 2022 3:40 am)
Рейтинг: 1.18%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
homester
Сообщения: 193
Зарегистрирован: Вт дек 24, 2019 2:09 pm
Благодарил (а): 110 раз
Поблагодарили: 34 раза

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

Сообщение homester » Вт сен 06, 2022 4:43 pm

Bagir писал(а):
Пн сен 05, 2022 12:13 pm
Вариант этой же задачи, но с использованием функции strtotime()
Что-то у меня ошибка вылезла
Снимок.PNG
Снимок.PNG (7.53 КБ) 188 просмотров
Raspberry Pi3 B+, v4.44, внешняя з/к
Аватара пользователя
Bagir
Сообщения: 1601
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 203 раза
Поблагодарили: 367 раз

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

Сообщение Bagir » Вт сен 06, 2022 5:25 pm

Поправил, кавычка потерялась чудным образом
За это сообщение автора Bagir поблагодарил:
homester (Вт сен 06, 2022 5:34 pm)
Рейтинг: 1.18%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Ответить