[Модификация] Управлением котлом (графический термостат) Highchart

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

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

denis
Сообщения: 284
Зарегистрирован: Сб ноя 24, 2012 11:47 am
Благодарил (а): 28 раз
Поблагодарили: 28 раз

[Модификация] Управлением котлом (графический термостат) Highchart

Сообщение denis » Вт ноя 10, 2015 11:31 pm

Делюсь работающей идеей и кодом страницы для задания графика включения котла отопления по заданному графику на неделю, с несколькими периодами в течение суток (мне пока хватило сил на равные промежутки, но если есть энтузиасты, то есть возможность менять и ось Х на графике).
Собственно идея была в следующем, чтобы экономить электричество, но и при этом не сильно вымораживать дом надо прийти к какому-то оптимуму, но делать десятки пунктов меню было некошерно, хотелось красоты и наглядности. Собственно идея проста: тянем мышью "столбик" диаграммы меняем данные в массиве температур. Но идея хорошо, реализовать сложнее)) в Excel такое есть, осталось найти что-то похожее для браузера. целый вечер поиска в сети привел к такому замечательному плагину:
HIGHCHARTS DRAGGABLE POINTS
это то, что нам нужно!
дальше мысль пошла, что надо бы группировать периоды по дням недели ... оказывается заморские товарищи и это придумали
GROUPED CATEGORIES
собственно дело за малым осталось придумать как хранить 10, 20, 30 значений целевой температуры, чтобы это было удобно. Решил хранить в виде строки с разделителями " | " ("пробел|пробел"). В результате в системе сейчас строка такого вида:

25 | 18 | 18 | 18 | 25 | 18 | 18 | 18 | 26 | 18 | 18 | 18 | 26 | 18 | 18 | 18 | 26 | 18 | 18 | 20 | 26 | 23 | 23 | 23 | 26 | 23 | 21 | 19

собственно что нужно сделать:
1. скачиваем дистрибутивы со страниц по ссылкам выше и сохраняем в папки (соотвеnственно):
C:\_majordomo\htdocs\highcharts\js\plugins\draggable-points-master
C:\_majordomo\htdocs\highcharts\js\plugins\grouped_categories-master

2. создаем объект Heating_profile_01
в нем свойства:
number_of_Periods_in_Day - число периодов в сутки = 4
temp_Profile - целевая температура (28 значений это 4 периода*7 дней) = 25 | 18 | 18 | 18 | 25 | 18 | 18 | 18 | 26 | 18 | 18 | 18 | 26 | 18 | 18 | 18 | 26 | 18 | 18 | 20 | 26 | 23 | 23 | 23 | 26 | 23 | 21 | 19
average_temperatures_of_Week - средние температуры за период с начала недели до текущей даты = 20.4 | 19.82 | 18.07 | 18.09 | 20.55 | 19.89 | 18.17

3. создаем домашнюю страницу с кодом:

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

<!DOCTYPE HTML>
<html>
        <head>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
                <title>Highstock Example</title>
                 
<script src="../highcharts/js/highcharts.js"></script>                 
<script src="../highcharts/js/plugins/grouped_categories-master/grouped-categories.js"></script>  
<script src="../highcharts/js/plugins/draggable-points-master/draggable-points.js"></script>

<script language="javascript" type="text/javascript" src="/middle/middle_object.js"></script>
<script language="javascript" type="text/javascript" src="/middle/middle_connector.js"></script>

<script type="text/javascript" language="javascript">

 
 
