From 0195373cc4083edf990185df6ea17d61af2ae0cd Mon Sep 17 00:00:00 2001 From: VladislavOstapov Date: Wed, 21 Feb 2024 15:44:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B5=D1=89=D0=B5=20=D0=BE=D0=B4=D0=BD=D0=BE=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=BE=20=D0=B2=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82:=20HART=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D0=BC,=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B0?= =?UTF-8?q?=D1=8E=D1=89=D0=B8=D0=B9=20=D0=BD=D0=B0=D0=BA=D0=BE=D0=BF=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=80=D0=B0=D1=81=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=20=D0=BE=D1=82=20=D1=80=D0=B0=D1=81=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=D1=82=D1=80=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env-template | 11 ++++++++++- logs_service/apps.py | 30 +++++++++++++++++++++++------- logs_service/services.py | 24 ++++++++++++++++++++++++ logs_service/views.py | 18 ++++++++++++++++-- static/js/index-main.js | 8 ++++++++ templates/index.html | 3 +++ users/models.py | 4 +++- 7 files changed, 87 insertions(+), 11 deletions(-) diff --git a/.env-template b/.env-template index b43b8a6..da19f31 100644 --- a/.env-template +++ b/.env-template @@ -12,15 +12,24 @@ DB_PORT=5432 # секретный ключ Django DJANGO_SECRET="django-secure" -# включение/отключение сервисов ModBus +# Настройки сервисов modbus + +# Резервуар ENABLE_MB_TANK_SERVICE=1 MB_TANK_ADDRESS="10.8.105.3" MB_TANK_PORT=504 MB_TANK_SCAN_RATE_MS=60000 +# Насосная ENABLE_MB_PUMP_SERVICE=1 MB_PUMP_ADDRESS="10.8.105.2" MB_PUMP_PORT=503 MB_PUMP_SCAN_RATE_MS=5000 +# Преобразователь HART-Modbus TCP для расходометра +ENABLE_MB_HART_SERVICE=1 +MB_HART_ADDRESS="10.8.105.2" +MB_HART_PORT=602 +MB_HART_SCAN_RATE_MS=5000 + LOGGER_SAVE_DAYS=60 diff --git a/logs_service/apps.py b/logs_service/apps.py index fda7dbe..c9bdd43 100644 --- a/logs_service/apps.py +++ b/logs_service/apps.py @@ -11,9 +11,11 @@ class LogsServiceConfig(AppConfig): mb_tank_service = None mb_pump_service = None + mb_hart_service = None - mb_tank_service_enable = True - mb_pump_service_enable = True + mb_tank_service_enable = False + mb_pump_service_enable = False + mb_hart_service_enable = False def ready(self): # защита от двойного запуска @@ -21,13 +23,16 @@ class LogsServiceConfig(AppConfig): return print(f"Running logger service in process with pid={os.getpid()}") - from .services import MbTankService, MbPumpService + from .services import MbTankService, MbPumpService, MbHartService # включение/выключение сервисов - mb_tank_service_enable = os.getenv('ENABLE_MB_TANK_SERVICE', '1') - LogsServiceConfig.mb_tank_service_enable = int(mb_tank_service_enable) != 0 + _en = os.getenv('ENABLE_MB_TANK_SERVICE', '1') + LogsServiceConfig.mb_tank_service_enable = int(_en) != 0 - mb_pump_service_enable = os.getenv('ENABLE_MB_PUMP_SERVICE', '1') - LogsServiceConfig.mb_pump_service_enable = int(mb_pump_service_enable) != 0 + _en = os.getenv('ENABLE_MB_PUMP_SERVICE', '1') + LogsServiceConfig.mb_pump_service_enable = int(_en) != 0 + + _en = os.getenv('ENABLE_MB_HART_SERVICE', '1') + LogsServiceConfig.mb_hart_service_enable = int(_en) != 0 save_days = int(os.getenv('LOGGER_SAVE_DAYS')) @@ -44,6 +49,12 @@ class LogsServiceConfig(AppConfig): scan_rate=int(os.getenv('MB_PUMP_SCAN_RATE_MS')), save_days=save_days) + if LogsServiceConfig.mb_hart_service_enable: + LogsServiceConfig.mb_hart_service = MbHartService(ip_addr=os.getenv('MB_HART_ADDRESS'), + port=int(os.getenv('MB_HART_PORT')), + scan_rate=int(os.getenv('MB_HART_SCAN_RATE_MS')), + save_days=save_days) + # запуск сервисов if LogsServiceConfig.mb_tank_service_enable: if DEBUG: @@ -55,6 +66,11 @@ class LogsServiceConfig(AppConfig): print('Creating service MbPumpService...') LogsServiceConfig.mb_pump_service.start() + if LogsServiceConfig.mb_hart_service_enable: + if DEBUG: + print('Creating service MbHartService...') + LogsServiceConfig.mb_hart_service.start() + return True diff --git a/logs_service/services.py b/logs_service/services.py index 5c5be51..5c3083a 100644 --- a/logs_service/services.py +++ b/logs_service/services.py @@ -181,3 +181,27 @@ class MbPumpService(MbService): 'half_auto_control': None } + +class MbHartService(MbService): + def __init__(self, **kwargs): + super().__init__(**kwargs) + self._lock = Lock() + self._curr_state = None + + def _load_current_state(self): + # D?: flow_meter + values = self.mb.read_holding_registers(600, 1) + if values is None: + raise AssertionError('failed to load current state') + with self._lock: + self._curr_state = { + 'accumulated_flow': values[0] + } + + def get_stats(self): + with self._lock: + # копируем данные, если они есть в текущем состоянии (иначе пустые поля) + return self._curr_state or { + 'accumulated_flow': None + } + diff --git a/logs_service/views.py b/logs_service/views.py index cf8a931..4fd6150 100644 --- a/logs_service/views.py +++ b/logs_service/views.py @@ -10,16 +10,30 @@ from .apps import LogsServiceConfig @permission_required(perm='logs_service.view_mbtankrecord', raise_exception=True) def view_stats(request): print(f"Executing view_stats in process with pid={os.getpid()}") - tank = MbTankRecord.load_stats() + + # данные резервуара + tank = {} + if request.user.has_perm('logs_service.view_mbtankrecord'): + if LogsServiceConfig.mb_pump_service is not None and LogsServiceConfig.mb_pump_service_enable: + tank = MbTankRecord.load_stats() + + # данные насосной pump = {} if request.user.has_perm('logs_service.view_pump_stats'): if LogsServiceConfig.mb_pump_service is not None and LogsServiceConfig.mb_pump_service_enable: pump = LogsServiceConfig.mb_pump_service.get_stats() + # данные HART-модема, он же расходометр + hart = {} + if request.user.has_perm('logs_service.view_accumulated_flow'): + if LogsServiceConfig.mb_hart_service is not None and LogsServiceConfig.mb_hart_service_enable: + hart = LogsServiceConfig.mb_hart_service.get_stats() + out = { 'stats': { 'tank': tank, - 'pump': pump + 'pump': pump, + 'hart': hart } } response = HttpResponse(json.dumps(out)) diff --git a/static/js/index-main.js b/static/js/index-main.js index 3ecc85a..6a2a7e1 100644 --- a/static/js/index-main.js +++ b/static/js/index-main.js @@ -355,6 +355,14 @@ const updateFunctions = { } }, + 'pump-accumulated-flow': { + 'get_val': (dataset) => { return dataset['hart']['accumulated_flow'] }, + 'handler': (element, value) => { + element.innerHTML = value + return null + } + }, + // 'id': { // 'get_val': (dataset) => { return dataset['...']['...'] }, // 'handler': (element, value) => { diff --git a/templates/index.html b/templates/index.html index 7ab79e8..4d92b2d 100644 --- a/templates/index.html +++ b/templates/index.html @@ -60,6 +60,9 @@

Регистр аварий:

Состояние КА:

Текущий расход: м³/ч

+ {% if perms.logs_service.view_accumulated_flow %} +

Накопленный расход: м³

+ {% endif %} {% endif %} diff --git a/users/models.py b/users/models.py index 68b978e..347bf55 100644 --- a/users/models.py +++ b/users/models.py @@ -62,7 +62,9 @@ class User(AbstractBaseUser): 'logs_service.delete_mbtankrecord': UserAccessLevel.ADMIN, 'logs_service.view_mbtankrecord': UserAccessLevel.BASIC, - 'logs_service.view_pump_stats': UserAccessLevel.ENGINEER + 'logs_service.view_pump_stats': UserAccessLevel.ENGINEER, + + 'logs_service.view_accumulated_flow': UserAccessLevel.ADMIN, } if perm in permissions: if permissions[perm] <= self.access_level: