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

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

Модератор: immortal

Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Вт дек 02, 2014 1:21 am

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

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

$s=$params['status']; // Возможно у вас будет $params['t']
if (!isset($s)) { $s = $this->getProperty('status'); } 
Суть в том, что если данные небыли переданы в параметре, то значит они должны были уже быть записаны в свойство этого объекта, и от туда их и надо взять.
Потом выложу весь код метода.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Благодарил (а): 60 раз
Поблагодарили: 532 раза
Контактная информация:

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

Сообщение Vovix » Вт дек 02, 2014 7:21 am

Bagir писал(а):..... Дельту допустимого изменения до установления direction я, вроде бы, выбрал в 0,3 градуса.
.....
Да, 0,5 я выбрал слишком много, ночь показала, что надо меньше - поставлю 0,3, а там посмотрим!
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Вт дек 02, 2014 7:46 pm

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

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

$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);
За это сообщение автора Bagir поблагодарил:
tsember (Сб апр 11, 2015 10:36 pm)
Рейтинг: 1.16%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Ответить