timeAfter(), переход через 12 часов ночи

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 28 раз
Поблагодарили: 5 раз

timeAfter(), переход через 12 часов ночи

Сообщение yden » Пн авг 17, 2020 7:28 pm

Добрый.
Подскажите плиз, как запрограммировать следующее.
При сработке датчика движения я кодом записываю время срабатывания и в свойство объекта PirZal.motion заношу 1:

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

sg('PirZal.motionTime',date('H:i'));
if (!gg('PirZal.motion')) sg('PirZal.motion', 1);
Следующим кодом (раз в минуту выполняется) я через 10 минут обнуляю указанное выше свойство:

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

$timeMotionZal = timeConvert(gg('PirZal.motionTime'))+60*10;
if (timeAfter($timeMotionZal)) sg('PirZal.motion', 0);
Естественно в коде есть еще команды, но к вопросу они не относятся.
Проблема: датчик сработал в 23:55, в свойство PirZal.motion записана 1. 10 минут проходит и не происходит изменения этого свойства. Все это из-за перехода через 12 часов ночи.
timeAfter($timeMotionZal) для этой ситуации не подходит. В другое время все работает.
Как можно изменить код, чтобы этот переход через 12 учесть?

благодарю
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

Re: timeAfter(), переход через 12 часов ночи

Сообщение xor » Вт авг 18, 2020 11:55 am

yden писал(а):Добрый.
Подскажите плиз, как запрограммировать следующее.
При сработке датчика движения я кодом записываю время срабатывания и в свойство объекта PirZal.motion заношу 1:

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

sg('PirZal.motionTime',date('H:i'));
if (!gg('PirZal.motion')) sg('PirZal.motion', 1);
Следующим кодом (раз в минуту выполняется) я через 10 минут обнуляю указанное выше свойство:

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

$timeMotionZal = timeConvert(gg('PirZal.motionTime'))+60*10;
if (timeAfter($timeMotionZal)) sg('PirZal.motion', 0);
Естественно в коде есть еще команды, но к вопросу они не относятся.
Проблема: датчик сработал в 23:55, в свойство PirZal.motion записана 1. 10 минут проходит и не происходит изменения этого свойства. Все это из-за перехода через 12 часов ночи.
timeAfter($timeMotionZal) для этой ситуации не подходит. В другое время все работает.
Как можно изменить код, чтобы этот переход через 12 учесть?

благодарю
Посмотрите функцию таймера settimeout(), если вам надо что-то переключить спустя 10 минут. Вам же не обязательно абсолютное время учитывать? Если нужно запланировать какое-нибудь действие по абсолютному времени, можно addSheduledJob() использовать. Посмотрите в бз планирование задач.

Отправлено с моего Redmi 4X через Tapatalk

Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

Re: timeAfter(), переход через 12 часов ночи

Сообщение xor » Вт авг 18, 2020 5:04 pm

yden писал(а):
Пн авг 17, 2020 7:28 pm
Добрый.
Подскажите плиз, как запрограммировать следующее.
При сработке датчика движения я кодом записываю время срабатывания и в свойство объекта PirZal.motion заношу 1:

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

sg('PirZal.motionTime',date('H:i'));
if (!gg('PirZal.motion')) sg('PirZal.motion', 1);
Следующим кодом (раз в минуту выполняется) я через 10 минут обнуляю указанное выше свойство:

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

$timeMotionZal = timeConvert(gg('PirZal.motionTime'))+60*10;
if (timeAfter($timeMotionZal)) sg('PirZal.motion', 0);
Естественно в коде есть еще команды, но к вопросу они не относятся.
Проблема: датчик сработал в 23:55, в свойство PirZal.motion записана 1. 10 минут проходит и не происходит изменения этого свойства. Все это из-за перехода через 12 часов ночи.
timeAfter($timeMotionZal) для этой ситуации не подходит. В другое время все работает.
Как можно изменить код, чтобы этот переход через 12 учесть?

благодарю
а еще замечание - если не хотите работать через таймеры/джобы, храните время в юникс тайм - формате. легко можно проверять без учета переходов через 12. Функция time() как раз возвращает текущее время в в юникс тайм - формате. легко можно сравнивать, добавлять/уменьшать значения времени без оглядки на переход дат
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 28 раз
Поблагодарили: 5 раз

Re: timeAfter(), переход через 12 часов ночи

Сообщение yden » Вт авг 18, 2020 8:40 pm

xor писал(а):
Вт авг 18, 2020 5:04 pm
yden писал(а):
Пн авг 17, 2020 7:28 pm
Добрый.
Подскажите плиз, как запрограммировать следующее.
При сработке датчика движения я кодом записываю время срабатывания и в свойство объекта PirZal.motion заношу 1:

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

