diff --git a/src_data/pages/settings.html b/src_data/pages/settings.html index 12f53d0..05121e4 100644 --- a/src_data/pages/settings.html +++ b/src_data/pages/settings.html @@ -975,176 +975,176 @@ console.log(error); } -//График -let equithermChart; + //График + let equithermChart; -async function initChart() { - try { - const response = await fetch("/api/settings", { - cache: "no-cache", - credentials: "include" - }); - - if (!response.ok) { - throw new Error('Response not valid'); - } + async function initChart() { + try { + const response = await fetch("/api/settings", { + cache: "no-cache", + credentials: "include" + }); - const result = await response.json(); - - //График переменные - const targetTemp = result?.heating?.target_temp ?? 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; + if (!response.ok) { + throw new Error('Response not valid'); + } - function calculateTRad(targetTemp, outdoorTemp, maxOut, Kn, Ke, Kk) { - let tempDiff = targetTemp - outdoorTemp; - if (tempDiff < 0) { + const result = 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) { + } + 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 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) { + 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 }; } - return { outdoorTemps, predictedTRad }; - } - // Стартовые данные - const { outdoorTemps, predictedTRad } = generateChartData(targetTemp, maxOut, Kn, Ke, Kk); + // Стартовые данные + 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)'); + // Создаем график + 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: { + + 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 + 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: { + }, + options: { responsive: true, scales: { - x: { - display: true, - title: { - display: true, - text: 'Наружная температура (°C)' - } - }, - y: { - display: true, - title: { - display: true, - text: 'Температура Радиатора (°C)' - } + 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) { + console.log(error); + } + } + + // Обновление графика + function updateChart(formData) { + if (!equithermChart) return; + + fetch("/api/settings", { + cache: "no-cache", + credentials: "include" + }) + .then(response => response.json()) + .then(result => { + const targetTemp = result?.heating?.target ?? 24; + const maxOut = result?.heating?.maxTemp ?? 90; + const Kn = parseFloat(formData.get('equitherm[n_factor]')) || 1; + const Ke = parseFloat(formData.get('equitherm[e_factor]')) || 1.3; + const Kk = parseFloat(formData.get('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); + } + + 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.datasets[0].data = predictedTRad; + equithermChart.update(); + }) + .catch(error => console.log(error)); + } + + // Слушаем отправку + const form = document.getElementById('equitherm-settings'); + form.addEventListener('submit', (e) => { + + const formData = new FormData(form); + updateChart(formData); }); - // Показ формы - document.getElementById('equitherm-settings-busy').classList.add('hidden'); - document.getElementById('equitherm-settings').classList.remove('hidden'); - - } catch (error) { - console.log(error); - } -} - -// Обновление графика -function updateChart(formData) { - if (!equithermChart) return; - - fetch("/api/settings", { - cache: "no-cache", - credentials: "include" - }) - .then(response => response.json()) - .then(result => { - const targetTemp = result?.heating?.target_temp ?? 24; - const maxOut = result?.heating?.maxTemp ?? 90; - const Kn = parseFloat(formData.get('equitherm[n_factor]')) || 1; - const Ke = parseFloat(formData.get('equitherm[e_factor]')) || 1.3; - const Kk = parseFloat(formData.get('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); - } - - 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.datasets[0].data = predictedTRad; - equithermChart.update(); - }) - .catch(error => console.log(error)); - } - - // Слушаем отправку - const form = document.getElementById('equitherm-settings'); - form.addEventListener('submit', (e) => { - - const formData = new FormData(form); - updateChart(formData); - }); - -// Слушаем кнопку сохранить - const equithermSection = document.querySelector('details'); - const saveButton = equithermSection.querySelector('button[data-i18n="button.save"]'); + // Слушаем кнопку сохранить + const equithermSection = document.querySelector('details'); + const saveButton = equithermSection.querySelector('button[data-i18n="button.save"]'); saveButton.addEventListener('click', () => { const form = document.getElementById('equitherm-settings'); const formData = new FormData(form); updateChart(formData); - }); + }); -// инициализируем -initChart(); + // инициализируем + initChart(); });