условно рабочее логгирование насосной, остатки удаления модели насосной станции из БД
This commit is contained in:
parent
9aab833a57
commit
250a4361ee
@ -1,5 +1,4 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from .models import MbPumpRecord, MbTankRecord
|
from .models import MbTankRecord
|
||||||
|
|
||||||
admin.site.register(MbPumpRecord)
|
|
||||||
admin.site.register(MbTankRecord)
|
admin.site.register(MbTankRecord)
|
||||||
|
@ -4,6 +4,7 @@ from ospaz_site.settings import DEBUG
|
|||||||
|
|
||||||
_is_ready = False
|
_is_ready = False
|
||||||
|
|
||||||
|
|
||||||
class LogsServiceConfig(AppConfig):
|
class LogsServiceConfig(AppConfig):
|
||||||
default_auto_field = 'django.db.models.BigAutoField'
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
name = 'logs_service'
|
name = 'logs_service'
|
||||||
|
@ -4,6 +4,7 @@ from threading import Thread
|
|||||||
import time
|
import time
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from pyModbusTCP.client import ModbusClient
|
from pyModbusTCP.client import ModbusClient
|
||||||
|
from threading import Lock
|
||||||
|
|
||||||
|
|
||||||
class MbClearHistoryService(Thread):
|
class MbClearHistoryService(Thread):
|
||||||
@ -117,27 +118,76 @@ class MbTankService(MbService):
|
|||||||
|
|
||||||
|
|
||||||
class MbPumpService(MbService):
|
class MbPumpService(MbService):
|
||||||
_config = {
|
def __init__(self, **kwargs):
|
||||||
"modbus": {
|
super().__init__(**kwargs)
|
||||||
"host": "10.8.105.2",
|
self._lock = Lock()
|
||||||
"port": 503,
|
|
||||||
"log-type": "on-change"
|
|
||||||
},
|
|
||||||
"registers": [
|
|
||||||
["D0", "v231_v236"],
|
|
||||||
["D1", "v236_v29"],
|
|
||||||
["D15", "ps_39"],
|
|
||||||
["D16", "flow_meter"],
|
|
||||||
["D28", "pump_stage"],
|
|
||||||
["D30", "half_auto_control"],
|
|
||||||
["D31", "watch_1"],
|
|
||||||
["D32", "watch_2"],
|
|
||||||
|
|
||||||
["D33", "st_valves"],
|
self._curr_state = None
|
||||||
["D35", "alarms"],
|
# {
|
||||||
|
# "level": int,
|
||||||
|
# "status": int,
|
||||||
|
# "radar": int
|
||||||
|
# }
|
||||||
|
|
||||||
["D25", "vfd_freq"],
|
def _init_state(self):
|
||||||
["D26", "vfd_current"],
|
pass
|
||||||
["D27", "vfd_error"]
|
|
||||||
]
|
def _push_current_state(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _load_current_state(self):
|
||||||
|
# D16: flow_meter
|
||||||
|
# D28: pump_stage
|
||||||
|
# D30: half_auto_control
|
||||||
|
# D31: watch_1
|
||||||
|
# D32: watch_2
|
||||||
|
# D33.14: sc_st_pump_31_run
|
||||||
|
# D33.15: sc_st_pump_31_run
|
||||||
|
# D35: alarms
|
||||||
|
# D25: vfd_freq
|
||||||
|
# D26: vfd_current
|
||||||
|
# D27: vfd_error
|
||||||
|
off = 16
|
||||||
|
values = self.mb.read_holding_registers(16, 35 - off)
|
||||||
|
with self._lock:
|
||||||
|
# определение запущенного насоса
|
||||||
|
pr = None
|
||||||
|
if values[33 - off] & (1 << 14):
|
||||||
|
pr = 1
|
||||||
|
elif values[33 - off] & (1 << 15):
|
||||||
|
pr = 2
|
||||||
|
|
||||||
|
self._curr_state = {
|
||||||
|
'alarms': values[35 - off],
|
||||||
|
'flow_meter': values[16 - off],
|
||||||
|
'last_update': int(datetime.now().timestamp()),
|
||||||
|
'pump_stage': values[28 - off],
|
||||||
|
'vfd_curr': values[26 - off],
|
||||||
|
'vfd_err': values[27 - off],
|
||||||
|
'vfd_freq': values[25 - off],
|
||||||
|
'pump_running': pr,
|
||||||
|
'pump_moto_watch_1': values[31 - off],
|
||||||
|
'pump_moto_watch_2': values[32 - off],
|
||||||
|
'half_auto_control': values[30 - off]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def _check_need_save(self):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_stats(self):
|
||||||
|
with self._lock:
|
||||||
|
# копируем данные, если они есть в текущем состоянии (иначе пустые поля)
|
||||||
|
return self._curr_state or {
|
||||||
|
'alarms': None,
|
||||||
|
'flow_meter': None,
|
||||||
|
'last_update': None,
|
||||||
|
'pump_stage': None,
|
||||||
|
'vfd_curr': None,
|
||||||
|
'vfd_err': None,
|
||||||
|
'vfd_freq': None,
|
||||||
|
'pump_running': None,
|
||||||
|
'pump_moto_watch_1': None,
|
||||||
|
'pump_moto_watch_2': None,
|
||||||
|
'half_auto_control': None
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -1,31 +1,25 @@
|
|||||||
import json
|
import json
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
from django.shortcuts import render
|
|
||||||
import os
|
|
||||||
from django.http import HttpResponse, HttpResponseBadRequest
|
from django.http import HttpResponse, HttpResponseBadRequest
|
||||||
from django.contrib.auth.decorators import login_required, permission_required
|
from django.contrib.auth.decorators import permission_required
|
||||||
from .models import MbTankRecord
|
from .models import MbTankRecord
|
||||||
|
from .apps import LogsServiceConfig
|
||||||
# только для тестирования!
|
|
||||||
import requests
|
|
||||||
|
|
||||||
TEST_BASE_FETCH = "https://test.wawaa.ru/dev-fetch.php"
|
|
||||||
|
|
||||||
|
|
||||||
@permission_required(perm='logs_service.view_mbtankrecord', raise_exception=True)
|
@permission_required(perm='logs_service.view_mbtankrecord', raise_exception=True)
|
||||||
def view_stats(request):
|
def view_stats(request):
|
||||||
# TODO: вставить использование привилегий для получения данных
|
tank = MbTankRecord.load_stats()
|
||||||
# только для тестирования!
|
pump = None
|
||||||
ext_stats = requests.get(TEST_BASE_FETCH + "?stats", headers={'Authorization': os.getenv("TEST_AUTH")})
|
if request.user.has_perm('logs_service.view_pump_stats'):
|
||||||
|
if LogsServiceConfig.mb_tank_service is not None and LogsServiceConfig.mb_tank_service_enable:
|
||||||
|
pump = LogsServiceConfig.mb_tank_service.get_stats()
|
||||||
|
|
||||||
out = {
|
out = {
|
||||||
'stats': {
|
'stats': {
|
||||||
'tank': MbTankRecord.load_stats(),
|
'tank': tank,
|
||||||
'pump': ext_stats.json()['stats']['pump']
|
'pump': pump
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
response = HttpResponse(json.dumps(out))
|
response = HttpResponse(json.dumps(out))
|
||||||
response.headers["Content-type"] = response.headers["Content-type"]
|
response.headers["Content-type"] = response.headers["Content-type"]
|
||||||
return response
|
return response
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
django
|
django
|
||||||
psycopg
|
psycopg
|
||||||
requests
|
|
||||||
python-dotenv
|
python-dotenv
|
||||||
pyModbusTCP==0.2.0
|
pyModbusTCP==0.2.0
|
||||||
|
@ -43,9 +43,6 @@ class User(AbstractBaseUser):
|
|||||||
secure_level = 1
|
secure_level = 1
|
||||||
|
|
||||||
permissions = {
|
permissions = {
|
||||||
'view_logs': 0,
|
|
||||||
'view_pump_stats': 1,
|
|
||||||
|
|
||||||
'users.add_user': 1,
|
'users.add_user': 1,
|
||||||
'users.change_user': 1,
|
'users.change_user': 1,
|
||||||
'users.delete_user': 1,
|
'users.delete_user': 1,
|
||||||
@ -55,6 +52,8 @@ class User(AbstractBaseUser):
|
|||||||
'logs_service.change_mbtankrecord': 1,
|
'logs_service.change_mbtankrecord': 1,
|
||||||
'logs_service.delete_mbtankrecord': 1,
|
'logs_service.delete_mbtankrecord': 1,
|
||||||
'logs_service.view_mbtankrecord': 0,
|
'logs_service.view_mbtankrecord': 0,
|
||||||
|
|
||||||
|
'logs_service.view_pump_stats': 1
|
||||||
}
|
}
|
||||||
if perm in permissions:
|
if perm in permissions:
|
||||||
if permissions[perm] <= secure_level:
|
if permissions[perm] <= secure_level:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user