v0.1.1
Changelog
All notable changes to anymodbus are documented here.
The format follows Keep a Changelog, and
the project adheres to Semantic Versioning.
Unreleased
0.1.1 - 2026-04-26
First post-release polish, driven by the REVIEW.md notes against v0.1.0
ahead of the first downstream consumers (watlowlib + planned alicatlib /
sartoriuslib). The package is still alpha; backwards-compatibility shims
were not kept.
Added
RegisterTypeenum (int16/uint16/int32/uint32/int64/
uint64/float32/float64/string) and a type-dispatched
decode(words, *, type=RegisterType.X, ...)/encode(value, *, type=RegisterType.X, ...)pair inanymodbus.decoders. Recommended
entry point for downstream device libraries that load a register schema
from configuration.register_count_for(type)helper for schema callers.- New per-type helpers:
decode_int16/encode_int16,decode_int64/
encode_int64,decode_float64/encode_float64. decode_string/encode_stringgained abyte_orderkeyword for
devices that store strings byte-swapped within each register.
encode_stringnow accepts eitherregister_countorbyte_count—
the latter is convenient for spec'd-in-bytes fields whose length isn't
a multiple of two.Slave.read_string/Slave.write_string(and their sync mirrors)
accept eitherregister_countorbyte_count, plusbyte_order.FCshort alias forFunctionCodeat the top-level package surface,
fulfilling the long-standing docstring promise.
Changed
TimingConfig.inter_char_timeoutrenamed toTimingConfig.inter_char_idle
to match the spec term used throughout DESIGN.md. The framer's keyword
argument is renamed to match.ModbusUnknownExceptionErroris now a subclass of
ModbusExceptionResponse, so callers wanting "any slave-returned
exception" canexcept ModbusExceptionResponseand be done. The raw
byte is exposed onexception_code(was:code).code_to_exception
now returnsModbusExceptionResponseinstead ofModbusError.
Removed
BusBusyErrorfrom DESIGN.md — it was documented but never
implemented. The bus lock serializes transactions; the right
resource-busy signal already comes fromanyio.BusyResourceErroron
the underlying stream.
0.1.0 - 2026-04-25
Initial release. See DESIGN.md for the full plan.
Added
- Repository skeleton:
pyproject.toml,Makefile, CI/docs/publish workflows,
pre-commit config, src/tests/docs layout. - Foundational pure-Python pieces:
anymodbus._types(enums + small dataclasses),
anymodbus.exceptions(fullModbusErrortree +code_to_exceptiontranslator),
anymodbus.crc(CRC-16/Modbus, 256-entry table),
anymodbus.config(frozen dataclasses with validation). WordOrderandByteOrdernamed enums for 32-bit value layout, with
defaults matching the Modbus Application Protocol spec example
(high-word-first, big-endian within word).Bus(half-duplex single-master client) and per-slaveSlavehandle, with
open_modbus_rtu(...)convenience opener overanyserial.- Length-aware RTU
Framerwith timing-gap fallback for unknown function codes
and tx-side 3.5-character pre-tx idle gap. - PDU encode/decode for the v0.1 function code set (FC 1–6, 15, 16) and
decodersfor 32-bit float / int values across two registers. Capabilitymodel (SUPPORTED/UNSUPPORTED/UNKNOWN) populated from probe
results.- Sync wrapper (
anymodbus.sync) using the same shared-portal pattern as
anyserial.sync. anymodbus.testingwithMockSlave,FaultPlan, andclient_slave_pair()
for hardware-free integration tests.