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
Example #6
0
 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]