Releases: bluetti-community/bluetti-modbus
Releases · bluetti-community/bluetti-modbus
Release list
0.34.0
Fixed
- A Balco Transfer Hub is now read field by field. Raw blocks from a hub showed it answering a 5-register read with a word inserted partway through and the rest shifted one register late - the DSP version decoding from a
2, the grid frequency from the DSP's high word, the PV total from two unrelated registers. It answers with the right count and no error, so nothing failed loudly.balcotransjoinsISOLATED_RANGE_DEVICES: one read per field, which is how every reading that matched the app was taken. (#110, bluetti-registers#29)
Full Changelog: 0.33.0...0.34.0
0.33.0
Fixed
- AC200L: the battery current read ten times low.
b_c_totalis scaled 0.1, not the assumed 0.01 - confirmed on a second unit charging at 810 W from the grid, where 0.1 gives 14.4 A into the pack, 94 % of the grid input. (#109, bluetti-registers#31)
Full Changelog: 0.32.0...0.33.0
0.32.0
Fixed
- A Balco Transfer Hub serves ten registers a block. A 15-register read came back correct for its first ten registers and wrong for everything past them - the two firmware versions and the grid frequency read values those registers never return one at a time.
max_spanis now 10 forbalcotrans. (#107, bluetti-registers#29) - The hub's battery voltage is scaled 0.01: 535 V where the connected station holds 53.5 V (bluetti-registers 0.0.47).
Full Changelog: 0.31.0...0.32.0
0.31.0
Added
get_device("balcotrans")reads a Balco Transfer Hub - 27 read-only fields from bluetti-registers 0.0.46, every one confirmed against the BLUETTI app on two real hubs, one charging a power station and one feeding the grid. The hub has no battery of its own: its SOC, battery voltage and PV registers carry the connected station's values, andd_inverter_totalis signed - negative while charging. No writable register is served by this firmware. (#106)
Full Changelog: 0.30.4...0.31.0
0.30.4
Fixed
bluetti-modreadno longer prints the whole read a second time.print_component()lists every public property a component class adds alongside its fields, andBluettiDevice.valuesis one, so each run ended with avalues {...}row repeating every row above it. The command prints the rows itself now, from the same reflection, with the properties left out; a repeating group still prints as its own block. (#103)
Full Changelog: 0.30.3...0.30.4
0.30.3
Both found on a real Balco 260.
Fixed
bluetti-modwriteno longer reports a stale value as the result of its own write. The device applies a setting immediately and serves the old one for a moment: writingb_soc_low15 → 16 read back 15, and the next command read 16. The read-back now waits (--settle, 2 s by default) and looks again; a value that never appears is reported as what the device says. (#102)- An unreachable device prints one line instead of a traceback, in both commands. (#102)
Full Changelog: 0.30.2...0.30.3
0.30.2
Fixed
- Installs on Python 3.12. The package declared
>=3.13, sopip install "bluetti-modbus[cli]"refused every version on a machine one release behind - which is where a command-line tool tends to be run. Nothing in the code needed 3.13, and every dependency accepts 3.12. The test suite passes on both, and CI now runs both. (#101)
Full Changelog: 0.30.1...0.30.2
0.30.1
Fixed
bluetti-modwritetakes the reader's transports:--serial,--baud,--parity,--stopbits,--unit, with--host/--serialmutually exclusive. 0.30.0 shipped it TCP-only two commits after the reader learned serial; a device readable over RS485 is now writable over it. (#100)- It reads one register instead of the whole device: writing a setting ran a full refresh twice - fifteen block reads each time on a Balco 260 - on a stack that serves one client at a time. It now reads the field being written, before and after. (#100)
- The confirmation prompt no longer holds a connection open: the read closes behind itself, the prompt happens with nothing open, the write opens its own connection. (#100)
Full Changelog: 0.30.0...0.30.1
0.30.0
Added
- Modbus RTU over a serial line.
BluettiModbusClient(device_type=..., serial_device=...)takes a port path or any pyserial URL -socket://ip:portreaches a serial-to-TCP gateway, where the line settings live in the gateway.unit_id(1 by default) picks the device on a shared bus andmessage_spacingpaces requests further apart than the backend's own inter-frame gap.bluetti-modreadgains--serial,--baud,--parity,--stopbitsand--unit. For an EP2000's RS485 port (bluetti-community/bluetti-registers#42); not verified against hardware yet - no BLUETTI unit is known to answer as a Modbus slave on RS485. (#97) bluetti-modwrite, a published counterpart tobluetti-modread: writes one setting register, with the same flags as thebluetti-modwritein Patrick762's own bluetti-modbus-lib. It refuses an unknown or read-only field (listing the writable ones), a value outside the bounds the profile declares, and the AC output switch unless--allow-ac-output; it printsold -> new, asks before sending, and reads the value back. (#99)
Fixed
- An enum field asked to be writable now is:
field()droppedwritableon that branch alone, so the first mode or selector a profile declares would have been generated read-only. No shipped profile has one. (#96) message_spacingis passed to the backend only when a caller asked for pacing: at the declared modbus-connection floor (4.11.1) that argument is a plain float, andNoneraisedTypeErrorbefore a connection was opened. Introduced in #97, never released. (#98)
Changed
- README: serial usage and the write command. HARDWARE_TESTING: never transmit on an RS485 bus the device itself drives - listen RX-only first, then read one request at a time.
Full Changelog: 0.29.0...0.30.0
0.29.0
Added
- FridgePower: the DC output switch and the grid charging switch are writable (57005, 57009), from bluetti-registers 0.0.45 - same-value writes on a real unit confirmed them at the Balco family's internal addresses (2012, 2207), now on file. The SOC thresholds refused a write and stay read-only; the AC output and grid feed-in switches are untried. (#95)
Changed
- Write probe and testing guide: disable the Home Assistant integration entry itself (not only its devices) and restart Home Assistant before a write test - the unit serves one client at a time. (#95)
Full Changelog: 0.28.1...0.29.0