mpModbus — Modbus library that runs unchanged on CPython and MicroPython
Just open-sourced this. Same source runs on CPython 3.11+ and MicroPython 1.21+ (incl. ESP32) — no try/import shims in user code.
RTU + TCP, async-only API, declarative JSON drivers (register maps with formats / scaling / masks / word-orderings / enums / virtual computed registers — adding a meter doesn't touch Python), multi-bus Collector with per-bus reconnect + per-device circuit breaker, and a persist pipeline
featuring on_change, wall-clock-aligned 15m/1h windows (every device on a slow RTU bus emits at the same :00 / :15 / :30 / :45 instant — jitter-corrected), PLC-style ton/toff run-time counters, and avg / sum / max / min / delta aggregations.
MicroPython angles
- ESP32 IDF UART FIFO quirks handled in the RTU transport (frame-length-based termination — long responses don't need setup-specific tuning).
- machine.UART kwargs ladder, RS-485 DE/RE as a URL param (&de=4), float32-on-MP quantisation handled (timestamps stay int — a 2026 Unix timestamp as float32 rounds into ~50s buckets on ESP32).
- Single-file bundle: python build_bundle.py → one mpmodbus_bundle.py, deploys with one mpremote cp. OTA-friendly: one file, atomic write, hash-checkable.
298 hermetic tests passing on CPython 3.11/3.12/3.13 + MicroPython 1.22 unix-port (CI on every push). Hardware-validated on real ESP32 against an ION-7650-V2 power meter (RTU + TCP) and a Waveshare 8I-8O digital-I/O module (RTU).
v0.1.0, MIT, Beta. Especially interested in reports from anyone running it on non-ESP32 targets (RP2, STM32, NRF) — that's the bit I can't test from my bench.
https://github.com/Tangerino/mpModbus
mpModbus — Modbus library that runs unchanged on CPython and MicroPython
Just open-sourced this. Same source runs on CPython 3.11+ and MicroPython 1.21+ (incl. ESP32) — no try/import shims in user code.
RTU + TCP, async-only API, declarative JSON drivers (register maps with formats / scaling / masks / word-orderings / enums / virtual computed registers — adding a meter doesn't touch Python), multi-bus Collector with per-bus reconnect + per-device circuit breaker, and a persist pipeline
featuring on_change, wall-clock-aligned 15m/1h windows (every device on a slow RTU bus emits at the same :00 / :15 / :30 / :45 instant — jitter-corrected), PLC-style ton/toff run-time counters, and avg / sum / max / min / delta aggregations.
MicroPython angles
298 hermetic tests passing on CPython 3.11/3.12/3.13 + MicroPython 1.22 unix-port (CI on every push). Hardware-validated on real ESP32 against an ION-7650-V2 power meter (RTU + TCP) and a Waveshare 8I-8O digital-I/O module (RTU).
v0.1.0, MIT, Beta. Especially interested in reports from anyone running it on non-ESP32 targets (RP2, STM32, NRF) — that's the bit I can't test from my bench.
https://github.com/Tangerino/mpModbus