1
0
mirror of https://github.com/beestat/app.git synced 2025-05-31 12:16:39 -04:00
beestat/js/beestat/runtime_sensor.js

250 lines
8.9 KiB
JavaScript

beestat.runtime_sensor = {};
/**
* Get a bunch of data for the current runtime_sensor rows. Includes basically
* everything you need to make a cool chart.
*
* @param {number} sensor_ids The sensor_ids to get data for.
* @param {object} range Range settings.
* @param {string} key The key to pull the data from inside
* beestat.cache.data. This exists because runtime_sensor data exists in
* multiple spots.
*
* @return {object} The data.
*/
beestat.runtime_sensor.get_data = function(sensor_ids, range, key) {
var data = {
'x': [],
'series': {},
'metadata': {
'series': {},
'chart': {
'sensors': null
}
}
};
var colors = [
beestat.style.color.blue.base,
beestat.style.color.red.base,
beestat.style.color.yellow.base,
beestat.style.color.green.base,
beestat.style.color.orange.base,
beestat.style.color.bluegreen.base,
beestat.style.color.purple.base,
beestat.style.color.lightblue.base,
beestat.style.color.blue.light,
beestat.style.color.red.light,
beestat.style.color.yellow.light,
beestat.style.color.green.light,
beestat.style.color.orange.light,
beestat.style.color.bluegreen.light,
beestat.style.color.purple.light,
beestat.style.color.lightblue.light,
beestat.style.color.blue.dark,
beestat.style.color.red.dark,
beestat.style.color.yellow.dark,
beestat.style.color.green.dark,
beestat.style.color.orange.dark,
beestat.style.color.bluegreen.dark,
beestat.style.color.purple.dark,
beestat.style.color.lightblue.dark
];
var series_codes = [];
// Get and sort all the sensors.
data.metadata.sensors = [];
// Set up the series_codes.
const sensor_series_colors = {};
sensor_ids.forEach(function(sensor_id, i) {
const sensor = beestat.cache.sensor[sensor_id];
series_codes.push('temperature_' + sensor.sensor_id);
series_codes.push('occupancy_' + sensor.sensor_id);
sensor_series_colors[sensor.sensor_id] = colors[i];
if (sensor.type === 'thermostat') {
series_codes.push('air_quality_' + sensor.sensor_id);
series_codes.push('voc_concentration_' + sensor.sensor_id);
series_codes.push('co2_concentration_' + sensor.sensor_id);
}
data.metadata.sensors.push(sensor);
});
// Sort by name with the thermostat at the top
data.metadata.sensors.sort(function(a, b) {
if (a.type === 'thermostat') {
return -1;
} else if (b.type === 'thermostat') {
return 1;
}
return a.name.localeCompare(b.name, 'en', {'sensitivity': 'base'});
});
series_codes.push('dummy');
// Initialize a bunch of stuff.
var sequential = {};
series_codes.forEach(function(series_code) {
sequential[series_code] = 0;
data.series[series_code] = [];
data.metadata.series[series_code] = {
'active': false,
'data': {}
};
if (series_code === 'dummy') {
data.metadata.series[series_code].name = null;
} else if (series_code.includes('air_quality_') === true) {
data.metadata.series[series_code].name = 'AQ';
} else if (series_code.includes('voc_concentration_') === true) {
data.metadata.series[series_code].name = 'TVOC';
} else if (series_code.includes('co2_concentration_') === true) {
data.metadata.series[series_code].name = 'CO2';
} else {
var sensor_id = series_code.replace(/[^0-9]/g, '');
data.metadata.series[series_code].name = beestat.cache.sensor[sensor_id].name;
data.metadata.series[series_code].color = sensor_series_colors[sensor_id];
}
});
var begin_m;
var end_m;
if (range.type === 'dynamic') {
begin_m = moment().subtract(
range.dynamic,
'day'
);
end_m = moment();
} else {
begin_m = moment(
range.static_begin + ' 00:00:00'
);
end_m = moment(
range.static_end + ' 23:59:59'
);
}
begin_m
.minute(Math.ceil(begin_m.minute() / 5) * 5)
.second(0)
.millisecond(0);
var runtime_sensors = beestat.runtime_sensor.get_runtime_sensors_by_date_(key);
// Loop.
var current_m = begin_m;
while (current_m.isSameOrAfter(end_m) === false) {
data.x.push(current_m.clone());
// Without this series the chart will jump to the nearest value if there is a chunk of missing data.
data.series.dummy.push(beestat.temperature(70));
data.metadata.series.dummy.active = true;
if (runtime_sensors[current_m.valueOf()] !== undefined) {
data.metadata.sensors.forEach(function(sensor, j) {
var runtime_sensor = runtime_sensors[current_m.valueOf()][sensor.sensor_id];
if (runtime_sensor === undefined) {
data.series['temperature_' + sensor.sensor_id].push(null);
data.series['occupancy_' + sensor.sensor_id].push(null);
if (sensor.type === 'thermostat') {
data.series['air_quality_' + sensor.sensor_id].push(null);
data.series['voc_concentration_' + sensor.sensor_id].push(null);
data.series['co2_concentration_' + sensor.sensor_id].push(null);
}
return;
}
var temperature = beestat.temperature(runtime_sensor.temperature);
data.series['temperature_' + runtime_sensor.sensor_id].push(temperature);
data.metadata.series['temperature_' + runtime_sensor.sensor_id].active = true;
data.metadata.series['temperature_' + runtime_sensor.sensor_id].data[current_m.valueOf()] = temperature;
if (sensor.type === 'thermostat') {
data.series['air_quality_' + runtime_sensor.sensor_id].push(runtime_sensor.air_quality);
data.metadata.series['air_quality_' + runtime_sensor.sensor_id].active = true;
data.metadata.series['air_quality_' + runtime_sensor.sensor_id].data[current_m.valueOf()] = runtime_sensor.air_quality;
data.series['voc_concentration_' + runtime_sensor.sensor_id].push(runtime_sensor.voc_concentration);
data.metadata.series['voc_concentration_' + runtime_sensor.sensor_id].active = true;
data.metadata.series['voc_concentration_' + runtime_sensor.sensor_id].data[current_m.valueOf()] = runtime_sensor.voc_concentration;
data.series['co2_concentration_' + runtime_sensor.sensor_id].push(runtime_sensor.co2_concentration);
data.metadata.series['co2_concentration_' + runtime_sensor.sensor_id].active = true;
data.metadata.series['co2_concentration_' + runtime_sensor.sensor_id].data[current_m.valueOf()] = runtime_sensor.co2_concentration;
}
if (runtime_sensor.occupancy === true) {
let swimlane_properties =
beestat.component.chart.runtime_sensor_detail_occupancy.get_swimlane_properties(
data.metadata.sensors.length,
j
);
sequential['occupancy_' + runtime_sensor.sensor_id]++;
data.series['occupancy_' + runtime_sensor.sensor_id].push(swimlane_properties.y);
data.metadata.series['occupancy_' + runtime_sensor.sensor_id].data[current_m.valueOf()] = swimlane_properties.y;
} else {
if (sequential['occupancy_' + runtime_sensor.sensor_id] > 0) {
let swimlane_properties =
beestat.component.chart.runtime_sensor_detail_occupancy.get_swimlane_properties(
data.metadata.sensors.length,
j
);
data.series['occupancy_' + runtime_sensor.sensor_id].push(swimlane_properties.y);
data.metadata.series['occupancy_' + runtime_sensor.sensor_id].data[current_m.valueOf()] = swimlane_properties.y;
} else {
data.series['occupancy_' + runtime_sensor.sensor_id].push(null);
}
sequential['occupancy_' + runtime_sensor.sensor_id] = 0;
}
});
} else {
data.metadata.sensors.forEach(function(sensor) {
data.series['temperature_' + sensor.sensor_id].push(null);
data.series['occupancy_' + sensor.sensor_id].push(null);
if (sensor.type === 'thermostat') {
data.series['air_quality_' + sensor.sensor_id].push(null);
data.series['voc_concentration_' + sensor.sensor_id].push(null);
data.series['co2_concentration_' + sensor.sensor_id].push(null);
}
});
}
current_m.add(5, 'minute');
}
return data;
};
/**
* Get all the runtime_sensor rows indexed by date.
*
* @param {string} key The key to pull the data from inside
* beestat.cache.data. This exists because runtime_sensor data exists in
* multiple spots.
*
* @return {array} The runtime_sensor rows.
*/
beestat.runtime_sensor.get_runtime_sensors_by_date_ = function(key) {
var runtime_sensors = {};
if (beestat.cache.data[key] !== undefined) {
beestat.cache.data[key].forEach(function(runtime_sensor) {
var timestamp = [moment(runtime_sensor.timestamp).valueOf()];
if (runtime_sensors[timestamp] === undefined) {
runtime_sensors[timestamp] = {};
}
runtime_sensors[timestamp][runtime_sensor.sensor_id] = runtime_sensor;
});
}
return runtime_sensors;
};