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

Длительность события, в минутах

Добавлено: Вс фев 17, 2019 3:28 pm
yden
Добрый.
Подскажите пожалуйста. Нужно вытащить с мдм длительность события. Суть: есть переменные вида '13:00' - время, типа метки. Задается кодом или берется со свойства объекта. Есть текущее время. Нужно вычислить сколько минут прошло со времени установки метки, именно минут. Подкиньте плиз идею. Не очень силен во временных функциях.

Пример. Сейчас текущее 20:20, кодом задается метка 20:10. Нужно получить эти 10 минут.

благодарю

Re: Длительность события, в минутах

Добавлено: Вс фев 17, 2019 3:41 pm
Chainik
Сходу код не подскажу, но самый простой вариант иметь дополнительно метку времени типа Timestamp (количество секунд с полуночи 1 января 1970 года).
Тогда все упрощается. Делаем разность между текущим временем (функция time()) и меткой времени, делим на 60 и округляем до минут.

Re: Длительность события, в минутах

Добавлено: Вс фев 17, 2019 3:42 pm
Logrus
"поморщу лоб" (с)
timeConvert
и еще больше, но выше будет достаточно на интервале текущего дня
mktime
последняя ссылка на прекрасный справочник, справа список близких функций

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

$tm = '17:20';
$time = time();
$timeDiffMin = floor(($time - timeConvert($tm))/60);
echo $timeDiffMin;

Re: Длительность события, в минутах

Добавлено: Ср мар 31, 2021 4:16 pm
Stryzhak
Здравствуйте дорогие друзья!
У меня схожая задача: надо посчитать время от изменения статуса обьекта с 1 на 0. Я написал такой сценарий:

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

if (gg('Pump3.status')==1){
$start=time();
if (gg('Pump3.status')==0){
$finish= gg('Pump3.updated');
 }
$duration=$finish-$start;
setGlobal('Pump3.durationLast',($duration));
say('длительность работы насоса '.$duration.' секунд',1);
}
Но после выполнения этого кода я получаю отрицательное значение, а именно: -1617173637 или примерно такое.
Такое впечатления, что оно отнимает от нуля, то есть переменная $finish как бы равна 0. Я пробовал ей присваевать значение time(). Но результат тот же. и второй момент это то, что оно почемуто выполняет другое условие внутри первого сразу же, не дожидаясь что свойство Pump3.status' станет 0. Подскажите, что я понимаю не правильно. Спасибо вам.

Re: Длительность события, в минутах

Добавлено: Ср мар 31, 2021 4:44 pm
Chainik
Когда насос стартует, он может проработать минуты и часы, а ваш скрипт никуда не сохраняет время старта. Кроме того ваша версия скрипта будет отрабатывать только в случае 'Pump3.status'==1. В одно и то же время свойство не может принимать одновременно 2 значения ("1" и "0"). Отсюда понятно, почему в переменной $finish у вас "0".

Думаю, не хватает свойства, куда бы сохранялось время старта насоса ("startTime"). Добавьте его. Вот так, видимо, заработает:

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

if (gg('Pump3.status')==1){
setGlobal('Pump3.startTime',time());
return;}
if (gg('Pump3.status')==0){
$finish=time();
$start=gg('Pump3.startTime');
$duration=$finish-$start;
setGlobal('Pump3.durationLast',$duration);
say('длительность работы насоса '.$duration.' секунд',1);
}

Re: Длительность события, в минутах

Добавлено: Ср мар 31, 2021 7:03 pm
Logrus
Stryzhak писал(а):
Ср мар 31, 2021 4:16 pm
Здравствуйте дорогие друзья!
У меня схожая задача: надо посчитать время от изменения статуса обьекта с 1 на 0. Я написал такой сценарий:

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

if (gg('Pump3.status')==1){
$start=time();
if (gg('Pump3.status')==0){
$finish= gg('Pump3.updated');
 }
$duration=$finish-$start;
setGlobal('Pump3.durationLast',($duration));
say('длительность работы насоса '.$duration.' секунд',1);
}
Но после выполнения этого кода я получаю отрицательное значение, а именно: -1617173637 или примерно такое.
Такое впечатления, что оно отнимает от нуля, то есть переменная $finish как бы равна 0. Я пробовал ей присваевать значение time(). Но результат тот же. и второй момент это то, что оно почемуто выполняет другое условие внутри первого сразу же, не дожидаясь что свойство Pump3.status' станет 0. Подскажите, что я понимаю не правильно. Спасибо вам.
СпойлерПоказать
Screenshot_2021-03-31-20-57-01.png
Screenshot_2021-03-31-20-57-01.png (57.6 КБ) 2851 просмотр
давно говорю что статистика нужна

Re: Длительность события, в минутах

Добавлено: Чт апр 01, 2021 2:47 am
xor
Stryzhak писал(а):
Ср мар 31, 2021 4:16 pm
Здравствуйте дорогие друзья!
У меня схожая задача: надо посчитать время от изменения статуса обьекта с 1 на 0. Я написал такой сценарий:
если есть история свойства статуса насоса -
посмотрите https://connect.smartliving.ru/profile/ ... omili.html

Re: Длительность события, в минутах

Добавлено: Чт апр 01, 2021 4:43 pm
Stryzhak
Chainik писал(а):
Ср мар 31, 2021 4:44 pm
Когда насос стартует, он может проработать минуты и часы, а ваш скрипт никуда не сохраняет время старта. Кроме того ваша версия скрипта будет отрабатывать только в случае 'Pump3.status'==1. В одно и то же время свойство не может принимать одновременно 2 значения ("1" и "0"). Отсюда понятно, почему в переменной $finish у вас "0".

Думаю, не хватает свойства, куда бы сохранялось время старта насоса ("startTime"). Добавьте его. Вот так, видимо, заработает:

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

if (gg('Pump3.status')==1){
setGlobal('Pump3.startTime',time());
return;}
if (gg('Pump3.status')==0){
$finish=time();
$start=gg('Pump3.startTime');
$duration=$finish-$start;
setGlobal('Pump3.durationLast',$duration);
say('длительность работы насоса '.$duration.' секунд',1);
}
Огромное спасибо, все заработало

Re: Длительность события, в минутах

Добавлено: Пт апр 02, 2021 1:32 pm
Stryzhak
У меня появился новый вопрос: А как сделать так, чтобы этот скрипт в реальном времени следил за временем работы насоса -Pump3.status'==1, и если это время превышает заданый мною наперед интервал, извещало, или делало что то еще, что я наперед пропишу? Но суть в том, как сделать тригер по времени активного включения?
Спасибо вам.

Re: Длительность события, в минутах

Добавлено: Пт апр 02, 2021 1:54 pm
fandaymon
Stryzhak писал(а):
Пт апр 02, 2021 1:32 pm
У меня появился новый вопрос: А как сделать так, чтобы этот скрипт в реальном времени следил за временем работы насоса -Pump3.status'==1, и если это время превышает заданый мною наперед интервал, извещало, или делало что то еще, что я наперед пропишу? Но суть в том, как сделать тригер по времени активного включения?
Спасибо вам.
При включении запускать таймер на этот заданный интервал.

SetTimeOut('title','commands', $timeout); -- $timeout в секундах

https://kb.mjdm.ru/vstroennie-v-majordomo-funkcii/

в качестве команды написать say, если нужно что-то сказать или rs('Название сценария'); если нужно сделать что-то более сложное.