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

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

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

Аватара пользователя
Bagir
Сообщения: 1485
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 187 раз
Поблагодарили: 337 раз

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

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

Нарыл таки я способ как получить нужный нам JSON.
Вот два варианта сценарияПоказать

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

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

 // Получить объект по имени
 $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."'");
 // Получаем данные из таблицы истории
 $arr_s = SQLSelect("SELECT UNIX_TIMESTAMP(ADDED) as ADDED, VALUE FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' ORDER BY ADDED");

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

 // Ответ
 echo ($st); 

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

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

 // Получить объект по имени
 $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."'");
 // Получаем данные из таблицы истории
 $arr_s = SQLSelect("SELECT UNIX_TIMESTAMP(ADDED)*1000 as ADDED, VALUE FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' ORDER BY ADDED");

 // Собрать структуру JSON
 $st = $params['callback'].'('.json_encode(array_map(array_values, $arr_s), JSON_NUMERIC_CHECK).')';

 // Ответ
 echo ($st); 
Ответы полностью одинаковые. Кто умеет, сделайте сравнительный анализ быстродействия. Очень интересно, какой способ быстрее. Особые надежды на второй вариант я не возлагаю. array_map наверное прожорливая штучка. Но в тоже время в первом варианте очень много операции сложение текста с очень длинной строкой. Так что без испытаний я не могу сказать кто победит.
Windows 7, HTTP, MegaD, Z-Wave, 1-Wire
Ko/|xo3HUk
Сообщения: 159
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

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

Сообщение Ko/|xo3HUk » Пт мар 10, 2017 9:36 am

Придумал потестить скрипт только так: создал два сценария, в которых прописал следующее:
Сценарий_1: js_test1Показать

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

$start = microtime(true);

{здесь вставил сценарий_1, только последнюю строку [echo ($st); ] закомментарил, чтобы лишнего на экран не выводило}
 //echo ($st); 

$finish = microtime(true);

$delta = $finish - $start;

echo 'Время выполнения php скрипта в микросекундах: '. $delta . ' сек.';
 
Сценарий_2: js_test2Показать

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

$start = microtime(true);

{здесь вставил сценарий_2, только последнюю строку [echo ($st); ] закомментарил, чтобы лишнего на экран не выводило}
 //echo ($st); 

$finish = microtime(true);

$delta = $finish - $start;

echo 'Время выполнения php скрипта в микросекундах: '. $delta . ' сек.';
 
И запускал эти скрипты следующим образом: в адресной строке браузера вставлял адрес:
для первого сценария:

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

http://192.168.1.69/objects/?script=js_test1&name=ESP8266_Outside.Temper_1    
для второго:

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

http://192.168.1.69/objects/?script=js_test2&name=ESP8266_Outside.Temper_1    
где, ESP8266_Outside.Temper_1 - переменная, куда пишется температура на улице. Пишется с 11 декабря 2015 года, с интервалом в 1 минуту.

Запускал скрипт по 20 раз. Получились в итоге вот такие цифры:
для сценария_1:
Среднее значение = 8,062919784 сек.Показать
7,03787303
5,184198141
6,219690084
5,426856995
9,406219006
7,841920137
7,057847023
5,6811409
5,919893026
6,546282053
6,701434135
5,970079184
8,49712491
9,361844063
8,728251934
5,736598015
5,904496908
18,10865498
9,478587151
16,449404
----------------------
Среднее значение = 8,062919784 сек.
для сценария_2:
Среднее значение = 8,675493026 сек.Показать
5,893275023
10,16350508
10,34498191
7,576536894
6,416634798
5,251133919
5,726686001
6,050065994
7,540504932
5,912469149
6,208261967
15,30325508
8,373816967
6,140471935
9,740535021
9,613977909
21,98826194
6,682202101
11,67304397
6,910239935
----------------------
Среднее значение = 8,675493026 сек.
Чисто субъективно - сценарий_1 пошустрее работает. Но всё-равно значения в каждом тесте сильно разнятся - зависит, видимо, больше от того - насколько загружен сейчас проц сервера другими задачами.
За это сообщение автора Ko/|xo3HUk поблагодарили (всего 2):
Bagir (Пт мар 10, 2017 9:47 am) • Kuzma (Сб апр 21, 2018 9:02 am)
Рейтинг: 2.35%
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Аватара пользователя
Bagir
Сообщения: 1485
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 187 раз
Поблагодарили: 337 раз

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

Сообщение Bagir » Пт мар 10, 2017 9:53 am

Да, нужно среднее высчитывать после нескольких запусков. Кроме сборки JSON многое зависит от реакции SQL. Но полученные цифры весьма многое говорят. Значит остаемся на первом варианте. Я немного изменил его по сравнению с примером на первом посте. В выходные оформлю.
За это сообщение автора Bagir поблагодарил:
Ko/|xo3HUk (Пт мар 10, 2017 9:57 am)
Рейтинг: 1.18%
Windows 7, HTTP, MegaD, Z-Wave, 1-Wire
Ko/|xo3HUk
Сообщения: 159
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

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

Сообщение Ko/|xo3HUk » Пт мар 10, 2017 9:57 am

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

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

