scietex.modbus_service
scietex.modbus_service is a scietex.service worker that runs the
serial-to-TCP Modbus gateway from
scietex.hal.serial. It
bridges a serial RS485 bus to TCP/IP: TCP clients speak plain Modbus/TCP, and
the gateway routes each request to the right device on the bus by device id.
The worker is a long-running daemon. It owns one serial port and one TCP
listener, both built once at startup from modbus.yml and torn down on
shutdown. Configuration can also be pushed at runtime through the framework's
remote-config channel, but the gateway itself is restart-required — see
Remote configuration.
Python ≥ 3.10 · License: MIT
Documentation
- Overview — what the service does and how it fits together
- Configuration — the
modbus.ymlschema and precedence - Deployment — container, serial device access, port 502
- Remote configuration — the declarative
modbussection
Installation
pip install scietex.modbus_service
This pulls in scietex.hal.serial (the gateway core) and
scietex.service[valkey] (the worker framework and its Valkey transport).
Quick start
1. Write a configuration file
The service reads modbus.yml from a modbus/ subdirectory of its config
directory. Create it by hand, or let the service generate defaults on first run.
The file is the bootstrap layer of a four-layer merge: constructor defaults <
modbus.yml < the framework's config.yml snapshot < the remote modbus
section. Each layer is a field-level patch — a key absent from a layer inherits
the layer below, null clears it back to the constructor default, and a value
sets it:
serial:
port: /dev/ttyUSB0
baudrate: 9600
bytesize: 8
parity: N
stopbits: 1
timeout: null
host: 0.0.0.0
port: 502
default_framer: RTU
devices:
1:
framer: RTU
2:
framer: ASCII
allow_unknown_devices: false
bus_retries: 0
port at the top level is the TCP listen port; serial.port is the
serial device path. They are unrelated — do not conflate them.
2. Run the service
start-modbus-service --conf-dir /etc/scietex
The service resolves its config directory automatically when --conf-dir is
omitted (see Configuration).
It runs in the foreground until it receives SIGINT or SIGTERM.
3. Point a Modbus/TCP client at it
Connect to host:port and issue normal Modbus/TCP requests, using the target
device id as the unit id. No special protocol is required.
Configuration at a glance
The defaults below are the constructor (L0) values: a field absent from every
layer, or explicitly cleared with null, resolves to the value shown.
| Setting | Default | Meaning |
|---|---|---|
serial.port |
/dev/ttyUSB0 |
Serial device path |
serial.baudrate |
9600 |
Bus baud rate |
host / port |
0.0.0.0 / 502 |
TCP bind address and port |
default_framer |
RTU |
Framer for devices without an explicit entry |
devices |
{} |
Per-device routing table, keyed by device id |
allow_unknown_devices |
false |
Route unknown ids with the default framer |
bus_retries |
0 |
Retry count for bus transactions |
Full field reference: Configuration.
Container
A Containerfile is included. It installs the released package from PyPI
(selected by the VERSION build arg), runs as a non-root appuser in the
dialout group, mounts /config, and sets SCIETEX_CONFIG_DIR=/config:
podman build --build-arg VERSION=2.1.0 -t scietex-modbus-service .
podman run --rm \
--device /dev/ttyUSB0 \
--cap-add NET_BIND_SERVICE \
-v ./config:/config \
scietex-modbus-service
Port 502 is privileged — binding it needs --cap-add NET_BIND_SERVICE, or
override the port in modbus.yml. See Deployment for
details.
Development
Dependencies are managed with uv; checks and tests run through tox:
uv sync --all-extras
uv run tox # format, lint, type, py314
uv run tox -e py314 # tests only
See AGENTS.md for the full toolchain and repo conventions.
Metadata
Release files for scietex.modbus-service 2.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| scietex_modbus_service-2.3.1.tar.gz | 24.5 kB | With provenance | Details for scietex_modbus_service-2.3.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| scietex_modbus_service-2.3.1-py3-none-any.whl | Python 3 | none | any | Details for scietex_modbus_service-2.3.1-py3-none-any.whl |
Total release size: 41.9 kB
Release files / scietex_modbus_service-2.3.1.tar.gz
| Download URL | scietex_modbus_service-2.3.1.tar.gz |
|---|---|
| Size | 24.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dc1050134d07cbe386b6d2d7defc5ee0fc4409c27074ea8d7859964a39b9d35d
|
|
BLAKE2b-256 checksum How to use checksums |
b87740a5848d98b2c1ca0ea0ecf8b09c4acffd1f9d857ffb3b2e893f3bafbeb7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logRelease files / scietex_modbus_service-2.3.1-py3-none-any.whl
| Download URL | scietex_modbus_service-2.3.1-py3-none-any.whl |
|---|---|
| Size | 17.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3f7f6fa59889c4f16b1aa0c0762589940c788a7264c15e4a77abfd7e39e5b93c
|
|
BLAKE2b-256 checksum How to use checksums |
12be68352cd17d84aa985ca0f9c6d05bb2f5ffdd568c9e03667dd45c5858cc17
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logSecurity for scietex.modbus-service 2.3.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for scietex_modbus_service-2.3.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.