{% set graph_math_ids = each_graph.math_ids.split(';') %} {% set graph_output_ids = each_graph.relay_ids.split(';') %} {% set graph_pid_ids = each_graph.pid_ids.split(';') %} chart_graph[{{chart_number}}] = new Highcharts.StockChart({ chart : { renderTo: 'container-graph-{{each_graph.id}}', zoomType: 'x', alignTicks: {% if each_graph.enable_align_ticks %}true{% else %}false{% endif %}, resetZoomButton: { theme: { display: 'none' } }, events: { load: function () { {% set count_series = [] -%} {% for each_input in input -%} {%- for each_id_and_measure in graph_input_ids if each_input.unique_id == each_id_and_measure.split(',')[0] %} getPastData({{chart_number}}, {{count_series|count}}, '{{each_id_and_measure.split(',')[1]}}', '{{each_input.unique_id}}', {{each_graph.x_axis_duration*60}}); {% if each_graph.enable_auto_refresh %} getLiveData({{chart_number}}, {{count_series|count}}, '{{each_id_and_measure.split(',')[1]}}', '{{each_input.unique_id}}', {{each_graph.x_axis_duration}}, {{each_graph.enable_xaxis_reset|int}}, {{each_graph.refresh_duration}}, {% if each_graph.enable_graph_shift %}true{% else %}false{% endif %}); {% endif %} {%- do count_series.append(1) %} {%- endfor -%} {%- endfor -%} {% for each_math in math -%} {%- for each_id_and_measure in graph_math_ids if each_math.unique_id == each_id_and_measure.split(',')[0] %} getPastData({{chart_number}}, {{count_series|count}}, '{{each_id_and_measure.split(',')[1]}}', '{{each_math.unique_id}}', {{each_graph.x_axis_duration*60}}); {% if each_graph.enable_auto_refresh %} getLiveData({{chart_number}}, {{count_series|count}}, '{{each_id_and_measure.split(',')[1]}}', '{{each_math.unique_id}}', {{each_graph.x_axis_duration}}, {{each_graph.enable_xaxis_reset|int}}, {{each_graph.refresh_duration}}, {% if each_graph.enable_graph_shift %}true{% else %}false{% endif %}); {% endif %} {%- do count_series.append(1) %} {%- endfor -%} {%- endfor -%} {%- for each_output in output -%} {%- for each_graph_relay_id in graph_output_ids if each_output.unique_id == each_graph_relay_id.split(',')[0] %} getPastData({{chart_number}}, {{count_series|count}}, '{{each_graph_relay_id.split(',')[1]}}', '{{each_output.unique_id}}', {{each_graph.x_axis_duration*60}}); {% if each_graph.enable_auto_refresh %} getLiveData({{chart_number}}, {{count_series|count}}, '{{each_graph_relay_id.split(',')[1]}}', '{{each_output.unique_id}}', {{each_graph.x_axis_duration}}, {{each_graph.enable_xaxis_reset|int}}, {{each_graph.refresh_duration}}, {% if each_graph.enable_graph_shift %}true{% else %}false{% endif %}); {% endif %} {%- do count_series.append(1) %} {%- endfor -%} {%- endfor -%} {%- for each_pid in pid -%} {%- for each_id_and_measure in graph_pid_ids if each_pid.unique_id == each_id_and_measure.split(',')[0] %} getPastData({{chart_number}}, {{count_series|count}}, '{{each_id_and_measure.split(',')[1]}}', '{{each_id_and_measure.split(',')[0]}}', {{each_graph.x_axis_duration*60}}); {% if each_graph.enable_auto_refresh %} getLiveData({{chart_number}}, {{count_series|count}}, '{{each_id_and_measure.split(',')[1]}}', '{{each_id_and_measure.split(',')[0]}}', {{each_graph.x_axis_duration}}, {{each_graph.enable_xaxis_reset|int}}, {{each_graph.refresh_duration}}, {% if each_graph.enable_graph_shift %}true{% else %}false{% endif %}); {% endif %} {%- do count_series.append(1) %} {%- endfor -%} {%- endfor -%} } } }, {% if each_graph.use_custom_colors and each_graph.custom_colors -%} {% set color_list = each_graph.custom_colors.split(',') %} colors: [{%- for each_color in color_list -%} "{{each_color}}", {%- endfor -%}], {%- endif -%} title: { text: '{% if each_graph.enable_title %}{{each_graph.name}}{% endif %}' }, legend: { enabled: true }, xAxis: { type: 'datetime', ordinal: false }, yAxis: [ {% for each_axis_meas in y_axes[each_graph.id] %} { {% if each_graph.enable_manual_y_axis and not (custom_yaxes[each_graph.id][dict_measurements[each_axis_meas]['meas']]['minimum'] == '0' and custom_yaxes[each_graph.id][dict_measurements[each_axis_meas]['meas']]['maximum'] == '0') %} min: {{custom_yaxes[each_graph.id][dict_measurements[each_axis_meas]['meas']]['minimum']}}, max: {{custom_yaxes[each_graph.id][dict_measurements[each_axis_meas]['meas']]['maximum']}}, startOnTick: {% if each_graph.enable_start_on_tick %}true{% else %}false{% endif %}, endOnTick: {% if each_graph.enable_end_on_tick %}true{% else %}false{% endif %}, {% endif %} title: { text: '{{dict_measurements[each_axis_meas]['name']}}{% if dict_measurements[each_axis_meas]['unit'] != '' %} ({{dict_measurements[each_axis_meas]['unit']}}){% endif %}' }, labels: { format: '{value}' }, opposite: false, id: '{{dict_measurements[each_axis_meas]['meas']}}' }, {% endfor %} ], exporting: { enabled: {% if each_graph.enable_export %}true{% else %}false{% endif %}, fallbackToExportServer: false, }, navigator: { enabled: {% if each_graph.enable_navbar %}true{% else %}false{% endif %} }, scrollbar: { enabled: false }, rangeSelector: { enabled: {% if each_graph.enable_rangeselect %}true{% else %}false{% endif %}, buttons: [{ count: 1, type: 'minute', text: '1m' }, { count: 5, type: 'minute', text: '5m' }, { count: 15, type: 'minute', text: '15m' }, { count: 30, type: 'minute', text: '30m' }, { type: 'hour', count: 1, text: '1h' }, { type: 'hour', count: 6, text: '6h' }, { type: 'day', count: 1, text: '1d' }, { type: 'week', count: 1, text: '1w' }, { type: 'month', count: 1, text: '1m' }, { type: 'month', count: 3, text: '3m' }, { type: 'all', text: 'Full' }], selected: 15 }, credits: { enabled: false, href: "https://github.com/kizniche/Mycodo", text: "Mycodo" }, series: [ {% for each_input in input -%} {%- for each_id_and_measure in graph_input_ids if each_input.unique_id == each_id_and_measure.split(',')[0] -%} {% if each_input.device == 'LinuxCommand' %} { name: '{{each_input.name}} {{each_input.cmd_measurement}} ({{each_input.cmd_measurement_units}})', type: 'line', tooltip: { {% if each_input.cmd_measurement == 'temperature' %} pointFormatter: function () { return '\u25CF ' + this.series.name + ': ' + Highcharts.numberFormat(this.y, 2) + '°C (' + Highcharts.numberFormat(((this.y*9/5)+32), 2) + '°F)
'; }, {% else %} valueSuffix: ' {{each_input.cmd_measurement_units}}', valueDecimals: 2 {% endif %} }, yAxis: '{{each_input.cmd_measurement}}', data: [] }, {% endif %} {%- for each_measurement in each_input.measurements.split(',') -%} {%- if each_measurement == each_id_and_measure.split(',')[1] -%} { name: '{{each_input.name}} {{measurement_units[each_measurement]['name']}}{% if dict_measurements[each_measurement]['unit'] != '' %} ({{measurement_units[each_measurement]['unit']}}){% endif %}', {% if measurement_units[each_measurement]['meas'] == 'edge' %} type: 'column', {% else %} type: 'line', {% endif %} tooltip: { {% if measurement_units[each_measurement]['meas'] == 'temperature' %} pointFormatter: function () { return '\u25CF ' + this.series.name + ': ' + Highcharts.numberFormat(this.y, 2) + '°C (' + Highcharts.numberFormat(((this.y*9/5)+32), 2) + '°F)
'; }, {% else %} valueSuffix: ' {{measurement_units[each_measurement]['unit']}}', valueDecimals: 2 {% endif %} }, yAxis: '{{measurement_units[each_measurement]['meas']}}', data: [] }, {%- elif each_input.adc_measure == each_id_and_measure.split(',')[1] -%} { name: '{{each_input.name}} {{each_input.adc_measure}}', type: 'line', tooltip: { valueSuffix: ' {{each_input.adc_measure_units}}', valueDecimals: 3 }, yAxis: '{{each_input.adc_measure}}', data: [] }, {%- endif -%} {%- endfor -%} {%- endfor -%} {% endfor %} {% for each_math in math -%} {%- for each_id_and_measure in graph_math_ids if each_math.unique_id == each_id_and_measure.split(',')[0] -%} { name: '{{each_math.name}} {% if each_id_and_measure.split(',')[1] in measurement_units %}{{measurement_units[each_id_and_measure.split(',')[1]]['name']}} ({{measurement_units[each_id_and_measure.split(',')[1]]['unit']}}){% else %}{{each_id_and_measure.split(',')[1]}}{% endif %}', type: 'line', tooltip: { {% if each_id_and_measure.split(',')[1] in measurement_units and measurement_units[each_id_and_measure.split(',')[1]]['meas'] == 'temperature' %} pointFormatter: function () { return '\u25CF ' + this.series.name + ': ' + Highcharts.numberFormat(this.y, 2) + '°C (' + Highcharts.numberFormat(((this.y*9/5)+32), 2) + '°F)
'; }, {% else %} valueSuffix: ' {% if each_id_and_measure.split(',')[1] in measurement_units %}{{measurement_units[each_id_and_measure.split(',')[1]]['unit']}}{% else %}{{each_math.measure_units}}{% endif %}', valueDecimals: 3 {% endif %} }, yAxis: '{{each_id_and_measure.split(',')[1]}}', data: [] }, {%- endfor -%} {% endfor %} {%- for each_output in output -%} {%- for each_graph_relay_id in graph_output_ids if each_output.unique_id == each_graph_relay_id.split(',')[0] -%} {% if each_graph_relay_id.split(',')[1] == 'duration_sec' %} { name: '{{each_output.name}} (sec)', type: 'column', dataGrouping: { approximation: 'low', groupPixelWidth: 3 }, tooltip: { valueSuffix: ' sec', valueDecimals: 2 }, yAxis: 'duration_sec', data: [] }, {% elif each_graph_relay_id.split(',')[1] == 'duty_cycle' %} { name: '{{each_output.name}} (%)', type: 'column', dataGrouping: { approximation: 'low', groupPixelWidth: 3 }, tooltip: { valueSuffix: ' %', valueDecimals: 2 }, yAxis: 'duty_cycle', data: [] }, {% endif %} {%- endfor -%} {%- endfor -%} {%- for each_pid in pid -%} {%- for each_graph_pid_id in graph_pid_ids if each_pid.unique_id == each_graph_pid_id.split(',')[0] -%} {% if each_graph_pid_id.split(',')[1] == 'setpoint' and each_pid.measurement %} { name: '{{each_pid.name}} {{_('Setpoint')}}', type: 'line', tooltip: { valueSuffix: ' {%- if each_pid.measurement.split(',')[1] in measurement_units -%} {{' ' + measurement_units[each_pid.measurement.split(',')[1]]['unit']|safe}} {%- else -%} {%- for each_input in input if each_pid.measurement.split(',')[0] == each_input.unique_id and each_input.device == 'LinuxCommand' -%} {{' ' + each_input.cmd_measurement_units}} {%- endfor -%} {%- endif -%}', valueDecimals: 2 }, yAxis: '{{each_pid.measurement.split(',')[1]}}', data: [] }, {% elif each_graph_pid_id.split(',')[1] == 'setpoint_band_min' and each_pid.measurement %} { name: '{{each_pid.name}} {{_('Band Min')}}', type: 'line', tooltip: { valueSuffix: '{%- if each_pid.measurement.split(',')[1] in measurement_units -%} {{' ' + measurement_units[each_pid.measurement.split(',')[1]]['unit']|safe}} {%- else -%} {%- for each_input in input if each_pid.measurement.split(',')[0] == each_input.unique_id and each_input.device == 'LinuxCommand' -%} {{' ' + each_input.cmd_measurement_units}} {%- endfor -%} {%- endif -%}', valueDecimals: 2 }, yAxis: '{{each_pid.measurement.split(',')[1]}}', data: [] }, {% elif each_graph_pid_id.split(',')[1] == 'setpoint_band_max' and each_pid.measurement %} { name: '{{each_pid.name}} {{_('Band Max')}}', type: 'line', tooltip: { valueSuffix: '{%- if each_pid.measurement.split(',')[1] in measurement_units -%} {{' ' + measurement_units[each_pid.measurement.split(',')[1]]['unit']|safe}} {%- else -%} {%- for each_input in input if each_pid.measurement.split(',')[0] == each_input.unique_id and each_input.device == 'LinuxCommand' -%} {{' ' + each_input.cmd_measurement_units}} {%- endfor -%} {%- endif -%}', valueDecimals: 2 }, yAxis: '{{each_pid.measurement.split(',')[1]}}', data: [] }, {% elif each_graph_pid_id.split(',')[1] == 'pid_p_value' %} { name: '{{each_pid.name}} P-Value', type: 'line', tooltip: { valueSuffix: '', valueDecimals: 2 }, yAxis: 'pid_value', data: [] }, {% elif each_graph_pid_id.split(',')[1] == 'pid_i_value' %} { name: '{{each_pid.name}} I-Value', type: 'line', tooltip: { valueSuffix: '', valueDecimals: 2 }, yAxis: 'pid_value', data: [] }, {% elif each_graph_pid_id.split(',')[1] == 'pid_d_value' %} { name: '{{each_pid.name}} D-Value', type: 'line', tooltip: { valueSuffix: '', valueDecimals: 2 }, yAxis: 'pid_value', data: [] }, {% elif each_graph_pid_id.split(',')[1] == 'pid_output' %} { name: '{{each_pid.name}} {{_('Output')}} {{_('Duration')}}', type: 'line', tooltip: { valueSuffix: ' sec', valueDecimals: 2 }, yAxis: 'duration_sec', data: [] }, {% elif each_graph_pid_id.split(',')[1] == 'duty_cycle' %} { name: '{{each_pid.name}} {{_('Output')}} {{_('Duty Cycle')}}', type: 'line', tooltip: { valueSuffix: ' %', valueDecimals: 2 }, yAxis: 'duty_cycle', data: [] }, {% endif %} {%- endfor -%} {%- endfor -%} ] }); $('#updateData{{chart_number}}').click(function() { {% set count_series = [] -%} {% for each_input in input -%} {%- for each_id_and_measure in graph_input_ids if each_input.unique_id == each_id_and_measure.split(',')[0] %} retrieveLiveData({{chart_number}}, {{count_series|count}}, '{{each_id_and_measure.split(',')[1]}}', '{{each_input.unique_id}}', {{each_graph.x_axis_duration}}, {{each_graph.enable_xaxis_reset|int}}, {{each_graph.refresh_duration}}, {% if each_graph.enable_graph_shift %}true{% else %}false{% endif %}); {%- do count_series.append(1) %} {%- endfor -%} {%- endfor -%} {% for each_math in math -%} {%- for each_id_and_measure in graph_math_ids if each_math.unique_id == each_id_and_measure.split(',')[0] %} retrieveLiveData({{chart_number}}, {{count_series|count}}, '{{each_id_and_measure.split(',')[1]}}', '{{each_math.unique_id}}', {{each_graph.x_axis_duration}}, {{each_graph.enable_xaxis_reset|int}}, {{each_graph.refresh_duration}}, {% if each_graph.enable_graph_shift %}true{% else %}false{% endif %}); {%- do count_series.append(1) %} {%- endfor -%} {%- endfor -%} {%- for each_output in output -%} {%- for each_graph_relay_id in graph_output_ids if each_output.unique_id == each_graph_relay_id.split(',')[0] %} retrieveLiveData({{chart_number}}, {{count_series|count}}, '{{each_graph_relay_id.split(',')[1]}}', '{{each_output.unique_id}}', {{each_graph.x_axis_duration}}, {{each_graph.enable_xaxis_reset|int}}, {{each_graph.refresh_duration}}, {% if each_graph.enable_graph_shift %}true{% else %}false{% endif %}); {%- do count_series.append(1) %} {%- endfor -%} {%- endfor -%} {%- for each_pid in pid -%} {%- for each_id_and_measure in graph_pid_ids if each_pid.unique_id == each_id_and_measure.split(',')[0] %} retrieveLiveData({{chart_number}}, {{count_series|count}}, '{{each_id_and_measure.split(',')[1]}}', '{{each_id_and_measure.split(',')[0]}}', {{each_graph.x_axis_duration}}, {{each_graph.enable_xaxis_reset|int}}, {{each_graph.refresh_duration}}, {% if each_graph.enable_graph_shift %}true{% else %}false{% endif %}); {%- do count_series.append(1) %} {%- endfor -%} {%- endfor -%} }); $('#resetZoom{{chart_number}}').click(function() { var chart = $('#container-graph-{{each_graph.id}}').highcharts(); chart.zoomOut(); }); $('#showhidebutton{{chart_number}}').click(function() { var chart = $('#container-graph-{{each_graph.id}}').highcharts(); var series = chart.series[0]; if (series.visible) { $(chart.series).each(function(){ this.setVisible(false, false); }); chart.redraw(); } else { $(chart.series).each(function(){ this.setVisible(true, false); }); chart.redraw(); } });