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

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

Добавлено: Пн авг 17, 2020 7:28 pm
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 учесть?

благодарю

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

Добавлено: Вт авг 18, 2020 11:55 am
xor
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


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

Добавлено: Вт авг 18, 2020 5:04 pm
xor
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() как раз возвращает текущее время в в юникс тайм - формате. легко можно сравнивать, добавлять/уменьшать значения времени без оглядки на переход дат

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

Добавлено: Вт авг 18, 2020 8:40 pm
yden
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() - пришлось бы очень часто переопределять таймеры.

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

сенк

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

Добавлено: Ср авг 19, 2020 12:43 am
xor
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
}
проверки в минутном цикле не нужно

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

Добавлено: Ср авг 19, 2020 5:24 pm
yden
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'));