"Живые" графики нужна помощь.

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

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

Re: "Живые" графики нужна помощь.

Сообщение Bagir » Вс окт 26, 2014 12:11 pm

Но почему тогда у меня вот это работает
КодПоказать

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

<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Highstock Example</title>

        <script type="text/javascript" src="/highstock/js/jquery-1.8.2.min.js"></script>
        <style type="text/css">
${demo.css}
        </style>
        <script type="text/javascript">

$(function () {
    var seriesOptions = [],
        seriesCounter = 0,
        names = ['кухня', 'гостиная', 'спальня', 'холл', 'кабинет'], 
        sensornames = ['KitchenArea.Temperature', 
                                  'Livingroom.Temperature', 
                                  'Bedroom.Temperature',
                                  'HallArea.Temperature',
                                  'OfficeRoom.Temperature'];


         Highcharts.setOptions({
              lang: {
                     months:   ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 
                                'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],

                     shortMonths:   ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 
                                'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'],

                     weekdays: ['Вск', 'Пнд', 'Втр', 'Срд', 'Чтв', 'Птн', 'Сбт'],

                    rangeSelectorZoom: 'Маcштаб',
                    rangeSelectorFrom: 'От',
                    rangeSelectorTo: 'До',
                    thousandsSep: ' '
               },
              global: {
                   useUTC: false
              }
        });


        // create the chart when all data is loaded
        createChart = function () {

            $('#container').highcharts('StockChart', {
                 rangeSelector: {
                      buttons: [{ type: 'hour',    count: 1, text: '1h' },
                                     { 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: 1 },  // Какая кнопка выбрана по умолчанию
                 title: { text : 'График температур в доме'},
                 legend: { enabled : true,
                                layout : 'horizontal',
                                align : 'center',
                                verticalAlign : 'top',
                                x : 0,
                                y : 20 },
                 xAxis: { maxZoom : 1 * 24 * 36000 },
                 yAxis: { title: { text: 'Температура (°C)' } },

                 series: seriesOptions
            });
        };

    $.each(names, function (i, name) {

        $.getJSON('/jsonp.php?name='+sensornames[i],    function (data) {

            seriesOptions[i] = {
                name: name,
                data: data
            };

            // As we're loading the data asynchronously, we don't know what order it will arrive. So
            // we keep a counter and create the chart when all the data is loaded.
            seriesCounter += 1;

            if (seriesCounter === names.length) {
                createChart();
            }
        });
    });
});
        </script>
    </head>
    <body>
<script src="/highstock/js/highstock.js"></script>
<script src="/highstock/js/modules/exporting.js"></script>


<div id="container" style="height: 500px; min-width: 500px"></div>
    </body>
</html>
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Vit
Сообщения: 867
Зарегистрирован: Вт янв 17, 2012 12:31 pm
Благодарил (а): 121 раз
Поблагодарили: 78 раз

Re: "Живые" графики нужна помощь.

Сообщение Vit » Вс окт 26, 2014 12:26 pm

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

Re: "Живые" графики нужна помощь.

Сообщение Bagir » Вс окт 26, 2014 6:51 pm

Раз уж графики "живые", то хотелось бы видеть новые данные с датчиков без обновления всей страницы. Highstock это позволяет. Вот пример кода графика с рандомными числами. График должен двигаться каждую секунду. У меня все работает. Пример взят из каталога highstock\examples\dynamic-update. Как и во всех случаях необходимо заменить

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

<script src="../../js/highstock.js"></script>
<script src="../../js/modules/exporting.js"></script>
на

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

<script src="/highstock/js/highstock.js"></script>
<script src="/highstock/js/modules/exporting.js"></script>
Отредактированный вариант кодаПоказать

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

<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Highstock Example</title>

        <script type="text/javascript" src="/highstock/js/jquery-1.8.2.min.js"></script>
        <style type="text/css">
${demo.css}
        </style>
        <script type="text/javascript">
$(function () {

    Highcharts.setOptions({
        global : {
            useUTC : false
        }
    });

    // Create the chart
    $('#container').highcharts('StockChart', {
        chart : {
            events : {
                load : function () {

                    // set up the updating of the chart each second
                    var series = this.series[0];
                    setInterval(function () {
                        var x = (new Date()).getTime(), // current time
                            y = Math.round(Math.random() * 100);
                        series.addPoint([x, y], true, true);
                    }, 1000);
                }
            }
        },

        rangeSelector: {
            buttons: [{
                count: 1,
                type: 'minute',
                text: '1M'
            }, {
                count: 5,
                type: 'minute',
                text: '5M'
            }, {
                type: 'all',
                text: 'All'
            }],
            inputEnabled: false,
            selected: 0
        },

        title : {
            text : 'Live random data'
        },

        exporting: {
            enabled: false
        },

        series : [{
            name : 'Random data',
            data : (function () {
                // generate an array of random data
                var data = [], time = (new Date()).getTime(), i;

                for (i = -999; i <= 0; i += 1) {
                    data.push([
                        time + i * 1000,
                        Math.round(Math.random() * 100)
                    ]);
                }
                return data;
            }())
        }]
    });

});

        </script>
    </head>
    <body>

<script src="/highstock/js/highstock.js"></script>
<script src="/highstock/js/modules/exporting.js"></script>

<div id="container" style="height: 400px; min-width: 310px"></div>
    </body>
</html>
С рандомными числами конечно все просто. Но а нам то как быть? У меня пока что есть только такая мысль. Устанавливаем временной интервал обновления графика исходя из периода обновления данных своего датчик, или желаемой проверки на наличие новых данных. Я не думаю, что получится каким либо способом послать новые данные в график при их появлении. Так что остается только периодически их проверять.
Дописать файл jsonp.php, добавив туда параметр начала периода.
По замыслу график будет сначала строиться как обычно, а потом каждую минуту получать json от файла jsonp.php с данными за последнюю минуту.
Переписать jsonp.php мне не сложно. С php я немного подружился. А вот с html я до сих пор на ВЫ. Есть желающие помочь?
Добавление кода заставило мой график температур в комнатах обновляться дальше рандомными числами.

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

        chart : {
            events : {
                load : function () {

                    // set up the updating of the chart each second
                    var series = this.series[0];
                    setInterval(function () {
                        var x = (new Date()).getTime(), // current time
                            y = Math.round(Math.random() * 100);
                        series.addPoint([x, y], true, true);
                    }, 1000);
                }
            }
        }, 
графикПоказать
Изображение
Так что дело за малым. Понять как добавлять данные если линий несколько и переписать рандом на json.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Vit
Сообщения: 867
Зарегистрирован: Вт янв 17, 2012 12:31 pm
Благодарил (а): 121 раз
Поблагодарили: 78 раз

Re: "Живые" графики нужна помощь.

Сообщение Vit » Вс окт 26, 2014 7:01 pm

Bagir писал(а):Раз уж графики "живые", то хотелось бы видеть новые данные с датчиков без обновления всей страницы. Highstock это позволяет. Вот пример кода графика с рандомными числами. График должен двигаться каждую секунду. У меня все работает. Пример взят из каталога highstock\examples\dynamic-update. Как и во всех случаях необходимо заменить

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

<script src="../../js/highstock.js"></script>
<script src="../../js/modules/exporting.js"></script>
на

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

<script src="/highstock/js/highstock.js"></script>
<script src="/highstock/js/modules/exporting.js"></script>
Отредактированный вариант кодаПоказать

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

<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Highstock Example</title>

        <script type="text/javascript" src="/highstock/js/jquery-1.8.2.min.js"></script>
        <style type="text/css">
${demo.css}
        </style>
        <script type="text/javascript">
$(function () {

    Highcharts.setOptions({
        global : {
            useUTC : false
        }
    });

    // Create the chart
    $('#container').highcharts('StockChart', {
        chart : {
            events : {
                load : function () {

                    // set up the updating of the chart each second
                    var series = this.series[0];
                    setInterval(function () {
                        var x = (new Date()).getTime(), // current time
                            y = Math.round(Math.random() * 100);
                        series.addPoint([x, y], true, true);
                    }, 1000);
                }
            }
        },

        rangeSelector: {
            buttons: [{
                count: 1,
                type: 'minute',
                text: '1M'
            }, {
                count: 5,
                type: 'minute',
                text: '5M'
            }, {
                type: 'all',
                text: 'All'
            }],
            inputEnabled: false,
            selected: 0
        },

        title : {
            text : 'Live random data'
        },

        exporting: {
            enabled: false
        },

        series : [{
            name : 'Random data',
            data : (function () {
                // generate an array of random data
                var data = [], time = (new Date()).getTime(), i;

                for (i = -999; i <= 0; i += 1) {
                    data.push([
                        time + i * 1000,
                        Math.round(Math.random() * 100)
                    ]);
                }
                return data;
            }())
        }]
    });

});

        </script>
    </head>
    <body>

<script src="/highstock/js/highstock.js"></script>
<script src="/highstock/js/modules/exporting.js"></script>

<div id="container" style="height: 400px; min-width: 310px"></div>
    </body>
</html>
С рандомными числами конечно все просто. Но а нам то как быть? У меня пока что есть только такая мысль. Устанавливаем временной интервал обновления графика исходя из периода обновления данных своего датчик, или желаемой проверки на наличие новых данных. Я не думаю, что получится каким либо способом послать новые данные в график при их появлении. Так что остается только периодически их проверять.
Дописать файл jsonp.php, добавив туда параметр начала периода.
По замыслу график будет сначала строиться как обычно, а потом каждую минуту получать json от файла jsonp.php с данными за последнюю минуту.
Переписать jsonp.php мне не сложно. С php я немного подружился. А вот с html я до сих пор на ВЫ. Есть желающие помочь?
Добавление кода заставило мой график температур в комнатах обновляться дальше рандомными числами.

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

        chart : {
            events : {
                load : function () {

                    // set up the updating of the chart each second
                    var series = this.series[0];
                    setInterval(function () {
                        var x = (new Date()).getTime(), // current time
                            y = Math.round(Math.random() * 100);
                        series.addPoint([x, y], true, true);
                    }, 1000);
                }
            }
        },
графикПоказать
Изображение
Так что дело за малым. Понять как добавлять данные если линий несколько и переписать рандом на json.
этот пример у меня появился а странице в отличие от предыдущих
СпойлерПоказать
Изображение
bagir как теперь данные передать с датчиков наших? у тебя получилось?
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: "Живые" графики нужна помощь.

Сообщение Bagir » Вс окт 26, 2014 7:08 pm

не могу понять, почему у тебя не работает вот этот мой пример http://smartliving.ru/forum/viewtopic.p ... 160#p14867
У меня отлично рисует пять графиков с температурой. Вот так пробовал?

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

$.getJSON('/jsonp.php?name=Chisinau.tempOutside', function (data) {  
Если jsonp.php нормально выдает данные, то я не вижу причин не работать. Но я мало знаком с html. Возможно есть какие то камни. Придется просить Сергея помочь и проверить мой пример.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Vit
Сообщения: 867
Зарегистрирован: Вт янв 17, 2012 12:31 pm
Благодарил (а): 121 раз
Поблагодарили: 78 раз

Re: "Живые" графики нужна помощь.

Сообщение Vit » Вс окт 26, 2014 7:19 pm

Bagir писал(а):не могу понять, почему у тебя не работает вот этот мой пример http://smartliving.ru/forum/viewtopic.p ... 160#p14867
У меня отлично рисует пять графиков с температурой. Вот так пробовал?

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

$.getJSON('/jsonp.php?name=Chisinau.tempOutside', function (data) { 
Если jsonp.php нормально выдает данные, то я не вижу причин не работать. Но я мало знаком с html. Возможно есть какие то камни. Придется просить Сергея помочь и проверить мой пример.
пробовал не работает и так

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

Re: "Живые" графики нужна помощь.

Сообщение Bagir » Вс окт 26, 2014 7:27 pm

Сожалею, но у меня даже нет вариантов куда копать. Надо попробовать другой пример из examples с одним только графиком. Еще можно попробовать вместо jsonp.php написать другой файл, который просто выдает что то наподобие [4,5,9,1,5,7] Надо найти причину.
Чисто из фантастики, может разделитель дробной части в системе указан не . а ,
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Vit
Сообщения: 867
Зарегистрирован: Вт янв 17, 2012 12:31 pm
Благодарил (а): 121 раз
Поблагодарили: 78 раз

Re: "Живые" графики нужна помощь.

Сообщение Vit » Вс окт 26, 2014 7:37 pm

Bagir писал(а):Сожалею, но у меня даже нет вариантов куда копать. Надо попробовать другой пример из examples с одним только графиком. Еще можно попробовать вместо jsonp.php написать другой файл, который просто выдает что то наподобие [4,5,9,1,5,7] Надо найти причину.
Чисто из фантастики, может разделитель дробной части в системе указан не . а ,
проверил все в норме с точкой
СпойлерПоказать
Изображение
тоже не знаю в чем причина

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

Re: "Живые" графики нужна помощь.

Сообщение Bagir » Вс окт 26, 2014 7:44 pm

Да, придется. Результат он уже видел, а вот код наверное не смотрел. http://smartliving.ru/forum/viewtopic.p ... 140#p14843 топик с примером. А я пока что еще поломаю копья по поводу динамического обновления. Уж очень хочется прикрутить.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Vit
Сообщения: 867
Зарегистрирован: Вт янв 17, 2012 12:31 pm
Благодарил (а): 121 раз
Поблагодарили: 78 раз

Re: "Живые" графики нужна помощь.

Сообщение Vit » Вс окт 26, 2014 7:47 pm

Bagir писал(а):Да, придется. Результат он уже видел, а вот код наверное не смотрел. http://smartliving.ru/forum/viewtopic.p ... 140#p14843 топик с примером. А я пока что еще поломаю копья по поводу динамического обновления. Уж очень хочется прикрутить.

хорошо...может новый твой вариант заработает))
Ответить