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

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

Модератор: immortal

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

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

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

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

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

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

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

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

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

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.16%
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Stryzhak
Сообщения: 35
Зарегистрирован: Пт сен 27, 2019 3:37 pm
Благодарил (а): 21 раз
Поблагодарили: 2 раза

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
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

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.16%
Logrus
Сообщения: 2077
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 456 раз

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

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.16%
Stryzhak
Сообщения: 35
Зарегистрирован: Пт сен 27, 2019 3:37 pm
Благодарил (а): 21 раз
Поблагодарили: 2 раза

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
Сообщения: 35
Зарегистрирован: Пт сен 27, 2019 3:37 pm
Благодарил (а): 21 раз
Поблагодарили: 2 раза

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

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

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

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.16%
Ответить