Страница 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'));