Skip to content

Upgrade pymodbus 2.5.2 to 3.x (Python 3.12+ compatibility)#3340

Closed
Xerolux wants to merge 1 commit intoopenWB:masterfrom
Xerolux:feature/pymodbus-3x-migration
Closed

Upgrade pymodbus 2.5.2 to 3.x (Python 3.12+ compatibility)#3340
Xerolux wants to merge 1 commit intoopenWB:masterfrom
Xerolux:feature/pymodbus-3x-migration

Conversation

@Xerolux
Copy link
Copy Markdown
Contributor

@Xerolux Xerolux commented May 3, 2026

Summary

  • Migrate from pymodbus 2.5.2 to pymodbus >=3.13.0 to support Python 3.12+ (pymodbus 2.x is incompatible with Python 3.12+)
  • Add compatibility shim (pymodbus_compat.py) for removed classes: Endian, BinaryPayloadBuilder, BinaryPayloadDecoder
  • Update all 163 affected files with new import paths and API changes

Changes

API Migration (pymodbus 3.x breaking changes)

2.x (before) 3.x (after)
from pymodbus.client.sync import ModbusTcpClient from pymodbus.client import ModbusTcpClient
from pymodbus.transaction import ModbusSocketFramer from pymodbus.framer import FramerType
from pymodbus.constants import Endian from modules.common.pymodbus_compat import Endian
from pymodbus.payload import BinaryPayloadBuilder from modules.common.pymodbus_compat import BinaryPayloadBuilder
unit=<id> device_id=<id> (keyword-only)
ModbusSerialClient(method="rtu", port=X) ModbusSerialClient(port, framer=FramerType.RTU)
ModbusTcpClient(host, port, framer) ModbusTcpClient(host, port=port, framer=framer) (keyword-only)
read_holding_registers(addr, count, unit=x) read_holding_registers(addr, count=count, device_id=x)
response.getRegister(i) response.registers[i]

New file

  • packages/modules/common/pymodbus_compat.py - struct-based reimplementation of Endian, BinaryPayloadBuilder, and BinaryPayloadDecoder (removed from pymodbus 3.x)

163 files changed

  • requirements.txt: pymodbus==2.5.2 -> pymodbus>=3.13.0
  • Core module: packages/modules/common/modbus.py - constructor fixes, keyword-only args
  • All device modules (100+ files): unit= -> device_id=
  • Smarthome modules (20+ files): direct client fixes, keyword-only args
  • Runs scripts: Serial constructor fixes
  • Test mocks: conftest.py updated for new module paths

Testing

Tested on Debian Trixie 13.4 with Python 3.13.5:

  • openwb2.service starts successfully with pymodbus 3.13.0
  • All Python files compile without syntax errors
  • Web interface accessible (HTTP 200)
  • atreboot.sh pip-installs pymodbus 3.13.0 correctly (no rollback)

Why

pymodbus 2.5.2 is incompatible with Python 3.12+. As distributions ship newer Python versions (e.g., Debian Trixie ships Python 3.13), openWB cannot run without this migration.

Migrate from pymodbus 2.5.2 to pymodbus >=3.13.0 to support
Python 3.12+ (pymodbus 2.x is incompatible).

Changes:
- requirements.txt: pymodbus==2.5.2 -> pymodbus>=3.13.0
- New: packages/modules/common/pymodbus_compat.py
  Provides Endian, BinaryPayloadBuilder, BinaryPayloadDecoder
  (removed from pymodbus 3.x)
- Import updates:
  pymodbus.client.sync -> pymodbus.client
  pymodbus.transaction -> pymodbus.framer (FramerType enum)
  pymodbus.constants.Endian -> local compat module
  pymodbus.payload.* -> local compat module
- API changes:
  unit= -> device_id= (keyword-only in 3.x)
  ModbusSocketFramer/ModbusRtuFramer -> FramerType.SOCKET/RTU
  ModbusSerialClient(method='rtu',port=X) -> ModbusSerialClient(port=X,framer=FramerType.RTU)
  ModbusTcpClient(host,port,framer) -> ModbusTcpClient(host,port=port,framer=framer)
  read_holding_registers(addr,count,...) -> read_holding_registers(addr,count=count,...)
  response.getRegister(i) -> response.registers[i]
- Updated test mocks in conftest.py for new module paths

Tested on Debian Trixie (Python 3.13.5) with openWB2 service running.
@Xerolux Xerolux closed this May 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant