исправил линейную аппроксимацию, добавил в зависимости библиотеку modbus tcp
This commit is contained in:
parent
494deb3cf9
commit
a5a77b864c
@ -12,3 +12,5 @@ DB_PORT=5432
|
|||||||
# секретный ключ Django
|
# секретный ключ Django
|
||||||
DJANGO_SECRET="django-secure"
|
DJANGO_SECRET="django-secure"
|
||||||
|
|
||||||
|
# включение/отключение сервисов ModBus
|
||||||
|
ENABLE_MB_SERVICES=1
|
||||||
|
@ -2,3 +2,4 @@ django
|
|||||||
psycopg
|
psycopg
|
||||||
requests
|
requests
|
||||||
python-dotenv
|
python-dotenv
|
||||||
|
pyModbusTCP==0.2.0
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user