переделал использование разрешений для просмотра данных о насосной, отрефакторил обновление stats
This commit is contained in:
parent
ac8fc87753
commit
ed37bcbfc2
@ -18,6 +18,7 @@ def view_index(request):
|
|||||||
|
|
||||||
@permission_required(perm='view_logs', raise_exception=True)
|
@permission_required(perm='view_logs', raise_exception=True)
|
||||||
def view_stats(request):
|
def view_stats(request):
|
||||||
|
# TODO: вставить использование привилегий для получения данных
|
||||||
# только для тестирования!
|
# только для тестирования!
|
||||||
res = requests.get(TEST_BASE_FETCH + "?stats", headers={'Authorization': os.getenv("TEST_AUTH")})
|
res = requests.get(TEST_BASE_FETCH + "?stats", headers={'Authorization': os.getenv("TEST_AUTH")})
|
||||||
response = HttpResponse(res.content)
|
response = HttpResponse(res.content)
|
||||||
|
@ -103,7 +103,113 @@ function _setIndicatorClass(element, good) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const pumpStageDescription = {
|
const updateFunctions = {
|
||||||
|
// последнее обновление резервуара
|
||||||
|
'tank-last-update': (element, dataset) => {
|
||||||
|
const now = Date.now() / 1000
|
||||||
|
element.innerHTML = moment(new Date(dataset['tank']['last_update'] * 1000)).format(DATETIME_FORMAT)
|
||||||
|
// для резервуара нормально, если обновление было меньше получаса назад
|
||||||
|
_setIndicatorClass(element, now - dataset['tank']['last_update'] < 1800)
|
||||||
|
},
|
||||||
|
|
||||||
|
// последнее обновление насосной
|
||||||
|
'pump-last-update': (element, dataset) => {
|
||||||
|
const now = Date.now() / 1000
|
||||||
|
element.innerHTML = moment(new Date(dataset['pump']['last_update'] * 1000)).format(DATETIME_FORMAT)
|
||||||
|
// для насосной можно допустить последнее обновление 10 минут назад
|
||||||
|
_setIndicatorClass(element, now - dataset['tank']['last_update'] < 600)
|
||||||
|
},
|
||||||
|
|
||||||
|
// Уровень воды <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) {
|
||||||
|
element.innerHTML = "(?)"
|
||||||
|
} else {
|
||||||
|
let ap = approximateWithTimestamps(last_radar_values)
|
||||||
|
if (Math.abs(ap) < 0.02) {
|
||||||
|
element.innerHTML = '→'
|
||||||
|
} else {
|
||||||
|
element.innerHTML = ap < 0 ? '↘' : '↗'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Текущий уровень воды: <span id="tank-level-now"></span>%
|
||||||
|
'tank-level-now': (element, dataset) => {
|
||||||
|
element.innerHTML = dataset['tank']['last_percentage']
|
||||||
|
// тут все хорошо если влезаем в установленные рамки +-2% (69-80%)
|
||||||
|
_setIndicatorClass(element, 67 <= dataset['tank']['last_percentage'] <= 82)
|
||||||
|
},
|
||||||
|
|
||||||
|
// Текущее значение с радара
|
||||||
|
'tank-raw-now': (element, dataset) => {
|
||||||
|
element.innerHTML = dataset['tank']['last_radar']
|
||||||
|
},
|
||||||
|
|
||||||
|
// Статус: <span id="tank-status"></span>
|
||||||
|
'tank-status': (element, dataset) => {
|
||||||
|
const shur_status_bits = ['нужна вода', 'поплавок нижний', 'поплавок верхний', 'поплавок аварийный']
|
||||||
|
element.innerHTML = unpackBits(dataset['tank']['status_reg'], shur_status_bits) + " (" + dataset['tank']['status_reg'] + ")"
|
||||||
|
// тут все хорошо, пока нет аварийного поплавка
|
||||||
|
_setIndicatorClass(element, (dataset['tank']['status_reg'] & 0x8) === 0)
|
||||||
|
},
|
||||||
|
|
||||||
|
// Частота ПЧ: <span id="pump-vfd-freq"></span>Гц
|
||||||
|
'pump-vfd-freq': (element, dataset) => {
|
||||||
|
element.innerHTML = dataset['pump']['vfd_freq']
|
||||||
|
},
|
||||||
|
|
||||||
|
// Ток ПЧ: <span id="pump-vfd-curr"></span>А
|
||||||
|
'pump-vfd-curr': (element, dataset) => {
|
||||||
|
document.getElementById("pump-vfd-curr").innerHTML = dataset['pump']['vfd_curr']
|
||||||
|
},
|
||||||
|
|
||||||
|
// Ошибка ПЧ: <span id="pump-vfd-error"></span>
|
||||||
|
'pump-vfd-error': (element, dataset) => {
|
||||||
|
const vfdErrorsDescription = {
|
||||||
|
5: "превышение напряжения",
|
||||||
|
8: "пониженное напряжение",
|
||||||
|
11: "обрыв фазы питания",
|
||||||
|
12: "отказ выходной цепи",
|
||||||
|
15: "перегрев ПЧ",
|
||||||
|
17: "замыкание двигателя на землю",
|
||||||
|
19: "двигатель без нагрузки",
|
||||||
|
34: "перегрузка по току"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dataset['pump']['vfd_err'] in vfdErrorsDescription) {
|
||||||
|
element.innerHTML = dataset['pump']['vfd_err'] + " (" + vfdErrorsDescription[dataset['pump']['vfd_err']] + ")"
|
||||||
|
} else {
|
||||||
|
element.innerHTML = dataset['pump']['vfd_err']
|
||||||
|
}
|
||||||
|
_setIndicatorClass(element, dataset['pump']['vfd_err'] === 0)
|
||||||
|
},
|
||||||
|
|
||||||
|
// Регистр аварий: <span id="pump-alarms"></span>
|
||||||
|
'pump-alarms': (element, dataset) => {
|
||||||
|
const pumpAlarmRegister = [
|
||||||
|
"общая авария",
|
||||||
|
"реле контроля фаз",
|
||||||
|
"насос",
|
||||||
|
"ошибка ПЧ",
|
||||||
|
"датчик потока",
|
||||||
|
"датчик уровня воды",
|
||||||
|
"датчик наличия воды",
|
||||||
|
"задвижки"
|
||||||
|
]
|
||||||
|
|
||||||
|
if (dataset['pump']['alarms'] === 0) {
|
||||||
|
element.innerHTML = "ok"
|
||||||
|
} else {
|
||||||
|
element.innerHTML = unpackBits(dataset['pump']['alarms'], pumpAlarmRegister) + " (" + dataset['pump']['alarms'] + ")"
|
||||||
|
}
|
||||||
|
_setIndicatorClass(element, dataset['pump']['alarms'] === 0)
|
||||||
|
},
|
||||||
|
|
||||||
|
// Состояние КА: <span id="pump-stage"></span>
|
||||||
|
'pump-stage': (element, dataset) => {
|
||||||
|
const pumpStageDescription = {
|
||||||
0: "отключен",
|
0: "отключен",
|
||||||
2: "инициализация: установка задвижек в начальное состояние",
|
2: "инициализация: установка задвижек в начальное состояние",
|
||||||
21: "инициализация: закрытие задвижек 23.5 и 23.6",
|
21: "инициализация: закрытие задвижек 23.5 и 23.6",
|
||||||
@ -121,112 +227,30 @@ const pumpStageDescription = {
|
|||||||
221: "остановка: перевод запорной арматуры в исходное состояние",
|
221: "остановка: перевод запорной арматуры в исходное состояние",
|
||||||
231: "остановка: работа компрессора",
|
231: "остановка: работа компрессора",
|
||||||
235: "остановка: сброс конденсата клапанами 25.*"
|
235: "остановка: сброс конденсата клапанами 25.*"
|
||||||
}
|
}
|
||||||
|
|
||||||
const pumpAlarmRegister = [
|
if (dataset['pump']['pump_stage'] in pumpStageDescription) {
|
||||||
"общая авария",
|
element.innerHTML = dataset['pump']['pump_stage'] + " (" + pumpStageDescription[dataset['pump']['pump_stage']] + ")"
|
||||||
"реле контроля фаз",
|
} else {
|
||||||
"насос",
|
element.innerHTML = dataset['pump']['pump_stage']
|
||||||
"ошибка ПЧ",
|
}
|
||||||
"датчик потока",
|
},
|
||||||
"датчик уровня воды",
|
|
||||||
"датчик наличия воды",
|
|
||||||
"задвижки"
|
|
||||||
]
|
|
||||||
|
|
||||||
const vfdErrorsDescription = {
|
// Текущий расход: <span id="pump-flow-meter"></span>м³
|
||||||
5: "превышение напряжения",
|
'pump-flow-meter': (element, dataset) => {
|
||||||
8: "пониженное напряжение",
|
element.innerHTML = dataset['pump']['flow_meter']
|
||||||
11: "обрыв фазы питания",
|
},
|
||||||
12: "отказ выходной цепи",
|
|
||||||
15: "перегрев ПЧ",
|
// 'id': (element, dataset) => {},
|
||||||
17: "замыкание двигателя на землю",
|
|
||||||
19: "двигатель без нагрузки",
|
|
||||||
34: "перегрузка по току"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function updateStatus() {
|
async function updateStatus() {
|
||||||
let dataset = await loadLastUpdates()
|
let dataset = await loadLastUpdates()
|
||||||
|
|
||||||
const now = Date.now() / 1000
|
for (let id in updateFunctions) {
|
||||||
|
let element = document.getElementById(id)
|
||||||
// последнее обновление
|
if (element !== null) {
|
||||||
|
updateFunctions[id](element, dataset)
|
||||||
// сначала резервуар
|
|
||||||
let tmp = document.getElementById("tank-last-update")
|
|
||||||
tmp.innerHTML = moment(new Date(dataset['tank']['last_update'] * 1000)).format(DATETIME_FORMAT)
|
|
||||||
// для резервуара нормально, если обновление было меньше получаса назад
|
|
||||||
_setIndicatorClass(tmp, now - dataset['tank']['last_update'] < 1800)
|
|
||||||
|
|
||||||
// теперь то же самое, только для насосной
|
|
||||||
tmp = document.getElementById("pump-last-update")
|
|
||||||
tmp.innerHTML = moment(new Date(dataset['pump']['last_update'] * 1000)).format(DATETIME_FORMAT)
|
|
||||||
// для насосной можно допустить последнее обновление 10 минут назад
|
|
||||||
_setIndicatorClass(tmp, now - dataset['tank']['last_update'] < 600)
|
|
||||||
|
|
||||||
//<p>Уровень воды <span id="tank-level-dir"></span></p>
|
|
||||||
const last_radar_values = dataset['tank']['last_radar_values']
|
|
||||||
if (last_radar_values.length === 0) {
|
|
||||||
document.getElementById("tank-level-dir").innerHTML = "(?)"
|
|
||||||
} else {
|
|
||||||
let ap = approximateWithTimestamps(last_radar_values)
|
|
||||||
if (Math.abs(ap) < 0.02) {
|
|
||||||
document.getElementById("tank-level-dir").innerHTML = '→'
|
|
||||||
} else {
|
|
||||||
document.getElementById("tank-level-dir").innerHTML = ap < 0 ? '↘' : '↗'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//<p>Текущий уровень воды: <span id="tank-level-now"></span>%</p>
|
|
||||||
tmp = document.getElementById("tank-level-now")
|
|
||||||
tmp.innerHTML = dataset['tank']['last_percentage']
|
|
||||||
// тут все хорошо если влезаем в установленные рамки +-2% (69-80%)
|
|
||||||
_setIndicatorClass(tmp, 67 <= dataset['tank']['last_percentage'] <= 82)
|
|
||||||
|
|
||||||
//<p>Текущее значение с радара: <span id="tank-raw-now"></span></p>
|
|
||||||
document.getElementById("tank-raw-now").innerHTML = dataset['tank']['last_radar']
|
|
||||||
|
|
||||||
//<p>Статус: <span id="tank-status"></span></p>
|
|
||||||
const shur_status_bits = ['нужна вода', 'поплавок нижний', 'поплавок верхний', 'поплавок аварийный']
|
|
||||||
tmp = document.getElementById("tank-status")
|
|
||||||
tmp.innerHTML = unpackBits(dataset['tank']['status_reg'], shur_status_bits) + " (" + dataset['tank']['status_reg'] + ")"
|
|
||||||
// тут все хорошо, пока нет аварийного поплавка
|
|
||||||
_setIndicatorClass(tmp, (dataset['tank']['status_reg'] & 0x8) === 0)
|
|
||||||
|
|
||||||
//<p>Частота ПЧ: <span id="pump-vfd-freq"></span>Гц</p>
|
|
||||||
document.getElementById("pump-vfd-freq").innerHTML = dataset['pump']['vfd_freq']
|
|
||||||
|
|
||||||
//<p>Ток ПЧ: <span id="pump-vfd-curr"></span>А</p>
|
|
||||||
document.getElementById("pump-vfd-curr").innerHTML = dataset['pump']['vfd_curr']
|
|
||||||
|
|
||||||
//<p>Ошибка ПЧ: <span id="pump-vfd-error"></span></p>
|
|
||||||
tmp = document.getElementById("pump-vfd-error")
|
|
||||||
if (dataset['pump']['vfd_err'] in vfdErrorsDescription) {
|
|
||||||
tmp.innerHTML = dataset['pump']['vfd_err'] + " (" + vfdErrorsDescription[dataset['pump']['vfd_err']] + ")"
|
|
||||||
} else {
|
|
||||||
tmp.innerHTML = dataset['pump']['vfd_err']
|
|
||||||
}
|
|
||||||
_setIndicatorClass(tmp, dataset['pump']['vfd_err'] === 0)
|
|
||||||
|
|
||||||
//<p>Регистр аварий: <span id="pump-alarms"></span></p>
|
|
||||||
tmp = document.getElementById("pump-alarms")
|
|
||||||
if (dataset['pump']['alarms'] === 0) {
|
|
||||||
tmp.innerHTML = "ok"
|
|
||||||
} else {
|
|
||||||
tmp.innerHTML = unpackBits(dataset['pump']['alarms'], pumpAlarmRegister) + " (" + dataset['pump']['alarms'] + ")"
|
|
||||||
}
|
|
||||||
_setIndicatorClass(tmp, dataset['pump']['alarms'] === 0)
|
|
||||||
|
|
||||||
//<p>Состояние КА: <span id="pump-stage"></span></p>
|
|
||||||
tmp = document.getElementById("pump-stage")
|
|
||||||
if (dataset['pump']['pump_stage'] in pumpStageDescription) {
|
|
||||||
tmp.innerHTML = dataset['pump']['pump_stage'] + " (" + pumpStageDescription[dataset['pump']['pump_stage']] + ")"
|
|
||||||
} else {
|
|
||||||
tmp.innerHTML = dataset['pump']['pump_stage']
|
|
||||||
}
|
|
||||||
|
|
||||||
//<p>Текущий расход: <span id="pump-flow-meter"></span>м³</p>
|
|
||||||
document.getElementById("pump-flow-meter").innerHTML = dataset['pump']['flow_meter']
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="params-wrapper">
|
<div class="params-wrapper">
|
||||||
<div>
|
<div>
|
||||||
|
{% if perms.view_pump_stats %}
|
||||||
<h2>Состояние насосной станции</h2>
|
<h2>Состояние насосной станции</h2>
|
||||||
<div class="params-group">
|
<div class="params-group">
|
||||||
<p>Последнее обновление: <span id="pump-last-update"></span></p>
|
<p>Последнее обновление: <span id="pump-last-update"></span></p>
|
||||||
@ -47,6 +48,7 @@
|
|||||||
<p>Состояние КА: <span id="pump-stage"></span></p>
|
<p>Состояние КА: <span id="pump-stage"></span></p>
|
||||||
<p>Текущий расход: <span id="pump-flow-meter"></span>м³</p>
|
<p>Текущий расход: <span id="pump-flow-meter"></span>м³</p>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h2>Состояние резервуара</h2>
|
<h2>Состояние резервуара</h2>
|
||||||
@ -63,6 +65,7 @@
|
|||||||
<div id="canvas-wrapper"><canvas id="water_level"></canvas></div>
|
<div id="canvas-wrapper"><canvas id="water_level"></canvas></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% if perms.view_pump_stats %}
|
||||||
<div class="params-wrapper">
|
<div class="params-wrapper">
|
||||||
<div>
|
<div>
|
||||||
<h2>Прочие показатели</h2>
|
<h2>Прочие показатели</h2>
|
||||||
@ -81,6 +84,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="params-wrapper">
|
<div class="params-wrapper">
|
||||||
|
@ -45,6 +45,7 @@ class User(AbstractBaseUser):
|
|||||||
|
|
||||||
permissions = {
|
permissions = {
|
||||||
'view_logs': 0,
|
'view_logs': 0,
|
||||||
|
'view_pump_stats': 1,
|
||||||
'change_users': 1,
|
'change_users': 1,
|
||||||
|
|
||||||
'users.add_user': 1,
|
'users.add_user': 1,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user