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

Как выборочно сохранять свойства (sensor temp)

Добавлено: Пт дек 06, 2019 6:55 pm
Kirch
Датчики периодически выдают нереальные значения по причине нестабильного питания или ещё чего.
Графики ужасно масштабируются и трудно пользоваться.

Хочется проверять значения перед сохранением, и если не в диапазоне, то не сохранять.
Например, сейчас сохранение датчиков сделано через веб-переменные.
Но я хочу переделать на сценарий в будущем.

подскажите, если webvars шаблоном поиска находит температуру в url, то как обратиться к этому значению из кода Действие при изменении: ?
$value пустое (проверял через DebMes)

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

$name="Sensor_temp17";
$sens=0.005;
if ($value==85.00 or $value>120) {
 sg('$name.alive',0);
}
else {
 	if (gg('$name.alive')==0) {
     sg('$name.alive',1);
    }
 	$old_temp=gg('$name.value');
	if ($value>$old_temp*(1+$sens) or $value<$old_temp(1-$sens)) {
 		sg('$name.value',$value);
     CallMethod('$name.valueUpdated');
		} 
    }
И надо ли вызывать методы объекта внутри после записи значений?

Re: Как выборочно сохранять свойства (sensor temp)

Добавлено: Вт дек 10, 2019 1:59 pm
Jilber
У меня сделано так:
СпойлерПоказать
1.jpg
1.jpg (88.63 КБ) 4392 просмотра
Метод "InputChanged":

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

$newvalue = $this->getProperty('Input');
$oldvalue = $this->getProperty('value');
if ($newvalue > '0' && $newvalue <> $oldvalue) $this->setProperty('value',$newvalue);
Проверяется, чтобы новое значение было больше 0 и при этом отличалось от предыдущего значения (чтобы не сохранять в базу несколько одинаковых значений подряд).

Re: Как выборочно сохранять свойства (sensor temp)

Добавлено: Вт дек 10, 2019 4:15 pm
Kirch
Jilber писал(а):
Вт дек 10, 2019 1:59 pm
Метод "InputChanged":
Благодарю.
Предложенный код нельзя переложить на методы веб-переменных. Так можно поступить, если отказаться от веб-переменных и сделать отдельный код и повесить на таймер. У меня десятки 1ware датчиков температуры на одном проводе на одном порту МЕгаД.

Re: Как выборочно сохранять свойства (sensor temp)

Добавлено: Вт дек 10, 2019 4:51 pm
Logrus
Jilber писал(а):
Вт дек 10, 2019 1:59 pm
У меня сделано так:
СпойлерПоказать
1.jpg
Метод "InputChanged":

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

$newvalue = $this->getProperty('Input');
$oldvalue = $this->getProperty('value');
if ($newvalue > '0' && $newvalue <> $oldvalue) $this->setProperty('value',$newvalue);
Проверяется, чтобы новое значение было больше 0 и при этом отличалось от предыдущего значения (чтобы не сохранять в базу несколько одинаковых значений подряд).
у вас стандартная ошибка новичка, привязывать желательно или в свойство или в метод, оба сразу не желательно, в метод обычно передается в параметрах либо текущее, либо старое новое значения, так же можно прочитать и из свойства
в бз скайсильвер писал про фильтацию (там простые примеры были)

в последних обновах при записи в свойство тоже можно реализовать фильтрацию/конвертацию и пр. смотрите в настройках свойства на уровне класса

Re: Как выборочно сохранять свойства (sensor temp)

Добавлено: Ср дек 11, 2019 5:44 pm
Jilber
Я вас правильно понял ?
СпойлерПоказать
Value.jpg
Value.jpg (60.61 КБ) 4302 просмотра
Метод ValueUpdated:

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

/* begin injection of {SDevices} */
require(DIR_MODULES.'devices/SSensors_valueUpdated.php');
/* end injection of {SDevices} */

if ($this->getProperty('NEW_VALUE') > '0' && $NEW_VALUE <> $OLD_VALUE) $this->setProperty('value',$NEW_VALUE);
СпойлерПоказать
WiFi-Iot.jpg
WiFi-Iot.jpg (50.77 КБ) 4302 просмотра

Re: Как выборочно сохранять свойства (sensor temp)

Добавлено: Ср дек 11, 2019 7:25 pm
Logrus
нет, если в свойство, то :
Снимок.PNG
Снимок.PNG (31.77 КБ) 4282 просмотра
если через метод, то свой
Снимок2.PNG
Снимок2.PNG (39.74 КБ) 4282 просмотра

Re: Как выборочно сохранять свойства (sensor temp)

Добавлено: Ср дек 11, 2019 7:33 pm
Jilber
А это не на альфе случаем появилось ? У меня нет такого.
СпойлерПоказать
Изображение

Re: Как выборочно сохранять свойства (sensor temp)

Добавлено: Ср дек 11, 2019 8:26 pm
Logrus
значит появится как с мастером сольют
п.с. кстати, viewtopic.php?f=4&t=2096

Re: Как выборочно сохранять свойства (sensor temp)

Добавлено: Ср дек 11, 2019 8:34 pm
Jilber
Т.е. пока в мастер не добавили я привязываю только метод без свойства ?
СпойлерПоказать
WiFi-Iot.jpg
WiFi-Iot.jpg (16.32 КБ) 4253 просмотра
А в методе InputChanged пишу:

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

if ($this->getProperty('NEW_VALUE') > '0' && $NEW_VALUE <> $OLD_VALUE) $this->setProperty('value',$NEW_VALUE);

Re: Как выборочно сохранять свойства (sensor temp)

Добавлено: Ср дек 11, 2019 8:42 pm
Logrus
https://kb.mjdm.ru/filtraciya-i-okrugle ... majordomo/
выше говорил, здесь простые способы Скайсильвер подробно расписал

и в методы значения параметрами передаются, у вас синтаксис не верный и код не имеет смысла
те же сяоми, простой пример метода выше

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

//при низком значении емкости аккамулятора, сенсоры сяоми шлют предупреждение (значение выходящее за разумный порог) и влед за ним нормальное, что б не ломать графики - фильтруем
if ($params['temperature'] < -5000) {
 DebMes($params['ORIGINAL_OBJECT_TITLE'] . ' error');
 return;
}

$value = round($params['temperature']/100, 1);

//проверка перед записью на повтор
if ($this->getProperty('value') != $value) {
 $this->setProperty('value', $value);
 $this->callMethod('heartbeat');
}