Skip to content

kenjicd-source/py-rackbus

py-rackbus

License: MIT Python 3.10+ Tests

An independent Python client for the Rackbus SL serial protocol — the legacy proprietary fieldbus used by some Endress+Hauser mass flowmeters and other Commutec-family transmitters from the mid-1990s.

This is a clean-room reverse-engineered implementation based on black-box observation of unencrypted traffic on the wire. No vendor firmware was decompiled, no vendor software was modified, no proprietary documentation was reproduced.

Disclaimer. This project is not affiliated with, endorsed by, or sponsored by Endress+Hauser AG. Rackbus, Commubox, Promass, Commutec may be trademarks of their respective owners — used here purely descriptively. The wire-format description in this repository is derived solely from observed traffic on equipment lawfully owned by the author. See NOTICE.md for full legal positioning.


Why this exists

Many Coriolis flowmeters and process instruments from 1995-2003 use the Rackbus SL protocol over RS-485. The vendor's original software (Commuwin II) was discontinued long ago, requires legacy hardware dongles, and runs only on Windows 95/98/XP.

These instruments are still in production use across dairy plants, breweries, chemical facilities, and pharmaceutical lines. Replacing them costs tens of thousands of euros per unit plus weeks of downtime.

This library lets you read live data from such instruments using modern, cheap hardware:

  • A $5 USB-to-RS485 adapter and Python — for laptops and gateway PCs
  • An ESP32 + MAX485 module — for embedded telemetry, MQTT, Home Assistant
  • Any platform with a serial port and an RS-485 transceiver

Read-only by design — you can pull mass flow, density, temperature, totalizers, and tags without risk of accidentally writing wrong configuration to live equipment.


Quick start

git clone https://github.com/kenjicd/py-rackbus.git
cd py-rackbus
pip install pyserial
python examples/basic_usage.py COM5 3

That assumes the instrument is at bus address 3 on COM5. Replace with whatever you have. Wiring:

Instrument terminal A (or +)  ─── USB-RS485 A (D+)
Instrument terminal B (or -)  ─── USB-RS485 B (D-)
Instrument shield / ⊥         ─── USB-RS485 GND  (optional)

Standard RS-485 polarity. See hardware/README.md for diagrams and tips.


API

from rackbus_client import RackbusClient

with RackbusClient(port='COM5', address=3) as client:
    print(client.read_mass_flow())          # → float (t/h)
    print(client.read_density())            # → float (g/cm³)
    print(client.read_temperature())        # → float (°C)
    print(client.read_totalizer_1())        # → float (t)
    print(client.read_tag_number())         # → str
    print(client.read_parameter('V0H0'))    # generic by V/H code
    print(client.read_all())                # → dict of common params

Full API surface and module layout: docs/STRUCTURE.md.


ESP32 firmware

A working PlatformIO firmware for ESP32-S2 (and any other ESP32 variant) is included in firmware/. It reads the Promass over RS-485 via a MAX485 module, serves a local web UI with live values, and optionally posts JSON telemetry to a remote endpoint.

cd firmware
cp include/secrets.h.example include/secrets.h
$EDITOR include/secrets.h         # WiFi, OTA password, telemetry URL
pio run -t upload                  # first flash over USB
pio device monitor                 # see live transactions

After that you can flash over WiFi (pio run -t upload -e ota) and open http://promass.local/ in a browser.

See firmware/README.md for the full guide and especially the MAX485 turnaround timing warning — that one will save you hours.


Status

Component Status
Frame structure (request + response, long + short) ✅ Fully reversed
Address encoding (0x5F − ASCII + parity) ✅ Verified
V/H encoding (0x5F − raw int + parity) ✅ Verified
Data decoding (ASCII complement, scale-char, integers, strings, @ invalid) ✅ Verified on real values
Request checksum ✅ Reversed (crc1 = 0x2E XOR …, crc2 = sum + 0x48)
Response checksum ⚠ Stub (slave trusted; verifier always returns True)
Multi-stage exchange (warmup → VR → DD → 48) ✅ Reversed and reliable
Test suite ✅ 57 tests passing
Confirmed device Promass 63 (63FS50-FTW91A00B1B, SW 3.00.00)
ESP32 firmware port ✅ Working (firmware/, PlatformIO, MAX485)
Modbus TCP gateway 🚧 Planned

Supported devices

Manufacturer Model Firmware Tested Notes
Endress+Hauser Promass 63 SW 3.00.00 / SW COM 3.00.00 Reference device

Likely compatible (untested) — please report:

  • Other Endress+Hauser Promass 60-series with RACKBUS RS 485 module
  • Other Commutec-family transmitters of the same generation (Promag 50/53, Levelflex, Cerabar) in their Rackbus variants

If you have one on the bench, please file a compatibility report.


Documentation


Testing

pip install pytest pyserial
pytest

Expected output: 57 passed.

The test suite uses byte-for-byte fixtures captured from a real device and runs offline (no hardware needed for tests).


Contributing

See CONTRIBUTING.md. Particularly welcome:

  • Compatibility reports for other Rackbus devices
  • Response-CRC reverse engineering (we have the captured material; the formula isn't found yet)
  • ESP32 / Arduino / STM32 ports
  • Wireshark dissector
  • Modbus TCP gateway

License

MIT — see LICENSE. All code in this repository is original work by the contributors and is not derived from any proprietary source.

For the legal positioning of the reverse-engineering effort itself (EU Software Directive 2009/24/EC, US 17 USC § 1201(f), trademark notes), see NOTICE.md.


Safety notice

This library is intentionally read-only. Write operations to live industrial process instruments can cause equipment damage, process upsets, or safety incidents. Always test on a bench setup before connecting to a production line.

About

Independent Python client for the Rackbus SL legacy industrial serial protocol. Clean-room reverse-engineered, MIT licensed, read-only by design.

Topics

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Packages