Страница 2 из 2

Re: Предыдущее значения свойства с историей

Добавлено: Вт дек 02, 2014 1:21 am
Bagir
Да, точно так. И я где то даже писал об этом. Не нужно указывать direction при незначительном изменении, тем более, когда сравниваем не просто с одним предыдущим, а со средним значением диапазона. Иначе от указателя теряется смысл. Он всегда будет куда то направлен. Предложенный мною код уже давно не обновлялся. Надо будет этим заняться. Перечитать и поправить. Дельту допустимого изменения до установления direction я, вроде бы, выбрал в 0,3 градуса.
А на счет t и s, так тут уж кому как угодно. Главное, чтобы при вызове метода statusChanged вы передавали именно этот параметр. Но тут еще могут быть грабли, если у вас есть и напрямую слинкованные например 1-wite датчики, а так же и передача данных в параметрах например от ардуино. А чтобы определить direction и признать датчик живым, метод то запускать дано один. Не плодить же для этого кучу почти похожих методов. Для себя я нашел такой выход:

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

$s=$params['status']; // Возможно у вас будет $params['t']
if (!isset($s)) { $s = $this->getProperty('status'); } 
Суть в том, что если данные небыли переданы в параметре, то значит они должны были уже быть записаны в свойство этого объекта, и от туда их и надо взять.
Потом выложу весь код метода.

Re: Предыдущее значения свойства с историей

Добавлено: Вт дек 02, 2014 7:21 am
Vovix
Bagir писал(а):..... Дельту допустимого изменения до установления direction я, вроде бы, выбрал в 0,3 градуса.
.....
Да, 0,5 я выбрал слишком много, ночь показала, что надо меньше - поставлю 0,3, а там посмотрим!

Re: Предыдущее значения свойства с историей

Добавлено: Вт дек 02, 2014 7:46 pm
Bagir
Вот полный код метода. Он рассчитывает direction и передает температуру слинкованной комнате. Конечно имена параметров могут, да и даже будут отличаться. Метод желает получить параметр status с температурой. У кого то это будет просто t. В коде есть комментарий. Если температура уже сразу пишется в параметр (слинкованное свойство) то метод, не получив параметр, возьмет температуру их свойства. Имена свойств так же могут отличаться. В моем варианте имя свойства температуры status. У вас может быть например temperature или просто temp.
Работа этого кода меня вполне устраивает. direction появляется только при явном изменении температуры на 0,3 градуса в любую сторону.
код метода statusChangedSPOILER_SHOW

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

$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("H:i",time()));
$this->setProperty("alive",1);
$ot=$this->object_title;
$alive_timeout=(int)$this->getProperty("aliveTimeOut");
if (!$alive_timeout) { $alive_timeout=3*60*60; }
setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);

$s=$params['status']; // Возможно у вас будет дугой параметр. Например $params['t']
// Для слинкованных свойств и запуска этого метода без передачи данных,
// если температура не была передана в параметре, то взять ее из свойства.
if (!isset($s)) { $s = $this->getProperty('status'); }

if (($s > 50) || ($s < -50)) {
  //Некорректные данные
  return; 
}

// Получение среднего значения из истории
//Получить id свойства
$prop_id=$this->getPropertyByName('status', $this->class_id, $this->id);
//Получаем VALUE_ID для следующей таблицы
$pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$this->id."'");
//Получаем средние значения температуры за последние 30 минут
$start_time=time()-30*60; // 30 минут
$arr_s = SQLSelectOne("SELECT avg(VALUE) as AVG_V FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' AND ADDED>='".date('Y-m-d H:i:s', $start_time)."'");

$avg_s=round($arr_s[AVG_V], 1);
$s=round($s, 1);

// Сравнение
if ($s-$avg_s > 0.3) {
 $d=1;
} elseif ($s-$avg_s < -0.3) {
 $d=-1;
} else {
 $d=0;
}

$this->setProperty('direction',$d);
$this->setProperty('status',$s);

// Передать данные слинкованной комнате
$linked_room=$this->getProperty("LinkedRoom");
if ($linked_room) { setGlobal($linked_room.'.Temperature', $s);