Суть индикатора отражена в названии. Активность периода за Сегодня. То есть считать нужно только в пределах текущих суток.
Пример можно применять не обязательно для Еко режима. Можно считать что угодно. Например работу отопителя или увлажнителя. Все зависит от Вашей фантазии.
Ну благодаря Bagir (у), спасибо ему огромное за отзывчивость и помощь, запустил я у себя сценарий расчета активности режима (1-активен, 0-неактивен), чем и хочу поделится с сообществом.
1. добавил свойство у класса режимов 2. повторяюсь благодаря помощи Bagir добавил сценарий EconomModePeriod со следующим кодом
Код: Выделить всё
/* Данные истории находятся в таблице 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');
для этого я сделал контейнер с двумя элементами, чтобы удобней было при желании перемещать по сцене
1 HTML элемент это просто надпись
2 HTML элемент сам индикатор со следующим кодом
Данные о размере берутся из его свойств ширины и высоты
Не забудьте поменять element_117 на свой
Код: Выделить всё
<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