Страница 5 из 5
Re: [Сценарий] Анализ периода от начала суток и построение индикатора
Добавлено: Пт ноя 15, 2019 12:24 pm
Logrus
MaxVM писал(а): ↑Пт ноя 15, 2019 10:25 am
Logrus писал(а): ↑Пт ноя 15, 2019 1:34 am
так и не понял физический смысл измерения направления изменения сенсора, а не факт работы тена, т.е. статус 1
В батареи датчик температуры и sonoff, режим работы (eco и comfort) переключает он + на нем датчик температуры который смотрит растет температура или нет. По ниму и смотрю время физической работы тена в радиаторе. Хочу знать в расчете на сутки сколько он раз включился, для начала в процентном отношении и по среднему посчитать потребление электроэнергии каждым конвектором
а состояние реле соноффа не получаете, то по нему время работы тена как-то прямее смотреть
Re: [Сценарий] Анализ периода от начала суток и построение индикатора
Добавлено: Пт ноя 15, 2019 1:01 pm
MaxVM
Logrus писал(а):MaxVM писал(а): ↑Пт ноя 15, 2019 10:25 am
Logrus писал(а): ↑Пт ноя 15, 2019 1:34 am
так и не понял физический смысл измерения направления изменения сенсора, а не факт работы тена, т.е. статус 1
В батареи датчик температуры и sonoff, режим работы (eco и comfort) переключает он + на нем датчик температуры который смотрит растет температура или нет. По ниму и смотрю время физической работы тена в радиаторе. Хочу знать в расчете на сутки сколько он раз включился, для начала в процентном отношении и по среднему посчитать потребление электроэнергии каждым конвектором
а состояние реле соноффа не получаете, то по нему время работы тена как-то прямее смотреть
Конечно получаю, просто сонофф совсем не выключает батарею. Он два режима делает
0-нормальный режим, реле НО держит температуру по крутилке стоящей на нем
1-экономичный режим, реле НЗ включает на конвекторе режим антизамерзания +5 в помещении.
А мне надо физическую работу тена в 2х режимах
Отправлено с моего MI 9 через Tapatalk
Re: [Сценарий] Анализ периода от начала суток и построение индикатора
Добавлено: Пт ноя 15, 2019 1:18 pm
MaxVM
xor писал(а): ↑Чт ноя 14, 2019 11:08 pm
кстати, сошлюсь на себя
https://connect.smartliving.ru/profile/ ... rdomo.html
Я там среднее считал, взвешенное по времени, эту функцию легко переделать для поиска времени на периоде, когда свойство удовлетворяет каким-то требованиям.
зы. и по-моему, за основу и брал скрипт из этого топика) там немного упрощено получение айдишников с использованием встроенных функций
вот как получилось:
Код: Выделить всё
//function getHistoryAvgMy($varname, $start_time, $stop_time = 0) {
$varname = 'Noorelay_1.status';
$what = 1; // какое значение считаем
$start_time = strtotime(date("Y-m-d").' 00:00:00');
$stop_time = 0;
if ($start_time <= 0) $start_time = (time() + $start_time);
if ($stop_time <= 0) $stop_time = (time() + $stop_time);
// Get hist val id
$pvalue = getHistoryValueId($varname);
if (defined('SEPARATE_HISTORY_STORAGE') && SEPARATE_HISTORY_STORAGE == 1) {
$table_name = createHistoryTable($pvalue);
} else {
$table_name = 'phistory';
}
// Получить количество записей за нужный период времени
$arr_s = SQLSelectOne("SELECT COUNT(ID) as COUNT_ID FROM $table_name ".
"WHERE VALUE_ID=".$pvalue." and not value is null ".
"AND ADDED between '".date('Y-m-d H:i:s', $start_time)."' AND '".date('Y-m-d H:i:s', $stop_time)."'");
// Взять это количество записей +1
$arr_s = SQLSelect("SELECT * FROM $table_name WHERE VALUE_ID=".$pvalue." and not value is null ".
" AND ADDED<='".date('Y-m-d H:i:s', $stop_time)."' ORDER BY ADDED DESC LIMIT 0 , ".(1+$arr_s['COUNT_ID']));
$tmr2 = $stop_time;
// Переберем весь массив
foreach($arr_s as $s) {
$tmr1 = $tmr2;
$tmr2 = strtotime($s['ADDED']);
// Ограничить началом
if ($tmr2<$start_time)
$tmr2 = $start_time;
// Двигаясь вниз по массиву времени складывать отрезки
//echo(date('H:i:s', $tmr1).' - '.date('H:i:s', $tmr2).' = '.($tmr1 - $tmr2).'c t='.$s['VALUE'].'<br>');
if($s['VALUE']==$what) $tmr_mem = $tmr_mem + $tmr1 - $tmr2;
//$ss = $ss + $s['VALUE']*($tmr1 - $tmr2);
}
$all = $stop_time - $start_time; //всего времени с начала суток all
$proc = ($tmr_mem/$all)*100; //%%
echo('part = '.$tmr_mem.' sec of value='.$what.'<br>') ;
echo('start = '.date("Y-m-d H:i:s",$start_time).'<br>') ;
echo('stop = '.date("Y-m-d H:i:s",$stop_time).'<br>') ;
echo('all = '.$all.' sec<br>');
echo('proc = '.$proc.' %');
вот вывод
Код: Выделить всё
part = 621 sec of value=1
start = 2019-11-15 00:00:00
stop = 2019-11-15 00:25:03
all = 1503 sec
proc = 41.317365269461 %
Годный код!!! Спасибо Xor-у!!!!
Но я чего то совсем туплю как этот, как сделать этот метод универсальным для всех объектов класса. $this я так думаю но как вставить грамотно, опять же синтаксис да мой мозг барахлит.
Re: [Сценарий] Анализ периода от начала суток и построение индикатора
Добавлено: Пт ноя 15, 2019 3:21 pm
xor
MaxVM писал(а):xor писал(а): ↑Чт ноя 14, 2019 11:08 pm
кстати, сошлюсь на себя
https://connect.smartliving.ru/profile/ ... rdomo.html
Я там среднее считал, взвешенное по времени, эту функцию легко переделать для поиска времени на периоде, когда свойство удовлетворяет каким-то требованиям.
зы. и по-моему, за основу и брал скрипт из этого топика) там немного упрощено получение айдишников с использованием встроенных функций
вот как получилось:
Код: Выделить всё
//function getHistoryAvgMy($varname, $start_time, $stop_time = 0) {
$varname = 'Noorelay_1.status';
$what = 1; // какое значение считаем
$start_time = strtotime(date("Y-m-d").' 00:00:00');
$stop_time = 0;
if ($start_time <= 0) $start_time = (time() + $start_time);
if ($stop_time <= 0) $stop_time = (time() + $stop_time);
// Get hist val id
$pvalue = getHistoryValueId($varname);
if (defined('SEPARATE_HISTORY_STORAGE') && SEPARATE_HISTORY_STORAGE == 1) {
$table_name = createHistoryTable($pvalue);
} else {
$table_name = 'phistory';
}
// Получить количество записей за нужный период времени
$arr_s = SQLSelectOne("SELECT COUNT(ID) as COUNT_ID FROM $table_name ".
"WHERE VALUE_ID=".$pvalue." and not value is null ".
"AND ADDED between '".date('Y-m-d H:i:s', $start_time)."' AND '".date('Y-m-d H:i:s', $stop_time)."'");
// Взять это количество записей +1
$arr_s = SQLSelect("SELECT * FROM $table_name WHERE VALUE_ID=".$pvalue." and not value is null ".
" AND ADDED<='".date('Y-m-d H:i:s', $stop_time)."' ORDER BY ADDED DESC LIMIT 0 , ".(1+$arr_s['COUNT_ID']));
$tmr2 = $stop_time;
// Переберем весь массив
foreach($arr_s as $s) {
$tmr1 = $tmr2;
$tmr2 = strtotime($s['ADDED']);
// Ограничить началом
if ($tmr2<$start_time)
$tmr2 = $start_time;
// Двигаясь вниз по массиву времени складывать отрезки
//echo(date('H:i:s', $tmr1).' - '.date('H:i:s', $tmr2).' = '.($tmr1 - $tmr2).'c t='.$s['VALUE'].'<br>');
if($s['VALUE']==$what) $tmr_mem = $tmr_mem + $tmr1 - $tmr2;
//$ss = $ss + $s['VALUE']*($tmr1 - $tmr2);
}
$all = $stop_time - $start_time; //всего времени с начала суток all
$proc = ($tmr_mem/$all)*100; //%%
echo('part = '.$tmr_mem.' sec of value='.$what.'<br>') ;
echo('start = '.date("Y-m-d H:i:s",$start_time).'<br>') ;
echo('stop = '.date("Y-m-d H:i:s",$stop_time).'<br>') ;
echo('all = '.$all.' sec<br>');
echo('proc = '.$proc.' %');
вот вывод
Код: Выделить всё
part = 621 sec of value=1
start = 2019-11-15 00:00:00
stop = 2019-11-15 00:25:03
all = 1503 sec
proc = 41.317365269461 %
Годный код!!! Спасибо Xor-у!!!!
Но я чего то совсем туплю как этот, как сделать этот метод универсальным для всех объектов класса. $this я так думаю но как вставить грамотно, опять же синтаксис да мой мозг барахлит.
Если надо работать с объектом/свойством, принимающим значения 0/1, то можно тупо использовать функцию средневзвешенного, приведённую в блоге. Она как раз выдаст долю единиц в интервале) кстати, там можно и другие периоды задавать, например, месяц, неделю, год, если данные в истории есть
Отправлено с моего Redmi 4X через Tapatalk
Re: [Сценарий] Анализ периода от начала суток и построение индикатора
Добавлено: Сб ноя 16, 2019 11:36 pm
xor
вот функцию более-менее универсальную нарисовал
https://connect.smartliving.ru/profile/ ... omili.html
проверяйте
Re: [Сценарий] Анализ периода от начала суток и построение индикатора
Добавлено: Вс ноя 17, 2019 12:27 am
MaxVM
Аааа аааа, круто! Только разобрался с предидущими двумя, как бац и опять смотри! СПАСИБО! Учиться никогда не поздно!
Отправлено с моего MI 9 через Tapatalk