def test_disconnect(self, monkeypatch): monkeypatch.setattr(socket, 'socket', MockSocket.mock_socket) d = client.SunSpecModbusClientDeviceTCP() d.client.connect() assert d.client.socket d.client.disconnect() assert d.client.socket is None
def test___init__(self): d = client.SunSpecModbusClientDeviceTCP() assert d.slave_id == 1 assert d.ipaddr == '127.0.0.1' assert d.ipport == 502 assert d.timeout is None assert d.ctx is None assert d.trace_func is None assert d.max_count == 125 assert d.client.__class__.__name__ == 'ModbusClientTCP'
def test_connect(self, monkeypatch): d = client.SunSpecModbusClientDeviceTCP() with pytest.raises(Exception) as exc: d.connect() assert 'Connection error' in str(exc.value) monkeypatch.setattr(socket, 'socket', MockSocket.mock_socket) d.connect() assert d.client.socket is not None assert d.client.socket.connected is True assert d.client.socket.ipaddr == '127.0.0.1' assert d.client.socket.ipport == 502 assert d.client.socket.timeout == 2
def test_write(self, monkeypatch): monkeypatch.setattr(socket, 'socket', MockSocket.mock_socket) d = client.SunSpecModbusClientDeviceTCP() d.client.connect() data_to_write = b'sn-000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \ b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' buffer = [b'\x00\x00\x00\x00\x00\x06\x01\x10\x9c', b't\x00\x10'] d.client.socket._set_buffer(buffer) d.client.write(40052, data_to_write) check_req = b"\x00\x00\x00\x00\x00'\x01\x10\x9ct\x00\x10 sn-000\x00\x00\x00\x00\x00\x00\x00" \ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" assert d.client.socket.request[0] == check_req
def test_read(self, monkeypatch): monkeypatch.setattr(socket, 'socket', MockSocket.mock_socket) d = client.SunSpecModbusClientDeviceTCP() buffer = [ b'\x00\x00\x00\x00\x00\x8f\x01\x03\x8c', b'SunS\x00\x01\x00BSunSpecTest\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00TestDevice-1\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00opt_a_b_c' b'\x00\x00\x00\x00\x00\x00\x001.2.3\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00sn-123456789\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00' ] check_req = b'\x00\x00\x00\x00\x00\x06\x01\x03\x9c@\x00F' d.client.connect() d.client.socket._set_buffer(buffer) assert d.read(40000, 70) == buffer[1] assert d.client.socket.request[0] == check_req
def __init__(self, config): self.configuration = config self.timestamp = None self.model = None self.ip_address = self.configuration[self.name]['IPAdresse'] self.parsed_data = OrderedDict() # self.time_zone = 'Europe/Berlin' self.time_zone = 'UTC' self.tz = pytz.timezone(self.time_zone) 'PhVphA', 'PhVphB', 'PhVphC' self.IDs = { # id of readback: ['name in DB', Scaling factor, number of digits] 'PhVphA': ['GridVoltageL1', 0.01, 1], 'PhVphB': ['GridVoltageL2', 0.01, 1], 'PhVphC': ['GridVoltageL3', 0.01, 1], 'W': ['Power_W', None], 'TotWhImp': ['total_Wh', None], } self.average_ignores = ['TIMESTAMP', 'time_sec', 'TotWhImp'] self.model = client.SunSpecModbusClientDeviceTCP( ipaddr=self.ip_address) self.model.scan()
def test_write(self, monkeypatch): monkeypatch.setattr(socket, 'socket', MockSocket.mock_socket) monkeypatch.setattr(serial, 'Serial', MockPort.mock_port) # tcp d_tcp = client.SunSpecModbusClientDeviceTCP(slave_id=1, ipaddr='127.0.0.1', ipport=8502) tcp_buffer = [ b'\x00\x00\x00\x00\x00\t\x01\x03\x06', b'SunS\x00\x01', b'\x00\x00\x00\x00\x00\x05\x01\x03\x02', b'\x00B', b'\x00\x00\x00\x00\x00\x8b\x01\x03\x88', b'\x00\x01\x00BSunSpecTest\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00TestDevice-1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00opt_a_b_c\x00\x00\x00\x00\x00\x00\x001.2.3\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00sn-123456789\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00', b'\x00\x00\x00\x00\x00\x05\x01\x03\x02', b'\x00~', b'\x00\x00\x00\x00\x00\x05\x01\x03\x02', b'\x00@', b'\x00\x00\x00\x00\x00\x87\x01\x03\x84', b'\x00~\x00@\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x80\x00\x80\x00\xff' b'\xff\xff\xff\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00' b'\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80' b'\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff' b'\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff', b'\x00\x00\x00\x00\x00\x05\x01\x03\x02', b'\xff\xff' ] d_tcp.client.connect() d_tcp.client.socket._set_buffer(tcp_buffer) d_tcp.scan() assert d_tcp.common[0].SN.value == 'sn-123456789' assert not d_tcp.common[0].SN.dirty d_tcp.common[0].SN.value = 'sn-000' assert d_tcp.common[0].SN.value == 'sn-000' assert d_tcp.common[0].SN.dirty tcp_write_buffer = [ b'\x00\x00\x00\x00\x00\x06\x01\x10\x9c', b't\x00\x10' ] d_tcp.client.socket.clear_buffer() d_tcp.client.socket._set_buffer(tcp_write_buffer) d_tcp.common[0].write() d_tcp.common[0].SN.value = 'will be overwritten by read' assert d_tcp.common[0].SN.value == 'will be overwritten by read' assert d_tcp.common[0].SN.dirty tcp_read_buffer = [ b'\x00\x00\x00\x00\x00#\x01\x03 ', b'sn-000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' ] d_tcp.client.socket.clear_buffer() d_tcp.client.socket._set_buffer(tcp_read_buffer) d_tcp.common[0].SN.read() assert d_tcp.common[0].SN.value == 'sn-000' assert not d_tcp.common[0].SN.dirty # rtu d_rtu = client.SunSpecModbusClientDeviceRTU(slave_id=1, name="COM2") rtu_buffer = [ b'\x01\x03\x06Su', b'nS\x00\x01\x8d\xe4', b'\x01\x03\x02\x00B', b'8u', b'\x01\x03\x88\x00\x01', b'\x00BSunSpecTest\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00TestDevice-1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00opt_a_b_c\x00\x00\x00\x00\x00\x00\x001.2.3\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00sn-123456789\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00M\xf9', b'\x01\x03\x02\x00~', b'8d', b'\x01\x03\x02\x00@', b'\xb9\xb4', b'\x01\x03\x84\x00~', b'\x00@\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x80\x00\x80\x00' b'\xff\xff\xff\xff\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff' b'\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00' b'\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff' b'\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xffI', b'\x01\x03\x02\xff\xff', b'\xb9\xf4' ] d_rtu.open() d_rtu.client.serial._set_buffer(rtu_buffer) d_rtu.scan() assert d_rtu.common[0].SN.value == 'sn-123456789' assert not d_rtu.common[0].SN.dirty d_rtu.common[0].SN.value = 'sn-000' assert d_rtu.common[0].SN.value == 'sn-000' assert d_rtu.common[0].SN.dirty rtu_write_buffer = [b'\x01\x10\x9ct\x00', b'\x10\xaf\x8f'] d_rtu.client.serial.clear_buffer() d_rtu.client.serial._set_buffer(rtu_write_buffer) d_rtu.common[0].write() d_rtu.common[0].SN.value = 'will be overwritten by read' assert d_rtu.common[0].SN.value == 'will be overwritten by read' assert d_rtu.common[0].SN.dirty rtu_read_buffer = [ b'\x01\x03 sn', b'-000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\xfb' ] d_rtu.client.serial.clear_buffer() d_rtu.client.serial._set_buffer(rtu_read_buffer) d_rtu.common[0].SN.read() assert d_rtu.common[0].SN.value == 'sn-000' assert not d_rtu.common[0].SN.dirty
def test_scan(self, monkeypatch): # tcp scan monkeypatch.setattr(socket, 'socket', MockSocket.mock_socket) c_tcp = client.SunSpecModbusClientDeviceTCP() tcp_req_check = [ b'\x00\x00\x00\x00\x00\x06\x01\x03\x9c@\x00\x03', b'\x00\x00\x00\x00\x00\x06\x01\x03\x9cC\x00\x01', b'\x00\x00\x00\x00\x00\x06\x01\x03\x9cB\x00D', b'\x00\x00\x00\x00\x00\x06\x01\x03\x9c\x86\x00\x01', b'\x00\x00\x00\x00\x00\x06\x01\x03\x9c\x87\x00\x01', b'\x00\x00\x00\x00\x00\x06\x01\x03\x9c\x86\x00B', b'\x00\x00\x00\x00\x00\x06\x01\x03\x9c\xc8\x00\x01' ] tcp_buffer = [ b'\x00\x00\x00\x00\x00\t\x01\x03\x06', b'SunS\x00\x01', b'\x00\x00\x00\x00\x00\x05\x01\x03\x02', b'\x00B', b'\x00\x00\x00\x00\x00\x8b\x01\x03\x88', b'\x00\x01\x00BSunSpecTest\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00TestDevice-1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00opt_a_b_c\x00\x00\x00\x00\x00\x00\x001.2.3\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00sn-123456789\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00', b'\x00\x00\x00\x00\x00\x05\x01\x03\x02', b'\x00~', b'\x00\x00\x00\x00\x00\x05\x01\x03\x02', b'\x00@', b'\x00\x00\x00\x00\x00\x87\x01\x03\x84', b'\x00~\x00@\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x80\x00\x80\x00\xff' b'\xff\xff\xff\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00' b'\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80' b'\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff' b'\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff', b'\x00\x00\x00\x00\x00\x05\x01\x03\x02', b'\xff\xff' ] c_tcp.client.connect() c_tcp.client.socket._set_buffer(tcp_buffer) c_tcp.scan() assert c_tcp.common assert c_tcp.volt_var for req in range(len(tcp_req_check)): assert tcp_req_check[req] == c_tcp.client.socket.request[req] # rtu scan monkeypatch.setattr(serial, 'Serial', MockPort.mock_port) c_rtu = client.SunSpecModbusClientDeviceRTU(1, "COMM2") rtu_req_check = [ b'\x01\x03\x9c@\x00\x03*O', b'\x01\x03\x9cC\x00\x01[\x8e', b'\x01\x03\x9cB\x00D\xcb\xbd', b'\x01\x03\x9c\x86\x00\x01K\xb3', b'\x01\x03\x9c\x87\x00\x01\x1as', b'\x01\x03\x9c\x86\x00B\nB', b'\x01\x03\x9c\xc8\x00\x01+\xa4' ] rtu_buffer = [ b'\x01\x03\x06Su', b'nS\x00\x01\x8d\xe4', b'\x01\x03\x02\x00B', b'8u', b'\x01\x03\x88\x00\x01', b'\x00BSunSpecTest\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00TestDevice-1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00opt_a_b_c\x00\x00\x00\x00\x00\x00\x001.2.3\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00sn-123456789\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00M\xf9', b'\x01\x03\x02\x00~', b'8d', b'\x01\x03\x02\x00@', b'\xb9\xb4', b'\x01\x03\x84\x00~', b'\x00@\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x80\x00\x80\x00' b'\xff\xff\xff\xff\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff' b'\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00' b'\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff' b'\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xffI', b'\x01\x03\x02\xff\xff', b'\xb9\xf4' ] c_rtu.open() c_rtu.client.serial._set_buffer(rtu_buffer) c_rtu.scan() assert c_rtu.common assert c_rtu.volt_var for req in range(len(rtu_req_check)): assert rtu_req_check[req] == c_rtu.client.serial.request[req]