Спасибоnick7zmail писал(а): ↑Вс ноя 03, 2019 12:58 pmСистему обновите. Такое ощущение - что старая версия системы у вас.

Модератор: immortal
Спасибоnick7zmail писал(а): ↑Вс ноя 03, 2019 12:58 pmСистему обновите. Такое ощущение - что старая версия системы у вас.
Может подскажете, как писать в Свойство раз в 5 минут среднее за период ?yii писал(а): ↑Ср сен 25, 2019 4:29 pmВариантов напридумывать можно... например писать в свое свойство раз скажем в 5 минут среднее за период, тот же optimizer при выборе avg оптимизации делает именно так... я свой единственный TH прошил сейчас на tasmota, там показания по 0.1 градусу, естественно колбасит еще больше чем у вас, мне как бы пофиг на вид графика, но optimizer запускается каждую ночь, и график на уже оптимизированных данных "красивый", что не скажешь о текущих...
Ну например навскидку (если подумать, то думаю можно более оптимальнее сделать), завести свойство в котором будет храниться расчетное значение и именно его отображать везде где нужно. Завести два свойства, обоим на старте поставить 0. На чейнж валуе повестить скрипт который будет в первое свойство писать то что в нем есть + то что получили (в нем получится сумма всех значений), а во второе + 1 (счетчик значений, сколько измерений прошло)...
Идеалогия понятна.yii писал(а): ↑Ср ноя 06, 2019 4:32 amНу например навскидку (если подумать, то думаю можно более оптимальнее сделать), завести свойство в котором будет храниться расчетное значение и именно его отображать везде где нужно. Завести два свойства, обоим на старте поставить 0. На чейнж валуе повестить скрипт который будет в первое свойство писать то что в нем есть + то что получили (в нем получится сумма всех значений), а во второе + 1 (счетчик значений, сколько измерений прошло)...
Далее если хотим писать среднее за период, скажем разв пять минут, то пишим скрипт запускающийся раз в пять минут который делит точто в накопителе значений на счетчик значений, полученное пишет в свойство с расчетным значением, счетчик и накопитель обнуляет.
Либо в тот же скрипт на чейнж валуе дописываем если счетчик >= 5 то делаем все тоже что по времени (считаем, пишем, обнуляем) в этом случае получаем среднее не по времени, а за 5 измерений
Но если бы я делал себе так, то я бы сделал чуть красивее... завел бы свойство типа rawvalue, и именно его бы привязал к саноффу, сделал бы для него метод onChange и все делал бы в нем, а конечный результат писал в стандартное value, так красивее и не надо править те места где используется валуе
Код: Выделить всё
$SumTemp = gg('MyTempSensor.SumTemp') + gg('MyTempSensor.RawValue'); // читаем в переменную текущую сумму и добавляем к ней текущее значение
$CountVal = gg('MyTempSensor.CountVal') + 1; // читаем в переменную текущий счетчик и увеличиваем его на 1
sg('MyTempSensor.SumTemp',$SumTemp); // сохраняем новое значение суммы
sg('MyTempSensor.CountVal',$CountVal); // сохраняем новое значение счетчика
Код: Выделить всё
if (date("i", time()) % 5) return; // если значение минут не кратно 5, то скрипт прервется
$CountVal = gg('MyTempSensor.CountVal'); // читаем текущее значение счетчика
if ($CountVal == 0) return; // прерываем скрипт если счетчик значений 0, так как считать нечего
$SumTemp = gg('MyTempSensor.SumTemp'); // читаем текущее значение суммы
sg('MyTempSensor.SumTemp',0); // обнуляем сумму
sg('MyTempSensor.CountVal',0); // обнуляем счетчик
$Temp = $SumTemp / $CountVal; // считаем среднее
$Temp = round($Temp,1); // округляем до одного знака после запятой
sg('MyTempSensor.value',$Temp); // пишим среднее значение в value
Код: Выделить всё
runScript('CalcAvgTemp'); // запускаем скрипт
Код: Выделить всё
$SumTemp = gg('MyTempSensor.SumTemp') + gg('MyTempSensor.RawValue'); // читаем в переменную текущую сумму и добавляем к ней текущее значение
$CountVal = gg('MyTempSensor.CountVal') + 1; // читаем в переменную текущий счетчик и увеличиваем его на 1
sg('MyTempSensor.SumTemp',$SumTemp); // сохраняем новое значение суммы
sg('MyTempSensor.CountVal',$CountVal); // сохраняем новое значение счетчика
if ($CountVal >=5) { // проверяем что мы сделали 5 и более измерении и если так то выполняем расчеты
$CountVal = gg('MyTempSensor.CountVal'); // читаем текущее значение счетчика
$SumTemp = gg('MyTempSensor.SumTemp'); // читаем текущее значение суммы
sg('MyTempSensor.SumTemp',0); // обнуляем сумму
sg('MyTempSensor.CountVal',0); // обнуляем счетчик
$Temp = $SumTemp / $CountVal; // считаем среднее
$Temp = round($Temp,1); // округляем до одного знака после запятой
sg('MyTempSensor.value',$Temp); // пишим среднее значение в value
}