diff --git a/index/views.py b/index/views.py index 6db98b5..53c8bd9 100644 --- a/index/views.py +++ b/index/views.py @@ -18,6 +18,7 @@ def view_index(request): @permission_required(perm='view_logs', raise_exception=True) def view_stats(request): + # TODO: вставить использование привилегий для получения данных # только для тестирования! res = requests.get(TEST_BASE_FETCH + "?stats", headers={'Authorization': os.getenv("TEST_AUTH")}) response = HttpResponse(res.content) diff --git a/static/js/index-main.js b/static/js/index-main.js index 20af3a7..18f2776 100644 --- a/static/js/index-main.js +++ b/static/js/index-main.js @@ -103,130 +103,154 @@ function _setIndicatorClass(element, good) { } } -const pumpStageDescription = { - 0: "отключен", - 2: "инициализация: установка задвижек в начальное состояние", - 21: "инициализация: закрытие задвижек 23.5 и 23.6", - 31: "инициализация: открытие задвижек 23.5 и 23.6", - 99: "авария", - 100: "ожидание сигнала на перекачку воды", - 102: "запуск: открытие задвижки 23.6", - 110: "запуск: ожидание сигнала от датчика уровня поз.36", - 121: "запуск: открытие задвижек насоса", - 131: "запуск: закрытие задвижки 23.6", - 141: "запуск: пуск ПЧ", - 200: "работает", - 202: "остановка: закрытие задвижек 23.3 и 23.4", - 211: "остановка: ожидание остановки ПЧ", - 221: "остановка: перевод запорной арматуры в исходное состояние", - 231: "остановка: работа компрессора", - 235: "остановка: сброс конденсата клапанами 25.*" -} +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) + }, -const pumpAlarmRegister = [ - "общая авария", - "реле контроля фаз", - "насос", - "ошибка ПЧ", - "датчик потока", - "датчик уровня воды", - "датчик наличия воды", - "задвижки" -] + // последнее обновление насосной + '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) + }, -const vfdErrorsDescription = { - 5: "превышение напряжения", - 8: "пониженное напряжение", - 11: "обрыв фазы питания", - 12: "отказ выходной цепи", - 15: "перегрев ПЧ", - 17: "замыкание двигателя на землю", - 19: "двигатель без нагрузки", - 34: "перегрузка по току" + // Уровень воды + '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 ? '↘' : '↗' + } + } + }, + + // Текущий уровень воды: % + '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'] + }, + + // Статус: + '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) + }, + + // Частота ПЧ: Гц + 'pump-vfd-freq': (element, dataset) => { + element.innerHTML = dataset['pump']['vfd_freq'] + }, + + // Ток ПЧ: А + 'pump-vfd-curr': (element, dataset) => { + document.getElementById("pump-vfd-curr").innerHTML = dataset['pump']['vfd_curr'] + }, + + // Ошибка ПЧ: + '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) + }, + + // Регистр аварий: + '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) + }, + + // Состояние КА: + 'pump-stage': (element, dataset) => { + const pumpStageDescription = { + 0: "отключен", + 2: "инициализация: установка задвижек в начальное состояние", + 21: "инициализация: закрытие задвижек 23.5 и 23.6", + 31: "инициализация: открытие задвижек 23.5 и 23.6", + 99: "авария", + 100: "ожидание сигнала на перекачку воды", + 102: "запуск: открытие задвижки 23.6", + 110: "запуск: ожидание сигнала от датчика уровня поз.36", + 121: "запуск: открытие задвижек насоса", + 131: "запуск: закрытие задвижки 23.6", + 141: "запуск: пуск ПЧ", + 200: "работает", + 202: "остановка: закрытие задвижек 23.3 и 23.4", + 211: "остановка: ожидание остановки ПЧ", + 221: "остановка: перевод запорной арматуры в исходное состояние", + 231: "остановка: работа компрессора", + 235: "остановка: сброс конденсата клапанами 25.*" + } + + 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'] + } + }, + + // Текущий расход: м³ + 'pump-flow-meter': (element, dataset) => { + element.innerHTML = dataset['pump']['flow_meter'] + }, + + // 'id': (element, dataset) => {}, } async function updateStatus() { let dataset = await loadLastUpdates() - const now = Date.now() / 1000 - - // последнее обновление - - // сначала резервуар - 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) - - //
Уровень воды
- 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 ? '↘' : '↗' + for (let id in updateFunctions) { + let element = document.getElementById(id) + if (element !== null) { + updateFunctions[id](element, dataset) } - } - - //Текущий уровень воды: %
- tmp = document.getElementById("tank-level-now") - tmp.innerHTML = dataset['tank']['last_percentage'] - // тут все хорошо если влезаем в установленные рамки +-2% (69-80%) - _setIndicatorClass(tmp, 67 <= dataset['tank']['last_percentage'] <= 82) - - //Текущее значение с радара:
- document.getElementById("tank-raw-now").innerHTML = dataset['tank']['last_radar'] - - //Статус:
- 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) - - //Частота ПЧ: Гц
- document.getElementById("pump-vfd-freq").innerHTML = dataset['pump']['vfd_freq'] - - //Ток ПЧ: А
- document.getElementById("pump-vfd-curr").innerHTML = dataset['pump']['vfd_curr'] - - //Ошибка ПЧ:
- 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) - - //Регистр аварий:
- 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) - - //Состояние КА:
- 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'] - } - - //Текущий расход: м³
- document.getElementById("pump-flow-meter").innerHTML = dataset['pump']['flow_meter'] - } diff --git a/templates/index.html b/templates/index.html index a62fcfd..ddae5fd 100644 --- a/templates/index.html +++ b/templates/index.html @@ -40,6 +40,7 @@ {% block content %}Последнее обновление:
@@ -47,6 +48,7 @@Состояние КА:
Текущий расход: м³