mirror of
https://github.com/beestat/app.git
synced 2025-05-24 02:14:03 -04:00
192 lines
5.5 KiB
JavaScript
192 lines
5.5 KiB
JavaScript
/**
|
|
* Sensors
|
|
*/
|
|
beestat.component.card.sensors = function() {
|
|
var self = this;
|
|
|
|
var change_function = beestat.debounce(function() {
|
|
self.rerender();
|
|
}, 10);
|
|
|
|
beestat.dispatcher.addEventListener(
|
|
[
|
|
'cache.thermostat',
|
|
'cache.ecobee_thermostat'
|
|
],
|
|
change_function
|
|
);
|
|
|
|
beestat.component.card.apply(this, arguments);
|
|
};
|
|
beestat.extend(beestat.component.card.sensors, beestat.component.card);
|
|
|
|
beestat.component.card.sensors.prototype.decorate_contents_ = function(parent) {
|
|
var self = this;
|
|
|
|
var sensors = [];
|
|
var internal_sensor;
|
|
beestat.sensor.get_sorted().forEach(function(sensor) {
|
|
if (sensor.thermostat_id === beestat.setting('thermostat_id')) {
|
|
if (sensor.type === 'thermostat') {
|
|
internal_sensor = sensor;
|
|
} else {
|
|
sensors.push(sensor);
|
|
}
|
|
}
|
|
});
|
|
|
|
/*
|
|
* Decorate the thermostat's internal sensor, if it has one. The Cor
|
|
* thermostats, for example, do not.
|
|
*/
|
|
if (internal_sensor !== undefined) {
|
|
var internal_sensor_container = $.createElement('div');
|
|
parent.appendChild(internal_sensor_container);
|
|
this.decorate_sensor_(internal_sensor_container, internal_sensor.sensor_id);
|
|
}
|
|
|
|
// Decorate the rest of the sensors
|
|
if (sensors.length > 0) {
|
|
var sensor_container = $.createElement('div')
|
|
.style({
|
|
'display': 'grid',
|
|
'grid-template-columns': 'repeat(auto-fit, minmax(160px, 1fr))',
|
|
'margin': '0 0 ' + beestat.style.size.gutter + 'px -' + beestat.style.size.gutter + 'px',
|
|
'border-radius': beestat.style.size.border_radius
|
|
});
|
|
parent.appendChild(sensor_container);
|
|
|
|
sensors.forEach(function(sensor) {
|
|
var div = $.createElement('div')
|
|
.style({
|
|
'padding': beestat.style.size.gutter + 'px 0 0 ' + beestat.style.size.gutter + 'px'
|
|
});
|
|
sensor_container.appendChild(div);
|
|
|
|
self.decorate_sensor_(div, sensor.sensor_id);
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Decorate an individual sensor.
|
|
*
|
|
* @param {rocket.Elements} parent
|
|
* @param {number} sensor_id
|
|
*/
|
|
beestat.component.card.sensors.prototype.decorate_sensor_ = function(parent, sensor_id) {
|
|
var sensor = beestat.cache.sensor[sensor_id];
|
|
var thermostat = beestat.cache.thermostat[beestat.setting('thermostat_id')];
|
|
|
|
var container = $.createElement('div')
|
|
.style({
|
|
'background': beestat.style.color.bluegray.dark,
|
|
'padding': (beestat.style.size.gutter / 2)
|
|
});
|
|
parent.appendChild(container);
|
|
|
|
var display_name = sensor.name;
|
|
if (sensor.type === 'thermostat') {
|
|
display_name += ' (Thermostat)';
|
|
}
|
|
|
|
var name = $.createElement('div')
|
|
.style({
|
|
'font-weight': beestat.style.font_weight.bold,
|
|
'margin-bottom': (beestat.style.size.gutter / 4),
|
|
'white-space': 'nowrap',
|
|
'overflow': 'hidden',
|
|
'text-overflow': 'ellipsis'
|
|
})
|
|
.innerHTML(display_name);
|
|
container.appendChild(name);
|
|
|
|
// Construct the table
|
|
var table = $.createElement('table').style('width', '100%');
|
|
var tr = $.createElement('tr');
|
|
var td_temperature = $.createElement('td')
|
|
.style({
|
|
'font-size': '18px',
|
|
'width': '40px'
|
|
})
|
|
.innerHTML((sensor.temperature === null) ? '???' : beestat.temperature({
|
|
'temperature': sensor.temperature,
|
|
'type': 'string'
|
|
}));
|
|
var td_above_below = $.createElement('td')
|
|
.style({
|
|
'width': '24px'
|
|
});
|
|
var td_icons = $.createElement('td')
|
|
.style({
|
|
'text-align': 'right'
|
|
});
|
|
|
|
if (sensor.temperature < thermostat.temperature && sensor.temperature !== null) {
|
|
(new beestat.component.icon('menu_down'))
|
|
.set_color(beestat.style.color.blue.base)
|
|
.render(td_above_below);
|
|
} else if (sensor.temperature > thermostat.temperature && sensor.temperature !== null) {
|
|
(new beestat.component.icon('menu_up'))
|
|
.set_color(beestat.style.color.red.base)
|
|
.render(td_above_below);
|
|
}
|
|
|
|
if (
|
|
sensor.type !== 'monitor_sensor' &&
|
|
sensor.type !== 'control_sensor'
|
|
) {
|
|
// Occupancy is not supported for these legacy sensor types.
|
|
if (sensor.occupancy === true) {
|
|
(new beestat.component.icon('eye', 'Occupied')).render(td_icons);
|
|
} else {
|
|
(new beestat.component.icon('eye_off', 'Unoccupied'))
|
|
.set_color(beestat.style.color.bluegray.light)
|
|
.render(td_icons);
|
|
}
|
|
}
|
|
|
|
td_icons.appendChild($.createElement('span').style({
|
|
'display': 'inline-block',
|
|
'width': (beestat.style.size.gutter / 4)
|
|
}));
|
|
|
|
if (sensor.in_use === true) {
|
|
(new beestat.component.icon('check', 'In use')).render(td_icons);
|
|
} else {
|
|
(new beestat.component.icon('check', 'Not in use'))
|
|
.set_color(beestat.style.color.bluegray.light)
|
|
.render(td_icons);
|
|
}
|
|
|
|
table.appendChild(tr);
|
|
tr.appendChild(td_temperature);
|
|
tr.appendChild(td_above_below);
|
|
tr.appendChild(td_icons);
|
|
container.appendChild(table);
|
|
};
|
|
|
|
/**
|
|
* Get the title of the card.
|
|
*
|
|
* @return {string} The title.
|
|
*/
|
|
beestat.component.card.sensors.prototype.get_title_ = function() {
|
|
return 'Sensors';
|
|
};
|
|
|
|
/**
|
|
* Decorate the menu.
|
|
*
|
|
* @param {rocket.Elements} parent
|
|
*/
|
|
beestat.component.card.sensors.prototype.decorate_top_right_ = function(parent) {
|
|
var menu = (new beestat.component.menu()).render(parent);
|
|
menu.add_menu_item(new beestat.component.menu_item()
|
|
.set_text('Help')
|
|
.set_icon('help_circle')
|
|
.set_callback(function() {
|
|
window.open('https://doc.beestat.io/d279d6fb4afc4f199409be2eb323140b');
|
|
}));
|
|
};
|