Помогите с кодом (с логикой) пожалуйста

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

Модератор: immortal

markovrv
Сообщения: 33
Зарегистрирован: Пт апр 28, 2017 9:10 pm
Благодарил (а): 20 раз
Поблагодарили: 16 раз

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение markovrv » Чт май 13, 2021 1:18 am

Chainik писал(а):
Чт май 13, 2021 12:06 am
Друзья! Я тут по наличию времени "сочиняю", чтобы долго не рыться в поисках ответа, может подскажите, как проще извлечь значение из строки? В общем, получаю нужную мне строчку из истории в виде:
{"VALUE":"555.25","ADDED":"2021-05-12 18:20:14"}
Каким образом проще извлечь из строки значение 555.25?
Судя по синтаксису, это у Вас json. Можно так:

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

$json = '{"VALUE":"555.25","ADDED":"2021-05-12 18:20:14"}'; 
$data = json_decode($json);
$val = $data->VALUE;
echo $val;
За это сообщение автора markovrv поблагодарил:
Chainik (Чт май 13, 2021 11:43 am)
Рейтинг: 1.18%
Chainik
Сообщения: 1386
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 228 раз
Поблагодарили: 433 раза

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение Chainik » Чт май 13, 2021 8:36 am

Спасибо! Меня тоже посещала эта мысль, что это формат json. Но почему-то таким образом выдает пустое значение, хотя ошибок не пишет...

ЗЫ. Если прогнать ваш код через онлайн-тестеровщик кода PHP, то нужное значение выдает. Если же делать то же самое в системе, только в качестве исходных данных брать не текстовую строку, а строку из истории ({"VALUE":"512.91","ADDED":"2021-05-13 11:53:57"}), то в пишет в $json 'Array', а в $data и в $val -- пустое значение.
Чувствую, отгадка где-то рядом...

PPS. Я, конечно, вывернулся, получая первое и последнее значение из массива истории:

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

$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
Однако все равно интересно, как получить то же самое, если мы извлекаем полную строку в формате json:

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

$ValueStart= current($arr);
$ValueEnd = end($arr);
Chainik
Сообщения: 1386
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 228 раз
Поблагодарили: 433 раза

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение Chainik » Пт май 14, 2021 11:36 pm

Конечно, сложно писать код, не имея под рукой реального объекта. Так что косяки и нестыковки весьма вероятны. Но попытка -- не пытка. Итак, что вырисовывается в первом приближении по электросчетчику.
Добавляем в класс электросчетчиков свойства.
Свойства для мониторинга текущего потребления с начала некого периода (месяца, дня, часа):
CurrentMounthConsumption -- текущее потребление с начала месяца
CurrentDayConsumption -- текущее потребление с начала суток
CurrentHourConsumption -- текущее потребление с начала часа
CurrentDayDailyRateConsumption -- потребление за текущие сутки по дневному тарифу
CurrentDayNightRateConsumption -- потребление за текущие сутки по ночному тарифу
Значения этих свойств вычисляются от "0" с начала каждого соответствующего периода. Не вижу смысла у этих свой включать историю, т.к. они служат для текущего мониторинга.

Свойства для сохранения вычисленной статистики за завершенные периоды (месяц, день, час):
LastMounthConsumption -- потребление за прошлый месяц
LastDayConsumption -- потребление за прошлый день
LastHourConsumption -- потребление за прошлый час
LastDayDailyRateConsumption -- потребление за прошлые сутки по дневному тарифу
LastDayDailyRateConsumptionCost -- стоимость потребления за прошлые сутки по дневному тарифу
LastDayNightRateConsumption -- потребление за прошлые сутки по ночному тарифу
LastDayNightRateConsumptionCost -- стоимость потребления за прошлые сутки по ночному тарифу
LastDayConsumptionCost -- стоимость потребления за прошлые сутки по дневному и ночному тарифу
LastMounthDailyRateConsumption -- потребление за прошлый месяц по дневному тарифу
LastMounthDailyRateConsumptionCost -- стоимость потребления за прошлый месяц по дневному тарифу
LastMounthNightRateConsumption -- потребление за прошлый месяц по ночному тарифу
LastMounthNightRateConsumptionCost -- стоимость потребления за прошлый месяц по ночному тарифу
LastMounthConsumptionCost -- стоимость потребления за прошлый месяц по дневному и ночному тарифу
У этих свойств есть смысл включать историю (по необходимости). У свойств LastDayDailyRateConsumption и LastDayNightRateConsumption историю надо включить обязательно.