sg('PirZal.motionTime',date('H:i'));
if (!gg('PirZal.motion')) sg('PirZal.motion', 1);
Следующим кодом (раз в минуту выполняется) я через 10 минут обнуляю указанное выше свойство:

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

$timeMotionZal = timeConvert(gg('PirZal.motionTime'))+60*10;
if (timeAfter($timeMotionZal)) sg('PirZal.motion', 0);
Естественно в коде есть еще команды, но к вопросу они не относятся.
Проблема: датчик сработал в 23:55, в свойство PirZal.motion записана 1. 10 минут проходит и не происходит изменения этого свойства. Все это из-за перехода через 12 часов ночи.
timeAfter($timeMotionZal) для этой ситуации не подходит. В другое время все работает.
Как можно изменить код, чтобы этот переход через 12 учесть?

благодарю
а еще замечание - если не хотите работать через таймеры/джобы, храните время в юникс тайм - формате. легко можно проверять без учета переходов через 12. Функция time() как раз возвращает текущее время в в юникс тайм - формате. легко можно сравнивать, добавлять/уменьшать значения времени без оглядки на переход дат
Я как раз от таймеров и хотел избавиться. Чтобы добиться того же эффекта с таймерами, что у меня получилось с timeAfter() - пришлось бы очень часто переопределять таймеры.

Честно, я про юникс тайм не понял. Можете примером, плиз :)

сенк
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

Re: timeAfter(), переход через 12 часов ночи

Сообщение xor » Ср авг 19, 2020 12:43 am

yden писал(а):
Вт авг 18, 2020 8:40 pm
Я как раз от таймеров и хотел избавиться. Чтобы добиться того же эффекта с таймерами, что у меня получилось с timeAfter() - пришлось бы очень часто переопределять таймеры.

Честно, я про юникс тайм не понял. Можете примером, плиз :)

сенк
про юникс тайм - вот просто ваш код переписал

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

if (!gg('PirZal.motion')) { //датчик сработал
  sg('PirZal.motionTime',time()); //запомним юникс время
  sg('PirZal.motion', 1); // движение=1
}
  
Следующим кодом (раз в минуту выполняется) я через 10 минут обнуляю указанное выше свойство:

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

if ((time()-gg('PirZal.motionTime'))>60*10) sg('PirZal.motion', 0);
строка будет сбрасывать дд каждую минуту(ну как и при timeAfter) после истечения 10 мин после срабатывания

вариант с таймером

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

if (!gg('PirZal.motion')) { //датчик сработал
  settimeout('pirZal_motion','sg('PirZal.motion', 0);',60*10);
  sg('PirZal.motion', 1); // движение=1
}
проверки в минутном цикле не нужно
За это сообщение автора xor поблагодарил:
yden (Ср авг 19, 2020 6:27 am)
Рейтинг: 1.16%
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 28 раз
Поблагодарили: 5 раз

Re: timeAfter(), переход через 12 часов ночи

Сообщение yden » Ср авг 19, 2020 5:24 pm

xor писал(а):
Ср авг 19, 2020 12:43 am
yden писал(а):
Вт авг 18, 2020 8:40 pm
Я как раз от таймеров и хотел избавиться. Чтобы добиться того же эффекта с таймерами, что у меня получилось с timeAfter() - пришлось бы очень часто переопределять таймеры.

Честно, я про юникс тайм не понял. Можете примером, плиз :)

сенк
про юникс тайм - вот просто ваш код переписал

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

if (!gg('PirZal.motion')) { //датчик сработал
  sg('PirZal.motionTime',time()); //запомним юникс время
  sg('PirZal.motion', 1); // движение=1
}
  
Следующим кодом (раз в минуту выполняется) я через 10 минут обнуляю указанное выше свойство:

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

if ((time()-gg('PirZal.motionTime'))>60*10) sg('PirZal.motion', 0);
строка будет сбрасывать дд каждую минуту(ну как и при timeAfter) после истечения 10 мин после срабатывания

вариант с таймером

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

if (!gg('PirZal.motion')) { //датчик сработал
  settimeout('pirZal_motion','sg('PirZal.motion', 0);',60*10);
  sg('PirZal.motion', 1); // движение=1
}
проверки в минутном цикле не нужно
Благодарю, получилось.
С time() сделал. Только пришлось еще одно свойство объекта завести - стандартное время, hh:mm, чтобы на сцене отображать время обнаружения движения:

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

sg('PirZal.motionTime',time());
sg('PirZal.motionTimeStandard',date('H:i'));
Ответить