Re: Помогите с кодом (с логикой) пожалуйста
Добавлено: Пн май 10, 2021 9:15 pm
можете на гите посмотреть, хотя все это у вас локально есть
посмотрите в пу счетчика в инжекциях
посмотрите в пу счетчика в инжекциях
Код: Выделить всё
<?php
//возвращает долю времени на интервале, где истинно сравнение $objprop со значением $value по правилу $oper
//$oper{'=','<>','>','>=','<','<=','betw','!betw'};
//ex gg('obj.prop') == 1 / gg('obj.prop') betw -1,1/ gg('obj.prop') !betw 10,15
//return t(true part)/t(whole interval)
function getHistoryPart($objprop, $start_time, $stop_time = 0, $oper = "=", $value = '1', $value2 = '0') {
if($start_time <= 0) $start_time = (time() + $start_time);
if($stop_time <= 0) $stop_time = (time() + $stop_time);
$pvalue = getHistoryValueId($objprop);
if(defined('SEPARATE_HISTORY_STORAGE') && SEPARATE_HISTORY_STORAGE == 1) {
$table_name = createHistoryTable($pvalue);
} else {
$table_name = 'phistory';
}
// Получить количество записей за нужный период времени
$arr_s = SQLSelectOne("SELECT COUNT(ID) as COUNT_ID FROM $table_name ".
"WHERE VALUE_ID=".$pvalue." and not value is null ".
"AND ADDED between '".date('Y-m-d H:i:s', $start_time)."' AND '".date('Y-m-d H:i:s', $stop_time)."'");
// Взять это количество записей +1
$arr_s = SQLSelect("SELECT * FROM $table_name WHERE VALUE_ID=".$pvalue." and not value is null ".
" AND ADDED<='".date('Y-m-d H:i:s', $stop_time)."' ORDER BY ADDED DESC LIMIT 0 , ".(1+$arr_s['COUNT_ID']));
$tmr2 = $stop_time;
// Переберем весь массив
foreach($arr_s as $s) {
$tmr1 = $tmr2;
$tmr2 = strtotime($s['ADDED']);
// Ограничить началом
if($tmr2<$start_time) $tmr2 = $start_time;
// Двигаясь вниз по массиву времени складывать отрезки
//echo(date('H:i:s', $tmr1).' - '.date('H:i:s', $tmr2).' = '.($tmr1 - $tmr2).'c t='.$s['VALUE'].'<br>');
if($oper == '=' || $oper == '=='){
if($s['VALUE']==$value) $tmr_mem = $tmr_mem + $tmr1 - $tmr2;
}elseif($oper == '>'){
if($s['VALUE']>$value) $tmr_mem = $tmr_mem + $tmr1 - $tmr2;
}elseif($oper == '<'){
if($s['VALUE']<$value) $tmr_mem = $tmr_mem + $tmr1 - $tmr2;
}elseif($oper == '>='){
if($s['VALUE']>=$value) $tmr_mem = $tmr_mem + $tmr1 - $tmr2;
}elseif($oper == '<='){
if($s['VALUE']<=$value) $tmr_mem = $tmr_mem + $tmr1 - $tmr2;
}elseif($oper == '<>' || $oper == '!='){
if($s['VALUE']<>$value) $tmr_mem = $tmr_mem + $tmr1 - $tmr2;
}elseif($oper == 'betw'){
if($s['VALUE']>=$value && $s['VALUE']<=$value2) $tmr_mem = $tmr_mem + $tmr1 - $tmr2;
}elseif($oper == '!betw'){
if($s['VALUE']<$value || $s['VALUE']>$value2) $tmr_mem = $tmr_mem + $tmr1 - $tmr2;
}
}//foreach
$all = $stop_time - $start_time; //всего времени с начала интервала до конца
return $tmr_mem/$all;
}
?>Код: Выделить всё
//Получаем статистику работы насоса за прошлый день
//Рассчитываем долю времени работы насоса в течение прошлого дня
$StartLastDayTime = strtotime(date('Y-m-d 0:0:0',time()-60*60*24));
$EndLastDayTime = strtotime(date('0:0:0',time()-1));
$Part = getHistoryPart('PumpHeat_01.Status',$StartLastDayTime,$EndLastDayTime,'=',1);
$this->setProperty('UsagePart', $Part);
//Процент пребывания во включенном состоянии в течение анализируемого периода
$UsagePercent = round($Part*100,2);
$this->setProperty('UsagePercent', $UsagePercent);
//Продолжительность пребывания во включенном состоянии в течение дня
$UsagePeriod = round($Part*60*60*24,0);
$UsagePeriod_H = floor($UsagePeriod/60/60);
$UsagePeriod_M = floor($UsagePeriod/60 - $UsagePeriod_H*60);
$UsagePeriod_S = floor($UsagePeriod - $UsagePeriod_H*60*60 - $UsagePeriod_M*60);
$UsagePeriodLastDayText = $UsagePeriod_H." ч. ".$UsagePeriod_M." мин. ".$UsagePeriod_S." сек.";
$this->setProperty('UsagePeriod', $UsagePeriodLastDayText);
//Считаем количество включений насоса в течение прошлого дня
$UsageАctivationQuantity = getHistorySum('PumpHeat_01.Status',$StartLastDayTime,$EndLastDayTime);
$this->setProperty('UsageАctivationQuantity', $UsageАctivationQuantity);Код: Выделить всё
//Получаем статистику работы насоса за прошлый день
//Рассчитываем долю времени работы насоса в течение прошлого дня
$ot = $this->object_title;
$StartLastDayTime = strtotime(date('Y-m-d 0:0:0',time()-60*60*24));
$EndLastDayTime = strtotime(date('0:0:0',time()-1));
$Part = getHistoryPart($ot.'.Status',$StartLastDayTime,$EndLastDayTime,'=',1);
$this->setProperty('UsagePart', $Part);
//Процент пребывания во включенном состоянии в течение анализируемого периода
$UsagePercent = round($Part*100,2);
$this->setProperty('UsagePercent', $UsagePercent);
//Продолжительность пребывания во включенном состоянии в течение дня
$UsagePeriod = round($Part*60*60*24,0);
$UsagePeriod_H = floor($UsagePeriod/60/60);
$UsagePeriod_M = floor($UsagePeriod/60 - $UsagePeriod_H*60);
$UsagePeriod_S = floor($UsagePeriod - $UsagePeriod_H*60*60 - $UsagePeriod_M*60);
$UsagePeriodLastDayText = $UsagePeriod_H." ч. ".$UsagePeriod_M." мин. ".$UsagePeriod_S." сек.";
$this->setProperty('UsagePeriod', $UsagePeriodLastDayText);
//Считаем количество включений насоса в течение прошлого дня
$UsageАctivationQuantity = getHistorySum($ot.'.Status',$StartLastDayTime,$EndLastDayTime);
$this->setProperty('UsageАctivationQuantity', $UsageАctivationQuantity);Код: Выделить всё
if (timeIs('00:01')) callMethodSafe('PumpHeat_01.getUsageStatistics');
if (timeIs('00:02')) callMethodSafe('PumpHeat_02.getUsageStatistics');
if (timeIs('00:03')) callMethodSafe('PumpHeat_03.getUsageStatistics');Код: Выделить всё
callMethodSafe('PumpHeat_01.getUsageStatistics');
SetTimeOut("PumpHeat_02_getUsageStatistics","callMethodSafe('PumpHeat_02.getUsageStatistics');",5);
SetTimeOut("PumpHeat_03_getUsageStatistics","callMethodSafe('PumpHeat_03.getUsageStatistics');",10);Фундаментальный разбор! Единственно добавлю, что, если это нужно делать в полночь, я использую onNewDayChainik писал(а): Пн май 10, 2021 11:55 pm Запускать метод надо раз в сутки. Можно из OnNewMinute, а лучше даже из onNewHour:
Код: Выделить всё
SetTimeOut("sun_t","RunScript('sun');",2);
SetTimeOut("moon_t","RunScript('moon');",5);
SetTimeOut("rates","RunScript('Курсы');",7);
setTimeOut("holidays","RunScript('holidays');",10);Этот метод нужно просто создать в классе, а в коде системы его обновление уже прописано так же, как и для минут и часовChainik писал(а): Вт май 11, 2021 8:49 am Xor, моё почтение!
Я бы тоже в OnNewDay запихнул, но такого объекта нет в "нулёвой" системе. Понятно, что нетрудно добавить, но вопрос в том, каким образом вы инициируете запуск OnNewDay?