diff --git a/js/beestat/math.js b/js/beestat/math.js new file mode 100644 index 0000000..9de3016 --- /dev/null +++ b/js/beestat/math.js @@ -0,0 +1,41 @@ +beestat.math = {}; + +/** + * Get a linear trendline from a set of data. + * + * @param {Object} data The data; at least two points required. + * + * @return {Object} The slope and intercept of the trendline. + */ +beestat.math.get_linear_trendline = function(data) { + // Requires at least two points. + if (Object.keys(data).length < 2) { + return null; + } + + var sum_x = 0; + var sum_y = 0; + var sum_xy = 0; + var sum_x_squared = 0; + var n = 0; + + for (var x in data) { + x = parseFloat(x); + var y = parseFloat(data[x]); + + sum_x += x; + sum_y += y; + sum_xy += (x * y); + sum_x_squared += Math.pow(x, 2); + n++; + } + + var slope = ((n * sum_xy) - (sum_x * sum_y)) / + ((n * sum_x_squared) - (Math.pow(sum_x, 2))); + var intercept = ((sum_y) - (slope * sum_x)) / (n); + + return { + 'slope': slope, + 'intercept': intercept + }; +}; diff --git a/js/component/card/temperature_profiles.js b/js/component/card/temperature_profiles.js index 57c4920..dd7bea8 100644 --- a/js/component/card/temperature_profiles.js +++ b/js/component/card/temperature_profiles.js @@ -138,7 +138,7 @@ beestat.component.card.temperature_profiles.prototype.get_data_ = function() { } profile.deltas = deltas_converted; - var linear_trendline = this.get_linear_trendline_(profile.deltas); + var linear_trendline = beestat.math.get_linear_trendline(profile.deltas); var min_max_keys = Object.keys(profile.deltas); @@ -215,49 +215,6 @@ beestat.component.card.temperature_profiles.prototype.get_data_ = function() { return data; }; -/** - * Get a linear trendline from a set of data. - * - * IMPORTANT: This exists in the profile already but it's wrong to use it - * directly as it's not right for Celsius. - * - * @param {Object} data The data; at least two points required. - * - * @return {Object} The slope and intercept of the trendline. - */ -beestat.component.card.temperature_profiles.prototype.get_linear_trendline_ = function(data) { - // Requires at least two points. - if (Object.keys(data).length < 2) { - return null; - } - - var sum_x = 0; - var sum_y = 0; - var sum_xy = 0; - var sum_x_squared = 0; - var n = 0; - - for (var x in data) { - x = parseFloat(x); - var y = parseFloat(data[x]); - - sum_x += x; - sum_y += y; - sum_xy += (x * y); - sum_x_squared += Math.pow(x, 2); - n++; - } - - var slope = ((n * sum_xy) - (sum_x * sum_y)) / - ((n * sum_x_squared) - (Math.pow(sum_x, 2))); - var intercept = ((sum_y) - (slope * sum_x)) / (n); - - return { - 'slope': slope, - 'intercept': intercept - }; -}; - /** * Get the title of the card. * diff --git a/js/component/modal/temperature_profiles_info.js b/js/component/modal/temperature_profiles_info.js index bc1863d..a6e8b1a 100644 --- a/js/component/modal/temperature_profiles_info.js +++ b/js/component/modal/temperature_profiles_info.js @@ -29,13 +29,29 @@ beestat.component.modal.temperature_profiles_info.prototype.decorate_contents_ = 'resist' ].forEach(function(type) { if (thermostat.profile.temperature[type] !== null) { + const profile = thermostat.profile.temperature[type]; + + // Convert the data to Celsius if necessary + const deltas_converted = {}; + for (let key in profile.deltas) { + deltas_converted[beestat.temperature({'temperature': key})] = + beestat.temperature({ + 'temperature': (profile.deltas[key]), + 'delta': true, + 'round': 3 + }); + } + + profile.deltas = deltas_converted; + const linear_trendline = beestat.math.get_linear_trendline(profile.deltas); + fields.push({ 'name': beestat.series['indoor_' + type + '_delta'].name, 'value': 'Slope = ' + - thermostat.profile.temperature[type].linear_trendline.slope + + linear_trendline.slope.toFixed(4) + '
Intercept = ' + - thermostat.profile.temperature[type].linear_trendline.intercept + linear_trendline.intercept.toFixed(4) + beestat.setting('units.temperature') }); } }); diff --git a/js/js.php b/js/js.php index 3b29d3e..3acf3b9 100755 --- a/js/js.php +++ b/js/js.php @@ -49,6 +49,7 @@ if($setting->get('environment') === 'dev' || $setting->get('environment') === 'd echo '' . PHP_EOL; echo '' . PHP_EOL; echo '' . PHP_EOL; + echo '' . PHP_EOL; // Layer echo '' . PHP_EOL;