[Сценарий] Анализ периода от начала суток и построение индикатора

Не требует установки программ или изменения файлов

Модераторы: immortal, newz20

Logrus
Сообщения: 1644
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 278 раз
Поблагодарили: 327 раз

Re: [Сценарий] Анализ периода от начала суток и построение индикатора

Сообщение Logrus » Пт ноя 15, 2019 12:24 pm

MaxVM писал(а):
Пт ноя 15, 2019 10:25 am
Logrus писал(а):
Пт ноя 15, 2019 1:34 am
так и не понял физический смысл измерения направления изменения сенсора, а не факт работы тена, т.е. статус 1
В батареи датчик температуры и sonoff, режим работы (eco и comfort) переключает он + на нем датчик температуры который смотрит растет температура или нет. По ниму и смотрю время физической работы тена в радиаторе. Хочу знать в расчете на сутки сколько он раз включился, для начала в процентном отношении и по среднему посчитать потребление электроэнергии каждым конвектором
а состояние реле соноффа не получаете, то по нему время работы тена как-то прямее смотреть
Мой CONNECT | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо - ТАМ =>
MaxVM
Сообщения: 61
Зарегистрирован: Вт янв 10, 2017 2:26 pm
Благодарил (а): 7 раз
Поблагодарили: 0

Re: [Сценарий] Анализ периода от начала суток и построение индикатора

Сообщение MaxVM » Пт ноя 15, 2019 1:01 pm

Logrus писал(а):
MaxVM писал(а):
Пт ноя 15, 2019 10:25 am
Logrus писал(а):
Пт ноя 15, 2019 1:34 am
так и не понял физический смысл измерения направления изменения сенсора, а не факт работы тена, т.е. статус 1
В батареи датчик температуры и sonoff, режим работы (eco и comfort) переключает он + на нем датчик температуры который смотрит растет температура или нет. По ниму и смотрю время физической работы тена в радиаторе. Хочу знать в расчете на сутки сколько он раз включился, для начала в процентном отношении и по среднему посчитать потребление электроэнергии каждым конвектором
а состояние реле соноффа не получаете, то по нему время работы тена как-то прямее смотреть
Конечно получаю, просто сонофф совсем не выключает батарею. Он два режима делает
0-нормальный режим, реле НО держит температуру по крутилке стоящей на нем
1-экономичный режим, реле НЗ включает на конвекторе режим антизамерзания +5 в помещении.
А мне надо физическую работу тена в 2х режимах

Отправлено с моего MI 9 через Tapatalk

MaxVM
Сообщения: 61
Зарегистрирован: Вт янв 10, 2017 2:26 pm
Благодарил (а): 7 раз
Поблагодарили: 0

Re: [Сценарий] Анализ периода от начала суток и построение индикатора

Сообщение MaxVM » Пт ноя 15, 2019 1:18 pm

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 я так думаю но как вставить грамотно, опять же синтаксис да мой мозг барахлит.
Аватара пользователя
xor
Сообщения: 1621
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 170 раз
Поблагодарили: 471 раз

Re: [Сценарий] Анализ периода от начала суток и построение индикатора

Сообщение xor » Пт ноя 15, 2019 3:21 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 я так думаю но как вставить грамотно, опять же синтаксис да мой мозг барахлит.
Если надо работать с объектом/свойством, принимающим значения 0/1, то можно тупо использовать функцию средневзвешенного, приведённую в блоге. Она как раз выдаст долю единиц в интервале) кстати, там можно и другие периоды задавать, например, месяц, неделю, год, если данные в истории есть

Отправлено с моего Redmi 4X через Tapatalk

За это сообщение автора xor поблагодарил:
Chainik (Пт ноя 15, 2019 3:26 pm)
Рейтинг: 1.23%
Аватара пользователя
xor
Сообщения: 1621
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 170 раз
Поблагодарили: 471 раз

Re: [Сценарий] Анализ периода от начала суток и построение индикатора

Сообщение xor » Сб ноя 16, 2019 11:36 pm

вот функцию более-менее универсальную нарисовал https://connect.smartliving.ru/profile/ ... omili.html
проверяйте
За это сообщение автора xor поблагодарили (всего 2):
Chainik (Сб ноя 16, 2019 11:51 pm) • MaxVM (Вс ноя 17, 2019 12:27 am)
Рейтинг: 2.47%
MaxVM
Сообщения: 61
Зарегистрирован: Вт янв 10, 2017 2:26 pm
Благодарил (а): 7 раз
Поблагодарили: 0

Re: [Сценарий] Анализ периода от начала суток и построение индикатора

Сообщение MaxVM » Вс ноя 17, 2019 12:27 am

xor писал(а):вот функцию более-менее универсальную нарисовал https://connect.smartliving.ru/profile/ ... omili.html
проверяйте
Аааа аааа, круто! Только разобрался с предидущими двумя, как бац и опять смотри! СПАСИБО! Учиться никогда не поздно!

Отправлено с моего MI 9 через Tapatalk

Ответить