Таким образом:
кВ в день (LastDayConsumption)
кВ в месяц (LastMounthConsumption)
Дневные кВ в день (LastDayDailyRateConsumption)
Ночные кВ в день (LastDayNightRateConsumption)
Дневные кВ в месяц (LastMounthDailyRateConsumption)
Ночные кВ в месяц (LastMounthNightRateConsumption)
Стоимость кВ в день (LastDayConsumptionCost)
Стоимость кВ в месяц (LastMounthConsumptionCost)
Стоимость дневных кВ в день (LastDayDailyRateConsumptionCost)
Стоимость ночных кВ в день (LastDayNightRateConsumptionCost)
Стоимость дневных кВ в месяц (LastMounthDailyRateConsumptionCost)
Стоимость ночных кВ в месяц (LastMounthNightRateConsumptionCost)

Добавляем для сбора статистики классовый метод getStatistics с кодом:

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

//Получение статистики с электросчетчика

//Дневной тариф, руб.
$DailyRate = 6.50;
//Ночной тариф, руб.
$NightRate = 3.20;

$ot = $this->object_title;

//Вычисляем потребление за длящиеся периоды
//Вычисляем текущее потребление с начала месяца
$StartMounthTime = strtotime(date('Y-m-1 0:0:0',time()));
$arr = getHistory($ot.'.ValueWork', $StartMounthTime, time());
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$CurrentMounthConsumption = $ValueEnd - $ValueStart;
$this->setProperty('CurrentMounthConsumption', $CurrentMounthConsumption);

//Вычисляем текущее потребление с начала суток
$StartDayTime = strtotime(date('0:0:0',time()));
$arr = getHistory($ot.'.ValueWork', $StartDayTime, time());
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$CurrentDayConsumption = $ValueEnd - $ValueStart;
$this->setProperty('CurrentDayConsumption', $CurrentDayConsumption);

//Вычисляем текущее потребление с начала часа
$StartHourTime = strtotime(date('H:0:0',time()));
$arr = getHistory($ot.'.ValueWork', $StartHourTime, time());
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$CurrentHourConsumption = $ValueEnd - $ValueStart;
$this->setProperty('CurrentHourConsumption', $CurrentHourConsumption);

//Разбивка на дневное и ночное потребление
//Вычисляем потребление за текущие сутки по дневному тарифу
$StartDayDailyRateTime = strtotime(date('7:0:0',time()));
$EndDayDailyRateTime = strtotime(date('23:0:0',time()))-1;
$arr = getHistory($ot.'.ValueWork', $StartDayTime, $EndDayDailyRateTime);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$CurrentDayDailyRateConsumption = $ValueEnd - $ValueStart;

//Вычисляем потребление за текущие сутки по ночному тарифу
$StartDayNightRateTime1 = strtotime(date('0:0:0',time()));
$EndDayNightRateTime1 = strtotime(date('7:0:0',time()))-1;
$arr = getHistory($ot.'.ValueWork', $StartDayNightRateTime1, $EndDayNightRateTime1);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$CurrentDayNightRateConsumption1 = $ValueEnd - $ValueStart;
$StartDayNightRateTime2 = strtotime(date('23:0:0',time()));
$EndDayNightRateTime2 = strtotime(date('23:59:59',time()));
$arr = getHistory($ot.'.ValueWork', $StartDayNightRateTime2, $EndDayNightRateTime2);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$CurrentDayNightRateConsumption2 = $ValueEnd - $ValueStart;
$CurrentDayNightRateConsumption = $CurrentDayNightRateConsumption1 + $CurrentDayNightRateConsumption2;


