From 19871d1234b7b9b55a14d39e54f24e164a48e480 Mon Sep 17 00:00:00 2001 From: valoka Date: Sun, 18 Jan 2026 22:33:10 +0900 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D0=BA=20=D0=BF=D0=B5=D1=80=D0=B5=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=20=D0=BD=D0=B0=20pyserial-asyncio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ lib/OCer.py | 72 +++++++++++++++++++++++++++++++++++------------------ main.py | 3 ++- 3 files changed, 52 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index fcf0f30..8fc1bf0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ test/ +test.py + # ---> Python # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/lib/OCer.py b/lib/OCer.py index 99f3578..977d1a6 100644 --- a/lib/OCer.py +++ b/lib/OCer.py @@ -3,6 +3,7 @@ import time import configparser import logging import socket +import asyncio import lib.lomka as lomka class caser: @@ -43,12 +44,12 @@ class caser: self.connection : serial.Serial # Определение базовых констант/команд - self.default_consts = {True: 17, - False: 0, - "INFO": 51, - "READ_HEADER": 128, - "RESPONSE_LENGHT": 5, - "MANIPULATE_HEADER": 138} + self.default_consts = {True: 17, + False: 0, + "INFO": 51, + "READ_HEADER": 128, + "MANIPULATE_HEADER": 138, + "RESPONSE_LENGHT": 5} def find_comport(self, some_open_ports : list): '''Находит и возвращает корректный comport (объект)''' @@ -80,9 +81,9 @@ class caser: self.controller_number = hex(controller_number) - def send_command(self, cell_number : int, command : int, - bytes_count=5, header=138): - active_comport = serial.Serial(self.comport, baudrate=self.baudrate) + def send_command(self, cell_number : int, command: int, + bytes_count=15, header=138): + active_comport = serial.Serial(self.comport, baudrate=self.baudrate, timeout=2) self.logger.info(f"Connected to {active_comport.name }") # 1 - header(8Ahex) (138dec), 2 - controller number(01), 3 - cell number(04), 4 - command(11), 5 - checksum(9E) @@ -91,7 +92,7 @@ class caser: int(self.controller_number, 16).to_bytes(1, 'little'), cell_number.to_bytes(1, 'little'), command.to_bytes(1, 'little')] - + data_string = b'' for i in data: data_string += i @@ -103,7 +104,7 @@ class caser: return active_comport.read(bytes_count) def read_controller(self, cell_number : int, command=51, header=128): - active_comport = serial.Serial(self.comport, baudrate=self.baudrate) + active_comport = serial.Serial(self.comport, baudrate=self.baudrate, timeout=2) self.logger.info(f"Connected to {active_comport.name }") data = [header.to_bytes(1, 'little'), int(self.controller_number, 16).to_bytes(1, 'little'), @@ -120,21 +121,37 @@ class caser: active_comport.write(data_string) return active_comport.read(5) - def READ_ALL_LOCKS(self): - # try: - return self.send_command(0, self.default_consts["INFO"], - 5, - header=self.default_consts["READ_HEADER"]) - # except Exception as error: - # return str(error) - - def OPEN_ALL_LOCKS(self, confirm : bool): + def READ_ALL_CELLS(self): '''и возвращает состояние всех замков''' + try: + result = [] + for i in range(0, self.controller_capacity - 1): + answer = self.send_command(cell_number=i, + command=self.default_consts["INFO"], + bytes_count=self.default_consts["RESPONSE_LENGHT"], + header=self.default_consts["READ_HEADER"]) + result.append({"CELL_NUMBER": i, + "CURRENT_STATUS": True if answer[-2] == 17 else False, + "FULL_ANSWER": answer}) + return result + except Exception as error: + return str(error) + + def OPEN_ALL_CELLS_LEGACY(self, confirm : bool): + '''Открывает все замки вручную и возвращает состояние всех замков + Confirm - подтверждение операции''' if confirm: try: - return self.send_command(0, self.default_consts[True], - self.default_consts["READ_HEADER"], - bytes_count=self.controller_capacity) + result = [] + for i in range(1, self.controller_capacity + 1): + answer = self.send_command(cell_number=i, + command=self.default_consts[True], + bytes_count=self.default_consts["RESPONSE_LENGHT"], + header=self.default_consts["MANIPULATE_HEADER"]) + result.append({"CELL_NUMBER": i, + "CURRENT_STATUS": True if answer[-2] == 17 else False, + "FULL_ANSWER": answer}) + return result except Exception as error: return str(error) else: @@ -155,6 +172,13 @@ class caser: # return str(error) pass + #хочу асинхронности def watchdog(self): - pass + '''Слушает контролер в реальном времени и возвращает bytearray с событием''' + try: + active_comport = serial.Serial(self.comport, baudrate=self.baudrate, timeout=2) + self.logger.info(f" |WD| Connected to (as Watchdog) {active_comport.name }") + + except Exception as error: + self.logger.critical(f"{error}") diff --git a/main.py b/main.py index 5e82811..83bc36b 100644 --- a/main.py +++ b/main.py @@ -30,7 +30,8 @@ if __name__ == "__main__": zxc.set_port_device() zxc.set_controller_capacity(18) # добавь *aargs - zxc.READ_ALL_LOCKS() + #print(zxc.READ_ALL_CELLS()) + print(zxc.OPEN_ALL_CELLS_LEGACY(True)) # print(zxc.read_controller(1)) # print(zxc.send_command(1, 17)) # print(zxc.read_controller(1)) \ No newline at end of file