|
|
|
@ -1,6 +1,7 @@
|
|
|
|
const POLLING_INTERVAL_MS = 1000;
|
|
|
|
const POLLING_INTERVAL_MS = 1000;
|
|
|
|
const WARNING_MARGIN_RATIO = 0.1;
|
|
|
|
const WARNING_MARGIN_RATIO = 0.1;
|
|
|
|
const MIN_READING_MAX_AGE_MS = 15000;
|
|
|
|
const MIN_READING_MAX_AGE_MS = 15000;
|
|
|
|
|
|
|
|
const DAY_IN_MS = 24 * 60 * 60 * 1000;
|
|
|
|
|
|
|
|
|
|
|
|
// Variables dinámicas para el control de históricos
|
|
|
|
// Variables dinámicas para el control de históricos
|
|
|
|
let currentHistoryInterval = 10000;
|
|
|
|
let currentHistoryInterval = 10000;
|
|
|
|
@ -718,6 +719,7 @@ function parseHistoricalCsv(csvText, valueKey) {
|
|
|
|
return rows
|
|
|
|
return rows
|
|
|
|
.map((line) => splitCsvLine(line))
|
|
|
|
.map((line) => splitCsvLine(line))
|
|
|
|
.map((columns) => {
|
|
|
|
.map((columns) => {
|
|
|
|
|
|
|
|
const rawTimestamp = columns[timestampIndex];
|
|
|
|
const rawValue = Number(columns[valueIndex]);
|
|
|
|
const rawValue = Number(columns[valueIndex]);
|
|
|
|
|
|
|
|
|
|
|
|
if (!Number.isFinite(rawValue)) {
|
|
|
|
if (!Number.isFinite(rawValue)) {
|
|
|
|
@ -725,13 +727,49 @@ function parseHistoricalCsv(csvText, valueKey) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
return {
|
|
|
|
label: formatTimestamp(columns[timestampIndex]),
|
|
|
|
timestampMs: parseTimestampMs(rawTimestamp),
|
|
|
|
|
|
|
|
label: formatTimestamp(rawTimestamp),
|
|
|
|
value: rawValue
|
|
|
|
value: rawValue
|
|
|
|
};
|
|
|
|
};
|
|
|
|
})
|
|
|
|
})
|
|
|
|
.filter(Boolean);
|
|
|
|
.filter(Boolean);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function parseTimestampMs(rawTimestamp) {
|
|
|
|
|
|
|
|
const numericTimestamp = Number(rawTimestamp);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (Number.isFinite(numericTimestamp)) {
|
|
|
|
|
|
|
|
if (numericTimestamp > 1000000000000) {
|
|
|
|
|
|
|
|
return numericTimestamp;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (numericTimestamp > 1000000000) {
|
|
|
|
|
|
|
|
return numericTimestamp * 1000;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const parsedDate = new Date(rawTimestamp);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!Number.isNaN(parsedDate.getTime())) {
|
|
|
|
|
|
|
|
return parsedDate.getTime();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Number.NaN;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function filterPointsForCurrentDay(points) {
|
|
|
|
|
|
|
|
const startOfToday = new Date();
|
|
|
|
|
|
|
|
startOfToday.setHours(0, 0, 0, 0);
|
|
|
|
|
|
|
|
const startMs = startOfToday.getTime();
|
|
|
|
|
|
|
|
const endMs = startMs + DAY_IN_MS;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return points.filter((point) =>
|
|
|
|
|
|
|
|
Number.isFinite(point.timestampMs) &&
|
|
|
|
|
|
|
|
point.timestampMs >= startMs &&
|
|
|
|
|
|
|
|
point.timestampMs < endMs
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function splitCsvLine(line) {
|
|
|
|
function splitCsvLine(line) {
|
|
|
|
return line
|
|
|
|
return line
|
|
|
|
.split(",")
|
|
|
|
.split(",")
|
|
|
|
@ -755,22 +793,10 @@ function formatTimestamp(rawTimestamp) {
|
|
|
|
return "";
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const numericTimestamp = Number(rawTimestamp);
|
|
|
|
const parsedMs = parseTimestampMs(rawTimestamp);
|
|
|
|
|
|
|
|
|
|
|
|
if (Number.isFinite(numericTimestamp)) {
|
|
|
|
|
|
|
|
if (numericTimestamp > 1000000000000) {
|
|
|
|
|
|
|
|
return new Date(numericTimestamp).toLocaleTimeString();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (numericTimestamp > 1000000000) {
|
|
|
|
|
|
|
|
return new Date(numericTimestamp * 1000).toLocaleTimeString();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const parsedDate = new Date(rawTimestamp);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!Number.isNaN(parsedDate.getTime())) {
|
|
|
|
if (Number.isFinite(parsedMs)) {
|
|
|
|
return parsedDate.toLocaleTimeString();
|
|
|
|
return new Date(parsedMs).toLocaleTimeString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return rawTimestamp;
|
|
|
|
return rawTimestamp;
|
|
|
|
@ -893,7 +919,7 @@ async function updateHistoricalTrends() {
|
|
|
|
historicalCharts.map(async (chartConfig) => ({
|
|
|
|
historicalCharts.map(async (chartConfig) => ({
|
|
|
|
chartConfig,
|
|
|
|
chartConfig,
|
|
|
|
points: currentEnabledSensorIds.has(chartConfig.sensorId)
|
|
|
|
points: currentEnabledSensorIds.has(chartConfig.sensorId)
|
|
|
|
? await readHistoricalData(chartConfig)
|
|
|
|
? filterPointsForCurrentDay(await readHistoricalData(chartConfig))
|
|
|
|
: []
|
|
|
|
: []
|
|
|
|
}))
|
|
|
|
}))
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|