Добавил еще одно устройство в проект: HART модем, получающий накопленный расход от расходометра.

This commit is contained in:
2024-02-21 15:44:55 +03:00
parent 4da1ce477e
commit 0195373cc4
7 changed files with 87 additions and 11 deletions

View File

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

View File

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

View File

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