1
0
mirror of https://github.com/beestat/app.git synced 2025-05-24 02:14:03 -04:00

Completed #148. Technical debt reduced just a little bit.

This commit is contained in:
Jon Ziebell 2019-08-11 15:12:35 -04:00
parent 09f6b1c728
commit c014f6c152
13 changed files with 352 additions and 379 deletions

View File

@ -27,6 +27,7 @@
"indent": ["error", 2],
"init-declarations": "off",
"linebreak-style": "off",
"lines-around-comment": "off",
"max-len": ["error", {"ignoreUrls": true, "ignoreStrings": true}],
"max-lines": "off",
"max-depth": "off",

View File

@ -1,4 +1,4 @@
beestat.api2 = function() {
beestat.api = function() {
this.api_calls_ = [];
};
@ -7,18 +7,14 @@ beestat.api2 = function() {
*
* @type {Object}
*/
beestat.api2.cache = {};
// if (window.localStorage.getItem('api_cache') !== null) {
// beestat.api2.cache = JSON.parse(window.localStorage.getItem('api_cache'));
// }
beestat.api.cache = {};
/**
* Beestat's local API key.
*
* @type {string}
*/
beestat.api2.api_key = 'ER9Dz8t05qUdui0cvfWi5GiVVyHP6OB8KPuSisP2';
beestat.api.api_key = 'ER9Dz8t05qUdui0cvfWi5GiVVyHP6OB8KPuSisP2';
/**
* Send an API call. If the api_call parameter is specified it will send that.
@ -27,9 +23,9 @@ beestat.api2.api_key = 'ER9Dz8t05qUdui0cvfWi5GiVVyHP6OB8KPuSisP2';
*
* @param {Object=} opt_api_call The API call object.
*
* @return {beestat.api2} This.
* @return {beestat.api} This.
*/
beestat.api2.prototype.send = function(opt_api_call) {
beestat.api.prototype.send = function(opt_api_call) {
var self = this;
this.xhr_ = new XMLHttpRequest();
@ -37,7 +33,7 @@ beestat.api2.prototype.send = function(opt_api_call) {
// If passing an actual API call, fire it off!
if (opt_api_call !== undefined) {
// Add in the API key
opt_api_call.api_key = beestat.api2.api_key;
opt_api_call.api_key = beestat.api.api_key;
// Build the query string
var query_string = Object.keys(opt_api_call)
@ -66,9 +62,17 @@ beestat.api2.prototype.send = function(opt_api_call) {
});
if (uncached_batch_api_calls.length === 0) {
// If no API calls left, just fire off the callback with the data.
/**
* If no API calls left, just fire off the callback with the data.
* Timeout makes this behave like an actual API call in terms of
* program flow. Without this, if there is a rerender() inside a
* callback, the rerender can happen during a render which causes
* problems.
*/
if (this.callback_ !== undefined) {
this.callback_(this.cached_batch_api_calls_);
setTimeout(function() {
self.callback_(self.cached_batch_api_calls_);
}, 0);
}
} else {
// If more than one API call left, fire off a batch API call.
@ -80,7 +84,16 @@ beestat.api2.prototype.send = function(opt_api_call) {
var cached = this.get_cached_(single_api_call);
if (cached !== undefined) {
if (this.callback_ !== undefined) {
this.callback_(cached.data);
/**
* Timeout makes this behave like an actual API call in terms of
* program flow. Without this, if there is a rerender() inside a
* callback, the rerender can happen during a render which causes
* problems.
*/
setTimeout(function() {
self.callback_(cached.data);
}, 0);
}
} else {
this.send(single_api_call);
@ -99,9 +112,9 @@ beestat.api2.prototype.send = function(opt_api_call) {
* @param {Object=} opt_args Optional arguments.
* @param {string=} opt_alias Optional alias (required for batch API calls).
*
* @return {beestat.api2} This.
* @return {beestat.api} This.
*/
beestat.api2.prototype.add_call = function(resource, method, opt_args, opt_alias) {
beestat.api.prototype.add_call = function(resource, method, opt_args, opt_alias) {
var api_call = {
'resource': resource,
'method': method,
@ -121,9 +134,9 @@ beestat.api2.prototype.add_call = function(resource, method, opt_args, opt_alias
*
* @param {Function} callback The callback function.
*
* @return {beestat.api2} This.
* @return {beestat.api} This.
*/
beestat.api2.prototype.set_callback = function(callback) {
beestat.api.prototype.set_callback = function(callback) {
this.callback_ = callback;
return this;
@ -134,7 +147,7 @@ beestat.api2.prototype.set_callback = function(callback) {
*
* @param {string} response_text Whatever the XHR request returned.
*/
beestat.api2.prototype.load_ = function(response_text) {
beestat.api.prototype.load_ = function(response_text) {
var response;
try {
response = window.JSON.parse(response_text);
@ -209,7 +222,7 @@ beestat.api2.prototype.load_ = function(response_text) {
*
* @return {boolean} Whether or not this is a batch API call.
*/
beestat.api2.prototype.is_batch_ = function() {
beestat.api.prototype.is_batch_ = function() {
return this.api_calls_.length > 1;
};
@ -220,24 +233,14 @@ beestat.api2.prototype.is_batch_ = function() {
* @param {*} data The data to cache.
* @param {string} until Timestamp to cache until.
*/
beestat.api2.prototype.cache_ = function(api_call, data, until) {
beestat.api.prototype.cache_ = function(api_call, data, until) {
var server_date = moment(this.xhr_.getResponseHeader('date'));
var duration = moment.duration(moment(until).diff(server_date));
beestat.api2.cache[this.get_key_(api_call)] = {
beestat.api.cache[this.get_key_(api_call)] = {
'data': data,
'until': moment().add(duration.asSeconds(), 'seconds')
};
/**
* Save the cache to localStorage to persist across reloads. It just happens
* to be annoying that localStorage only supports strings so I prefer to
* deal with myself.
*/
// window.localStorage.setItem(
// 'api_cache',
// window.JSON.stringify(beestat.api2.cache)
// );
};
/**
@ -247,8 +250,8 @@ beestat.api2.prototype.cache_ = function(api_call, data, until) {
*
* @return {*} The cached data, or undefined if none.
*/
beestat.api2.prototype.get_cached_ = function(api_call) {
var cached = beestat.api2.cache[this.get_key_(api_call)];
beestat.api.prototype.get_cached_ = function(api_call) {
var cached = beestat.api.cache[this.get_key_(api_call)];
if (
cached !== undefined &&
moment().isAfter(cached.until) === false
@ -266,67 +269,6 @@ beestat.api2.prototype.get_cached_ = function(api_call) {
*
* @return {string} The cache key.
*/
beestat.api2.prototype.get_key_ = function(api_call) {
beestat.api.prototype.get_key_ = function(api_call) {
return api_call.resource + '.' + api_call.method + '.' + api_call.arguments;
};
// TODO OLD DELETE THIS
beestat.api = function(resource, method, args, callback) {
var xhr = new XMLHttpRequest();
var load = function() {
var response;
try {
response = window.JSON.parse(this.responseText);
} catch (e) {
beestat.error('API returned invalid response.', this.responseText);
return;
}
if (
response.data &&
(
response.data.error_code === 1004 || // Session is expired.
response.data.error_code === 10001 || // Could not get first token.
response.data.error_code === 10002 || // Could not refresh ecobee token; no token found.
response.data.error_code === 10003 // Could not refresh ecobee token; ecobee returned no token.
)
) {
window.location.href = '/';
} else if (response.data && response.data.error_code === 1209) {
// Could not get lock; safe to ignore as that means sync is running.
} else if (response.success !== true) {
beestat.error(
'API call failed: ' + response.data.error_message,
JSON.stringify(response, null, 2)
);
} else if (callback !== undefined) {
callback(response.data);
}
};
xhr.addEventListener('load', load);
var api_key = 'ER9Dz8t05qUdui0cvfWi5GiVVyHP6OB8KPuSisP2';
if (resource === 'api' && method === 'batch') {
args.forEach(function(api_call, i) {
if (args[i].arguments !== undefined) {
args[i].arguments = JSON.stringify(args[i].arguments);
}
});
xhr.open(
'POST',
'../api/?batch=' + JSON.stringify(args) +
'&api_key=' + api_key
);
} else {
xhr.open(
'POST',
'../api/?resource=' + resource +
'&method=' + method +
(args === undefined ? '' : '&arguments=' + JSON.stringify(args)) +
'&api_key=' + api_key
);
}
xhr.send();
};

View File

@ -34,66 +34,71 @@ beestat.disable_poll = function() {
* Poll the database for changes and update the cache.
*/
beestat.poll = function() {
beestat.api(
'api',
'batch',
[
{
'resource': 'user',
'method': 'read_id',
'alias': 'user'
},
{
'resource': 'thermostat',
'method': 'read_id',
'alias': 'thermostat',
'arguments': {
'attributes': {
'inactive': 0
}
}
},
{
'resource': 'sensor',
'method': 'read_id',
'alias': 'sensor',
'arguments': {
'attributes': {
'inactive': 0
}
}
},
{
'resource': 'ecobee_thermostat',
'method': 'read_id',
'alias': 'ecobee_thermostat',
'arguments': {
'attributes': {
'inactive': 0
}
}
},
{
'resource': 'ecobee_sensor',
'method': 'read_id',
'alias': 'ecobee_sensor',
'arguments': {
'attributes': {
'inactive': 0
}
}
}
],
function(response) {
beestat.cache.set('user', response.user);
beestat.cache.set('thermostat', response.thermostat);
beestat.cache.set('sensor', response.sensor);
beestat.cache.set('ecobee_thermostat', response.ecobee_thermostat);
beestat.cache.set('ecobee_sensor', response.ecobee_sensor);
beestat.enable_poll();
beestat.dispatcher.dispatchEvent('poll');
}
var api = new beestat.api();
api.add_call(
'user',
'read_id',
{},
'user'
);
api.add_call(
'thermostat',
'read_id',
{
'attributes': {
'inactive': 0
}
},
'thermostat'
);
api.add_call(
'sensor',
'read_id',
{
'attributes': {
'inactive': 0
}
},
'sensor'
);
api.add_call(
'ecobee_thermostat',
'read_id',
{
'attributes': {
'inactive': 0
}
},
'ecobee_thermostat'
);
api.add_call(
'ecobee_sensor',
'read_id',
{
'attributes': {
'inactive': 0
}
},
'ecobee_sensor'
);
api.set_callback(function(response) {
beestat.cache.set('user', response.user);
beestat.cache.set('thermostat', response.thermostat);
beestat.cache.set('sensor', response.sensor);
beestat.cache.set('ecobee_thermostat', response.ecobee_thermostat);
beestat.cache.set('ecobee_sensor', response.ecobee_sensor);
beestat.enable_poll();
beestat.dispatcher.dispatchEvent('poll');
});
api.send();
};
beestat.default_poll_interval = 300000; // 5 minutes

View File

@ -56,27 +56,25 @@ beestat.setting = function(key, opt_value, opt_callback) {
settings[key] = opt_value;
}
var api_calls = [];
var api = new beestat.api();
api.set_callback(opt_callback);
for (var k in settings) {
if (user.json_settings[k] !== settings[k]) {
user.json_settings[k] = settings[k];
beestat.dispatcher.dispatchEvent('setting.' + k);
api_calls.push({
'resource': 'user',
'method': 'update_setting',
'arguments': {
api.add_call(
'user',
'update_setting',
{
'key': k,
'value': settings[k]
}
});
);
}
}
if (api_calls.length > 0) {
beestat.api('api', 'batch', api_calls, opt_callback);
} else if (opt_callback !== undefined) {
opt_callback();
}
api.send();
};

View File

@ -64,7 +64,7 @@ beestat.generate_temperature_profile = function(callback) {
}
} else {
beestat.cache.delete('data.comparison_temperature_profile');
new beestat.api2()
new beestat.api()
.add_call(
'thermostat_group',
'generate_temperature_profile',
@ -106,7 +106,7 @@ beestat.get_comparison_scores = function(callback) {
'resist'
];
var api = new beestat.api2();
var api = new beestat.api();
types.forEach(function(type) {
beestat.cache.delete('data.comparison_scores_' + type);
api.add_call(

View File

@ -251,14 +251,16 @@ beestat.component.alert.prototype.decorate_detail_ = function(parent) {
.set_background_hover_color(beestat.style.color.red.light)
.render(dismiss_container)
.addEventListener('click', function() {
beestat.api(
'thermostat',
'dismiss_alert',
{
'thermostat_id': beestat.setting('thermostat_id'),
'guid': self.alert_.guid
}
);
new beestat.api()
.add_call(
'thermostat',
'dismiss_alert',
{
'thermostat_id': beestat.setting('thermostat_id'),
'guid': self.alert_.guid
}
)
.send();
beestat.cache.thermostat[beestat.setting('thermostat_id')].json_alerts.forEach(function(alert) {
if (alert.guid === self.alert_.guid) {
@ -286,14 +288,16 @@ beestat.component.alert.prototype.decorate_detail_ = function(parent) {
.set_background_hover_color(beestat.style.color.red.light)
.render(restore_container)
.addEventListener('click', function() {
beestat.api(
'thermostat',
'restore_alert',
{
'thermostat_id': beestat.setting('thermostat_id'),
'guid': self.alert_.guid
}
);
new beestat.api()
.add_call(
'thermostat',
'restore_alert',
{
'thermostat_id': beestat.setting('thermostat_id'),
'guid': self.alert_.guid
}
)
.send();
beestat.cache.thermostat[beestat.setting('thermostat_id')].json_alerts.forEach(function(alert) {
if (alert.guid === self.alert_.guid) {

View File

@ -6,6 +6,9 @@ beestat.component.card.aggregate_runtime = function() {
var self = this;
/*
* When a setting is changed clear all of the data. Then rerender which will
* trigger the loading state.
*
* Debounce so that multiple setting changes don't re-trigger the same
* event. This fires on the trailing edge so that all changes are accounted
* for when rerendering.
@ -712,10 +715,10 @@ beestat.component.card.aggregate_runtime.prototype.get_subtitle_ = function() {
};
/**
* Determine whether or not enough data is currently available to render this
* card.
* Is aggregate runtime data available?
*
* @return {boolean}
* @return {boolean} Whether or not enough data is currently available to
* render this card.
*/
beestat.component.card.aggregate_runtime.prototype.data_available_ = function() {
// Demo can juse grab whatever data is there.
@ -738,7 +741,10 @@ beestat.component.card.aggregate_runtime.prototype.data_available_ = function()
beestat.setting('aggregate_runtime_time_period')
));
}
required_sync_begin = moment.max(required_sync_begin, moment(thermostat.first_connected));
required_sync_begin = moment.max(
required_sync_begin,
moment(thermostat.first_connected)
);
var required_sync_end = moment().subtract(1, 'hour');
// Percentage
@ -772,18 +778,20 @@ beestat.component.card.aggregate_runtime.prototype.get_data_ = function() {
var self = this;
var thermostat = beestat.cache.thermostat[beestat.setting('thermostat_id')];
beestat.api(
'ecobee_runtime_thermostat',
'get_aggregate_runtime',
{
'ecobee_thermostat_id': thermostat.ecobee_thermostat_id,
'time_period': beestat.setting('aggregate_runtime_time_period'),
'group_by': beestat.setting('aggregate_runtime_group_by'),
'time_count': beestat.setting('aggregate_runtime_time_count')
},
function(response) {
new beestat.api()
.add_call(
'ecobee_runtime_thermostat',
'get_aggregate_runtime',
{
'ecobee_thermostat_id': thermostat.ecobee_thermostat_id,
'time_period': beestat.setting('aggregate_runtime_time_period'),
'group_by': beestat.setting('aggregate_runtime_group_by'),
'time_count': beestat.setting('aggregate_runtime_time_count')
}
)
.set_callback(function(response) {
beestat.cache.set('aggregate_runtime', response);
self.rerender();
}
);
})
.send();
};

View File

@ -72,7 +72,7 @@ beestat.component.card.comparison_settings.prototype.decorate_contents_ = functi
beestat.remove_poll_interval(poll_interval);
beestat.dispatcher.removeEventListener('poll.home_comparisons_load');
new beestat.api2()
new beestat.api()
.add_call(
'thermostat_group',
'generate_temperature_profiles',

View File

@ -1385,7 +1385,7 @@ beestat.component.card.recent_activity.prototype.get_data_ = function() {
var self = this;
var thermostat = beestat.cache.thermostat[beestat.setting('thermostat_id')];
new beestat.api2()
new beestat.api()
.add_call(
'ecobee_runtime_thermostat',
'get_recent_activity',

View File

@ -150,13 +150,15 @@ beestat.component.header.prototype.decorate_ = function(parent) {
.set_text('Log Out')
.set_icon('exit_to_app')
.set_callback(function() {
beestat.api(
'user',
'log_out',
{'all': false},
function() {
new beestat.api()
.set_callback(function() {
window.location.reload();
}
);
})
.add_call(
'user',
'log_out',
{'all': false}
)
.send();
}));
};

View File

@ -129,7 +129,7 @@ beestat.component.modal.change_system_type.prototype.get_buttons_ = function() {
.set_background_hover_color()
.removeEventListener('click');
new beestat.api2()
new beestat.api()
.add_call(
'thermostat_group',
'update_system_types',

View File

@ -19,7 +19,7 @@ if($setting->get('environment') === 'dev' || $setting->get('environment') === 'd
echo '<script src="/js/beestat/debounce.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/dispatcher.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/cache.js"></script>' . PHP_EOL;
// echo '<script src="/js/beestat/clone.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/clone.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/style.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/api.js"></script>' . PHP_EOL;
echo '<script src="/js/beestat/error.js"></script>' . PHP_EOL;

View File

@ -32,195 +32,208 @@ beestat.layer.load.prototype.decorate_ = function(parent) {
(new beestat.component.loading()).render(loading_text);
var batch = [
{
'resource': 'thermostat',
'method': 'sync',
'alias': 'thermostat_sync'
},
{
'resource': 'sensor',
'method': 'sync',
'alias': 'sensor_sync'
},
{
'resource': 'user',
'method': 'read_id',
'alias': 'user'
},
{
'resource': 'thermostat',
'method': 'read_id',
'alias': 'thermostat',
'arguments': {
'attributes': {
'inactive': 0
}
}
},
{
'resource': 'thermostat_group',
'method': 'read_id',
'alias': 'thermostat_group'
},
{
'resource': 'sensor',
'method': 'read_id',
'alias': 'sensor',
'arguments': {
'attributes': {
'inactive': 0
}
}
},
{
'resource': 'ecobee_thermostat',
'method': 'read_id',
'alias': 'ecobee_thermostat',
'arguments': {
'attributes': {
'inactive': 0
}
}
},
{
'resource': 'ecobee_sensor',
'method': 'read_id',
'alias': 'ecobee_sensor',
'arguments': {
'attributes': {
'inactive': 0
}
}
},
{
'resource': 'address',
'method': 'read_id',
'alias': 'address'
},
{
'resource': 'announcement',
'method': 'read_id',
'alias': 'announcement'
}
];
var api = new beestat.api();
// First up, sync all thermostats and sensors.
beestat.api(
'api',
'batch',
batch,
function(response) {
beestat.cache.set('user', response.user);
api.add_call(
'thermostat',
'sync',
{},
'thermostat_sync'
);
// Rollbar isn't defined on dev.
if (window.Rollbar !== undefined) {
Rollbar.configure({
'payload': {
'person': {
'id': beestat.get_user().user_id
},
'beestat': {
'user_id': beestat.get_user().user_id
}
api.add_call(
'sensor',
'sync',
{},
'sensor_sync'
);
api.add_call(
'user',
'read_id',
{},
'user'
);
api.add_call(
'thermostat',
'read_id',
{
'attributes': {
'inactive': 0
}
},
'thermostat'
);
api.add_call(
'thermostat_group',
'read_id',
{},
'thermostat_group'
);
api.add_call(
'sensor',
'read_id',
{
'attributes': {
'inactive': 0
}
},
'sensor'
);
api.add_call(
'ecobee_thermostat',
'read_id',
{
'attributes': {
'inactive': 0
}
},
'ecobee_thermostat'
);
api.add_call(
'ecobee_sensor',
'read_id',
{
'attributes': {
'inactive': 0
}
},
'ecobee_sensor'
);
api.add_call(
'address',
'read_id',
{},
'address'
);
api.add_call(
'announcement',
'read_id',
{},
'announcement'
);
api.set_callback(function(response) {
beestat.cache.set('user', response.user);
// Rollbar isn't defined on dev.
if (window.Rollbar !== undefined) {
Rollbar.configure({
'payload': {
'person': {
'id': beestat.get_user().user_id
},
'beestat': {
'user_id': beestat.get_user().user_id
}
});
}
}
});
}
beestat.cache.set('thermostat', response.thermostat);
beestat.cache.set('thermostat_group', response.thermostat_group);
beestat.cache.set('sensor', response.sensor);
beestat.cache.set('thermostat', response.thermostat);
beestat.cache.set('thermostat_group', response.thermostat_group);
beestat.cache.set('sensor', response.sensor);
beestat.cache.set('ecobee_thermostat', response.ecobee_thermostat);
beestat.cache.set('ecobee_sensor', response.ecobee_sensor);
beestat.cache.set('address', response.address);
beestat.cache.set('announcement', response.announcement);
beestat.cache.set('ecobee_runtime_thermostat', []);
beestat.cache.set('aggregate_runtime', []);
beestat.cache.set('ecobee_thermostat', response.ecobee_thermostat);
beestat.cache.set('ecobee_sensor', response.ecobee_sensor);
beestat.cache.set('address', response.address);
beestat.cache.set('announcement', response.announcement);
beestat.cache.set('ecobee_runtime_thermostat', []);
beestat.cache.set('aggregate_runtime', []);
// Set the active thermostat_id if this is your first time visiting.
if (beestat.setting('thermostat_id') === undefined) {
beestat.setting(
'thermostat_id',
$.values(beestat.cache.thermostat)[0].thermostat_id
);
}
// Set the active thermostat_id if this is your first time visiting.
if (beestat.setting('thermostat_id') === undefined) {
beestat.setting(
'thermostat_id',
$.values(beestat.cache.thermostat)[0].thermostat_id
);
}
// Change the active thermostat_id if the one you have is no longer valid.
if (response.thermostat[beestat.setting('thermostat_id')] === undefined) {
beestat.setting('thermostat_id', Object.keys(response.thermostat)[0]);
}
// Change the active thermostat_id if the one you have is no longer valid.
if (response.thermostat[beestat.setting('thermostat_id')] === undefined) {
beestat.setting('thermostat_id', Object.keys(response.thermostat)[0]);
}
var thermostat = beestat.cache.thermostat[
beestat.setting('thermostat_id')
];
var ecobee_thermostat = beestat.cache.ecobee_thermostat[
thermostat.ecobee_thermostat_id
];
var thermostat = beestat.cache.thermostat[
beestat.setting('thermostat_id')
];
var ecobee_thermostat = beestat.cache.ecobee_thermostat[
thermostat.ecobee_thermostat_id
];
// Rename series if only one stage is available.
if (ecobee_thermostat.json_settings.coolStages === 1) {
beestat.series.compressor_cool_1.name = 'Cool';
}
if (ecobee_thermostat.json_settings.heatStages === 1) {
beestat.series.compressor_heat_1.name = 'Heat';
}
// Rename series if only one stage is available.
if (ecobee_thermostat.json_settings.coolStages === 1) {
beestat.series.compressor_cool_1.name = 'Cool';
}
if (ecobee_thermostat.json_settings.heatStages === 1) {
beestat.series.compressor_heat_1.name = 'Heat';
}
// Fix some other stuff for non-heat-pump.
if (ecobee_thermostat.json_settings.hasHeatPump === false) {
beestat.series.auxiliary_heat_1.name =
beestat.series.compressor_heat_1.name;
beestat.series.auxiliary_heat_1.color =
beestat.series.compressor_heat_1.color;
beestat.series.auxiliary_heat_2.name =
beestat.series.compressor_heat_2.name;
beestat.series.auxiliary_heat_2.color =
beestat.series.compressor_heat_2.color;
beestat.series.auxiliary_heat_3.name = 'Heat 3';
beestat.series.auxiliary_heat_3.color = '#d35400';
}
// Fix some other stuff for non-heat-pump.
if (ecobee_thermostat.json_settings.hasHeatPump === false) {
beestat.series.auxiliary_heat_1.name =
beestat.series.compressor_heat_1.name;
beestat.series.auxiliary_heat_1.color =
beestat.series.compressor_heat_1.color;
beestat.series.auxiliary_heat_2.name =
beestat.series.compressor_heat_2.name;
beestat.series.auxiliary_heat_2.color =
beestat.series.compressor_heat_2.color;
beestat.series.auxiliary_heat_3.name = 'Heat 3';
beestat.series.auxiliary_heat_3.color = '#d35400';
}
/*
* Fire off an API call to sync. The cron job will eventually run but this
* ensures things get moving quicker.
*/
beestat.api(
/*
* Fire off an API call to sync. The cron job will eventually run but this
* ensures things get moving quicker.
*/
new beestat.api()
.add_call(
'ecobee_runtime_thermostat',
'sync',
{
'thermostat_id': thermostat.thermostat_id
}
);
)
.send();
// Enable polling for live updates
beestat.enable_poll();
// Enable polling for live updates
beestat.enable_poll();
(new beestat.layer.dashboard()).render();
(new beestat.layer.dashboard()).render();
/*
* If never seen an announcement, or if there is an unread important
* announcement, show the modal.
*/
var last_read_announcement_id = beestat.setting('last_read_announcement_id');
/*
* If never seen an announcement, or if there is an unread important
* announcement, show the modal.
*/
var last_read_announcement_id = beestat.setting('last_read_announcement_id');
var most_recent_important_announcement_id;
var announcements = $.values(beestat.cache.announcement).reverse();
for (var i = 0; i < announcements.length; i++) {
if (announcements[i].important === true) {
most_recent_important_announcement_id = announcements[i].announcement_id;
break;
}
}
if (
last_read_announcement_id === undefined ||
(
most_recent_important_announcement_id !== undefined &&
last_read_announcement_id < most_recent_important_announcement_id
)
) {
(new beestat.component.modal.announcements()).render();
var most_recent_important_announcement_id;
var announcements = $.values(beestat.cache.announcement).reverse();
for (var i = 0; i < announcements.length; i++) {
if (announcements[i].important === true) {
most_recent_important_announcement_id = announcements[i].announcement_id;
break;
}
}
);
if (
last_read_announcement_id === undefined ||
(
most_recent_important_announcement_id !== undefined &&
last_read_announcement_id < most_recent_important_announcement_id
)
) {
(new beestat.component.modal.announcements()).render();
}
});
api.send();
};