Cleaning for chart code

This commit is contained in:
P43YM
2025-02-28 20:19:03 +03:00
parent b7334b5f3e
commit c3b127c868

View File

@@ -978,7 +978,8 @@
//График //График
let equithermChart; let equithermChart;
async function initChart() {
async function fetchSettings() {
try { try {
const response = await fetch("/api/settings", { const response = await fetch("/api/settings", {
cache: "no-cache", cache: "no-cache",
@@ -989,145 +990,137 @@
throw new Error('Response not valid'); throw new Error('Response not valid');
} }
const result = await response.json(); return await response.json();
//График переменные
const targetTemp = result?.heating?.target ?? 24;
const maxOut = result?.heating?.maxTemp ?? 90;
const Kn = result?.equitherm?.n_factor ?? 1;
const Ke = result?.equitherm?.e_factor ?? 1.3;
const Kk = result?.equitherm?.k_factor ?? 0;
function calculateTRad(targetTemp, outdoorTemp, maxOut, Kn, Ke, Kk) {
let tempDiff = targetTemp - outdoorTemp;
if (tempDiff < 0) {
tempDiff = 0;
}
const minOutside = targetTemp - (maxOut - targetTemp) / Kn;
let base = targetTemp - minOutside;
if (base <= 0) {
base = 0.0001;
}
const c1 = (maxOut - targetTemp) / Math.pow(base, 1.0 / Ke);
let T_rad = targetTemp + c1 * Math.pow(tempDiff, 1.0 / Ke) + Kk;
return Math.min(T_rad, maxOut);
}
function generateChartData(targetTemp, maxOut, Kn, Ke, Kk) {
const outdoorTemps = [];
const predictedTRad = [];
for (let temp = 25; temp >= -30; temp -= 1) {
outdoorTemps.push(temp);
predictedTRad.push(calculateTRad(targetTemp, temp, maxOut, Kn, Ke, Kk).toFixed(1));
}
return { outdoorTemps, predictedTRad };
}
// Стартовые данные
const { outdoorTemps, predictedTRad } = generateChartData(targetTemp, maxOut, Kn, Ke, Kk);
// Создаем график
const ctx = document.getElementById('equithermChart').getContext('2d');
// Create gradient for the line
const canvasHeight = ctx.canvas.height;
const gradient = ctx.createLinearGradient(0, canvasHeight, 0, 0); // Adjust x1, y1, x2, y2 for direction
gradient.addColorStop(0, 'rgba(75, 192, 192, 1)');
gradient.addColorStop(0.5, 'rgba(255, 99, 132, 1)');
equithermChart = new Chart(ctx, {
type: 'line',
data: {
labels: outdoorTemps,
datasets: [{
label: 'Температура Радиатора (°C)',
borderColor: gradient, // Use gradient instead of solid color
borderWidth: 1,
fill: false,
tension: 0.1,
pointRadius: 2, // Reduce dot size (default is 3)
pointHoverRadius: 4,
data: predictedTRad
}]
},
options: {
responsive: true,
interaction: {
mode: 'nearest', // Подтягиваемся к точкам
intersect: false
},
plugins: {
tooltip: {
enabled: true,
position: 'nearest',
}
},
scales: {
x: {
display: true,
title: {
display: true,
text: 'Наружная температура (°C)'
}
},
y: {
display: true,
title: {
display: true,
text: 'Температура Радиатора (°C)'
}
}
}
}
});
// Показ формы
document.getElementById('equitherm-settings-busy').classList.add('hidden');
document.getElementById('equitherm-settings').classList.remove('hidden');
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }
} }
// Обновление графика // Считаем температуру
function calculateTRad(targetTemp, outdoorTemp, maxOut, Kn, Ke, Kk) {
let tempDelta = targetTemp - outdoorTemp;
const maxPoint = targetTemp - (maxOut - targetTemp) / Kn;
let base = targetTemp - maxPoint;
if (base <= 0) {
base = 0.0001;
}
const sf = (maxOut - targetTemp) / Math.pow(base, 1.0 / Ke);
let T_rad = targetTemp + sf * (tempDelta >= 0 ? Math.pow(tempDelta, 1.0 / Ke) : -Math.pow(-tempDelta, 1.0 / Ke)) + Kk;
return Math.min(T_rad, maxOut);
}
// Генерируем данные для графика
function generateChartData(targetTemp, maxOut, Kn, Ke, Kk) {
const outdoorTemps = [];
const predictedTRad = [];
for (let temp = 25; temp >= -30; temp -= 1) {
outdoorTemps.push(temp);
predictedTRad.push(calculateTRad(targetTemp, temp, maxOut, Kn, Ke, Kk).toFixed(1));
}
return { outdoorTemps, predictedTRad };
}
// Создаем график
function createChart(outdoorTemps, predictedTRad) {
const ctx = document.getElementById('equithermChart').getContext('2d');
const canvasHeight = ctx.canvas.height;
const gradient = ctx.createLinearGradient(0, canvasHeight, 0, 0);
gradient.addColorStop(0, 'rgba(75, 192, 192, 1)');
gradient.addColorStop(0.5, 'rgba(255, 99, 132, 1)');
equithermChart = new Chart(ctx, {
type: 'line',
data: {
labels: outdoorTemps,
datasets: [{
label: 'Температура Радиатора (°C)',
borderColor: gradient,
borderWidth: 1,
fill: false,
tension: 0.1,
pointRadius: 2,
pointHoverRadius: 4,
data: predictedTRad
}]
},
options: {
responsive: true,
interaction: {
mode: 'nearest',
intersect: false
},
plugins: {
tooltip: {
enabled: true,
position: 'nearest',
}
},
scales: {
x: {
display: true,
title: {
display: true,
text: 'Наружная температура (°C)'
}
},
y: {
display: true,
title: {
display: true,
text: 'Температура Радиатора (°C)'
}
}
}
}
});
}
// Инициализируем график
async function initChart() {
try {
const result = await fetchSettings();
const { heating, equitherm } = result;
const targetTemp = heating?.target ?? 24;
const maxOut = heating?.maxTemp ?? 90;
const Kn = equitherm?.n_factor ?? 1;
const Ke = equitherm?.e_factor ?? 1.3;
const Kk = equitherm?.k_factor ?? 0;
const { outdoorTemps, predictedTRad } = generateChartData(targetTemp, maxOut, Kn, Ke, Kk);
createChart(outdoorTemps, predictedTRad);
document.getElementById('equitherm-settings-busy').classList.add('hidden');
document.getElementById('equitherm-settings').classList.remove('hidden');
} catch (error) {
console.log(error);
}
}
function updateChart(formData) { function updateChart(formData) {
if (!equithermChart) return; if (!equithermChart) return;
fetch("/api/settings", { fetchSettings()
cache: "no-cache",
credentials: "include"
})
.then(response => response.json())
.then(result => { .then(result => {
const targetTemp = result?.heating?.target ?? 24; const targetTemp = result?.heating?.target ?? 24;
const maxOut = result?.heating?.maxTemp ?? 90; const maxOut = result?.heating?.maxTemp ?? 90;
const Kn = parseFloat(formData.get('equitherm[n_factor]')) || 1; const Kn = parseFloat(formData.get('equitherm[n_factor]')) || 1;
const Ke = parseFloat(formData.get('equitherm[e_factor]')) || 1.3; const Ke = parseFloat(formData.get('equitherm[e_factor]')) || 1.3;
const Kk = parseFloat(formData.get('equitherm[k_factor]')) || 0; const Kk = parseFloat(formData.get('equitherm[k_factor]')) || 0;
function calculateTRad(targetTemp, outdoorTemp, maxOut, Kn, Ke, Kk) { const { outdoorTemps, predictedTRad } = generateChartData(targetTemp, maxOut, Kn, Ke, Kk);
let tempDiff = targetTemp - outdoorTemp;
if (tempDiff < 0) {
tempDiff = 0;
}
const minOutside = targetTemp - (maxOut - targetTemp) / Kn;
let base = targetTemp - minOutside;
if (base <= 0) {
base = 0.0001;
}
const c1 = (maxOut - targetTemp) / Math.pow(base, 1.0 / Ke);
let T_rad = targetTemp + c1 * Math.pow(tempDiff, 1.0 / Ke) + Kk;
return Math.min(T_rad, maxOut);
}
const outdoorTemps = [];
const predictedTRad = [];
for (let temp = 25; temp >= -30; temp -= 1) {
outdoorTemps.push(temp);
predictedTRad.push(calculateTRad(targetTemp, temp, maxOut, Kn, Ke, Kk).toFixed(1));
}
equithermChart.data.labels = outdoorTemps; equithermChart.data.labels = outdoorTemps;
equithermChart.data.datasets[0].data = predictedTRad; equithermChart.data.datasets[0].data = predictedTRad;
@@ -1136,6 +1129,7 @@
.catch(error => console.log(error)); .catch(error => console.log(error));
} }
// Слушаем отправку // Слушаем отправку
const form = document.getElementById('equitherm-settings'); const form = document.getElementById('equitherm-settings');
form.addEventListener('submit', (e) => { form.addEventListener('submit', (e) => {