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

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 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)

View File

@ -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'

View File

@ -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
# }
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 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

View File

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

View File

@ -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: