avoid sending modbus cmds in critical states
This commit is contained in:
@@ -35,6 +35,9 @@ class Control:
|
|||||||
|
|
||||||
|
|
||||||
class Talent(Message):
|
class Talent(Message):
|
||||||
|
STATE_INIT = 0
|
||||||
|
STATE_UP = 2
|
||||||
|
STATE_CLOSED = 3
|
||||||
|
|
||||||
def __init__(self, server_side: bool, id_str=b''):
|
def __init__(self, server_side: bool, id_str=b''):
|
||||||
super().__init__(server_side)
|
super().__init__(server_side)
|
||||||
@@ -45,7 +48,7 @@ class Talent(Message):
|
|||||||
self.db = InfosG3()
|
self.db = InfosG3()
|
||||||
self.mb = Modbus()
|
self.mb = Modbus()
|
||||||
self.forward_modbus_resp = False
|
self.forward_modbus_resp = False
|
||||||
self.closed = False
|
self.state = self.STATE_INIT
|
||||||
self.switch = {
|
self.switch = {
|
||||||
0x00: self.msg_contact_info,
|
0x00: self.msg_contact_info,
|
||||||
0x13: self.msg_ota_update,
|
0x13: self.msg_ota_update,
|
||||||
@@ -67,7 +70,7 @@ class Talent(Message):
|
|||||||
# so we have to erase self.switch, otherwise this instance can't be
|
# so we have to erase self.switch, otherwise this instance can't be
|
||||||
# deallocated by the garbage collector ==> we get a memory leak
|
# deallocated by the garbage collector ==> we get a memory leak
|
||||||
self.switch.clear()
|
self.switch.clear()
|
||||||
self.closed = True
|
self.state = self.STATE_CLOSED
|
||||||
|
|
||||||
def __set_serial_no(self, serial_no: str):
|
def __set_serial_no(self, serial_no: str):
|
||||||
|
|
||||||
@@ -126,6 +129,8 @@ class Talent(Message):
|
|||||||
return
|
return
|
||||||
|
|
||||||
async def send_modbus_cmd(self, func, addr, val) -> None:
|
async def send_modbus_cmd(self, func, addr, val) -> None:
|
||||||
|
if self.state != self.STATE_UP:
|
||||||
|
return
|
||||||
self.forward_modbus_resp = False
|
self.forward_modbus_resp = False
|
||||||
self.__build_header(0x70, 0x77)
|
self.__build_header(0x70, 0x77)
|
||||||
self._send_buffer += b'\x00\x01\xa3\x28' # fixme
|
self._send_buffer += b'\x00\x01\xa3\x28' # fixme
|
||||||
@@ -331,6 +336,7 @@ class Talent(Message):
|
|||||||
self._send_buffer += b'\x01'
|
self._send_buffer += b'\x01'
|
||||||
self.__finish_send_msg()
|
self.__finish_send_msg()
|
||||||
self.__process_data()
|
self.__process_data()
|
||||||
|
self.state = self.STATE_UP
|
||||||
|
|
||||||
elif self.ctrl.is_resp():
|
elif self.ctrl.is_resp():
|
||||||
return # ignore received response
|
return # ignore received response
|
||||||
@@ -359,7 +365,7 @@ class Talent(Message):
|
|||||||
msg_hdr_len = self.parse_msg_header()
|
msg_hdr_len = self.parse_msg_header()
|
||||||
|
|
||||||
for key, update in self.db.parse(self._recv_buffer, self.header_len
|
for key, update in self.db.parse(self._recv_buffer, self.header_len
|
||||||
+ msg_hdr_len):
|
+ msg_hdr_len, self.node_id):
|
||||||
if update:
|
if update:
|
||||||
self.new_data[key] = True
|
self.new_data[key] = True
|
||||||
|
|
||||||
|
|||||||
@@ -302,6 +302,8 @@ class SolarmanV5(Message):
|
|||||||
self.__finish_send_msg()
|
self.__finish_send_msg()
|
||||||
|
|
||||||
async def send_modbus_cmd(self, func, addr, val) -> None:
|
async def send_modbus_cmd(self, func, addr, val) -> None:
|
||||||
|
if self.closed:
|
||||||
|
return
|
||||||
self.forward_modbus_resp = False
|
self.forward_modbus_resp = False
|
||||||
self.__build_header(0x4510)
|
self.__build_header(0x4510)
|
||||||
self._send_buffer += struct.pack('<BHLLL', self.MB_RTU_CMD,
|
self._send_buffer += struct.pack('<BHLLL', self.MB_RTU_CMD,
|
||||||
@@ -315,6 +317,8 @@ class SolarmanV5(Message):
|
|||||||
self._send_buffer = bytearray(0)
|
self._send_buffer = bytearray(0)
|
||||||
|
|
||||||
async def send_at_cmd(self, AT_cmd: str) -> None:
|
async def send_at_cmd(self, AT_cmd: str) -> None:
|
||||||
|
if self.closed:
|
||||||
|
return
|
||||||
self.__build_header(0x4510)
|
self.__build_header(0x4510)
|
||||||
self._send_buffer += struct.pack(f'<BHLLL{len(AT_cmd)}sc', self.AT_CMD,
|
self._send_buffer += struct.pack(f'<BHLLL{len(AT_cmd)}sc', self.AT_CMD,
|
||||||
2, 0, 0, 0, AT_cmd.encode('utf-8'),
|
2, 0, 0, 0, AT_cmd.encode('utf-8'),
|
||||||
@@ -347,7 +351,8 @@ class SolarmanV5(Message):
|
|||||||
def __process_data(self, ftype):
|
def __process_data(self, ftype):
|
||||||
inv_update = False
|
inv_update = False
|
||||||
msg_type = self.control >> 8
|
msg_type = self.control >> 8
|
||||||
for key, update in self.db.parse(self._recv_buffer, msg_type, ftype):
|
for key, update in self.db.parse(self._recv_buffer, msg_type, ftype,
|
||||||
|
self.node_id):
|
||||||
if update:
|
if update:
|
||||||
if key == 'inverter':
|
if key == 'inverter':
|
||||||
inv_update = True
|
inv_update = True
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ class Mqtt(metaclass=Singleton):
|
|||||||
topic = str(message.topic)
|
topic = str(message.topic)
|
||||||
node_id = topic.split('/')[1] + '/'
|
node_id = topic.split('/')[1] + '/'
|
||||||
for m in Message:
|
for m in Message:
|
||||||
if m.server_side and not m.closed and (m.node_id == node_id):
|
if m.server_side and (m.node_id == node_id):
|
||||||
logger_mqtt.debug(f'Found: {node_id}')
|
logger_mqtt.debug(f'Found: {node_id}')
|
||||||
fnc = getattr(m, func_name, None)
|
fnc = getattr(m, func_name, None)
|
||||||
if callable(fnc):
|
if callable(fnc):
|
||||||
@@ -148,7 +148,7 @@ class Mqtt(metaclass=Singleton):
|
|||||||
payload = message.payload.decode("UTF-8")
|
payload = message.payload.decode("UTF-8")
|
||||||
logger_mqtt.info(f'InvCnf: {node_id}:{payload}')
|
logger_mqtt.info(f'InvCnf: {node_id}:{payload}')
|
||||||
for m in Message:
|
for m in Message:
|
||||||
if m.server_side and not m.closed and (m.node_id == node_id):
|
if m.server_side and (m.node_id == node_id):
|
||||||
logger_mqtt.info(f'Found: {node_id}')
|
logger_mqtt.info(f'Found: {node_id}')
|
||||||
fnc = getattr(m, "send_modbus_cmd", None)
|
fnc = getattr(m, "send_modbus_cmd", None)
|
||||||
res = payload.split(',')
|
res = payload.split(',')
|
||||||
|
|||||||
@@ -733,10 +733,16 @@ def test_msg_unknown(ConfigTsunInv1, MsgUnknown):
|
|||||||
m.close()
|
m.close()
|
||||||
|
|
||||||
def test_ctrl_byte():
|
def test_ctrl_byte():
|
||||||
|
c = Control(0x70)
|
||||||
|
assert not c.is_ind()
|
||||||
|
assert not c.is_resp()
|
||||||
|
assert c.is_req()
|
||||||
c = Control(0x91)
|
c = Control(0x91)
|
||||||
|
assert not c.is_req()
|
||||||
assert c.is_ind()
|
assert c.is_ind()
|
||||||
assert not c.is_resp()
|
assert not c.is_resp()
|
||||||
c = Control(0x99)
|
c = Control(0x99)
|
||||||
|
assert not c.is_req()
|
||||||
assert not c.is_ind()
|
assert not c.is_ind()
|
||||||
assert c.is_resp()
|
assert c.is_resp()
|
||||||
|
|
||||||
@@ -891,8 +897,9 @@ def test_msg_modbus_fragment(ConfigTsunInv1, MsgModbusResp20):
|
|||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_msg_build_modbus_req(ConfigTsunInv1, MsgModbusCmd):
|
async def test_msg_build_modbus_req(ConfigTsunInv1, MsgModbusCmd):
|
||||||
ConfigTsunInv1
|
ConfigTsunInv1
|
||||||
m = MemoryStream(b'', (0,), False)
|
m = MemoryStream(b'', (0,), True)
|
||||||
m.id_str = b"R170000000000001"
|
m.id_str = b"R170000000000001"
|
||||||
|
m.state = m.STATE_UP
|
||||||
await m.send_modbus_cmd(Modbus.WRITE_SINGLE_REG, 0x2008, 0)
|
await m.send_modbus_cmd(Modbus.WRITE_SINGLE_REG, 0x2008, 0)
|
||||||
assert 0 == m.send_msg_ofs
|
assert 0 == m.send_msg_ofs
|
||||||
assert m._forward_buffer == b''
|
assert m._forward_buffer == b''
|
||||||
|
|||||||
Reference in New Issue
Block a user