1
0
mirror of https://github.com/beestat/app.git synced 2025-05-24 02:14:03 -04:00
beestat/js/component/chart/runtime_thermostat_summary.js
2024-05-25 08:22:09 -04:00

412 lines
11 KiB
JavaScript
Executable File

/**
* Runtime thermostat summary chart.
*
* @param {object} data The chart data.
*/
beestat.component.chart.runtime_thermostat_summary = function(data) {
this.data_ = data;
beestat.component.chart.apply(this, arguments);
};
beestat.extend(beestat.component.chart.runtime_thermostat_summary, beestat.component.chart);
/**
* Override for get_options_xAxis_labels_formatter_.
*
* @return {Function} xAxis labels formatter.
*/
beestat.component.chart.runtime_thermostat_summary.prototype.get_options_xAxis_labels_formatter_ = function() {
var current_month;
var current_year;
return function() {
if (this.isFirst === true) {
current_month = null;
current_year = null;
}
var label_parts = [];
var day = this.value.format('D');
var week = this.value.clone().startOf('isoweek')
.format('MMM D');
var month = this.value.format('MMM');
var year = this.value.format('YYYY');
switch (beestat.setting('runtime_thermostat_summary_group_by')) {
case 'year':
label_parts.push(year);
break;
case 'month':
label_parts.push(month);
if (year !== current_year) {
label_parts.push(year);
}
break;
case 'week':
label_parts.push(week);
if (year !== current_year) {
label_parts.push(year);
}
break;
case 'day':
if (month !== current_month) {
label_parts.push(month);
}
label_parts.push(day);
if (year !== current_year) {
label_parts.push(year);
}
break;
}
current_month = month;
current_year = year;
return label_parts.join(' ');
};
};
/**
* Override for get_options_series_.
*
* @return {Array} All of the series to display on the chart.
*/
beestat.component.chart.runtime_thermostat_summary.prototype.get_options_series_ = function() {
var self = this;
var series = [];
[
'sum_compressor_cool_1',
'sum_compressor_cool_2',
'sum_compressor_heat_1',
'sum_compressor_heat_2',
'sum_auxiliary_heat_1',
'sum_auxiliary_heat_2'
].forEach(function(series_code) {
if (self.data_.metadata.series[series_code].active === true) {
series.push({
'name': series_code,
'data': self.data_.series[series_code],
'color': beestat.series[series_code].color,
'yAxis': 0,
'groupPadding': 0,
'type': 'column'
});
}
});
if (
self.data_.metadata.series.avg_outdoor_temperature.active === true ||
self.data_.metadata.series.extreme_outdoor_temperature.active === true
) {
series.push({
'name': 'avg_outdoor_temperature',
'id': 'avg_outdoor_temperature',
'data': this.data_.series.avg_outdoor_temperature,
'color': beestat.series.avg_outdoor_temperature.color,
'yAxis': 1,
'type': 'spline',
'dashStyle': 'ShortDash',
'lineWidth': 1,
'events': {
'legendItemClick': function() {
const outdoor_temperature_visible = this.visible;
if (outdoor_temperature_visible === false) {
this.chart.get('sum_heating_degree_days').setVisible(false);
}
}
}
});
series.push({
'name': 'extreme_outdoor_temperature',
'data': this.data_.series.extreme_outdoor_temperature,
'color': beestat.series.extreme_outdoor_temperature.color,
'type': 'areasplinerange',
'yAxis': 1,
'fillOpacity': 0.2,
'lineWidth': 0,
'linkedTo': 'avg_outdoor_temperature'
});
}
if (
self.data_.metadata.series.sum_heating_degree_days.active === true ||
self.data_.metadata.series.sum_cooling_degree_days.active === true
) {
series.push({
'name': 'sum_heating_degree_days',
'id': 'sum_heating_degree_days',
'data': this.data_.series.sum_heating_degree_days,
'color': beestat.series.sum_heating_degree_days.color,
'yAxis': 2,
'type': 'spline',
'lineWidth': 2,
'visible': false,
'events': {
'legendItemClick': function() {
const degree_days_visible = this.visible;
if (degree_days_visible === false) {
this.chart.get('avg_outdoor_temperature').setVisible(false);
}
}
}
});
series.push({
'name': 'sum_cooling_degree_days',
'data': this.data_.series.sum_cooling_degree_days,
'color': beestat.series.sum_cooling_degree_days.color,
'yAxis': 2,
'type': 'spline',
'lineWidth': 2,
'linkedTo': 'sum_heating_degree_days',
'visible': false
});
}
return series;
};
/**
* Override for get_options_yAxis_.
*
* @return {Array} The y-axis options.
*/
beestat.component.chart.runtime_thermostat_summary.prototype.get_options_yAxis_ = function() {
var y_max_hours;
var tick_interval;
if (beestat.setting('runtime_thermostat_summary_smart_scale') === true) {
switch (beestat.setting('runtime_thermostat_summary_group_by')) {
case 'year':
y_max_hours = 8760;
tick_interval = 2190;
break;
case 'month':
y_max_hours = 672;
tick_interval = 168;
break;
case 'week':
y_max_hours = 168;
tick_interval = 24;
break;
case 'day':
y_max_hours = 24;
tick_interval = 6;
break;
}
}
return [
{
'alignTicks': false,
'min': 0,
'softMax': y_max_hours,
'tickInterval': tick_interval,
'reversedStacks': false,
'gridLineColor': beestat.style.color.bluegray.light,
'gridLineDashStyle': 'longdash',
'title': {
'text': ''
},
'labels': {
'style': {
'color': beestat.style.color.gray.base,
'fontSize': '11px'
},
'formatter': function() {
return this.value + 'h';
}
}
},
{
'alignTicks': false,
'gridLineColor': null,
'gridLineDashStyle': 'longdash',
'opposite': true,
'allowDecimals': false,
'title': {
'text': ''
},
'labels': {
'style': {
'color': beestat.style.color.gray.base,
'fontSize': '11px'
},
'formatter': function() {
return this.value + beestat.setting('units.temperature');
}
}
},
{
'alignTicks': false,
'gridLineColor': null,
'gridLineDashStyle': 'longdash',
'opposite': true,
'allowDecimals': false,
'title': {
'text': ''
},
'labels': {
'style': {
'color': beestat.style.color.gray.base
},
'formatter': function() {
return this.value.toLocaleString();
}
}
}
];
};
/**
* Override for get_options_tooltip_formatter_.
*
* @return {Function} The tooltip formatter.
*/
beestat.component.chart.runtime_thermostat_summary.prototype.get_options_tooltip_formatter_ = function() {
var self = this;
return function() {
var sections = [];
var groups = {
'heat': [],
'cool': [],
'other': []
};
var values = {};
this.points.forEach(function(point) {
if (point.series.name === 'extreme_outdoor_temperature') {
values.min_outdoor_temperature = point.point.low;
values.max_outdoor_temperature = point.point.high;
} else {
values[point.series.name] = point.y;
}
});
this.points.forEach(function(point) {
var label;
var value;
var color;
switch (point.series.name) {
case 'extreme_outdoor_temperature':
return;
case 'avg_outdoor_temperature':
label = beestat.series.avg_outdoor_temperature.name;
color = point.series.color;
value = beestat.temperature({
'temperature': values.avg_outdoor_temperature,
'input_temperature_unit': beestat.setting('units.temperature'),
'units': true,
'round': 0
});
value += ' (';
value += beestat.temperature({
'temperature': values.min_outdoor_temperature,
'input_temperature_unit': beestat.setting('units.temperature'),
'units': true,
'round': 0
});
value += ' to ';
value += beestat.temperature({
'temperature': values.max_outdoor_temperature,
'input_temperature_unit': beestat.setting('units.temperature'),
'units': true,
'round': 0
});
value += ')';
break;
case 'sum_heating_degree_days':
label = beestat.series.sum_heating_degree_days.name;
color = point.series.color;
value = values.sum_heating_degree_days.toFixed(1).toLocaleString();
break;
case 'sum_cooling_degree_days':
label = beestat.series.sum_cooling_degree_days.name;
color = point.series.color;
value = values.sum_cooling_degree_days.toFixed(1).toLocaleString();
break;
default:
label = beestat.series[point.series.name].name;
value = beestat.time(values[point.series.name], 'hours');
color = point.series.color;
break;
}
var group;
if (point.series.name.indexOf('heat') !== -1) {
group = 'heat';
} else if (point.series.name.indexOf('cool') !== -1) {
group = 'cool';
} else {
group = 'other';
}
groups[group].push({
'label': label,
'value': value,
'color': color
});
});
sections.push(groups.heat);
sections.push(groups.cool);
sections.push(groups.other);
var title;
switch (beestat.setting('runtime_thermostat_summary_group_by')) {
case 'year':
title = this.x.format('YYYY');
break;
case 'month':
title = this.x.format('MMM YYYY');
break;
case 'week':
title = 'Week of ' + this.x.clone().startOf('isoweek')
.format('MMM Do, YYYY');
break;
case 'day':
title = this.x.format('MMM Do');
break;
}
return self.tooltip_formatter_helper_(
title,
sections
);
};
};
/**
* Remove the crosshair width so it is one series wide.
*
* @return {object} The crosshair width.
*/
beestat.component.chart.runtime_thermostat_summary.prototype.get_options_xAxis_crosshair_width_ = function() {
return undefined;
};
/**
* Get the crosshair snap.
*
* @return {object} The crosshair snap.
*/
beestat.component.chart.runtime_thermostat_summary.prototype.get_options_xAxis_crosshair_snap_ = function() {
return true;
};
/**
* Get the height of the chart.
*
* @return {number} The height of the chart.
*/
beestat.component.chart.runtime_thermostat_summary.prototype.get_options_chart_height_ = function() {
return 350;
};