$start = microtime(true);
//echo 'Время начала выполнения php скрипта в микросекундах: '. $start . ' сек.';


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


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

 // Получить объект по имени
 $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."'");
 // Получаем данные из таблицы истории
 // $arr_s = SQLSelect("SELECT UNIX_TIMESTAMP(ADDED) as ADDED, VALUE FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' ORDER BY ADDED");
 $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'].'([';
 $f = false;
 foreach($arr_s as $s) {
   if ($f) { $st .=','; } else { $f = true; }
   $st .= '['.$s['ADDED'].'000,'.$s['VALUE'].']' ;
 }
 $st .= '])';

 // Ответ
 //echo ($st); 
$finish = microtime(true);

$delta = $finish - $start;

echo 'Время выполнения php скрипта в микросекундах: '. $delta . ' сек.';

 
Вот в итоге какие цифры получились:
Среднее значение = 4,010806394 сек.Показать
2,660046101
1,288882017
1,056625128
1,317773104
18,16537905
1,894510031
2,801804066
1,680463076
3,049397945
2,236911058
3,544475079
8,996900082
0,81338501
1,403491974
1,155987978
3,382887125
1,120095015
17,04177904
5,479170084
1,126164913
----------------
Среднее значение = 4,010806394 сек.
Здесь наглядно видно что в какие-то моменты времени проц очень занят - прирост времени в 1000% :)
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Аватара пользователя
Bagir
Сообщения: 1485
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 187 раз
Поблагодарили: 337 раз

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

Сообщение Bagir » Пт мар 10, 2017 10:16 am

Вообщем, как не жаль, а выше головы не прыгнешь. Поборемся конечно еще на оптимизацию. Может какие новые идеи будут.
Данных реально очень много, и быстро их не обработать. Значит будем работать со вторым направлением. С нашей базой данных. С точки зрения индексов по моему она совершенна. И тут уже нечего добавить. Нам остается только обязательно оптимизировать её, чтобы не было одинаковых значений. Если хочется, чтобы шкала времени была всегда линейная, то для этого есть специальный параметр. Тут о нём уже ранее говорили. Я выложу его в пример на первом посте.
Highstock сейчас использую тоже новой версии. Замеры на скорость отрисовки не проводил, но на скидку уж точно не хуже.

Ещё можно подумать над самой структурой. Например, у меня температура пишется сразу в объект датчик с историей 7 дней. Пишется при любом, даже самом малом изменении. По этим данным я могу точно вычислить, возрастает или убывает показания датчика.
Затем, при изменении температуры объекта датчика, значение передается объекту комнаты. Тут уже не так критично, и пишу уже с точностью 1 градус. Это сильно округляет данные и уменьшает объем. Объект комнаты хранит данные уже два года. По объектам комнат уже и строю графики температур.
Кстати, такая схема позволяет организовать дублирующие датчики для объекта комнаты. Например, когда основной датчик "захворал", но у нас есть ещё один источник данных температуры в этой комнате.
За это сообщение автора Bagir поблагодарил:
Ko/|xo3HUk (Пт мар 10, 2017 10:53 am)
Рейтинг: 1.18%
Windows 7, HTTP, MegaD, Z-Wave, 1-Wire
Victor_S
Сообщения: 264
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

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

Сообщение Victor_S » Пт мар 10, 2017 6:51 pm

Может кто подсказать по графикам highstok, в чем проблема? viewtopic.php?p=47426#p47426
Ko/|xo3HUk
Сообщения: 159
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

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

Сообщение Ko/|xo3HUk » Пт мар 10, 2017 7:19 pm

Victor_S писал(а):Может кто подсказать по графикам highstok, в чем проблема? viewtopic.php?p=47426#p47426
Вы там спрашивали как масштаб "All" по умолчанию вывести - ищите в коде:

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

                         rangeSelector: {
                            buttons: [    { type: 'hour',    count: 1, text: '1h' },
                                           { type: 'hour',    count: 6, text: '6h' },
                                           { type: 'day',     count: 1, text: '1d' },
                                           { type: 'day',     count: 2, text: '2d' },
                                           { type: 'week',   count: 1, text: '1w' },
                                           { type: 'month', count: 1, text: '1m' },
                                           { type: 'month', count: 6, text: '6m' },
                                           { type: 'year',    count: 1, text: '1y' },
                                           { type: 'all', text: 'All' }],
                               selected: 2  // Какая кнопка выбрана по умолчанию
                        },
 
вот "selected: 2" как раз и отвечает - какой масштаб будет по умолчанию.
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Victor_S
Сообщения: 264
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

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

Сообщение Victor_S » Вс мар 12, 2017 6:27 pm

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

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

Сообщение Ko/|xo3HUk » Вс мар 12, 2017 7:09 pm

Сорри, прочитал по диагонали, не увидел про "selected". Без кода графика сложно говорить что-либо.
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Аватара пользователя
Sapizdullin
Сообщения: 398
Зарегистрирован: Сб фев 18, 2017 9:47 am
Благодарил (а): 49 раз
Поблагодарили: 60 раз

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

Сообщение Sapizdullin » Пн сен 04, 2017 9:48 am

Кто направит на путь истинный?
Создаю
Bagir писал(а): 2. Создайте новый сценарий с именем jconhs
пытаюсь запустить - error 500 сервера и аля улю..
Intel(R) Core(TM) i7-6700, Debian 9 "Stretch", Zoneminder, Avreg.
Ответить