Собственные обработчики системных событий

Новые релизы, обновления и т.п.

Модератор: immortal

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

Собственные обработчики системных событий

Сообщение sergejey » Чт июн 05, 2014 1:27 pm

В последнем обновлении исходников немного переработал раздел общих настроек в панеле управления.

Во-первых, настройки сейчас разбиты на секции, чтобы не всё в одной куче.

Во-вторых, добавилась секция Обработчики, в которой можно задать собственный код, который встраивается в системные функции.

Пока реализовано два обработчика:
After Say
Before Say

Этот код будет выполняться соответственнов в начале и в конце вызова системной функции say().

Пример использования:
Изображение
Текстом:

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

DebMes("Before say (".$level."): ".$ph);
DebMes("After say (".$level."): ".$ph); 
$level это параметр "важности" и $ph это сама фраза (собственно, это параметры системной функции say($ph,$level=0);)

В приведённом примере каждая фраза будет дополнительно записываться в лог-файл.

Таким же образом можно сделать вызов собственных методов, например:

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

callMethod('MyObject.MyMethod',array('ph'=>$ph,'level'=>$level)); 
и тогда в коде MyObject.MyMethod можно использовать
$params['ph'] -- фраза
$params['level'] -- уровень важности

Т.е. теперь можно создавать и подключать собственные средства оповещения.

Аналогичным образом можно будет добавить обработчики и на другие системные функции, но я пока не придумал, где ещё есть такая необходимость -- подсказывайте :)

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Собственные обработчики системных событий

Сообщение sergejey » Чт июн 05, 2014 1:31 pm

Небольшое уточнение насчёт After Say -- этот код выполнеяется не по окончанию произнесения фразы, а по окончанию выполнения функции say. Дело в том, что эта функция не ждёт, когда фраза будет произнесена (непосредственное произношение идёт в отдельном потоке). Просто имейте в виду, что для выполнения каких-либо действий после произношения лучше воспользоваться таймером, запуская его в Before Say (или After Say -- без разницы).

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Собственные обработчики системных событий

Сообщение Ivan » Чт июн 05, 2014 2:45 pm

Я уже заметил это когда реализовывал глушения радио. В итоге у меня новости проговариваются с ИКАМИ.

Хотел бы внести свои пожелания насчёт этих обработок. Они как раз нужны во время проговаривания фразы. Чтобы потушить радио. С таймером не угадаешь время произнесения
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Собственные обработчики системных событий

Сообщение Ivan » Чт июн 05, 2014 2:50 pm

Ещё вопрос как использовать эти обработчики для реализации модуля например skype
То есть есть ли на уровне ядра возможность подписаться на них?
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Собственные обработчики системных событий

Сообщение sergejey » Чт июн 05, 2014 3:06 pm

Ivan писал(а):Ещё вопрос как использовать эти обработчики для реализации модуля например skype
То есть есть ли на уровне ядра возможность подписаться на них?
Модуль автоматически не может подписаться. Хотя... есть вариант. Модуль может сам внести изменения в общие настройки через базу данных (например, при установке) и прописать вызов собственной функции. Например так:

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

SQLExec("UPDATE settings SET VALUE='include_once(DIR_MODULES.\"/mymodule/mymodule.class.php\");$m=new mymodule();$m->beforeSay($ph,$level);' WHERE `NAME`='HOOK_BEFORE_SAY'"); 
и соответственно в модуле mymodule должен быть метод beforeSay()

Насчёт таймеров -- мне кажется должно нормально работать, если принять что произнесённая фраза будет не дольше 5 секунд, то достаточно в afterSay поставить такой код:

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

runScript("myBeforeSayScript");clearTimeOut('afterSayTimer');setTimeOut('afterSayTimer','runScript("myAfterSayScript")',5); 
ну и скрипты должны быть myBeforeSayScript и myAfterSayScript

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
aurodionov
Сообщения: 87
Зарегистрирован: Пн янв 27, 2014 2:50 pm
Откуда: Россия, Тюмень
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Re: Собственные обработчики системных событий

Сообщение aurodionov » Вс июн 08, 2014 5:06 pm

Сергей, Огромное спасибо за обновление.
"Пушовер" больше не придётся менять руками после каждого обновления.
Из хотелок ,имя системы ,через что произносить голос.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Собственные обработчики системных событий

Сообщение sergejey » Пн июн 09, 2014 9:42 am

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

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

say(array('name'=>'Имя','text'=>"Фраза")); 
а в обработчик beforesay сделать следующее:

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

if (is_array($ph)) {$name=$ph['name']; $ph=$ph['text'];} 
ну и потом с $name делать всё, что угодно. параметров можно любое количество так передавать, при этом остаётся совместимость со стандартным способом

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

Re: Собственные обработчики системных событий

Сообщение Bagir » Вс авг 31, 2014 11:17 pm

sergejey писал(а):Аналогичным образом можно будет добавить обработчики и на другие системные функции, но я пока не придумал, где ещё есть такая необходимость -- подсказывайте :)
Если я правильно понял, что таким образом можно увести чтение сообщений в свою программу, то тогда было бы неплохо добавить такие же обработчики на функцию playSound, чтобы так же перехватить имена файлов со звуковыми сообщениями, и не проигрывать их в madplay.exe, а утащить себе, где они будут выстроены в очередь с чтением текстовых сообщений.
Только вот я еще не разобрался, как этот перехват сделать. Допустим в beforeSay() я сделаю вызов своего метода

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

callMethod('MyObject.MyMethod',array('ph'=>$ph,'level'=>$level));  
В этом методе текст будет отправлен в другую программу, и там будет прочтен. А как запретить его чтение тут? Наверное то же самое и со звуковыми файлами.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Ответить