1
0
mirror of https://github.com/beestat/app.git synced 2025-05-24 02:14:03 -04:00
beestat/js/layer/load.js
2025-05-18 06:11:47 -04:00

337 lines
9.3 KiB
JavaScript

/**
* Load layer.
*/
beestat.layer.load = function() {
beestat.layer.apply(this, arguments);
};
beestat.extend(beestat.layer.load, beestat.layer);
beestat.layer.load.prototype.decorate_ = function(parent) {
$('body').style({
'overflow-y': 'scroll',
'background': beestat.style.color.bluegray.light,
'padding': '0 ' + beestat.style.size.gutter + 'px'
});
var logo_container = $.createElement('div');
logo_container.style({
'margin': '100px auto 32px auto',
'text-align': 'center'
});
parent.appendChild(logo_container);
(new beestat.component.logo()).render(logo_container);
var loading_text = $.createElement('div');
loading_text.style({
'font-weight': '500',
'margin': '0 auto 16px auto',
'text-align': 'center'
});
parent.appendChild(loading_text);
(new beestat.component.loading()).render(loading_text);
var api = new beestat.api();
api.add_call(
'thermostat',
'sync',
{},
'thermostat_sync'
);
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(
'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(
'floor_plan',
'read_id',
{},
'floor_plan'
);
api.add_call(
'announcement',
'read_id',
{},
'announcement'
);
api.add_call(
'runtime_thermostat_summary',
'read_id',
{},
'runtime_thermostat_summary'
);
api.add_call(
'stripe_event',
'read_id',
{},
'stripe_event'
);
api.set_callback(function(response) {
beestat.cache.set('user', response.user);
Sentry.configureScope(function(scope) {
scope.setUser({
'id': beestat.user.get().user_id
});
});
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.cache.set('address', response.address);
beestat.cache.set('floor_plan', response.floor_plan);
beestat.cache.set('announcement', response.announcement);
beestat.cache.set('runtime_thermostat_summary', response.runtime_thermostat_summary);
beestat.cache.set('stripe_event', response.stripe_event);
// Send you to the no thermostats layer if none were returned.
if(Object.keys(response.thermostat).length === 0) {
(new beestat.layer.no_thermostats()).render();
return;
}
// 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
);
}
// Increment the number of opens if under the threshold.
const setting_key = 'meta.opens.' + beestat.platform();
if (beestat.setting(setting_key) === undefined) {
beestat.setting(setting_key, 1);
} else {
beestat.setting(setting_key, beestat.setting(setting_key) + 1);
}
// 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')
];
// Set the document title to include the thermostat name
if (thermostat.name !== null && thermostat.name.trim() !== '') {
document.title = 'beestat • ' + thermostat.name;
} else {
document.title = 'beestat';
}
// Set the temperature unit if it hasn't been set before.
if (beestat.setting('units.temperature') === undefined) {
beestat.setting('units.temperature', thermostat.temperature_unit);
}
// Set the distance/area units if they hasn't been set before.
const imperial_countries = [
'USA',
'CAN'
];
if (
beestat.setting('units.distance') === undefined ||
beestat.setting('units.area') === undefined
) {
if (
thermostat.address_id !== null &&
beestat.address.is_valid(thermostat.address_id) === true
) {
const address = beestat.cache.address[thermostat.address_id];
beestat.setting({
'units.distance': imperial_countries.includes(address.normalized.components.country_iso_3) === true ? 'ft' : 'm',
'units.area': imperial_countries.includes(address.normalized.components.country_iso_3) === true ? 'ft²' : 'm²'
});
} else {
// Assume ft/ft² if invalid address.
beestat.setting({
'units.distance': 'ft',
'units.area': 'ft²'
});
}
}
// Currency (USD is default)
const currency_map = {
'CAN': 'cad',
'AUS': 'aud',
'GBR': 'gbp'
};
if (
beestat.setting('units.currency') === undefined &&
thermostat.address_id !== null &&
beestat.address.is_valid(thermostat.address_id) === true
) {
const address = beestat.cache.address[thermostat.address_id];
if (currency_map[address.normalized.components.country_iso_3] !== undefined) {
beestat.setting(
'units.currency',
currency_map[address.normalized.components.country_iso_3]
);
}
}
// Rename series if there are multiple stages.
if (beestat.thermostat.get_stages(thermostat.thermostat_id, 'heat') > 1) {
beestat.series.compressor_heat_1.name = 'Heat 1';
beestat.series.sum_compressor_heat_1.name = 'Heat 1';
beestat.series.indoor_heat_1_delta.name = 'Heat 1 Δ';
}
if (beestat.thermostat.get_stages(thermostat.thermostat_id, 'auxiliary_heat') > 1) {
beestat.series.auxiliary_heat_1.name = 'Aux Heat 1';
beestat.series.sum_auxiliary_heat_1.name = 'Aux Heat 1';
beestat.series.indoor_auxiliary_heat_1_delta.name = 'Aux Heat 1 Δ';
}
if (beestat.thermostat.get_stages(thermostat.thermostat_id, 'cool') > 1) {
beestat.series.compressor_cool_1.name = 'Cool 1';
beestat.series.sum_compressor_cool_1.name = 'Cool 1';
beestat.series.indoor_cool_1_delta.name = 'Cool 1 Δ';
}
// Fix some other stuff for non-heat-pump.
const sytem_type_heat = beestat.thermostat.get_system_type(thermostat.thermostat_id, 'heat');
if (
sytem_type_heat !== 'compressor' &&
sytem_type_heat !== 'geothermal'
) {
beestat.series.auxiliary_heat_1.name = beestat.series.sum_compressor_heat_1.name;
beestat.series.auxiliary_heat_1.color = beestat.series.sum_compressor_heat_1.color;
beestat.series.sum_auxiliary_heat_2.name = beestat.series.compressor_heat_2.name;
beestat.series.sum_auxiliary_heat_2.color = beestat.series.compressor_heat_2.color;
}
/*
* 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(
'runtime',
'sync',
{
'thermostat_id': thermostat.thermostat_id
}
)
.send();
// Enable polling for live updates
beestat.enable_poll();
beestat.enable_poll_watcher();
(new beestat.layer.detail()).render();
beestat.ecobee.notify_if_down();
/*
* 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;
}
}
/*
* Show the first run modal or the announcements modal if there are unread
* important announcements.
*/
if (beestat.setting('first_run') === true) {
beestat.setting('first_run', false);
(new beestat.component.modal.newsletter()).render();
} else if (
$.keys(beestat.cache.announcement).length > 0 &&
(
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();
};