условно рабочее логгирование насосной, остатки удаления модели насосной станции из БД

This commit is contained in:
VladislavOstapov 2024-01-23 17:40:20 +03:00
parent 9aab833a57
commit 250a4361ee
6 changed files with 85 additions and 43 deletions

View File

@ -1,5 +1,4 @@
from django.contrib import admin
from .models import MbPumpRecord, MbTankRecord
from .models import MbTankRecord
admin.site.register(MbPumpRecord)
admin.site.register(MbTankRecord)

View File

@ -4,6 +4,7 @@ from ospaz_site.settings import DEBUG
_is_ready = False
class LogsServiceConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'logs_service'

View File

@ -4,6 +4,7 @@ from threading import Thread
import time
from datetime import datetime, timedelta
from pyModbusTCP.client import ModbusClient
from threading import Lock
class MbClearHistoryService(Thread):
@ -117,27 +118,76 @@ class MbTankService(MbService):
class MbPumpService(MbService):
_config = {
"modbus": {
"host": "10.8.105.2",
"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"],
def __init__(self, **kwargs):
super().__init__(**kwargs)
self._lock = Lock()
["D33", "st_valves"],
["D35", "alarms"],
self._curr_state = None
# {
# "level": int,
# "status": int,
# "radar": int
# }
def _init_state(self):
pass
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
}
["D25", "vfd_freq"],
["D26", "vfd_current"],
["D27", "vfd_error"]
]
}

View File

@ -1,31 +1,25 @@
import json
from datetime import datetime, timedelta
from django.shortcuts import render
import os
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
# только для тестирования!
import requests
TEST_BASE_FETCH = "https://test.wawaa.ru/dev-fetch.php"
from .apps import LogsServiceConfig
@permission_required(perm='logs_service.view_mbtankrecord', raise_exception=True)
def view_stats(request):
# TODO: вставить использование привилегий для получения данных
# только для тестирования!
ext_stats = requests.get(TEST_BASE_FETCH + "?stats", headers={'Authorization': os.getenv("TEST_AUTH")})
tank = MbTankRecord.load_stats()
pump = None
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 = {
'stats': {
'tank': MbTankRecord.load_stats(),
'pump': ext_stats.json()['stats']['pump']
'tank': tank,
'pump': pump
}
}
response = HttpResponse(json.dumps(out))
response.headers["Content-type"] = response.headers["Content-type"]
return response

View File

@ -1,5 +1,4 @@
django
psycopg
requests
python-dotenv
pyModbusTCP==0.2.0

View File

@ -43,9 +43,6 @@ class User(AbstractBaseUser):
secure_level = 1
permissions = {
'view_logs': 0,
'view_pump_stats': 1,
'users.add_user': 1,
'users.change_user': 1,
'users.delete_user': 1,
@ -55,6 +52,8 @@ class User(AbstractBaseUser):
'logs_service.change_mbtankrecord': 1,
'logs_service.delete_mbtankrecord': 1,
'logs_service.view_mbtankrecord': 0,
'logs_service.view_pump_stats': 1
}
if perm in permissions:
if permissions[perm] <= secure_level: