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

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

Модератор: immortal

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

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

Сообщение yden » Вс фев 17, 2019 3:28 pm

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

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

благодарю
Chainik
Сообщения: 1365
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 225 раз
Поблагодарили: 429 раз

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

Сообщение Chainik » Вс фев 17, 2019 3:41 pm

Сходу код не подскажу, но самый простой вариант иметь дополнительно метку времени типа Timestamp (количество секунд с полуночи 1 января 1970 года).
Тогда все упрощается. Делаем разность между текущим временем (функция time()) и меткой времени, делим на 60 и округляем до минут.
Logrus
Сообщения: 1764
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 296 раз
Поблагодарили: 364 раза

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

Сообщение Logrus » Вс фев 17, 2019 3:42 pm

"поморщу лоб" (с)
timeConvert
и еще больше, но выше будет достаточно на интервале текущего дня
mktime
последняя ссылка на прекрасный справочник, справа список близких функций

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

$tm = '17:20';
$time = time();
$timeDiffMin = floor(($time - timeConvert($tm))/60);
echo $timeDiffMin;
За это сообщение автора Logrus поблагодарил:
yden (Вс фев 17, 2019 4:16 pm)
Рейтинг: 1.18%
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Stryzhak
Сообщения: 16
Зарегистрирован: Пт сен 27, 2019 3:37 pm
Благодарил (а): 8 раз
Поблагодарили: 1 раз

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

Сообщение 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. Подскажите, что я понимаю не правильно. Спасибо вам.
Chainik
Сообщения: 1365
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 225 раз
Поблагодарили: 429 раз

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

Сообщение 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);
}
За это сообщение автора Chainik поблагодарил:
Stryzhak (Чт апр 01, 2021 4:42 pm)
Рейтинг: 1.18%
Logrus
Сообщения: 1764
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 296 раз
Поблагодарили: 364 раза

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

Сообщение Logrus » Ср мар 31, 2021 7:03 pm

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 КБ) 549 просмотров
давно говорю что статистика нужна
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
xor
Сообщения: 1741
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 213 раз
Поблагодарили: 522 раза

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

Сообщение xor » Чт апр 01, 2021 2:47 am

Stryzhak писал(а):
Ср мар 31, 2021 4:16 pm
Здравствуйте дорогие друзья!
У меня схожая задача: надо посчитать время от изменения статуса обьекта с 1 на 0. Я написал такой сценарий:
если есть история свойства статуса насоса -
посмотрите https://connect.smartliving.ru/profile/ ... omili.html
За это сообщение автора xor поблагодарил:
Chainik (Чт апр 01, 2021 8:35 am)
Рейтинг: 1.18%
Stryzhak
Сообщения: 16
Зарегистрирован: Пт сен 27, 2019 3:37 pm
Благодарил (а): 8 раз
Поблагодарили: 1 раз

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

Сообщение Stryzhak » Чт апр 01, 2021 4:43 pm

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);
}
Огромное спасибо, все заработало
Stryzhak
Сообщения: 16
Зарегистрирован: Пт сен 27, 2019 3:37 pm
Благодарил (а): 8 раз
Поблагодарили: 1 раз

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

Сообщение Stryzhak » Пт апр 02, 2021 1:32 pm

У меня появился новый вопрос: А как сделать так, чтобы этот скрипт в реальном времени следил за временем работы насоса -Pump3.status'==1, и если это время превышает заданый мною наперед интервал, извещало, или делало что то еще, что я наперед пропишу? Но суть в том, как сделать тригер по времени активного включения?
Спасибо вам.
fandaymon
Сообщения: 1347
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 37 раз
Поблагодарили: 505 раз

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

Сообщение fandaymon » Пт апр 02, 2021 1:54 pm

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

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

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

в качестве команды написать say, если нужно что-то сказать или rs('Название сценария'); если нужно сделать что-то более сложное.
За это сообщение автора fandaymon поблагодарил:
Stryzhak (Пт апр 02, 2021 2:18 pm)
Рейтинг: 1.18%
Ответить