diff --git a/productivity/driver.py b/productivity/driver.py index b3f2255..b82f00f 100644 --- a/productivity/driver.py +++ b/productivity/driver.py @@ -149,8 +149,10 @@ async def _write_register_value(self, key: str, """ start_address = self.tags[key]['address']['start'] - 400001 - builder = BinaryPayloadBuilder(byteorder=Endian.Big, - wordorder=Endian.Little) + bigendian = Endian.BIG if self.pymodbus35plus else Endian.Big # type:ignore[attr-defined] + lilendian = Endian.BIG if self.pymodbus35plus else Endian.Big # type:ignore[attr-defined] + builder = BinaryPayloadBuilder(byteorder=bigendian, + wordorder=lilendian) data_type = self.tags[key]['type'] if data_type == 'float': builder.add_32bit_float(float(value)) @@ -222,9 +224,11 @@ async def _read_discrete(self, addresses: dict, output=True) -> dict: async def _read_registers(self, a_type: str) -> dict: """Handle reading input or holding registers from the PLC.""" r = await self.read_registers(**self.addresses[a_type], type=a_type) + bigendian = Endian.BIG if self.pymodbus35plus else Endian.Big # type:ignore[attr-defined] + lilendian = Endian.BIG if self.pymodbus35plus else Endian.Big # type:ignore[attr-defined] decoder = BinaryPayloadDecoder.fromRegisters(r, - byteorder=Endian.Big, - wordorder=Endian.Little) + byteorder=bigendian, + wordorder=lilendian) current = self.addresses[a_type]['address'] + TYPE_START[a_type] + 1 end = current + self.addresses[a_type]['count'] result = {} diff --git a/productivity/util.py b/productivity/util.py index 816c8a3..1c5dde2 100644 --- a/productivity/util.py +++ b/productivity/util.py @@ -71,6 +71,7 @@ def _detect_pymodbus_version(self) -> None: self.pymodbus30plus = int(pymodbus.__version__[0]) == 3 self.pymodbus32plus = self.pymodbus30plus and int(pymodbus.__version__[2]) >= 2 self.pymodbus33plus = self.pymodbus30plus and int(pymodbus.__version__[2]) >= 3 + self.pymodbus35plus = self.pymodbus30plus and int(pymodbus.__version__[2]) >= 5 async def _connect(self): """Start asynchronous reconnect loop."""