//Вычисляем потребление за завершенные периоды
//Вычисляем потребление за прошлый месяц
//Вызываем 1-го числа каждого месяца в 00:00
if ((int)date('j') == 1 && timeIs('00:00')) {
$StartLastMounthTime = strtotime(date('Y-m-d H:i:s', mktime(0, 0, 0, date('m') - 1, 1)));
$EndLastMounthTime = strtotime(date('Y-m-1 0:0:0',time()))-1;
$arr = getHistory($ot.'.ValueWork', $StartLastMounthTime, $EndLastMounthTime);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$LastMounthConsumption = $ValueEnd - $ValueStart;
$this->setProperty('LastMounthConsumption', $LastMounthConsumption);
}

//Вычисляем потребление за прошлый день
//Вызываем каждый день в 00:00
if (timeIs('00:00')) {
$StartLastDayTime = strtotime(date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d')-1, date('y'))));
$EndLastDayTime = strtotime(date('0:0:0',time()))-1;
$arr = getHistory($ot.'.ValueWork', $StartLastDayTime, $EndLastDayTime);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$LastDayConsumption = $ValueEnd - $ValueStart;
$this->setProperty('LastDayConsumption', $LastDayConsumption);
}

//Вычисляем потребление за прошлый час
//Вызываем в начале каждого часа
$m=date('i',time());
if ($m=="00") {
$StartLastHourTime = strtotime(date('H:0:0',time()))-60*60;
$EndLastHourTime = strtotime(date('H:0:0',time()))-1;
$arr = getHistory($ot.'.ValueWork', $StartLastHourTime, $EndLastHourTime);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$LastHourConsumption = $ValueEnd - $ValueStart;
$this->setProperty('LastHourConsumption', $LastHourConsumption);
}




//Вычисляем потребление за прошлые сутки по дневному тарифу
//Вызываем каждый день в 00:00
if (timeIs('00:00')) {
$StartLastDayDailyRateTime = strtotime(date('Y-m-d H:i:s', mktime(7, 0, 0, date('m'), date('d')-1, date('y'))));
$EndLastDayDailyRateTime = strtotime(date('Y-m-d H:i:s', mktime(23, 0, 0, date('m'), date('d')-1, date('y'))))-1;
$arr = getHistory($ot.'.ValueWork', $StartLastDayDailyRateTime, $EndLastDayDailyRateTime);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$LastDayDailyRateConsumption = $ValueEnd - $ValueStart;
$this->setProperty('LastDayDailyRateConsumption', $LastDayDailyRateConsumption);
$LastDayDailyRateConsumptionCost = round($DailyRate * $LastDayDailyRateConsumption, 2);
$this->setProperty('LastDayDailyRateConsumptionCost', $LastDayDailyRateConsumptionCost);

//Вычисляем потребление за прошлые сутки по ночному тарифу
$StartLastDayNightRateTime1 = strtotime(date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d')-1, date('y'))));
$EndLastDayNightRateTime1 = strtotime(date('Y-m-d H:i:s', mktime(7, 0, 0, date('m'), date('d')-1, date('y'))))-1;
$arr = getHistory($ot.'.ValueWork', $StartLastDayNightRateTime1, $EndLastDayNightRateTime1);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$LastDayNightRateConsumption1 = $ValueEnd - $ValueStart;
$StartLastDayNightRateTime2 = strtotime(date('Y-m-d H:i:s', mktime(23, 0, 0, date('m'), date('d')-1, date('y'))));
$EndLastDayNightRateTime2 = strtotime(date('Y-m-d H:i:s', mktime(23, 59, 59, date('m'), date('d')-1, date('y'))));
$arr = getHistory($ot.'.ValueWork', $StartLastDayNightRateTime2, $EndLastDayNightRateTime2);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$LastDayNightRateConsumption2 = $ValueEnd - $ValueStart;
$LastDayNightRateConsumption = $LastDayNightRateConsumption1 + $LastDayNightRateConsumption2;
$this->setProperty('LastDayNightRateConsumption', $LastDayNightRateConsumption);
$LastDayNightRateConsumptionCost = round($NightRate * $LastDayNightRateConsumption, 2);
$this->setProperty('LastDayNightRateConsumptionCost', $LastDayNightRateConsumptionCost);

//Вычисляем стоимость потребления за прошлые сутки по дневному и ночному тарифу
$LastDayConsumptionCost = $LastDayDailyRateConsumptionCost + $LastDayNightRateConsumptionCost;
$this->setProperty('LastDayConsumptionCost', $LastDayConsumptionCost);
}


//Вычисляем потребление за прошлый месяц по дневному тарифу
//Вызываем 1-го числа каждого месяца в 00:00
if ((int)date('j') == 1 && timeIs('00:00')) {
$StartLastMounthTime = strtotime(date('Y-m-d H:i:s', mktime(0, 0, 0, date('m') - 1, 1)))+600;
$EndLastMounthTime = strtotime(date('Y-m-1 0:0:0',time()))+600;
$LastMounthDailyRateConsumption = getHistorySum($ot.'.LastDayDailyRateConsumption', $StartLastMounthTime, $EndLastMounthTime);
$this->setProperty('LastMounthDailyRateConsumption', $LastMounthDailyRateConsumption);
$LastMounthDailyRateConsumptionCost = round($DailyRate * $LastMounthDailyRateConsumption, 2);
$this->setProperty('LastMounthDailyRateConsumptionCost', $LastMounthDailyRateConsumptionCost);

//Вычисляем потребление за прошлый месяц по ночному тарифу
$StartLastMounthTime = strtotime(date('Y-m-d H:i:s', mktime(0, 0, 0, date('m') - 1, 1)))+600;
$EndLastMounthTime = strtotime(date('Y-m-1 0:0:0',time()))+600;
$LastMounthNightRateConsumption = getHistorySum($ot.'.LastDayNightRateConsumption', $StartLastMounthTime, $EndLastMounthTime);
$this->setProperty('LastMounthNightRateConsumption', $LastMounthNightRateConsumption);
$LastMounthNightRateConsumptionCost = round($NightRate * $LastMounthNightRateConsumption, 2);
$this->setProperty('LastMounthNightRateConsumptionCost', $LastMounthNightRateConsumptionCost);

//Вычисляем стоимость потребления за прошлый месяц по дневному и ночному тарифу
$LastMounthConsumptionCost = $LastMounthDailyRateConsumptionCost + $LastMounthNightRateConsumptionCost;
$this->setProperty('LastMounthConsumptionCost', $LastMounthConsumptionCost);
}
В начале метода надо вручную указать дневной и ночной тариф.
Запускать метод нужно минимум 1 раз в час (можно чаще, по потребности). Я бы запускал из onNewHour, указывая для каждого объекта счетчика собственное имя таймера и соответствующий метод:

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

setTimeOut("Counter02_Timer","callMethod('Counter02.getStatistics');",25);
За это сообщение автора Chainik поблагодарил:
John (Сб май 15, 2021 1:21 am)
Рейтинг: 1.18%
John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение John » Сб май 15, 2021 1:20 am

Вроде бы все настроил и прописал, завтра посмотрим на статистику.
Если все заработает, можно наладить мониторинг системы энергопотребления всего дома по группам потребителей, это очень интересная статистика.
Вы даже себе представить не можете насколько я Вам благодарен!!!

PS Запустил метод вручную, хорошо бы округлять значения свойств до 2 знаков после зпт.
Chainik
Сообщения: 1386
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 228 раз
Поблагодарили: 433 раза

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение Chainik » Сб май 15, 2021 11:27 am

Там надо внимательно понаблюдать, как все это будет работать. Поскольку это будет чудом, если не всплывут какие-нибудь косяки.
Например, предвижу, что может быть небольшая разница между потреблением за месяц, исчисленным как разность между конечными и начальными показаниями и тем же потреблением за месяц, исчисленным как сумма потребления за каждый день месяца. Или потреблением за день и суммой дневного и ночного потребления за тот же день.
Но в вашем случае, т.к. показания пишутся довольно часто, вряд ли эта разница будет существенной.

Что касается округления, то добавить его несложно. В строках, где считается потребление

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

$ValueEnd - $ValueStart;
можно его добавить:

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

round($ValueEnd - $ValueStart, 2);
За это сообщение автора Chainik поблагодарил:
John (Вс май 16, 2021 11:23 pm)
Рейтинг: 1.18%
John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение John » Вс май 16, 2021 11:23 pm

Нижайший поклон и искренняя благодарность!!!!

С итоге, я создал новый класс EnergyCounters и объект Boiler (в планах поставить ее множество счетчиков и создать под них объекты), счетчик передает значения в свойство Value.
Нашел и поправил небольшие косяки по коду, получилось вот так:

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

//Получение статистики с электросчетчика

//Дневной тариф, руб.
$DailyRate = 4.90;
//Ночной тариф, руб.
$NightRate = 2.39;

$ot = $this->object_title;

//Вычисляем потребление за длящиеся периоды
//Вычисляем текущее потребление с начала месяца
$StartMounthTime = strtotime(date('Y-m-1 0:0:0',time()));
$arr = getHistory($ot.'.Value', $StartMounthTime, time());
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$CurrentMounthConsumption = round($ValueEnd - $ValueStart, 2);
$this->setProperty('CurrentMounthConsumption', $CurrentMounthConsumption);

//Вычисляем текущее потребление с начала суток
$StartDayTime = strtotime(date('0:0:0',time()));
$arr = getHistory($ot.'.Value', $StartDayTime, time());
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$CurrentDayConsumption = round($ValueEnd - $ValueStart, 2);
$this->setProperty('CurrentDayConsumption', $CurrentDayConsumption);

//Вычисляем текущее потребление с начала часа
$StartHourTime = strtotime(date('H:0:0',time()));
$arr = getHistory($ot.'.Value', $StartHourTime, time());
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$CurrentHourConsumption = round($ValueEnd - $ValueStart, 2);
$this->setProperty('CurrentHourConsumption', $CurrentHourConsumption);

//Разбивка на дневное и ночное потребление
//Вычисляем потребление за текущие сутки по дневному тарифу
$StartDayDailyRateTime = strtotime(date('7:0:0',time()));
$EndDayDailyRateTime = strtotime(date('23:0:0',time()))-1;
$arr = getHistory($ot.'.Value', $StartDayDailyRateTime, $EndDayDailyRateTime);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$CurrentDayDailyRateConsumption = round($ValueEnd - $ValueStart, 2);
$this->setProperty('CurrentDayDailyRateConsumption', $CurrentDayDailyRateConsumption);

//Вычисляем потребление за текущие сутки по ночному тарифу
$StartDayNightRateTime1 = strtotime(date('0:0:0',time()));
$EndDayNightRateTime1 = strtotime(date('7:0:0',time()))-1;
$arr = getHistory($ot.'.Value', $StartDayNightRateTime1, $EndDayNightRateTime1);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$CurrentDayNightRateConsumption1 = round($ValueEnd - $ValueStart, 2);
$StartDayNightRateTime2 = strtotime(date('23:0:0',time()));
$EndDayNightRateTime2 = strtotime(date('23:59:59',time()));
$arr = getHistory($ot.'.Value', $StartDayNightRateTime2, $EndDayNightRateTime2);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$CurrentDayNightRateConsumption2 =round($ValueEnd - $ValueStart, 2);
$CurrentDayNightRateConsumption = $CurrentDayNightRateConsumption1 + $CurrentDayNightRateConsumption2;
$this->setProperty('CurrentDayNightRateConsumption', $CurrentDayNightRateConsumption);

//Вычисляем потребление за завершенные периоды
//Вычисляем потребление за прошлый месяц
//Вызываем 1-го числа каждого месяца в 00:00
if ((int)date('j') == 1 && timeIs('00:00')) {
$StartLastMounthTime = strtotime(date('Y-m-d H:i:s', mktime(0, 0, 0, date('m') - 1, 1)));
$EndLastMounthTime = strtotime(date('Y-m-1 0:0:0',time()))-1;
$arr = getHistory($ot.'.Value', $StartLastMounthTime, $EndLastMounthTime);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$LastMounthConsumption = round($ValueEnd - $ValueStart, 2);
$this->setProperty('LastMounthConsumption', $LastMounthConsumption);
}

//Вычисляем потребление за прошлый день
//Вызываем каждый день в 00:00
if (timeIs('00:00')) {
$StartLastDayTime = strtotime(date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d')-1, date('y'))));
$EndLastDayTime = strtotime(date('0:0:0',time()))-1;
$arr = getHistory($ot.'.Value', $StartLastDayTime, $EndLastDayTime);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$LastDayConsumption = round($ValueEnd - $ValueStart, 2);
$this->setProperty('LastDayConsumption', $LastDayConsumption);
}

//Вычисляем потребление за прошлый час
//Вызываем в начале каждого часа
$m=date('i',time());
if ($m=="00") {
$StartLastHourTime = strtotime(date('H:0:0',time()))-60*60;
$EndLastHourTime = strtotime(date('H:0:0',time()))-1;
$arr = getHistory($ot.'.Value', $StartLastHourTime, $EndLastHourTime);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$LastHourConsumption = round($ValueEnd - $ValueStart, 2);
$this->setProperty('LastHourConsumption', $LastHourConsumption);
}

//Вычисляем потребление за прошлые сутки по дневному тарифу
//Вызываем каждый день в 00:00
if (timeIs('00:00')) {
$StartLastDayDailyRateTime = strtotime(date('Y-m-d H:i:s', mktime(7, 0, 0, date('m'), date('d')-1, date('y'))));
$EndLastDayDailyRateTime = strtotime(date('Y-m-d H:i:s', mktime(23, 0, 0, date('m'), date('d')-1, date('y'))))-1;
$arr = getHistory($ot.'.Value', $StartLastDayDailyRateTime, $EndLastDayDailyRateTime);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$LastDayDailyRateConsumption = round($ValueEnd - $ValueStart, 2);
$this->setProperty('LastDayDailyRateConsumption', $LastDayDailyRateConsumption);
$LastDayDailyRateConsumptionCost = round($DailyRate * $LastDayDailyRateConsumption, 2);
$this->setProperty('LastDayDailyRateConsumptionCost', $LastDayDailyRateConsumptionCost);

//Вычисляем потребление за прошлые сутки по ночному тарифу
$StartLastDayNightRateTime1 = strtotime(date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d')-1, date('y'))));
$EndLastDayNightRateTime1 = strtotime(date('Y-m-d H:i:s', mktime(7, 0, 0, date('m'), date('d')-1, date('y'))))-1;
$arr = getHistory($ot.'.Value', $StartLastDayNightRateTime1, $EndLastDayNightRateTime1);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$LastDayNightRateConsumption1 = round($ValueEnd - $ValueStart, 2);
$StartLastDayNightRateTime2 = strtotime(date('Y-m-d H:i:s', mktime(23, 0, 0, date('m'), date('d')-1, date('y'))));
$EndLastDayNightRateTime2 = strtotime(date('Y-m-d H:i:s', mktime(23, 59, 59, date('m'), date('d')-1, date('y'))));
$arr = getHistory($ot.'.Value', $StartLastDayNightRateTime2, $EndLastDayNightRateTime2);
$ValueStart = $arr[0]['VALUE'];
$ValueEnd = $arr[count($arr)-1]['VALUE'];
$LastDayNightRateConsumption2 = round($ValueEnd - $ValueStart, 2);
$LastDayNightRateConsumption = $LastDayNightRateConsumption1 + $LastDayNightRateConsumption2;
$this->setProperty('LastDayNightRateConsumption', $LastDayNightRateConsumption);
$LastDayNightRateConsumptionCost = round($NightRate * $LastDayNightRateConsumption, 2);
$this->setProperty('LastDayNightRateConsumptionCost', $LastDayNightRateConsumptionCost);

//Вычисляем стоимость потребления за прошлые сутки по дневному и ночному тарифу
$LastDayConsumptionCost = $LastDayDailyRateConsumptionCost + $LastDayNightRateConsumptionCost;
$this->setProperty('LastDayConsumptionCost', $LastDayConsumptionCost);
}


//Вычисляем потребление за прошлый месяц по дневному тарифу
//Вызываем 1-го числа каждого месяца в 00:00
if ((int)date('j') == 1 && timeIs('00:00')) {
$StartLastMounthTime = strtotime(date('Y-m-d H:i:s', mktime(0, 0, 0, date('m') - 1, 1)))+600;
$EndLastMounthTime = strtotime(date('Y-m-1 0:0:0',time()))+600;
$LastMounthDailyRateConsumption = getHistorySum($ot.'.LastDayDailyRateConsumption', $StartLastMounthTime, $EndLastMounthTime);
$this->setProperty('LastMounthDailyRateConsumption', $LastMounthDailyRateConsumption);
$LastMounthDailyRateConsumptionCost = round($DailyRate * $LastMounthDailyRateConsumption, 2);
$this->setProperty('LastMounthDailyRateConsumptionCost', $LastMounthDailyRateConsumptionCost);

//Вычисляем потребление за прошлый месяц по ночному тарифу
$StartLastMounthTime = strtotime(date('Y-m-d H:i:s', mktime(0, 0, 0, date('m') - 1, 1)))+600;
$EndLastMounthTime = strtotime(date('Y-m-1 0:0:0',time()))+600;
$LastMounthNightRateConsumption = getHistorySum($ot.'.LastDayNightRateConsumption', $StartLastMounthTime, $EndLastMounthTime);
$this->setProperty('LastMounthNightRateConsumption', $LastMounthNightRateConsumption);
$LastMounthNightRateConsumptionCost = round($NightRate * $LastMounthNightRateConsumption, 2);
$this->setProperty('LastMounthNightRateConsumptionCost', $LastMounthNightRateConsumptionCost);

//Вычисляем стоимость потребления за прошлый месяц по дневному и ночному тарифу
$LastMounthConsumptionCost = $LastMounthDailyRateConsumptionCost + $LastMounthNightRateConsumptionCost;
$this->setProperty('LastMounthConsumptionCost', $LastMounthConsumptionCost);
}
Теперь попробую придумать как визуализировать весь этот объем информации в удобоваримом виде, результатом непременно поделюсь.
Chainik
Сообщения: 1386
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 228 раз
Поблагодарили: 433 раза

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение Chainik » Пн май 17, 2021 12:22 pm

Рад, что что-то получается! А косяки практически неизбежны, поскольку не на чем было толком протестировать...
Главное, посмотреть на корректность подсчета данных и отловить все косяки, если какие остались.
Ответить