Страница 1 из 1

Пожалуйста немного больше о таймерах.

Добавлено: Чт сен 04, 2014 11:10 pm
Bagir
В разделе Встроенные функции есть указания как создать теймер, как его удалить, и как проверить есть ли такой сейчас. timeOutExists возвращает идентификатор таймера, а если его нет, вернет 0. Отлично подходит в конструкции if.
Можно легко сделать вариант отодвигания таймера. Допустим у нас есть условие, что свет должен гореть 5 минут после обнаружения движения. Сделать это просто. При срабатывании датчика мы удаляем и вновь создаем новый таймер с периодом 5 минут.
А теперь вопрос знатокам: Как быть, если таких условий несколько, и период у них разный. Допустим, по событию дотчика движения, свет должен гореть 5 минут. По событию геркона на двери - 10 минут. А по значку в сценах - 15 минут. В чем прикол? а втом, что если мы запустили таймр на 15 минут, то по событию датчика движения таймер перезапустится всего она 5. Следовательно, при перезапуске таймера нам надо знать, сколько времени он будет еще работать, и сравнить это время со временем нового таймера. И возможно, что время нового таймера будет меньше, чем остаточное время у текущего таймера.
Ну вот собственно и вопрос: Как узнать, сколько еще время будет работать таймер. Это полюбому уже где то и не раз обсуждалось. Ну вот не находится у меня многое поиском.
В будущем наверное еще буду приставать с подобным вопросом, но уже про события. Штука тоже крайне интересная, но чтобы ей пользоваться, надо уметь получать данные из всех ее полей.

Re: Пожалуйста немного больше о таймерах.

Добавлено: Пт сен 05, 2014 10:29 am
sergejey
А вот кстати такого вопроса и не было :)
Честно говоря, мне не приходилось сталкиваться с тем, что необходимо один таймер "отодвигать" на разное время. Могу предложить такой "хак" для того, чтобы узнать, через какое время установлен таймер:

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

$timerId=timeOutExists('myTimer');
if ($timerId) {
 $timer_job=SQLSelectOne("SELECT UNIX_TIMESTAMP(RUNTIME) as TM FROM jobs WHERE ID='".$timerId."'");
 $diff=(int)$timer_job['TM']-time(); // получаем время в секундах, оставшееся до запланированного срабатывания таймера
} 

Re: Пожалуйста немного больше о таймерах.

Добавлено: Пт сен 05, 2014 1:26 pm
Ivan
Я делаю отдельную переменную в ThisComputer и в ней храню значение последнего срабатывания.
И когда нужно беру из неё значение

Использую при срабатывании будильника.
Смысл такой. Будильник выключает NightMode (Или 11:00 часов). Но я то встаю не сразу, долго слушаю радио :) и встаю через 10-20 мин.

При этом срабатывает проверка датчиков движений. Понятное дело что движений нет, и Алиса переводит в режим NobadyHome (говорит: Кажется никого нет дома). А когда я встаю переводит в "Кто то дома". (говорит: добро пожаловать)

Чтобы такого не было, сохраняю время последнее срабатывание будильника. И отодвигает проверку на NobadyHome

Re: Пожалуйста немного больше о таймерах.

Добавлено: Пт сен 05, 2014 9:15 pm
Bagir
sergejey, благодарю! Отлично работает!
Не то уж, чтобы для меня было так важно сделать разные периоды задержки включения освещения от разных источников событий, но вот чую, что в будущем мне это очень пригодится. Например с вентиляцией. И на примере этих фонарей я хотел просто отработать тему. Опять выручайте меня с хитрым вопросом )) Пожалуй пора создавать в ./lib/ свой закуток.
Ivan, я думал сделать так. И в Вашем случае это отличный вариант. Но вот для каждого случая мне просто не хотелось заводить лишние свойства. У меня уже есть опыт с предыдущей системой, когда в попытках получить желаемое, и за нехваткой инструментов, я на прикручивал кучу скриптов, и своих небольших программ. А когда пришлось немного изменить поведение системы, в конечном итоге и сам запутался. Тут же все офигенно, прозрачно и понятно. Объектная модель + язык программирования просто рвут в клочья любой планировщик. Жаль, что я понял это не сразу.

Re: Пожалуйста немного больше о таймерах.

Добавлено: Ср сен 10, 2014 7:41 pm
Bagir
А вот скажите, обязательно ли надо в случае отодвигания таймера, перед созданием нового с тем же именем, удалять предыдущий?
То есть такая ситуация: Мы точно знаем, что таймер с именем "test_timer" сейчас существует, и ему еще тикать несколько минут. А нам надо отодвинуть таймер на час. Не добавить, а заменить, хотя к вопросу это уже не имеет отношение. Алгоритм такой: Удаляем существующий таймер, и добавляем новый. А зачем удалять, если новый перезаписывает существующий?

Re: Пожалуйста немного больше о таймерах.

Добавлено: Чт сен 11, 2014 12:22 pm
sergejey
Удалять не обязательно -- при создании нового таймера с таким же именем старый удалится сам собой.

Re: Пожалуйста немного больше о таймерах.

Добавлено: Чт сен 11, 2014 12:25 pm
Bagir
Спасибо за комментарий! Я видел что так происходит, но после Вашего подтверждения как то спокойней ))
И к стати, определение оставшегося времени работы таймера мне уже пригодилось дважды. Очень полезная функция!