use AsyncIfc class with FIFO

This commit is contained in:
Stefan Allius
2024-09-22 10:40:30 +02:00
parent af81aef07c
commit b7c63b5cf8
12 changed files with 380 additions and 359 deletions

View File

@@ -5,6 +5,7 @@ import asyncio
import logging
import random
from math import isclose
from app.src.async_ifc import AsyncIfc
from app.src.gen3plus.solarman_v5 import SolarmanV5
from app.src.config import Config
from app.src.infos import Infos, Register
@@ -20,13 +21,6 @@ Infos.static_init()
timestamp = int(time.time()) # 1712861197
heartbeat = 60
class Writer():
def __init__(self):
self.sent_pdu = b''
def write(self, pdu: bytearray):
self.sent_pdu = pdu
class Mqtt():
def __init__(self):
@@ -40,12 +34,14 @@ class Mqtt():
class MemoryStream(SolarmanV5):
def __init__(self, msg, chunks = (0,), server_side: bool = True):
super().__init__(server_side, client_mode=False)
_ifc = AsyncIfc()
super().__init__(server_side, client_mode=False, ifc=_ifc)
if server_side:
self.mb.timeout = 0.4 # overwrite for faster testing
self.mb_first_timeout = 0.5
self.mb_timeout = 0.5
self.writer = Writer()
self.sent_pdu = b''
self.ifc.write.reg_trigger(self.write_cb)
self.mqtt = Mqtt()
self.__msg = msg
self.__msg_len = len(msg)
@@ -64,6 +60,9 @@ class MemoryStream(SolarmanV5):
self.data = ''
self.msg_recvd = []
def write_cb(self):
self.sent_pdu = self.ifc.write.get()
def _timestamp(self):
return timestamp
@@ -86,11 +85,11 @@ class MemoryStream(SolarmanV5):
chunk_len = self.__chunks[self.__chunk_idx]
self.__chunk_idx += 1
if chunk_len!=0:
self._recv_buffer += self.__msg[self.__offs:chunk_len]
self.ifc.read += self.__msg[self.__offs:chunk_len]
copied_bytes = chunk_len - self.__offs
self.__offs = chunk_len
else:
self._recv_buffer += self.__msg[self.__offs:]
self.ifc.read += self.__msg[self.__offs:]
copied_bytes = self.__msg_len - self.__offs
self.__offs = self.__msg_len
except Exception:
@@ -690,8 +689,8 @@ def test_read_message(device_ind_msg):
assert m.control == 0x4110
assert str(m.seq) == '01:00'
assert m.data_len == 0xd4
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -711,8 +710,8 @@ def test_invalid_start_byte(invalid_start_byte, device_ind_msg):
assert m.control == 0x4110
assert str(m.seq) == '01:00'
assert m.data_len == 0xd4
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 1
m.close()
@@ -731,8 +730,8 @@ def test_invalid_stop_byte(invalid_stop_byte):
assert m.control == 0x4110
assert str(m.seq) == '01:00'
assert m.data_len == 0xd4
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 1
m.close()
@@ -756,8 +755,8 @@ def test_invalid_stop_byte2(invalid_stop_byte, device_ind_msg):
assert m.msg_recvd[1]['data_len']==0xd4
assert m.unique_id == None
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 1
m.close()
@@ -778,8 +777,8 @@ def test_invalid_stop_start_byte(invalid_stop_byte, invalid_start_byte):
assert m.control == 0x4110
assert str(m.seq) == '01:00'
assert m.data_len == 0xd4
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 1
m.close()
@@ -802,8 +801,8 @@ def test_invalid_checksum(invalid_checksum, device_ind_msg):
assert m.msg_recvd[1]['control']==0x4110
assert m.msg_recvd[1]['seq']=='01:00'
assert m.msg_recvd[1]['data_len']==0xd4
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 1
m.close()
@@ -824,7 +823,7 @@ def test_read_message_twice(config_no_tsun_inv1, device_ind_msg, device_rsp_msg)
assert m.msg_recvd[1]['control']==0x4110
assert m.msg_recvd[1]['seq']=='01:01'
assert m.msg_recvd[1]['data_len']==0xd4
assert m._send_buffer==device_rsp_msg+device_rsp_msg
assert m.ifc.write.get()==device_rsp_msg+device_rsp_msg
assert m._forward_buffer==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -897,11 +896,10 @@ def test_read_two_messages(config_tsun_allow_all, device_ind_msg, device_rsp_msg
assert '02b0' == m.db.get_db_value(Register.SENSOR_LIST, None)
assert 0x02b0 == m.sensor_list
assert m._forward_buffer==device_ind_msg+inverter_ind_msg
assert m._send_buffer==device_rsp_msg+inverter_rsp_msg
assert m.ifc.write.get()==device_rsp_msg+inverter_rsp_msg
m._send_buffer = bytearray(0) # clear send buffer for next test
m._init_new_client_conn()
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
m.close()
def test_read_two_messages2(config_tsun_allow_all, inverter_ind_msg, inverter_ind_msg_81, inverter_rsp_msg, inverter_rsp_msg_81):
@@ -923,11 +921,10 @@ def test_read_two_messages2(config_tsun_allow_all, inverter_ind_msg, inverter_in
assert m.msg_recvd[1]['data_len']==0x199
assert m.time_ofs == 0x33e447a0
assert m._forward_buffer==inverter_ind_msg+inverter_ind_msg_81
assert m._send_buffer==inverter_rsp_msg+inverter_rsp_msg_81
assert m.ifc.write.get()==inverter_rsp_msg+inverter_rsp_msg_81
m._send_buffer = bytearray(0) # clear send buffer for next test
m._init_new_client_conn()
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
m.close()
def test_read_two_messages3(config_tsun_allow_all, device_ind_msg2, device_rsp_msg2, inverter_ind_msg, inverter_rsp_msg):
@@ -953,11 +950,10 @@ def test_read_two_messages3(config_tsun_allow_all, device_ind_msg2, device_rsp_m
assert '02b0' == m.db.get_db_value(Register.SENSOR_LIST, None)
assert 0x02b0 == m.sensor_list
assert m._forward_buffer==inverter_ind_msg+device_ind_msg2
assert m._send_buffer==inverter_rsp_msg+device_rsp_msg2
assert m.ifc.write.get()==inverter_rsp_msg+device_rsp_msg2
m._send_buffer = bytearray(0) # clear send buffer for next test
m._init_new_client_conn()
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
m.close()
def test_unkown_frame_code(config_tsun_inv1, inverter_ind_msg_81, inverter_rsp_msg_81):
@@ -972,8 +968,8 @@ def test_unkown_frame_code(config_tsun_inv1, inverter_ind_msg_81, inverter_rsp_m
assert m.control == 0x4210
assert str(m.seq) == '03:03'
assert m.data_len == 0x199
assert m._recv_buffer==b''
assert m._send_buffer==inverter_rsp_msg_81
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==inverter_rsp_msg_81
assert m._forward_buffer==inverter_ind_msg_81
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -990,8 +986,8 @@ def test_unkown_message(config_tsun_inv1, unknown_msg):
assert m.control == 0x5110
assert str(m.seq) == '84:10'
assert m.data_len == 0x0a
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==unknown_msg
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1008,8 +1004,8 @@ def test_device_rsp(config_tsun_inv1, device_rsp_msg):
assert m.control == 0x1110
assert str(m.seq) == '01:01'
assert m.data_len == 0x0a
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1026,8 +1022,8 @@ def test_inverter_rsp(config_tsun_inv1, inverter_rsp_msg):
assert m.control == 0x1210
assert str(m.seq) == '02:02'
assert m.data_len == 0x0a
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1043,8 +1039,8 @@ def test_heartbeat_ind(config_tsun_inv1, heartbeat_ind_msg, heartbeat_rsp_msg):
assert m.control == 0x4710
assert str(m.seq) == '84:11' # value after sending response
assert m.data_len == 0x01
assert m._recv_buffer==b''
assert m._send_buffer==heartbeat_rsp_msg
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==heartbeat_rsp_msg
assert m._forward_buffer==heartbeat_ind_msg
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1061,8 +1057,8 @@ def test_heartbeat_ind2(config_tsun_inv1, heartbeat_ind_msg, heartbeat_rsp_msg):
assert m.control == 0x4710
assert str(m.seq) == '84:11' # value after sending response
assert m.data_len == 0x01
assert m._recv_buffer==b''
assert m._send_buffer==heartbeat_rsp_msg
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==heartbeat_rsp_msg
assert m._forward_buffer==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1079,8 +1075,8 @@ def test_heartbeat_rsp(config_tsun_inv1, heartbeat_rsp_msg):
assert m.control == 0x1710
assert str(m.seq) == '11:84' # value after sending response
assert m.data_len == 0x0a
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1096,8 +1092,8 @@ def test_sync_start_ind(config_tsun_inv1, sync_start_ind_msg, sync_start_rsp_msg
assert m.control == 0x4310
assert str(m.seq) == '0d:0d' # value after sending response
assert m.data_len == 47
assert m._recv_buffer==b''
assert m._send_buffer==sync_start_rsp_msg
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==sync_start_rsp_msg
assert m._forward_buffer==sync_start_ind_msg
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
@@ -1120,8 +1116,8 @@ def test_sync_start_rsp(config_tsun_inv1, sync_start_rsp_msg):
assert m.control == 0x1310
assert str(m.seq) == '0d:0d' # value after sending response
assert m.data_len == 0x0a
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1137,8 +1133,8 @@ def test_sync_end_ind(config_tsun_inv1, sync_end_ind_msg, sync_end_rsp_msg):
assert m.control == 0x4810
assert str(m.seq) == '07:07' # value after sending response
assert m.data_len == 60
assert m._recv_buffer==b''
assert m._send_buffer==sync_end_rsp_msg
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==sync_end_rsp_msg
assert m._forward_buffer==sync_end_ind_msg
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1155,8 +1151,8 @@ def test_sync_end_rsp(config_tsun_inv1, sync_end_rsp_msg):
assert m.control == 0x1810
assert str(m.seq) == '07:07' # value after sending response
assert m.data_len == 0x0a
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1175,9 +1171,9 @@ def test_build_modell_600(config_tsun_allow_all, inverter_ind_msg):
assert '02b0' == m.db.get_db_value(Register.SENSOR_LIST, None)
assert 0 == m.sensor_list # must not been set by an inverter data ind
m._send_buffer = bytearray(0) # clear send buffer for next test
m.ifc.write.clear() # clear send buffer for next test
m._init_new_client_conn()
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
m.close()
def test_build_modell_1600(config_tsun_allow_all, inverter_ind_msg1600):
@@ -1241,9 +1237,9 @@ def test_build_logger_modell(config_tsun_allow_all, device_ind_msg):
def test_msg_iterator():
Message._registry.clear()
m1 = SolarmanV5(server_side=True, client_mode=False)
m2 = SolarmanV5(server_side=True, client_mode=False)
m3 = SolarmanV5(server_side=True, client_mode=False)
m1 = SolarmanV5(server_side=True, client_mode=False, ifc=AsyncIfc())
m2 = SolarmanV5(server_side=True, client_mode=False, ifc=AsyncIfc())
m3 = SolarmanV5(server_side=True, client_mode=False, ifc=AsyncIfc())
m3.close()
del m3
test1 = 0
@@ -1261,7 +1257,7 @@ def test_msg_iterator():
assert test2 == 1
def test_proxy_counter():
m = SolarmanV5(server_side=True, client_mode=False)
m = SolarmanV5(server_side=True, client_mode=False, ifc=AsyncIfc())
assert m.new_data == {}
m.db.stat['proxy']['Unknown_Msg'] = 0
Infos.new_stat_data['proxy'] = False
@@ -1285,16 +1281,16 @@ async def test_msg_build_modbus_req(config_tsun_inv1, device_ind_msg, device_rsp
m.read()
assert m.control == 0x4110
assert str(m.seq) == '01:01'
assert m._send_buffer==device_rsp_msg
assert m.ifc.write.get()==device_rsp_msg
assert m._forward_buffer==device_ind_msg
m._send_buffer = bytearray(0) # clear send buffer for next test
m.ifc.write.clear() # clear send buffer for next test
m._forward_buffer = bytearray(0) # clear send buffer for next test
await m.send_modbus_cmd(Modbus.WRITE_SINGLE_REG, 0x2008, 0, logging.DEBUG)
assert 0 == m.send_msg_ofs
assert m._forward_buffer == b''
assert m.writer.sent_pdu == b'' # modbus command must be ignore, cause connection is still not up
assert m._send_buffer == b'' # modbus command must be ignore, cause connection is still not up
assert m.sent_pdu == b'' # modbus command must be ignore, cause connection is still not up
assert m.ifc.write.get() == b'' # modbus command must be ignore, cause connection is still not up
m.append_msg(inverter_ind_msg)
m.read()
@@ -1304,24 +1300,22 @@ async def test_msg_build_modbus_req(config_tsun_inv1, device_ind_msg, device_rsp
assert m.msg_recvd[0]['seq']=='01:01'
assert m.msg_recvd[1]['control']==0x4210
assert m.msg_recvd[1]['seq']=='02:02'
assert m._recv_buffer==b''
assert m._send_buffer==inverter_rsp_msg
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==inverter_rsp_msg
assert m._forward_buffer==inverter_ind_msg
m._send_buffer = bytearray(0) # clear send buffer for next test
m._forward_buffer = bytearray(0) # clear send buffer for next test
await m.send_modbus_cmd(Modbus.WRITE_SINGLE_REG, 0x2008, 0, logging.DEBUG)
assert 0 == m.send_msg_ofs
assert m._forward_buffer == b''
assert m.writer.sent_pdu == msg_modbus_cmd
assert m._send_buffer == b''
assert m.sent_pdu == msg_modbus_cmd
assert m.ifc.write.get()== b''
m._send_buffer = bytearray(0) # clear send buffer for next test
m.test_exception_async_write = True
await m.send_modbus_cmd(Modbus.WRITE_SINGLE_REG, 0x2008, 0, logging.DEBUG)
assert 0 == m.send_msg_ofs
assert m._forward_buffer == b''
assert m._send_buffer == b''
assert m.ifc.write.get() == b''
m.close()
@pytest.mark.asyncio
@@ -1331,13 +1325,12 @@ async def test_at_cmd(config_tsun_allow_all, device_ind_msg, device_rsp_msg, inv
m.read() # read device ind
assert m.control == 0x4110
assert str(m.seq) == '01:01'
assert m._send_buffer==device_rsp_msg
assert m.ifc.write.get()==device_rsp_msg
assert m._forward_buffer==device_ind_msg
m._send_buffer = bytearray(0) # clear send buffer for next test
m._forward_buffer = bytearray(0) # clear send buffer for next test
await m.send_at_cmd('AT+TIME=214028,1,60,120')
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert str(m.seq) == '01:01'
assert m.mqtt.key == ''
@@ -1347,33 +1340,31 @@ async def test_at_cmd(config_tsun_allow_all, device_ind_msg, device_rsp_msg, inv
m.read() # read inverter ind
assert m.control == 0x4210
assert str(m.seq) == '02:02'
assert m._send_buffer==inverter_rsp_msg
assert m.ifc.write.get()==inverter_rsp_msg
assert m._forward_buffer==inverter_ind_msg
m._send_buffer = bytearray(0) # clear send buffer for next test
m._forward_buffer = bytearray(0) # clear send buffer for next test
await m.send_at_cmd('AT+TIME=214028,1,60,120')
assert m._send_buffer==at_command_ind_msg
assert m.ifc.write.get()==at_command_ind_msg
assert m._forward_buffer==b''
assert str(m.seq) == '02:03'
assert m.mqtt.key == ''
assert m.mqtt.data == ""
m._send_buffer = bytearray(0) # clear send buffer for next test
m.append_msg(at_command_rsp_msg)
m.read() # read at resp
assert m.control == 0x1510
assert str(m.seq) == '03:03'
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert m.key == 'at_resp'
assert m.data == "+ok"
m.test_exception_async_write = True
await m.send_at_cmd('AT+TIME=214028,1,60,120')
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert str(m.seq) == '03:04'
assert m.forward_at_cmd_resp == False
@@ -1388,13 +1379,12 @@ async def test_at_cmd_blocked(config_tsun_allow_all, device_ind_msg, device_rsp_
m.read()
assert m.control == 0x4110
assert str(m.seq) == '01:01'
assert m._send_buffer==device_rsp_msg
assert m.ifc.write.get()==device_rsp_msg
assert m._forward_buffer==device_ind_msg
m._send_buffer = bytearray(0) # clear send buffer for next test
m._forward_buffer = bytearray(0) # clear send buffer for next test
await m.send_at_cmd('AT+WEBU')
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert str(m.seq) == '01:01'
assert m.mqtt.key == ''
@@ -1404,15 +1394,14 @@ async def test_at_cmd_blocked(config_tsun_allow_all, device_ind_msg, device_rsp_
m.read()
assert m.control == 0x4210
assert str(m.seq) == '02:02'
assert m._recv_buffer==b''
assert m._send_buffer==inverter_rsp_msg
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==inverter_rsp_msg
assert m._forward_buffer==inverter_ind_msg
m._send_buffer = bytearray(0) # clear send buffer for next test
m._forward_buffer = bytearray(0) # clear send buffer for next test
await m.send_at_cmd('AT+WEBU')
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert str(m.seq) == '02:02'
assert m.forward_at_cmd_resp == False
@@ -1435,8 +1424,8 @@ def test_at_cmd_ind(config_tsun_inv1, at_command_ind_msg):
assert m.control == 0x4510
assert str(m.seq) == '03:02'
assert m.data_len == 39
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==at_command_ind_msg
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
assert m.db.stat['proxy']['AT_Command'] == 1
@@ -1459,8 +1448,8 @@ def test_at_cmd_ind_block(config_tsun_inv1, at_command_ind_msg_block):
assert m.control == 0x4510
assert str(m.seq) == '03:02'
assert m.data_len == 23
assert m._recv_buffer==b''
assert m._send_buffer==b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m._forward_buffer==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
assert m.db.stat['proxy']['AT_Command'] == 0
@@ -1482,7 +1471,7 @@ def test_msg_at_command_rsp1(config_tsun_inv1, at_command_rsp_msg):
assert m.header_len==11
assert m.data_len==17
assert m._forward_buffer==at_command_rsp_msg
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
m.close()
@@ -1501,7 +1490,7 @@ def test_msg_at_command_rsp2(config_tsun_inv1, at_command_rsp_msg):
assert m.header_len==11
assert m.data_len==17
assert m._forward_buffer==b''
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
m.close()
@@ -1526,8 +1515,8 @@ def test_msg_modbus_req(config_tsun_inv1, msg_modbus_cmd, msg_modbus_cmd_fwd):
assert c.header_len==11
assert c.data_len==23
assert c._forward_buffer==b''
assert c._send_buffer==b''
assert m.writer.sent_pdu == msg_modbus_cmd_fwd
assert c.ifc.write.get()==b''
assert m.sent_pdu == msg_modbus_cmd_fwd
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['AT_Command'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 1
@@ -1553,8 +1542,8 @@ def test_msg_modbus_req2(config_tsun_inv1, msg_modbus_cmd_crc_err):
assert c.header_len==11
assert c.data_len==23
assert c._forward_buffer==b''
assert c._send_buffer==b''
assert m.writer.sent_pdu==b''
assert c.ifc.write.get()==b''
assert m.sent_pdu==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['AT_Command'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
@@ -1576,7 +1565,7 @@ def test_msg_unknown_cmd_req(config_tsun_inv1, msg_unknown_cmd):
assert m.header_len==11
assert m.data_len==23
assert m._forward_buffer==msg_unknown_cmd
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['AT_Command'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
@@ -1597,7 +1586,7 @@ def test_msg_modbus_rsp1(config_tsun_inv1, msg_modbus_rsp):
assert m.header_len==11
assert m.data_len==59
assert m._forward_buffer==b''
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
m.close()
@@ -1621,7 +1610,7 @@ def test_msg_modbus_rsp2(config_tsun_inv1, msg_modbus_rsp):
assert m.mb.err == 0
assert m.msg_count == 1
assert m._forward_buffer==msg_modbus_rsp
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
assert m.db.get_db_value(Register.VERSION) == 'V4.0.10'
assert m.new_data['inverter'] == True
m.new_data['inverter'] = False
@@ -1634,7 +1623,7 @@ def test_msg_modbus_rsp2(config_tsun_inv1, msg_modbus_rsp):
assert m.mb.err == 0
assert m.msg_count == 2
assert m._forward_buffer==msg_modbus_rsp
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
assert m.db.get_db_value(Register.VERSION) == 'V4.0.10'
assert m.new_data['inverter'] == False
@@ -1659,7 +1648,7 @@ def test_msg_modbus_rsp3(config_tsun_inv1, msg_modbus_rsp):
assert m.mb.err == 0
assert m.msg_count == 1
assert m._forward_buffer==msg_modbus_rsp
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
assert m.db.get_db_value(Register.VERSION) == 'V4.0.10'
assert m.new_data['inverter'] == True
m.new_data['inverter'] = False
@@ -1671,7 +1660,7 @@ def test_msg_modbus_rsp3(config_tsun_inv1, msg_modbus_rsp):
assert m.mb.err == 5
assert m.msg_count == 2
assert m._forward_buffer==b''
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
assert m.db.get_db_value(Register.VERSION) == 'V4.0.10'
assert m.new_data['inverter'] == False
@@ -1690,7 +1679,7 @@ def test_msg_unknown_rsp(config_tsun_inv1, msg_unknown_cmd_rsp):
assert m.header_len==11
assert m.data_len==59
assert m._forward_buffer==msg_unknown_cmd_rsp
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
m.close()
@@ -1704,7 +1693,7 @@ def test_msg_modbus_invalid(config_tsun_inv1, msg_modbus_invalid):
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
assert m.msg_count == 1
assert m._forward_buffer==b''
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
m.close()
@@ -1727,7 +1716,7 @@ def test_msg_modbus_fragment(config_tsun_inv1, msg_modbus_rsp):
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
assert m.msg_count == 1
assert m._forward_buffer==msg_modbus_rsp
assert m._send_buffer == b''
assert m.ifc.write.get()== b''
assert m.mb.err == 0
assert m.modbus_elms == 20-1 # register 0x300d is unknown, so one value can't be mapped
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
@@ -1750,28 +1739,27 @@ async def test_modbus_polling(config_tsun_inv1, heartbeat_ind_msg, heartbeat_rsp
assert m.control == 0x4710
assert str(m.seq) == '84:11' # value after sending response
assert m.data_len == 0x01
assert m._recv_buffer==b''
assert m._send_buffer==heartbeat_rsp_msg
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==heartbeat_rsp_msg
assert m._forward_buffer==heartbeat_ind_msg
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m._send_buffer = bytearray(0) # clear send buffer for next test
assert m.state == State.up
assert isclose(m.mb_timeout, 0.5)
assert next(m.mb_timer.exp_count) == 0
await asyncio.sleep(0.5)
assert m.writer.sent_pdu==bytearray(b'\xa5\x17\x00\x10E\x12\x84!Ce{\x02\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x30\x00\x000J\xde\x86\x15')
assert m._send_buffer==b''
assert m.sent_pdu==bytearray(b'\xa5\x17\x00\x10E\x12\x84!Ce{\x02\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x30\x00\x000J\xde\x86\x15')
assert m.ifc.write.get()==b''
await asyncio.sleep(0.5)
assert m.writer.sent_pdu==bytearray(b'\xa5\x17\x00\x10E\x13\x84!Ce{\x02\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x30\x00\x000J\xde\x87\x15')
assert m._send_buffer==b''
assert m.sent_pdu==bytearray(b'\xa5\x17\x00\x10E\x13\x84!Ce{\x02\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x30\x00\x000J\xde\x87\x15')
assert m.ifc.write.get()==b''
m.state = State.closed
m.writer.sent_pdu = bytearray()
m.sent_pdu = bytearray()
await asyncio.sleep(0.5)
assert m.writer.sent_pdu==bytearray(b'')
assert m._send_buffer==b''
assert m.sent_pdu==bytearray(b'')
assert m.ifc.write.get()==b''
assert next(m.mb_timer.exp_count) == 4
m.close()
@@ -1785,7 +1773,7 @@ async def test_start_client_mode(config_tsun_inv1, str_test_ip):
assert m.mb_timer.tim == None
assert asyncio.get_running_loop() == m.mb_timer.loop
await m.send_start_cmd(get_sn_int(), str_test_ip, m.mb_first_timeout)
assert m.writer.sent_pdu==bytearray(b'\xa5\x17\x00\x10E\x01\x00!Ce{\x02\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x030\x00\x000J\xde\xf1\x15')
assert m.sent_pdu==bytearray(b'\xa5\x17\x00\x10E\x01\x00!Ce{\x02\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x030\x00\x000J\xde\xf1\x15')
assert m.db.get_db_value(Register.IP_ADDRESS) == str_test_ip
assert isclose(m.db.get_db_value(Register.POLLING_INTERVAL), 0.5)
assert m.db.get_db_value(Register.HEARTBEAT_INTERVAL) == 120
@@ -1793,16 +1781,16 @@ async def test_start_client_mode(config_tsun_inv1, str_test_ip):
assert m.state == State.up
assert m.no_forwarding == True
assert m._send_buffer==b''
assert m.ifc.write.get()==b''
assert isclose(m.mb_timeout, 0.5)
assert next(m.mb_timer.exp_count) == 0
await asyncio.sleep(0.5)
assert m.writer.sent_pdu==bytearray(b'\xa5\x17\x00\x10E\x02\x00!Ce{\x02\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x030\x00\x000J\xde\xf2\x15')
assert m._send_buffer==b''
assert m.sent_pdu==bytearray(b'\xa5\x17\x00\x10E\x02\x00!Ce{\x02\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x030\x00\x000J\xde\xf2\x15')
assert m.ifc.write.get()==b''
await asyncio.sleep(0.5)
assert m.writer.sent_pdu==bytearray(b'\xa5\x17\x00\x10E\x03\x00!Ce{\x02\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x030\x00\x000J\xde\xf3\x15')
assert m._send_buffer==b''
assert m.sent_pdu==bytearray(b'\xa5\x17\x00\x10E\x03\x00!Ce{\x02\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x030\x00\x000J\xde\xf3\x15')
assert m.ifc.write.get()==b''
assert next(m.mb_timer.exp_count) == 3
m.close()