Конечно, сложно писать код, не имея под рукой реального объекта. Так что косяки и нестыковки весьма вероятны. Но попытка -- не пытка. Итак, что вырисовывается в первом приближении по электросчетчику.
Добавляем в класс электросчетчиков свойства.
Свойства для мониторинга текущего потребления с начала некого периода (месяца, дня, часа):
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);