Files
bmspy/README.md
T
tim f2ffc4568a Add multi-device support
server.py
  - --device is now repeatable (-d ups1:/dev/ttyUSB0 -d ups2:/dev/ttyUSB1). Bare paths (/dev/ttyUSB0) auto-name from the last path component (ttyUSB0).
  - Maintains {name: {ser, data, timestamp}} per UPS — each device has independent data freshness.
  - GET response is now {ups_name: JBDUPS}. Accepts optional ups key in the request to return only one.

client.py
  - read_data() gains ups=None parameter — pass a name to filter server-side, or omit for all.
  - Always returns {ups_name: JBDUPS}.

influxdb.py
  - influxdb_create_snapshot() iterates {name: JBDUPS} and tags every InfluxDB point with ups=name.
  - influxdb_export() / bmspy-influxdb gain --ups to export only a specific UPS.

__init__.py
  - bmspy CLI gains --ups to display only a named UPS.
  - Displays each UPS under a === name === header.
2026-05-02 17:40:31 +02:00

2.2 KiB

bmspy

bmspy is a tool to get information from a xiaoxiang-type BMS system, using some sort of serial connection.

It can display the information as text, in JSON, or export the data continuously to InfluxDB or a Prometheus exporter.

Multiple BMS/UPS devices can be connected at once. Each is identified by a name, and data from all of them (or just one) can be pushed to InfluxDB or Prometheus in the same connection, with each measurement tagged with the UPS name.

To install: git clone https://git.treehouse.org.za/tim/bmspy cd bmspy poetry install

Or, to install with influxdb and/or prometheus support: poetry install -E influxdb -E prometheus

Running the server

The server daemon reads from one or more serial devices and makes the data available over a Unix socket.

Single device (defaults to /dev/ttyUSB0):

poetry run bmspy-server

Multiple devices, with optional names (default name is derived from the device path, e.g. ttyUSB0):

poetry run bmspy-server -d network:/dev/ttyUSB0 -d nas:/dev/ttyUSB1

To run via systemd, copy bmspy-server.service to /etc/systemd/system, adjust WorkingDirectory and the ExecStart line as needed, then enable and start it:

cp bmspy-server.service /etc/systemd/system
$EDITOR /etc/systemd/system/bmspy-server.service
systemctl daemon-reload
systemctl enable bmspy-server
systemctl start bmspy-server

Running a client

To print a summary of all connected UPSes:

poetry run bmspy

To show only a specific UPS:

poetry run bmspy --ups network

To push data for all UPSes to InfluxDB (each measurement is tagged ups=<name>):

poetry run bmspy-influxdb --url https://influx.example.com --org myorg --token mytoken

To push data for a single UPS only:

poetry run bmspy-influxdb --ups network --url ...

InfluxDB connection details can also be supplied via environment variables (INFLUXDB_V2_URL, INFLUXDB_V2_ORG, INFLUXDB_V2_TOKEN) instead of command-line flags.