условно рабочее логгирование насосной, остатки удаления модели насосной станции из БД
This commit is contained in:
parent
9aab833a57
commit
250a4361ee
@ -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)
|
||||
|
@ -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'
|
||||
|
@ -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"]
|
||||
]
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -1,5 +1,4 @@
|
||||
django
|
||||
psycopg
|
||||
requests
|
||||
python-dotenv
|
||||
pyModbusTCP==0.2.0
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user