$(function(){

//var mydata=[10, 15, 15, 15,
//             30, 17, 17, 17,
//             30, 17, 17, 17,
//             30, 17, 17, 17, 
//             30, 17, 17, 17, 
//             30, 17, 17, 17, 
//             30, 17, 17, 17 
// ];


// заполнение массива с целевыми температурами  

var xxxx= "%Heating_profile_01.temp_Profile%";
mydata = xxxx.split(' | ') ;
var mydata_double = new Array (mydata.length); 
var mydata_double_output = new Array (mydata.length); 
 

for (var i = 0; i < mydata.length; i++) { 
mydata_double[i]=parseFloat(mydata[i]);
mydata_double_output[i]=parseFloat(mydata[i]);
 }


//str_from_arr = mydata_double.join(" | ") 
                                  
// заполнение массива со средними температурами
                                  
var xxxx1= "%Heating_profile_01.average_temperatures_of_Week%";
mydata_average_temp = xxxx1.split(' | ') ;
var mydata__average_temp_double = new Array (mydata_average_temp.length); 

 

for (var i = 0; i < mydata_average_temp.length; i++) { 
mydata__average_temp_double[i]=parseFloat(mydata_average_temp[i]);
 }

 
///str_from_arr = mydata_double.join(" | ") 
//alert (str_from_arr);
 
 
// построение графика highcharts
                                  
 
 var chart = new Highcharts.Chart({
 
 
 
    chart: {
        renderTo: 'container',
        animation: false
    },
    
    title: {
        text: 'Профиль отопления'
    },
    exporting: {
            enabled: true
                 },
    xAxis: {
        categories: [{
             name : "понедельник",
             categories: ['00-06', '06-12', '12-18','18-24']
             }, {
             name : "вторник",
             categories: ['00-06', '06-12', '12-18','18-24']
             }, {
             name : "среда",
             categories: ['00-06', '06-12', '12-18','18-24']
              }, {
             name : "четверг",
             categories: ['00-06', '06-12', '12-18','18-24']
              }, {
             name : "пятница",
             categories: ['00-06', '06-12', '12-18','18-24']
              }, {
             name : "суббота",
             categories: ['00-06', '06-12', '12-18','18-24']
             }, {
             name : "воскресенье",
             categories: ['00-06', '06-12', '12-18','18-24']
             }
             ]},

    plotOptions: {
        series: {
                 // pointPadding: 0
            point: {
                events: {

                    drag: function (e) {
                      
                           // alert (e.y);
                           // if (e.y > 10) {
                            // округляем текущее значение после "протяжки" 
                       //     e.y = Math.round (e.y);
                            // this.y = Highcharts.numberFormat(this.y, 0);
                           // this.y = Math.Round(e.y);                          
                           // return false;
                           // }
                        

                        $('#drag').html(
                             
                            'Dragging <b>' + this.series.name + '</b>, <b>' + this.category + '</b> to <b>' + Highcharts.numberFormat(e.y, 2) + '</b>');
                    },
                    drop: function () {
 
                      // округляем текущее значение после "протяжки" 
                      this.y = Math.round(this.y);

                      //   определяем период (день недели) в котором было изменение целевой температуры на графике
                      num_period= (this.x + 1);
                      if (num_period >= 10)  {
                      num_period = num_period;
                      }
                      else
                      {
                      num_period ='0'+ num_period;
                      }
                      name_period = 'Heating_period_' + num_period ;

                      // записываем числовые данные в массив, а затем объединяем в строку
                      mydata_double_output[this.x]=parseFloat(this.y);
                      str_from_arr = mydata_double_output.join(" | ");     

                      //  передаем новое значение переменной в MDM (взял из middle connector у Alex)
                      url_string ='/objects/?object=Heating_profile_01&op=set&p=temp_Profile&v='+ str_from_arr;
                      xmlhttp = new XMLHttpRequest();
                      xmlhttp.open("GET", url_string, true);
                      xmlhttp.send(null); 

 
                     $('#drop').html(

                           'In <b>' + this.series.name + '</b>, <b>' + this.category + '</b> was set to <b>' + Highcharts.numberFormat(this.y, 2) + '</b>');
                    }
                }
            },
            stickyTracking: false
        },
        column: {
         // stacking: 'normal'
                 pointPadding: 0,
                 groupPadding: 0
            //    borderWidth: 0
        },
        line: {
            cursor: 'ns-resize'
        }
    },

    tooltip: {
        valueDecimals: 0
    },

    series: [{
         name: "Целевая температура",
        data: mydata_double,
        //draggableX: true,
        draggableY: true,
        dragMinY: 1,
        dragMaxY: 30,
        type: 'column',
        minPointLength: 2
    }, {
         name: "Средние температуры",
        data: mydata__average_temp_double,
        draggableY: false
    } ]

});
});




</script>
      
</head>

<body>


<div id="container" style="height: 500px"></div>
<div id="drag"></div>
<div id="drop"></div>
  
</body>
         
</html>
4. собственно все работает! тянем мышью верхнюю часть столбика, в переменной temp_Profile меняется значение целевой температуры в "тянущем" периоде.
5. пишем метод у объекта Heating_profile_01
метод tempProfileChanged

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

$day_month=(int)date('w');
$h=(int)date('G',time());
//$h=23;
if ($day_month == 0) { 
 $day_month = 7;
}
else
{
 $day_month = $day_month ;
} 

$num_period_of_day = floor($h/24*gg('Heating_profile_01.number_of_Periods_in_Day'));

$num_of_position_in_array = ($day_month - 1)*gg('Heating_profile_01.number_of_Periods_in_Day') + ($num_period_of_day + 1);

$string = gg('Heating_profile_01.temp_Profile');
$arr = explode(" | ", $string);
//say ('targetTemp'.($arr[$num_of_position_in_array-1]));
sg('ElKotel.tempTarget',$arr[$num_of_position_in_array-1]); 
который вызывается по изменению свойства temp_Profile (не забыть про это при создании свойств!) и собственно меняет целевую температуру Вашего котла!! у меня это ElKotel.tempTarget

