diff --git a/app/src/gen3/talent.py b/app/src/gen3/talent.py index 33d5d8d..daf700f 100644 --- a/app/src/gen3/talent.py +++ b/app/src/gen3/talent.py @@ -35,6 +35,9 @@ class Control: class Talent(Message): + STATE_INIT = 0 + STATE_UP = 2 + STATE_CLOSED = 3 def __init__(self, server_side: bool, id_str=b''): super().__init__(server_side) @@ -45,7 +48,7 @@ class Talent(Message): self.db = InfosG3() self.mb = Modbus() self.forward_modbus_resp = False - self.closed = False + self.state = self.STATE_INIT self.switch = { 0x00: self.msg_contact_info, 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 # deallocated by the garbage collector ==> we get a memory leak self.switch.clear() - self.closed = True + self.state = self.STATE_CLOSED def __set_serial_no(self, serial_no: str): @@ -126,6 +129,8 @@ class Talent(Message): return async def send_modbus_cmd(self, func, addr, val) -> None: + if self.state != self.STATE_UP: + return self.forward_modbus_resp = False self.__build_header(0x70, 0x77) self._send_buffer += b'\x00\x01\xa3\x28' # fixme @@ -331,6 +336,7 @@ class Talent(Message): self._send_buffer += b'\x01' self.__finish_send_msg() self.__process_data() + self.state = self.STATE_UP elif self.ctrl.is_resp(): return # ignore received response @@ -359,7 +365,7 @@ class Talent(Message): msg_hdr_len = self.parse_msg_header() for key, update in self.db.parse(self._recv_buffer, self.header_len - + msg_hdr_len): + + msg_hdr_len, self.node_id): if update: self.new_data[key] = True diff --git a/app/src/gen3plus/solarman_v5.py b/app/src/gen3plus/solarman_v5.py index b175cb3..823e5ab 100644 --- a/app/src/gen3plus/solarman_v5.py +++ b/app/src/gen3plus/solarman_v5.py @@ -302,6 +302,8 @@ class SolarmanV5(Message): self.__finish_send_msg() async def send_modbus_cmd(self, func, addr, val) -> None: + if self.closed: + return self.forward_modbus_resp = False self.__build_header(0x4510) self._send_buffer += struct.pack(' None: + if self.closed: + return self.__build_header(0x4510) self._send_buffer += struct.pack(f'> 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 key == 'inverter': inv_update = True diff --git a/app/src/mqtt.py b/app/src/mqtt.py index 3469201..484d7df 100644 --- a/app/src/mqtt.py +++ b/app/src/mqtt.py @@ -130,7 +130,7 @@ class Mqtt(metaclass=Singleton): topic = str(message.topic) node_id = topic.split('/')[1] + '/' 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}') fnc = getattr(m, func_name, None) if callable(fnc): @@ -148,7 +148,7 @@ class Mqtt(metaclass=Singleton): payload = message.payload.decode("UTF-8") logger_mqtt.info(f'InvCnf: {node_id}:{payload}') 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}') fnc = getattr(m, "send_modbus_cmd", None) res = payload.split(',') diff --git a/app/tests/test_talent.py b/app/tests/test_talent.py index a94df4f..202cd96 100644 --- a/app/tests/test_talent.py +++ b/app/tests/test_talent.py @@ -733,10 +733,16 @@ def test_msg_unknown(ConfigTsunInv1, MsgUnknown): m.close() def test_ctrl_byte(): + c = Control(0x70) + assert not c.is_ind() + assert not c.is_resp() + assert c.is_req() c = Control(0x91) + assert not c.is_req() assert c.is_ind() assert not c.is_resp() c = Control(0x99) + assert not c.is_req() assert not c.is_ind() assert c.is_resp() @@ -891,8 +897,9 @@ def test_msg_modbus_fragment(ConfigTsunInv1, MsgModbusResp20): @pytest.mark.asyncio async def test_msg_build_modbus_req(ConfigTsunInv1, MsgModbusCmd): ConfigTsunInv1 - m = MemoryStream(b'', (0,), False) + m = MemoryStream(b'', (0,), True) m.id_str = b"R170000000000001" + m.state = m.STATE_UP await m.send_modbus_cmd(Modbus.WRITE_SINGLE_REG, 0x2008, 0) assert 0 == m.send_msg_ofs assert m._forward_buffer == b''