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

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

Добавлено: Вт фев 10, 2015 8:23 pm
Vit
Задача анализа периода от начала суток оказалась весьма хитрая. Она была бы намного проще, если предположить, что в истории за 0 всегда идет 1, а за 1 всегда 0. Да и что каждый день вообще есть записи в истории. Слишком много если.. Поэтому было принято решение сделать запрос к базе данных и посчитать временные интервалы.
Суть индикатора отражена в названии. Активность периода за Сегодня. То есть считать нужно только в пределах текущих суток.
Пример можно применять не обязательно для Еко режима. Можно считать что угодно. Например работу отопителя или увлажнителя. Все зависит от Вашей фантазии.

Ну благодаря Bagir (у), спасибо ему огромное за отзывчивость и помощь, запустил я у себя сценарий расчета активности режима (1-активен, 0-неактивен), чем и хочу поделится с сообществом.

1. добавил свойство у класса режимов
SPOILERSPOILER_SHOW
Изображение
2. повторяюсь благодаря помощи Bagir добавил сценарий EconomModePeriod со следующим кодом
SPOILERSPOILER_SHOW

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

/* Данные истории находятся в таблице phistory. Чтобы их от туда взять, нужно знать VALUE_ID нашего Объект.Свойства
   Получить его можно разными путями в зависимости от ситуации. Приведу общий способ, который будет работать в любом месте. 
   Например из сценария, где нет такого указателя как $this. Еще этот код немного расскажет про связь между таблицами в базе данных.
*/

$start_time=date("Y-m-d").' 00:00:00';
$tmr_start = strtotime($start_time);
$tmr_now = time();
$tmr_mem = 0; //накопитель времени в секундах


// Мы знаем имя объекта и имя свойства.

// Имена объектов находятся в таблице objects и они должны быть уникальными
// Для начала нам нужно получить id нашего объекта и id класса которому принадлежит объект
$obj_title = 'EconomMode'; //имя объекта (поменять на свой !!!!!!!!!!!!!!!!!)
$arr_s = SQLSelectOne("SELECT * FROM objects WHERE TITLE='".$obj_title."'");
$obj_id = $arr_s['ID'];
$class_id = $arr_s['CLASS_ID'];

/* Имена свойств находятся в таблице properties
   с указанием id класса если свойство заданно на уровне класса,
   или id объекта если свойство принадлежит объекту лично.
*/   
// Получим id свойства по его имени И (id класса ИЛИ id объекта)
$prop_title = 'active';  //имя свойства (поменять на свое!!!!!!!!!!!!!)
$arr_s = SQLSelectOne("SELECT * FROM properties WHERE TITLE='".$prop_title."' AND (CLASS_ID='".$class_id."' OR OBJECT_ID='".$obj_id."')");
$prop_id = $arr_s['ID'];

// значения свойств находятся в таблице pvalues
// Нам нужен id. (уточнить необходимость сортировки по UPDATED)
$arr_s = SQLSelectOne("SELECT * FROM pvalues WHERE OBJECT_ID='".$obj_id."' AND PROPERTY_ID='".$prop_id."'");
$pvalue = $arr_s['ID'];

/* Зная $pvalue можно слазать за данными истории в таблицу phistory
   Для нашей задачи нужно получить все записи по времени >= началу суток + 1 запись
*/   
// Получить количество записей за нужный период времени
$arr_s = SQLSelectOne("SELECT COUNT(ID) as COUNT_ID FROM phistory WHERE VALUE_ID=".$pvalue." AND ADDED>='".date('Y-m-d H:i:s', $tmr_start)."'");
// Взять это количество записей +1
$arr_s = SQLSelect("SELECT * FROM phistory WHERE VALUE_ID=".$pvalue." ORDER BY ADDED DESC LIMIT 0 , ".(1+$arr_s['COUNT_ID']));


$tmr2 = $tmr_now;

// Переберем весь массив
foreach($arr_s as $s) {
 $tmr1 = $tmr2;
 $tmr2 = strtotime($s['ADDED']);
 
 // Ограничить началом суток
 if ($tmr2<$tmr_start) { $tmr2=$tmr_start; }
 
 
 // Двигаясь вниз по массиву времени складывать отрезки если режим включен
 if ($s['VALUE']) { $tmr_mem = $tmr_mem + $tmr1 - $tmr2; }
}

