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

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

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

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

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

Сообщение Ko/|xo3HUk » Ср сен 20, 2017 2:22 pm

Захотелось мне сделать один из графиков с возможностью задания даты начала и конца графика. В процессе получилось проще сделать задание конечной даты + задание интервала самого графика. Про задание интервала вроде писАл уже, так что здесь не буду повторяться.
Итак, были произведены следующие изменения:
1. Сценарий jsonhs:
вместо

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

$end_time=time();
прописал

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

 $end_time = isset($params['end']) ? strtotime($params['end']) : null;
//DebMes("end_time at start = : ".$end_time); // После этого в XRay во вкладке debug можно смотреть результат. 

// Получаем текущее время (если не задано конечное время - берём текущее):
// if (!is_null($end_time)){
 if ($end_time==''){
     $end_time=time();
 }
2. На домашней странице, в коде графика добавил следующее:
было:

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

        $.getJSON('/objects/?script=jsonhs&name='+sensornames[i]+'&callback=?', function (data) {
стало:

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

        $.getJSON('/objects/?script=jsonhs&end=%Climat.trend_end_time%&name='+sensornames[i]+'&callback=?', function (data) {
3. В Объектах создал свойство (Задание конечной даты графика (начальная дата = end_time - interval)):

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

Climat.trend_end_time
4. В меню управления добавил строку:
СпойлерПоказать
Безымянный.png
Безымянный.png (45.12 КБ) 8806 просмотров
И теперь, задавая конечную дату в формате
Y-m-d H:i:s
, например: 2017-05-01 23:00:00, получаю график с заданной конечной датой и интервалом.
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
D.motor
Сообщения: 8
Зарегистрирован: Пн апр 24, 2017 5:42 pm
Благодарил (а): 3 раза
Поблагодарили: 0

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

Сообщение D.motor » Вт сен 26, 2017 11:45 am

Расскажите пожалуйста на пальцах, как заставить таблицу работать и отображать мои данные.
Файл /highcharts/sample3.htm открывается. Посмотрел соодержимое, вообще непонятно куда можно свои данные подставить.
Ko/|xo3HUk
Сообщения: 160
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

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

Сообщение Ko/|xo3HUk » Вт сен 26, 2017 12:01 pm

Так в самом первом сообщении всё пошагово расписано. На пальцах тут не объяснить, у самого не с первого раза получилось.
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Аватара пользователя
Sapizdullin
Сообщения: 408
Зарегистрирован: Сб фев 18, 2017 9:47 am
Откуда: Земля
Благодарил (а): 54 раза
Поблагодарили: 61 раз

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

Сообщение Sapizdullin » Ср сен 27, 2017 10:42 pm

Кто нибудь подскажет в чем проблема? Сценарий ругается 500 ошибкой на строку

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

$prop_id=$obj->getPropertyByName($name[1], $obj->class_id, $obj->id);
ремлю ее - отрабатывает. Включаю в код - ошибка 500
error apach

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

PHP Fatal error:  Call to a member function getPropertyByName() on integer in /var/www/modules/scripts/scripts.class.php(139) : eval()'d code on line 9, referer: http://192.168.110.103/admin.php?pd=cGFuZWw6e2FjdGlvbj1zY3JpcHRzfQ%3D%3Dpz_&md=scripts&inst=adm&
Последний раз редактировалось Sapizdullin Ср сен 27, 2017 11:15 pm, всего редактировалось 1 раз.
Intel(R) Core(TM) i7-6700, Debian 9 "Stretch", Zoneminder, Avreg.
Ko/|xo3HUk
Сообщения: 160
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

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

Сообщение Ko/|xo3HUk » Ср сен 27, 2017 10:53 pm

Sapizdullin писал(а):Кто нибудь подскажет в чем проблема? Сценарий ругается 500 ошибкой на строку

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

$prop_id=$obj->getPropertyByName($name[1], $obj->class_id, $obj->id); 
ремлю ее - отрабатывает. Включаю в код - ошибка 500
sensornames в запросе правильное имя имеет? У меня, например:

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

          sensornames = ['ESP8266_Garage.Temper_1']; 
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Аватара пользователя
Sapizdullin
Сообщения: 408
Зарегистрирован: Сб фев 18, 2017 9:47 am
Откуда: Земля
Благодарил (а): 54 раза
Поблагодарили: 61 раз

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

Сообщение Sapizdullin » Ср сен 27, 2017 11:21 pm

Да все правильно записано.. Я выше написал ошибку Апача...
Все! Победил добавляя по одному. Заработало..
Intel(R) Core(TM) i7-6700, Debian 9 "Stretch", Zoneminder, Avreg.
Ko/|xo3HUk
Сообщения: 160
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

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

Сообщение Ko/|xo3HUk » Чт сен 28, 2017 6:13 am

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

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

Сообщение Sapizdullin » Чт сен 28, 2017 9:51 pm

Ko/|xo3HUk писал(а):Что сделали то для победы? Поделитесь знаниями.
Начал с одного датчика. Сработало, потом второй. Но вот если скрипт вручную запускаю - ошибка 500. А так - все заработало. Полтергейст какой-то.
Intel(R) Core(TM) i7-6700, Debian 9 "Stretch", Zoneminder, Avreg.
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

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

Сообщение Bagir » Вт мар 20, 2018 12:01 am

Небольшое дополнение:
Иногда бывает так, то в свойство объекта с историей пишется сразу два новых значения. Это происходит быстро, и время записи получается одинаковое до последней секунды. То есть сортировка по колонке времени может не дать нужного результата. Рассмотрим ситуацию:
ADDED, VALUE
2018-03-18 15:00:00, 20
2018-03-19 23:45:35, 20
2018-03-19 23:45:35, 25

Видно, и мы условимся что это так на самом деле, что свойство более суток имело значение 20, а потом уже увеличилось до 25. При этом на графике будет прямая линия и вертикальный взлет вверх. Если в json для графика данные попадут именно так, то всё будет правильно, но SQL может ответить и по другому. Например так:
ADDED, VALUE
2018-03-18 15:00:00, 20
2018-03-19 23:45:35, 25
2018-03-19 23:45:35, 20

При этом на графике будет наклонная линия, и вертикальное падение вниз, что по сути совершенно не правильно. Ведь по нашему условию показания датчика всё же увеличились а не наоборот. Для избежания такой ситуации можно добавить ещё одну сортировку по колонке ID.
Сценарий, который формирует json для графика:

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

 // Получаем данные из таблицы истории
 $arr_s = SQLSelect("SELECT UNIX_TIMESTAMP(ADDED) as ADDED, VALUE FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' ORDER BY ADDED, ID"); 
Обратите внимание на дополнительное условие сортировки ORDER BY ADDED, ID
За это сообщение автора Bagir поблагодарили (всего 2):
skysilver (Вт мар 20, 2018 12:14 am) • Ko/|xo3HUk (Вт мар 20, 2018 6:42 am)
Рейтинг: 2.33%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

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

Сообщение Bagir » Ср мар 21, 2018 1:08 pm

Ещё одно добавление:
Допустим у нас есть график температуры или влажности. И на этом графике располагаются кривые сразу нескольких комнат. Если физические показатели часто меняются, и все датчики довольно активно присылают данные, то все графики по времени будут заканчиваться примерно одинаково.
Но если ситуация иная, то график, по которому не поступили новые данные по какой либо причине, будет отставать от других, и на определенном масштабе может просто пропасть из виду. А такие причины на самом деле могут быть.
Я столкнулся с этим моментом на графиках влажности. Сейчас зима, и довольно сухо. Минимальный предел измерения моих датчиков это 20%. Фактически относительная влажность упала ещё ниже. Поэтому датчики просто перестали отправлять данные и графики замерли. Для борьбы с засухой, были поставлены два комнатных увлажнителя, которые изменили ситуацию, но только в этих комнатах. С двух датчиков пошли новые данные, когда влажность начала подниматься. А вот с остальных датчиков данных не приходило, и их графики просто пропали.
Ситуация не однозначная. Есть данные о последнем измерении, и на самом деле по факту физические показания не изменились. если смотреть на цифры, то всё устраивает, но график то не строиться.
Чтобы видеть такие графики, я попробовал просто добавлять (дублировать) последние показания с текущим временем. Для этого в сценарий внес небольшие изменения.

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

 // Собрать структуру JSON
 //Вариант без повтора последнего измерения с текущим временем
 $st = $params['callback'].'([';
 $f = false;
 foreach($arr_s as $s) {
   if ($f) { $st .=','; } else { $f = true; }
   $st .= '['.$s['ADDED'].'000,'.$s['VALUE'].']';
 }
 $st .= '])';

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

 // Собрать структуру JSON
 //Вариант с добавлением в конце последнего значения с текущим временем
 $st = $params['callback'].'([';
  foreach($arr_s as $s) {
   $st .= '['.$s['ADDED'].'000,'.$s['VALUE'].']';
   $st .=',';
 }
 $st .= '['.time().'000,'.$s['VALUE'].']';
 $st .= '])';
Результатом я был доволен. Выношу на Ваш суд. Но стоит заметить, что способ возможно будет не полностью универсальный. И при неких других условиях и измерениях, возможно не следует растягивать на графике последнее измерение до текущего времени. Об этом и хотел бы поговорить.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Ответить