From 250a4361eebb0d46b8e5a56552e03e20b4eef3c4 Mon Sep 17 00:00:00 2001 From: VladislavOstapov Date: Tue, 23 Jan 2024 17:40:20 +0300 Subject: [PATCH] =?UTF-8?q?=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=BD=D0=BE=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B5=20=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BD?= =?UTF-8?q?=D0=B0=D1=81=D0=BE=D1=81=D0=BD=D0=BE=D0=B9,=20=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D0=BA=D0=B8=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=81=D0=BE=D1=81=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=D1=86=D0=B8=D0=B8=20=D0=B8=D0=B7=20=D0=91=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logs_service/admin.py | 3 +- logs_service/apps.py | 1 + logs_service/services.py | 94 ++++++++++++++++++++++++++++++---------- logs_service/views.py | 24 ++++------ requirements.txt | 1 - users/models.py | 5 +-- 6 files changed, 85 insertions(+), 43 deletions(-) diff --git a/logs_service/admin.py b/logs_service/admin.py index 7dffb9d..c7ee86b 100644 --- a/logs_service/admin.py +++ b/logs_service/admin.py @@ -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) diff --git a/logs_service/apps.py b/logs_service/apps.py index d22e6e0..d1829b5 100644 --- a/logs_service/apps.py +++ b/logs_service/apps.py @@ -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' diff --git a/logs_service/services.py b/logs_service/services.py index a2efc97..9dc04aa 100644 --- a/logs_service/services.py +++ b/logs_service/services.py @@ -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"] - ] - } diff --git a/logs_service/views.py b/logs_service/views.py index f610557..c6bd6b3 100644 --- a/logs_service/views.py +++ b/logs_service/views.py @@ -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 diff --git a/requirements.txt b/requirements.txt index 09da131..1a04c75 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ django psycopg -requests python-dotenv pyModbusTCP==0.2.0 diff --git a/users/models.py b/users/models.py index 4b142b9..8d14048 100644 --- a/users/models.py +++ b/users/models.py @@ -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: