[Модификация] Строим графики Highstock

Вносятся изменения в файлы или устанавливаются доп программы

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

Ko/|xo3HUk
Сообщения: 159
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

Re: Строим графики Highstock

Сообщение Ko/|xo3HUk » Чт фев 02, 2017 8:54 am

У меня сервак под линуксом, там другие пути. На картинке вверху написан путь до файла.
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Ko/|xo3HUk
Сообщения: 159
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

Re: Строим графики Highstock

Сообщение Ko/|xo3HUk » Вс фев 19, 2017 4:50 pm

Решил подкорректировать немного сценарий jconhs для того, чтобы данные в график загружались не с самого начала работы сервера, а только за последний месяц, т.к. если данных очень много - довольно таки долго строится такой график.
СпойлерПоказать

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

// Получить имя и проверить
 if ( isset($params['name'])  ) { $name = $params['name']; } else { returm; }
 // Разбить на объект и свойство
 $name = explode('.', $name);

// Получаем текущее время:
 $end_time=time();
 $start_time = $end_time-31*24*60*60; // 1 месяц

// Получить объект по имени
 $obj=getObject($name[0]); 
 // Получить id свойства
 $prop_id=$obj->getPropertyByName($name[1], $obj->class_id, $obj->id);
 // Получаем VALUE_ID для следующей таблицы
 $pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$obj->id."'");
//DebMes("Запрос = : ".$pvalue); // После этого в XRay во вкладке debug можно смотреть результат. 
// Получаем таблицу
 $arr_s = SQLSelect("SELECT UNIX_TIMESTAMP(ADDED) as ADDED, VALUE FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' AND ADDED>=('".date('Y-m-d H:i:s', $start_time)."') AND ADDED<=('".date('Y-m-d H:i:s', $end_time)."') ORDER BY ADDED");

 // Собрать структуру JSON
 $st = $params['callback'].'([';
 foreach($arr_s as $s) {
   if ($f) { $st .=','; }
   $st .= '['.$s['ADDED'].'000,'.$s['VALUE'].']' ;
   $f=1;
 }
 $st .= '])';

 // Ответ
 echo ($st); 
//DebMes("Собрать структуру JSON: ".$st); // После этого в XRay во вкладке debug можно смотреть результат.
 
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Ko/|xo3HUk
Сообщения: 159
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

Re: Строим графики Highstock

Сообщение Ko/|xo3HUk » Вс фев 19, 2017 5:37 pm

Всё-таки мне захотелось сделать настраиваемый период данных для графиков.
Создал объект Highstock:
СпойлерПоказать
1.png
1.png (37.24 КБ) 7936 просмотров
Создал свойство jsonhs_period:
СпойлерПоказать
2.png
2.png (27.05 КБ) 7936 просмотров
Создал новый пункт меню (тип: select):
СпойлерПоказать
3.png
3.png (56.06 КБ) 7936 просмотров
Добавил новое свойство Highstock.jsonhs_period в сценарий jsonhs:
СпойлерПоказать

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

// Получить имя и проверить
 if ( isset($params['name'])  ) { $name = $params['name']; } else { returm; }
 // Разбить на объект и свойство
 $name = explode('.', $name);

// Получаем текущее время:
 $end_time=time();
 $start_time = $end_time-gg("HighStock.jsonhs_period")*24*60*60; //Период задаётся в меню "Управление->Настройка периода для графиков Highstock"

// Получить объект по имени
 $obj=getObject($name[0]); 
 // Получить id свойства
 $prop_id=$obj->getPropertyByName($name[1], $obj->class_id, $obj->id);
 // Получаем VALUE_ID для следующей таблицы
 $pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$obj->id."'");
//DebMes("Запрос = : ".$pvalue); // После этого в XRay во вкладке debug можно смотреть результат. 
// Получаем таблицу
 $arr_s = SQLSelect("SELECT UNIX_TIMESTAMP(ADDED) as ADDED, VALUE FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' AND ADDED>=('".date('Y-m-d H:i:s', $start_time)."') AND ADDED<=('".date('Y-m-d H:i:s', $end_time)."') ORDER BY ADDED");

 // Собрать структуру JSON
 $st = $params['callback'].'([';
 foreach($arr_s as $s) {
   if ($f) { $st .=','; }
   $st .= '['.$s['ADDED'].'000,'.$s['VALUE'].']' ;
   $f=1;
 }
 $st .= '])';

 // Ответ
 echo ($st); 
//DebMes("Собрать структуру JSON: ".$st); // После этого в XRay во вкладке debug можно смотреть результат.
И сейчас можно выбирать период через меню:
СпойлерПоказать
4.png
4.png (119.46 КБ) 7936 просмотров
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Аватара пользователя
Bagir
Сообщения: 1486
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 187 раз
Поблагодарили: 337 раз

Re: Строим графики Highstock

Сообщение Bagir » Чт мар 09, 2017 2:29 pm

