diff --git a/pyproject.toml b/pyproject.toml index d496a36..768d138 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,7 @@ dynamic = ["version", "description"] requires-python = ">=3.9" keywords = ["sun2000", "modbus", "photovoltaic"] dependencies = [ - "pymodbus==3.7.4", + "pymodbus>=3.7.4", ] [project.urls] diff --git a/requirements.txt b/requirements.txt index 28c238a..b000634 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -pymodbus==3.7.4 +pymodbus>=3.7.4 diff --git a/sun2000_modbus/inverter.py b/sun2000_modbus/inverter.py index 969017a..736e1cb 100644 --- a/sun2000_modbus/inverter.py +++ b/sun2000_modbus/inverter.py @@ -53,7 +53,7 @@ def read_raw_value(self, register): raise ValueError('Inverter is not connected') try: - register_value = self.inverter.read_holding_registers(register.value.address, register.value.quantity, slave=self.slave) + register_value = self.inverter.read_holding_registers(address=register.value.address, count=register.value.quantity, slave=self.slave) if type(register_value) == ModbusIOException: logger.error('Inverter unit did not respond') raise register_value @@ -98,7 +98,7 @@ def read_range(self, start_address, quantity=0, end_address=0): if end_address != 0: quantity = end_address - start_address + 1 try: - register_range_value = self.inverter.read_holding_registers(start_address, quantity, slave=self.slave) + register_range_value = self.inverter.read_holding_registers(address=start_address, count=quantity, slave=self.slave) if type(register_range_value) == ModbusIOException: logger.error('Inverter unit did not respond') raise register_range_value @@ -115,10 +115,10 @@ def write(self, register, value): raise ValueError('Register is not writeable') encoded_value = datatypes.encode(value, register.value.data_type) - chunks = [encoded_value[i:i+2] for i in range(0, len(encoded_value), 2)] + chunks = [int.from_bytes(encoded_value[i:i+2], byteorder='big', signed=False) for i in range(0, len(encoded_value), 2)] try: - response = self.inverter.write_registers(register.value.address, chunks, slave=self.slave, skip_encode=True) + response = self.inverter.write_registers(address=register.value.address, values=chunks, slave=self.slave) if type(response) == ModbusIOException: logger.error('Inverter unit did not respond') raise response diff --git a/tests/sun2000mock.py b/tests/sun2000mock.py index 7d8f339..0c4de52 100644 --- a/tests/sun2000mock.py +++ b/tests/sun2000mock.py @@ -34,23 +34,23 @@ def encode(self): } -def mock_read_holding_registers(self, address, quantity, slave): - return MockedResponse(address, quantity) +def mock_read_holding_registers(self, address, count, slave): + return MockedResponse(address, count) -def mock_read_holding_registers_ModbusIOException(self, address, quantity, slave): +def mock_read_holding_registers_ModbusIOException(self, address, count, slave): return ModbusIOException('Requested slave is not available') -def mock_read_holding_registers_ConnectionException(self, address, quantity, slave): +def mock_read_holding_registers_ConnectionException(self, address, count, slave): raise ConnectionException('Connection unexpectedly closed') -def mock_write_registers_ModbusIOException(self, address, value, slave, skip_encode): +def mock_write_registers_ModbusIOException(self, address, values, slave): return ModbusIOException('Requested slave is not available') -def mock_write_registers_ConnectionException(self, address, value, slave, skip_encode): +def mock_write_registers_ConnectionException(self, address, values, slave): raise ConnectionException('Connection unexpectedly closed') diff --git a/tests/test_sun2000_modbus.py b/tests/test_sun2000_modbus.py index 9bedba0..5735885 100644 --- a/tests/test_sun2000_modbus.py +++ b/tests/test_sun2000_modbus.py @@ -461,7 +461,7 @@ def test_write_uint16be_connection_unexpectedly_closed(self): def test_write_uint16be(self, write_registers_mock): self.test_inverter.connect() self.test_inverter.write(BatteryEquipmentRegister.BackupPowerSOC, 10) - write_registers_mock.assert_called_once_with(47102, [b'\x00\x0A'], slave=1, skip_encode=True) + write_registers_mock.assert_called_once_with(address=47102, values=[10], slave=1) @patch( 'pymodbus.client.ModbusTcpClient.write_registers' @@ -475,7 +475,7 @@ def test_write_uint16be(self, write_registers_mock): def test_write_uint32be(self, write_registers_mock): self.test_inverter.connect() self.test_inverter.write(InverterEquipmentRegister.FixedActivePowerDeratedInW, 10200) - write_registers_mock.assert_called_once_with(40126, [b'\x00\x00', b'\x27\xD8'], slave=1, skip_encode=True) + write_registers_mock.assert_called_once_with(address=40126, values=[0, 10200], slave=1) @patch( 'pymodbus.client.ModbusTcpClient.write_registers' @@ -489,7 +489,7 @@ def test_write_uint32be(self, write_registers_mock): def test_write_int16be(self, write_registers_mock): self.test_inverter.connect() self.test_inverter.write(BatteryEquipmentRegister.MaximumFeedGridPowerInPercentage, -90) - write_registers_mock.assert_called_once_with(47418, [b'\xFF\xA6'], slave=1, skip_encode=True) + write_registers_mock.assert_called_once_with(address=47418, values=[65446], slave=1) @patch( 'pymodbus.client.ModbusTcpClient.write_registers' @@ -503,7 +503,7 @@ def test_write_int16be(self, write_registers_mock): def test_write_int32be(self, write_registers_mock): self.test_inverter.connect() self.test_inverter.write(BatteryEquipmentRegister.MaximumChargeFromGridPower, -10200) - write_registers_mock.assert_called_once_with(47590, [b'\xFF\xFF', b'\xD8\x28'], slave=1, skip_encode=True) + write_registers_mock.assert_called_once_with(address=47590, values=[65535, 55336], slave=1) @patch( 'pymodbus.client.ModbusTcpClient.write_registers' @@ -517,7 +517,7 @@ def test_write_int32be(self, write_registers_mock): def test_write_multidata(self, write_registers_mock): self.test_inverter.connect() self.test_inverter.write(InverterEquipmentRegister.CosPhiPPnCharacteristicCurve, b'\x01\x02\x03\x04') - write_registers_mock.assert_called_once_with(40133, [b'\x01\x02', b'\x03\x04'], slave=1, skip_encode=True) + write_registers_mock.assert_called_once_with(address=40133, values=[258, 772], slave=1) @patch( 'pymodbus.client.ModbusTcpClient.write_registers'