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:
parent
09f6b1c728
commit
c014f6c152
@ -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",
|
||||
|
@ -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();
|
||||
};
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
};
|
||||
|
@ -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(
|
||||
|
@ -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) {
|
||||
|
@ -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();
|
||||
};
|
||||
|
@ -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',
|
||||
|
@ -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',
|
||||
|
@ -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();
|
||||
}));
|
||||
};
|
||||
|
@ -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',
|
||||
|
@ -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;
|
||||
|
351
js/layer/load.js
351
js/layer/load.js
@ -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();
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user