Linux-first single-binary bridge for polling PACE BMS battery packs over local serial communication and publishing read-only telemetry to MQTT and Home Assistant.
Early implementation. The bridge currently focuses on safe reads only:
- PACE ASCII serial frames used by common PACE/Gobel packs,
- pack discovery over RS485-style addressing,
- analog telemetry parsing for cells, temperatures, voltage, current, capacity, SOC, SOH and cycle count,
- MQTT state topics and Home Assistant MQTT Discovery,
- embedded HTTP status page and JSON API.
No BMS writes are implemented.
Run locally with the example config:
go run ./cmd/pace-bms-mqtt-bridge --config ./configs/config.example.yamlProbe a serial adapter:
go run ./cmd/pace-bms-probe --port /dev/pace-bms --baud 9600 --protocol rs232 --first 255 --last 255
go run ./cmd/pace-bms-probe --port /dev/pace-bms --baud 115200 --protocol rs485 --first 0 --last 16By default the web panel listens on http://127.0.0.1:8080.
See configs/config.example.yaml.
For Linux deployments, prefer a stable udev symlink such as /dev/pace-bms instead of raw /dev/ttyUSB*.
Serial-over-Ethernet converters can be used by setting serial.port to a TCP endpoint such as tcp://192.168.6.134:4196. The converter should run in transparent TCP server mode with the same serial parameters configured in serial.
polling.interval controls the fast analog telemetry loop. polling.status_interval controls the slower warning/status loop used for MOS, fault and protection readback.
Deployment notes and a systemd unit are in docs/DEPLOYMENT.md.
GitHub Actions builds and tests every push to main and every pull request.
Pushing a tag such as v0.0.1 creates a GitHub release with Linux amd64 and arm64 archives. After CI succeeds on main, the repository also creates the next patch tag automatically and dispatches the release workflow.
Protocol behavior was cross-checked against:
Apache-2.0. See LICENSE.