исправил линейную аппроксимацию, добавил в зависимости библиотеку 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_SECRET="django-secure"
# включение/отключение сервисов ModBus
ENABLE_MB_SERVICES=1

View File

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

View File

@ -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 = {
// Уровень воды <span id="tank-level-dir"></span>
'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)