Вот такое небольшое украшательство. Летом думаю прикошачу этот же способ к управлению поливом.

скриншот
Вложения
отопление .jpg
отопление .jpg (136.7 КБ) 20669 просмотров
За это сообщение автора denis поблагодарили (всего 8):
Vovix (Ср ноя 11, 2015 9:59 am) • shemnik69 (Ср ноя 11, 2015 3:35 pm) • savenko_egor (Чт ноя 12, 2015 3:42 am) • tammat (Пт ноя 13, 2015 1:57 pm) • Sturgeon (Ср янв 13, 2016 11:05 pm) • Bagir (Ср апр 04, 2018 9:38 pm) • Strangeman (Чт окт 25, 2018 11:10 am) • directman66 (Пн дек 24, 2018 10:27 pm)
Рейтинг: 9.3%
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Управлением котлом (графический термостат) Highchart

Сообщение shemnik69 » Ср ноя 11, 2015 3:47 pm

Замечательная реализация. Но как видно управление идет на основе управляемых клапанов или приводов. А если можно опишите как ситема привязана к железу (отоплению).
У меня немного проще.
У котла 3 скростной двигатель насоса. При температуре от +5 до 0 (осень как сейчас) система на основе данных температуры с улицы (3 сценария, проверки условия) принудительно включает 1 скорость (самая малая) температура примерно на выходе 50 градусов. Поскольку скрость мала, то резко уменьшилась цикличность котла, и горелка "встает" на самый минимум мощности. Если температура понизилась, на улице (холодает) то интервал 0 -5 это второй режим.
Если -5 -15 и ниже то 3 режим. При этом система автоматики котла стремится удержать минимум мощности при минимуме циклов. Это самый оптимальный вариант.
Но мне очень понравилась Ваша реализация, именно способом установки параметра.
denis
Сообщения: 284
Зарегистрирован: Сб ноя 24, 2012 11:47 am
Благодарил (а): 28 раз
Поблагодарили: 28 раз

Re: Управлением котлом (графический термостат) Highchart

Сообщение denis » Ср ноя 11, 2015 9:23 pm

Система отопления состоит из водяных теплых полов + радиаторы + электрокотел, в дальнейшем к зиме запущу тепловой насос - буду измерять экономию) Честно сказать сейчас это тестовая система управления, т.е. просто включаю электрокотел (это важно, так как в таком случае можно не поддерживать минимальную мощность, а просто включать/выключать - инерционность системы позволяет, с котлами на топливе конечно так нельзя поступать, либо надо иметь буфер - теплоаккумулятор) и соответственно поддерживаю температуру в одной комнате. А в целом в коллекторной группе установлены сервоприводы на каждую петлю теплого пола (на каждую комнату) и на каждый радиатор, соответственно в дальнейшем система будет "поумнее" особенно в период отсутствия людей в доме (даче). Главное было хоть на одной комнате реализовать, дальше масштабировать проще. Кроме того хочу в будущем с разным гистерезисом регулировать радиаторы и теплый пол из-за их разной инерционности.
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Управлением котлом (графический термостат) Highchart

Сообщение shemnik69 » Чт ноя 12, 2015 9:12 am

Электрокотел, конечно может регулироваться, хоть ступенчато хоть линейно (с тиристорным регулятором). Например у меня ранее с 2004 по 2008 годы был электрокотел. Он работал так: Внутри ставил тены (от бойлеров Аристон) на 05 кВт . 1 кВт и 1.5 кВт (стены дома это пеноблок и внешнее 10 см утепление, поэтому дом имеет относительно низкую температурную энерцию, (быстрый прогрев при холодном старте) но очень высокую температурную независимость от внешней среды как следствие, большая мощность нагревателя не нужна) у меня 3 фазы и каждый ТЭН был на свой "фазе", регулировка, каждого тэна, имела по уровню уставку на 2-4 градуса выше. Иными словами, если например холодный старт, то все тэны работали, затем по мере прогрева, они отк. и фактически температуру держал самый малый на 05 кВт. Также не было резких скачков температуры. А вообще, одно значение температуры в комнатах это не прихоть это условия, в противном случае начинаются как премещения воздушных масс если дом имеет несколько уровней 2 и выше и прочие. А вот режим экономии, это тоже спорная идея. У меня есть теплый пол (фактически весь 1 этаж это ТП) и если его "пытать" температурной "пилой" вверх вниз в попытках экономить, то это не тот вариант. Что по комнатным уставкам, да допускаю, но при условии что комнаты обособленные. Тогда есть смысл. Ну и еще на ночь например температура в спальне оптимальна 17-18 градусов. Хотя это сугубо индивидуально.
denis
Сообщения: 284
Зарегистрирован: Сб ноя 24, 2012 11:47 am
Благодарил (а): 28 раз
Поблагодарили: 28 раз

