Обновляю свойство temp датчика температуры при его изменении на 0.1 (знаю что это изменение не почувствовать, но люблю точность).
В связи с этим, за час истории может набраться 200-300 записей в таблице phistory. При отрисовке графиков, например, за сутки, идет ожидание достаточное время (10-20 сек). В связи с этим, написал обработку всех датчиков температуры (можно легко переделать и на другие датчики (вместо класса Temperature ставим ваш класс, вместо свойства temp ставим ваше свойство (например status)). Метод этот вызывается раз в час из таймера (у меня из cron`a). Вытаскивает все значения с момента прошлого усреднения, записывает их в отдельное свойство объекта, а всю историю по главному свойству с историей - удаляет.
За код сильно не ругайте, мучал его три вечера (ночи):
Код: Выделить всё
// получаем все объекты класса Temperature
$objects = getObjectsByClass("Temperature");
// перебираем все полученные объекты (цикл)
foreach($objects as $object)
{
// получаем название объекта
$obj_title = $object['TITLE'];
// получаем ID объекта
$obj_id = $object['ID'];
// получаем все свойства объекта по его названию
$obj=getObject($obj_title);
// получаем ID свойства temp
$prop_id = $obj->getPropertyByName('temp', $obj->class_id, $obj->obj_id);
// по известным данным вытаскиваем с базы ID свойства
$pvalue = SQLSelectOne("SELECT ID FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$obj->id."' LIMIT 0,1");
foreach ($pvalue as $pvalue_id)
// средствами mysql сразу получаем среднее значение температур
$query = SQLSelectOne("SELECT AVG(VALUE) as AVG_temp FROM phistory WHERE VALUE_ID = $pvalue_id");
// округляем значение до сотых
$avg_t = round($query[AVG_temp], 2);
// проверяем значение на ноль (если датчик в течение часа не обновлялся)
if(!$avg_t) { return; } else
// записываем новое значение
sg("$obj_title.tempAvg",$avg_t);
// удаляем обработанные значения (чистим историю по данному свойству
SQLExec("DELETE FROM phistory WHERE VALUE_ID = $pvalue_id");
// выводим информацию на экран (работает при прямом вызове)
echo"<br>Средняя температура датчика $obj_title за последние 60 минут составила: ".$avg_t." градусов<br>";
}