исправил линейную аппроксимацию, добавил в зависимости библиотеку modbus tcp

This commit is contained in:
VladislavOstapov 2024-01-22 14:15:20 +03:00
parent 494deb3cf9
commit a5a77b864c
3 changed files with 30 additions and 31 deletions

View File

@ -12,3 +12,5 @@ DB_PORT=5432
# секретный ключ Django # секретный ключ Django
DJANGO_SECRET="django-secure" DJANGO_SECRET="django-secure"
# включение/отключение сервисов ModBus
ENABLE_MB_SERVICES=1

View File

@ -2,3 +2,4 @@ django
psycopg psycopg
requests requests
python-dotenv python-dotenv
pyModbusTCP==0.2.0

View File

@ -31,37 +31,33 @@ function unpackBits(num, desc) {
* @returns {number}, коэфицент a * @returns {number}, коэфицент a
*/ */
function approximateWithTimestamps(dataset) { function approximateWithTimestamps(dataset) {
// для точных расчетов нужно сместить timestamp
const timestamp_offset = dataset[0][0] const timestamp_offset = dataset[0][0]
const x = dataset.map((element) => element[0] - timestamp_offset);
// сумма (x[i] * y[i]) const y = dataset.map((element) => element[1]);
let sum_x_mul_y = 0 const sumX = x.reduce((prev, curr) => prev + curr, 0);
for (let i = 0; i < dataset.length; i++) { const avgX = sumX / x.length;
sum_x_mul_y += (dataset[i][0] - timestamp_offset) * dataset[i][1] const xDifferencesToAverage = x.map((value) => avgX - value);
} const xDifferencesToAverageSquared = xDifferencesToAverage.map(
(value) => value ** 2
// сумма всех x[i] );
let sum_x = 0; const SSxx = xDifferencesToAverageSquared.reduce(
for (let i = 0; i < dataset.length; i++) { (prev, curr) => prev + curr,
sum_x += dataset[i][0] - timestamp_offset 0
} );
const sumY = y.reduce((prev, curr) => prev + curr, 0);
// сумма всех y[i] const avgY = sumY / y.length;
let sum_y = 0; const yDifferencesToAverage = y.map((value) => avgY - value);
for (let i = 0; i < dataset.length; i++) { const xAndYDifferencesMultiplied = xDifferencesToAverage.map(
sum_y += dataset[i][1] (curr, index) => curr * yDifferencesToAverage[index]
} );
const SSxy = xAndYDifferencesMultiplied.reduce(
// сумма всех x[i]^2 (prev, curr) => prev + curr,
let sum_x_mul_x = 0; 0
for (let i = 0; i < dataset.length; i++) { );
sum_x_mul_x += Math.pow(dataset[i][0] - timestamp_offset, 2) // const slope = SSxy / SSxx;
} // const intercept = avgY - slope * avgX;
// return (x) => intercept + slope * x;
// вычисление коэфицента a из формулы y=ax+b return SSxy / SSxx
// нам нужен только он
return (dataset.length * sum_x_mul_y - sum_x * sum_y) / (sum_x_mul_x - Math.pow(sum_x, 2))
} }
async function makeRequest(url) { async function makeRequest(url) {
@ -123,7 +119,7 @@ const updateFunctions = {
// Уровень воды <span id="tank-level-dir"></span> // Уровень воды <span id="tank-level-dir"></span>
'tank-level-dir': (element, dataset) => { 'tank-level-dir': (element, dataset) => {
const last_radar_values = dataset['tank']['last_radar_values'] const last_radar_values = dataset['tank']['last_radar_values']
if (last_radar_values.length === 0) { if (last_radar_values.length < 3) {
element.innerHTML = "(?)" element.innerHTML = "(?)"
} else { } else {
let ap = approximateWithTimestamps(last_radar_values) let ap = approximateWithTimestamps(last_radar_values)