Вернулся к теме графиков. Стало интересно, что там новенького придумали в библиотеке. Да и на момент написания статьи остались не реализованы разные интересные идеи. Перечитал всё, чтобы вспомнить. Завтра обновлю код. У меня за это время были небольшие изменения. Не столь критичные, но чтобы говорить об одном и том же, приведу всё в порядок.
И да, конечно же JSON, а не JСON. Забавная ошибка затесалась на момент написания скрипта. На тот момент я про формат JSON вообще и не знал.
Самое первое, с чего хотел бы начать, это преобразование ответа, полученного из базы данных с помощью SQLSelect в формат JSON. Сейчас это делается с помощью цикла foreach. Этот способ, наверное, не претендует на самый оптимальный по времени. Проводил ли кто тесты на скорость?
Еще нужно обсудить вариант записи в базу данных. Писать туда одинаковые значения, я считаю не целесообразно. Сейчас в базу пишется только первое и последнее одинаковое значение. Но, последнее значение будет обновлять метку времени. При этом мы можем видеть, какой период времени продолжало присутствовать это значение. Этого должно быть достаточно, чтобы правильно отображать изменения значения на линии времени графика. К тому же это сильно уменьшит объем обрабатываемых данных, что хорошо скажется на скорости.
Windows 7, HTTP, MegaD, Z-Wave, 1-Wire
Jager
Сообщения: 708
Зарегистрирован: Сб авг 18, 2012 10:21 am
Благодарил (а): 26 раз
Поблагодарили: 180 раз

Re: Строим графики Highstock

Сообщение Jager » Чт мар 09, 2017 3:06 pm

Bagir писал(а):Вернулся к теме графиков. Стало интересно, что там новенького придумали в библиотеке. Да и на момент написания статьи остались не реализованы разные интересные идеи. Перечитал всё, чтобы вспомнить. Завтра обновлю код.
Лучше сразу в виде модуля, по аналогии со встроенным Charts, с интеграцией в домашние страницы и сцены.
Аватара пользователя
Bagir
Сообщения: 1486
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 187 раз
Поблагодарили: 337 раз

Re: Строим графики Highstock

Сообщение Bagir » Чт мар 09, 2017 7:38 pm

Даже и не знаю. Есть ли смысл в модуле. Там всего то нужен сценарий json, а код html может быть встроен уже в существующую страницу. А примере конечно на отдельной, чтобы по проще было разобраться.
Файлы можно тянуть из Интернета

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

<script src="https://code.highcharts.com/highcharts.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
либо скачать и закинуть в js папку.
Нет ни циклов, ни настроек, ни базы данных в sql. Так что модуль тут не нужен. HTML код для графика у всех будет разный. Тут как говорится на вкус и цвет... А почитать можно тут.
Я когда доберусь до системы, первым делом хочу проверить скорость создания json циклом и, например, с помощью json_encode. Да и вообще, подойдет ли json_encode для этого.
Windows 7, HTTP, MegaD, Z-Wave, 1-Wire
Jager
Сообщения: 708
Зарегистрирован: Сб авг 18, 2012 10:21 am
Благодарил (а): 26 раз
Поблагодарили: 180 раз

Re: Строим графики Highstock

Сообщение Jager » Чт мар 09, 2017 8:18 pm

Bagir писал(а):Даже и не знаю. Есть ли смысл в модуле. Там всего то нужен сценарий json, а код html может быть встроен уже в существующую страницу.
Файлы можно тянуть из Интернета, либо скачать и закинуть в js папку.
Так в том и смысл что бы при установке модуля автоматом скачались нужные файлы и юзеру осталось только указать нужные свойства-опции и на выходе получить html код для вставки.
Ko/|xo3HUk
Сообщения: 159
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

Re: Строим графики Highstock

Сообщение Ko/|xo3HUk » Чт мар 09, 2017 9:11 pm

Мне кажется с модулем потеряется большая часть функционала/настроек графиков. Там настроек - тыщщи. Если только модуль будет подготавливать код, который можно уже будет тюнить для своих нужд - тогда ещё пойдёт.
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Jager
Сообщения: 708
Зарегистрирован: Сб авг 18, 2012 10:21 am
Благодарил (а): 26 раз
Поблагодарили: 180 раз

Re: Строим графики Highstock

Сообщение Jager » Чт мар 09, 2017 10:00 pm

Ko/|xo3HUk писал(а):Если только модуль будет подготавливать код, который можно уже будет тюнить для своих нужд - тогда ещё пойдёт.
В том и смысл что не подготовленный человек сразу получает картинку и рядом инструкцию с тюнингом.
Аватара пользователя
Bagir
Сообщения: 1486
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 187 раз
Поблагодарили: 337 раз

Re: Строим графики Highstock

Сообщение Bagir » Чт мар 09, 2017 10:28 pm

Ну да, если так, то идея хорошая. Это как online конструктор модулей от Сергея.
Эх, для начала бы ускорить работу сценария подготовки JSON. json_encode работает быстрее, но делает не совсем такую строку, чтобы скормить её графику. А многочисленные замены символов не добавят быстродействия по сравнению с перебором в цикле. У json_encode есть параметры. Например JSON_NUMERIC_CHECK убирает кавычки если это число. Но остается еще много вопросов.

В итоге после запроса данных из sql, мы имеем следующее:
простой массив, элементы которого это ассоциативные массивы. И если это бодро скормить json_encode, то результат будет не съедобен для графиков. Вероятно придется остаться с вариантом перебора foreach
Windows 7, HTTP, MegaD, Z-Wave, 1-Wire
Ответить