@@ -103,130 +103,154 @@ function _setIndicatorClass(element, good) {
}
}
const pumpStageDescrip tion = {
0 : "отключен" ,
2 : "инициализация: установка задвижек в начальное состояние" ,
21 : "инициализация: закрытие задвижек 23.5 и 23.6" ,
31 : "инициализация: открытие задвижек 23.5 и 23.6" ,
99 : "<span class=\"value-bad\">авария</span>" ,
100 : "ожидание сигнала на перекачку воды" ,
102 : "запуск: открытие задвижки 23.6" ,
110 : "запуск: ожидание сигнала от датчика уровня поз.36" ,
121 : "запуск: открытие задвижек насоса" ,
131 : "запуск: закрытие задвижки 23.6" ,
141 : "запуск: пуск ПЧ" ,
200 : "<span class=\"value-good\">работает</span>" ,
202 : "остановка: закрытие задвижек 23.3 и 23.4" ,
211 : "остановка: ожидание остановки ПЧ" ,
221 : "остановка: перевод запорной арматуры в исходное состояние" ,
231 : "остановка: работа компрессора" ,
235 : "остановка: с б р о с конденсата клапанами 25.*"
}
const updateFunc tions = {
// последнее обновление резервуара
'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 : "перегрузка по току"
// Уровень воды <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 : "отключен" ,
2 : "инициализация: установка задвижек в начальное состояние" ,
21 : "инициализация: закрытие задвижек 23.5 и 23.6" ,
31 : "инициализация: открытие задвижек 23.5 и 23.6" ,
99 : "<span class=\"value-bad\">авария</span>" ,
100 : "ожидание сигнала на перекачку воды" ,
102 : "запуск: открытие задвижки 23.6" ,
110 : "запуск: ожидание сигнала от датчика уровня поз.36" ,
121 : "запуск: открытие задвижек насоса" ,
131 : "запуск: закрытие задвижки 23.6" ,
141 : "запуск: пуск ПЧ" ,
200 : "<span class=\"value-good\">работает</span>" ,
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' ]
}
} ,
// Текущий расход: <span id="pump-flow-meter"></span>м³
'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 )
//<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 ? '↘' : '↗'
for ( let id in updateFunctions ) {
let element = document . getElementById ( id )
if ( element !== null ) {
updateFunctions [ id ] ( element , dataset )
}
}
//<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' ]
}