Страница 10 из 12

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

Добавлено: Ср сен 20, 2017 2:22 pm
Ko/|xo3HUk
Захотелось мне сделать один из графиков с возможностью задания даты начала и конца графика. В процессе получилось проще сделать задание конечной даты + задание интервала самого графика. Про задание интервала вроде писАл уже, так что здесь не буду повторяться.
Итак, были произведены следующие изменения:
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 КБ) 6422 просмотра
И теперь, задавая конечную дату в формате
Y-m-d H:i:s
, например: 2017-05-01 23:00:00, получаю график с заданной конечной датой и интервалом.

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

Добавлено: Вт сен 26, 2017 11:45 am
D.motor
Расскажите пожалуйста на пальцах, как заставить таблицу работать и отображать мои данные.
Файл /highcharts/sample3.htm открывается. Посмотрел соодержимое, вообще непонятно куда можно свои данные подставить.

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

Добавлено: Вт сен 26, 2017 12:01 pm
Ko/|xo3HUk
Так в самом первом сообщении всё пошагово расписано. На пальцах тут не объяснить, у самого не с первого раза получилось.

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

Добавлено: Ср сен 27, 2017 10:42 pm
Sapizdullin
Кто нибудь подскажет в чем проблема? Сценарий ругается 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&

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

Добавлено: Ср сен 27, 2017 10:53 pm
Ko/|xo3HUk
Sapizdullin писал(а):Кто нибудь подскажет в чем проблема? Сценарий ругается 500 ошибкой на строку

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

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

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

          sensornames = ['ESP8266_Garage.Temper_1']; 

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

Добавлено: Ср сен 27, 2017 11:21 pm
Sapizdullin
Да все правильно записано.. Я выше написал ошибку Апача...
Все! Победил добавляя по одному. Заработало..

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

Добавлено: Чт сен 28, 2017 6:13 am
Ko/|xo3HUk
Что сделали то для победы? Поделитесь знаниями.

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

Добавлено: Чт сен 28, 2017 9:51 pm
Sapizdullin
Ko/|xo3HUk писал(а):Что сделали то для победы? Поделитесь знаниями.
Начал с одного датчика. Сработало, потом второй. Но вот если скрипт вручную запускаю - ошибка 500. А так - все заработало. Полтергейст какой-то.

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

Добавлено: Вт мар 20, 2018 12:01 am
Bagir
Небольшое дополнение:
Иногда бывает так, то в свойство объекта с историей пишется сразу два новых значения. Это происходит быстро, и время записи получается одинаковое до последней секунды. То есть сортировка по колонке времени может не дать нужного результата. Рассмотрим ситуацию:
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

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

Добавлено: Ср мар 21, 2018 1:08 pm
Bagir
Ещё одно добавление:
Допустим у нас есть график температуры или влажности. И на этом графике располагаются кривые сразу нескольких комнат. Если физические показатели часто меняются, и все датчики довольно активно присылают данные, то все графики по времени будут заканчиваться примерно одинаково.
Но если ситуация иная, то график, по которому не поступили новые данные по какой либо причине, будет отставать от других, и на определенном масштабе может просто пропасть из виду. А такие причины на самом деле могут быть.
Я столкнулся с этим моментом на графиках влажности. Сейчас зима, и довольно сухо. Минимальный предел измерения моих датчиков это 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 .= '])';
Результатом я был доволен. Выношу на Ваш суд. Но стоит заметить, что способ возможно будет не полностью универсальный. И при неких других условиях и измерениях, возможно не следует растягивать на графике последнее измерение до текущего времени. Об этом и хотел бы поговорить.