Re: Управлением котлом (графический термостат) Highchart

Сообщение denis » Чт ноя 12, 2015 8:33 pm

Насчет электрокотла все правильно, можно сделать тиристорное, но к сожалению времени не хватает на все( Да и в будущем электрокотел будет только в качестве запасного варианта или для "накачки" теплоаккумулятора ночным тарифом, основным источником тепла будет тепловой насос. А вот Ваш метод настройки 3-х фазного котла по разным уставкам температуры очень интересен и полезен, так как у меня 3 ТЭНа по 4 кВт и когда система прогрета конечно эл.котел часто включается/выключается.
Насчет теплого пола отчасти согласен, что не очень хорошо его постоянно/выключать, но во-первых пока нет теплоаккумулятор)), а во-вторых теперь я могу задать любой "профиль" температуры и например сделать плавное нарастание температуры к приезду, так как дом кирпичный, то быстро его не прогреешь. Теперь буду экспериментировать, как выгоднее: сильно греть ночью, или плавно к выходным поднимать температуру.
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Управлением котлом (графический термостат) Highchart

Сообщение shemnik69 » Пт ноя 13, 2015 8:23 am

Денис! Самый оптимальный режим, это плавное нарастание мощности. Т.е например:
если необходимо поднять комнатную температуру. скажем на 2 градуса. от начальной (пускай 17 градусов (для взрослых это оптиум. а для ребенка мало. ему оптиум 24-25) то если "гнать" сразу мощностью, то быстро перегреваем радиаторы и систему в целом и если есть следящие элементы (датчики) они получают сразу очень большую ошибку по уровню и стремятся заглушить (выключить, придавить клапан и т.п) подачу энергии и сама система отопления начинает циклировать. Это плохо.
Если же, подаем мощность плавно, с учетом тепловых балансов помещения, то, такая ошибка не возникает, и регулятор (это следящий элемент (датчик) и органы (микроконтроллер, алгоритм в МД) воздействия на приводы (клапаны заслонки и пр) не получает управляющих команд, либо они минимальны. А раз так, система в целом, самооптимизируется, на минимальное энерго распределение (это как генерация тепла (котел) так и его распределение по помещению системой отопления (магистрали.радиаторы.)
В целом же, на эту тему можно долго писать, и мы по сути уходим от самой сути. Так вот Ваш метод именно хорош тем, что его можно привязать именно с системам имеющим плавное регулирование подачи мощности, это либо трехходовые клапаны с приводом, либо насосные агрегаты, у которых есть управление скоросными режимами т.е линейное регулирование. Вот тут да ..все красота управления. Как то так. Ну и конечно электрокотлы с тиристорными регуляторами. Это самый идеальный вариант.
denis
Сообщения: 284
Зарегистрирован: Сб ноя 24, 2012 11:47 am
Благодарил (а): 28 раз
Поблагодарили: 28 раз

Re: Управлением котлом (графический термостат) Highchart

Сообщение denis » Пт ноя 13, 2015 9:48 am

Спасибо за положительную оценку моего "творчества" в МДМ! Может потом доделаю редактирование временных интервалов, хотя мне пока хватает. Только вот надо бы переделать интерфейс для "пальцетыковых" ) планшетов, все-таки сейчас более удобно двигать мышью, чем пальцем на телефоне.
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Управлением котлом (графический термостат) Highchart

Сообщение shemnik69 » Пт ноя 13, 2015 12:03 pm

Конечно за реализацию и идею 5 +,,, Но саму идею и :lol: коды...я заимствовал.... :D
denis
Сообщения: 284
Зарегистрирован: Сб ноя 24, 2012 11:47 am
Благодарил (а): 28 раз
Поблагодарили: 28 раз

Re: Управлением котлом (графический термостат) Highchart

Сообщение denis » Сб ноя 14, 2015 11:08 am

так для этого и форум, чтобы делиться или помочь по возможности :)
dimkov74
Сообщения: 10
Зарегистрирован: Вт окт 20, 2015 8:01 pm
Благодарил (а): 0
Поблагодарили: 2 раза

Re: Управлением котлом (графический термостат) Highchart

Сообщение dimkov74 » Сб ноя 14, 2015 2:40 pm

Попробовал ваш термостат. На большом экране с мышкой все хорошо, а на мобильных устройствах совершенно не удобно. На стареньком планшете вообще не прогружает диаграммы , даже в локальной сети не говоря уже про мобильную. Для теплицы летом использую наработку http://www.raspiviv.com/, очень понравилось.
Ответить