From a5a77b864c60392e4c0f6d4a8b7a04c6c489bbae Mon Sep 17 00:00:00 2001 From: VladislavOstapov Date: Mon, 22 Jan 2024 14:15:20 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BB=D0=B8=D0=BD=D0=B5=D0=B9=D0=BD=D1=83=D1=8E=20?= =?UTF-8?q?=D0=B0=D0=BF=D0=BF=D1=80=D0=BE=D0=BA=D1=81=D0=B8=D0=BC=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8E,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B2=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D1=83=20modbus=20tcp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env-template | 2 ++ requirements.txt | 1 + static/js/index-main.js | 58 +++++++++++++++++++---------------------- 3 files changed, 30 insertions(+), 31 deletions(-) diff --git a/.env-template b/.env-template index 390e58f..36d8ce0 100644 --- a/.env-template +++ b/.env-template @@ -12,3 +12,5 @@ DB_PORT=5432 # секретный ключ Django DJANGO_SECRET="django-secure" +# включение/отключение сервисов ModBus +ENABLE_MB_SERVICES=1 diff --git a/requirements.txt b/requirements.txt index ed31306..09da131 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ django psycopg requests python-dotenv +pyModbusTCP==0.2.0 diff --git a/static/js/index-main.js b/static/js/index-main.js index 18f2776..9816ccb 100644 --- a/static/js/index-main.js +++ b/static/js/index-main.js @@ -31,37 +31,33 @@ function unpackBits(num, desc) { * @returns {number}, коэфицент a */ function approximateWithTimestamps(dataset) { - - // для точных расчетов нужно сместить timestamp const timestamp_offset = dataset[0][0] - - // сумма (x[i] * y[i]) - let sum_x_mul_y = 0 - for (let i = 0; i < dataset.length; i++) { - sum_x_mul_y += (dataset[i][0] - timestamp_offset) * dataset[i][1] - } - - // сумма всех x[i] - let sum_x = 0; - for (let i = 0; i < dataset.length; i++) { - sum_x += dataset[i][0] - timestamp_offset - } - - // сумма всех y[i] - let sum_y = 0; - for (let i = 0; i < dataset.length; i++) { - sum_y += dataset[i][1] - } - - // сумма всех x[i]^2 - let sum_x_mul_x = 0; - for (let i = 0; i < dataset.length; i++) { - sum_x_mul_x += Math.pow(dataset[i][0] - timestamp_offset, 2) - } - - // вычисление коэфицента a из формулы y=ax+b - // нам нужен только он - return (dataset.length * sum_x_mul_y - sum_x * sum_y) / (sum_x_mul_x - Math.pow(sum_x, 2)) + const x = dataset.map((element) => element[0] - timestamp_offset); + const y = dataset.map((element) => element[1]); + const sumX = x.reduce((prev, curr) => prev + curr, 0); + const avgX = sumX / x.length; + const xDifferencesToAverage = x.map((value) => avgX - value); + const xDifferencesToAverageSquared = xDifferencesToAverage.map( + (value) => value ** 2 + ); + const SSxx = xDifferencesToAverageSquared.reduce( + (prev, curr) => prev + curr, + 0 + ); + const sumY = y.reduce((prev, curr) => prev + curr, 0); + const avgY = sumY / y.length; + const yDifferencesToAverage = y.map((value) => avgY - value); + const xAndYDifferencesMultiplied = xDifferencesToAverage.map( + (curr, index) => curr * yDifferencesToAverage[index] + ); + const SSxy = xAndYDifferencesMultiplied.reduce( + (prev, curr) => prev + curr, + 0 + ); + // const slope = SSxy / SSxx; + // const intercept = avgY - slope * avgX; + // return (x) => intercept + slope * x; + return SSxy / SSxx } async function makeRequest(url) { @@ -123,7 +119,7 @@ const updateFunctions = { // Уровень воды 'tank-level-dir': (element, dataset) => { const last_radar_values = dataset['tank']['last_radar_values'] - if (last_radar_values.length === 0) { + if (last_radar_values.length < 3) { element.innerHTML = "(?)" } else { let ap = approximateWithTimestamps(last_radar_values)