$period = round( $tmr_mem * 100 / ($tmr_now - $tmr_start) );

setGlobal("EconomMode.period",$period); //запись значения в свойство объекта (поменять на свое!!!!!!!!!!!!!!)           


запускаю пока этот сценарий в методе onNewHour каждый час командой

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

runScript('EconomModePeriod'); 
далее выводим активность режима на сцене в виде
SPOILERSPOILER_SHOW
Изображение
для этого я сделал контейнер с двумя элементами, чтобы удобней было при желании перемещать по сцене
SPOILERSPOILER_SHOW
Изображение
1 HTML элемент это просто надпись
SPOILERSPOILER_SHOW
Изображение
2 HTML элемент сам индикатор со следующим кодом
Данные о размере берутся из его свойств ширины и высоты
Не забудьте поменять element_117 на свой
SPOILERSPOILER_SHOW

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

<style type = "text/CSS">
div.element_117 {
  border-style: solid;
  border-width: 1px;
  border-color: black;
}
.element_117 .line {
  width:%EconomMode.period%%;
  height:100%;
  background-color: rgb(59,103,158); /* Old browsers */
  background-image: linear-gradient(rgb(59,73,128), rgb(89,133,188) 10%);
}
</style>

<div class="line"></div> 
объект.свойство в коде поменяйте на свое..

вот в принципе и все....

доработка как кода так и дизайна приветствуется...

может кто подскажет по каким то недочетам либо ошибкам...


Пробуйте, тестируйте и отписывайтесь

Изображение

P.S. Благодарю Bagir (а) за помощь
файл элементов сцена в attach

Re: стили для элементов сцен

Добавлено: Вт фев 10, 2015 10:47 pm
Bagir
Очень рад, что все получилось! Сегодня ночью я посмотрю как отработает переход на новые сутки. Пока что циферки просчитывал, все сходится.
Из дополнений:
Скрипту в параметрах можно передавать имя Объект.свойство у которого берем историю, и Объект.свойство которому надо присвоить ответ. Тогда скрипт можно вызывать для разных объектов.

Re: стили для элементов сцен

Добавлено: Ср фев 11, 2015 8:32 pm
adzam
А этот файл Elements20-32-30.rar как раскрыть или его надо импортировать?
После распаковки получаем файл Elements20-32-30.elements и что с ним делать?

Re: стили для элементов сцен

Добавлено: Ср фев 11, 2015 9:21 pm
Vit
adzam писал(а):А этот файл Elements20-32-30.rar как раскрыть или его надо импортировать?
После распаковки получаем файл Elements20-32-30.elements и что с ним делать?
в сценах в элементах выбранной сцены
SPOILERSPOILER_SHOW
Изображение
есть пункт
SPOILERSPOILER_SHOW
Изображение
выбрать файл и импортировать

Re: стили для элементов сцен

Добавлено: Ср фев 11, 2015 9:25 pm
adzam
Получилось , спасибо,но это только индикатор.
Сделай пож импорт всей этой сцены , я хочу посмотреть как у тебя сделано, или пару кнопок

Re: стили для элементов сцен

Добавлено: Ср фев 11, 2015 9:29 pm
Vit
adzam писал(а):Получилось , спасибо,но это только индикатор.
Сделай пож импорт всей этой сцены , я хочу посмотреть как у тебя сделано, или пару кнопок
я тоже ее только начал рисовать...так пока для примера новых стилей

может кто из присутствующих может планы помещений в 3d почертить помочь, буду благодарен

Re: Анализ периода от начала суток и построение индикатора

Добавлено: Ср апр 15, 2015 2:35 pm
Amarok
А что это вообще за РежимЭкономии? Что он делает?
  • Кэп: Экономит!
  • я: Спасибо, Капитан!
А что входит в понятие экономия?

Re: Анализ периода от начала суток и построение индикатора

Добавлено: Ср апр 15, 2015 3:23 pm
Bagir
Можно например уменьшить время включения освещения в режиме экономии.

Re: Анализ периода от начала суток и построение индикатора

Добавлено: Ср апр 15, 2015 3:25 pm
Amarok
Примерчиков бы живых...

Re: Анализ периода от начала суток и построение индикатора

Добавлено: Вт ноя 22, 2016 11:35 am
mazahaka7sk
Сделал все как у вас имена обьектов не менял так как у меня такие же названия но почему то не работает ( что я сделал не так подскажите??