From 017d0a8b73c3935ff003a1104f9627518184b4be Mon Sep 17 00:00:00 2001 From: acidburns Date: Sat, 11 Jul 2026 17:23:04 +0200 Subject: [PATCH] Update BullTron README details --- README.md | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 425f642..bbc8780 100644 --- a/README.md +++ b/README.md @@ -150,8 +150,8 @@ The GUI shows: charge/discharge current and watts, and computed time-to-empty/time-to-full - alarm/status words decoded into readable alarm names where known - system/settings values such as the control PIN, firmware/version text, - product info, battery code/SN, production-date raw value, and inferred battery - Ah when the settings block contains a plausible capacity + product info, battery code/SN, parsed production date where possible, and + inferred battery Ah when the settings block contains a plausible capacity - raw TX/RX frames for debugging and protocol confirmation The settings tab has MOS on/off controls, but writes are deliberately guarded: @@ -160,6 +160,11 @@ The default write registers mirror the BullTron system screen: `0x00A5` for charge MOS and `0x00A6` for discharge MOS. The live MOS status still comes from read-only telemetry registers `0x0035` and `0x0036`. +The MOS status can lag the requested control state until that MOSFET path is +actually used. For example, disabling charging may still display as ON while +the pack is idle or discharging; it only reports OFF once charging is attempted +and the BMS applies the charge MOS state. + Scan results are sorted so likely BullTron devices appear first. The Android app accepts scanned devices whose BLE name contains `DL` or `B35`, or whose legacy advertising payload contains marker bytes for `DL`, `PU`, or `JHB`. The desktop @@ -241,14 +246,18 @@ Important fields: | `0x003A`-`0x003D` | Alarm/status words | 16-bit bitmaps | Time-to-empty/time-to-full is computed by the app instead of read as one live -BLE value: +BLE value. Current app logic uses the remaining-capacity register when present, +falling back to rated capacity times SOC fraction only if remaining Ah is not +available: ```text -if register 0x002F == 1: - time-to-full = rated_capacity_Ah * (100 - SOC_percent) / abs(current_A) * 60 +remaining_Ah = register_0x0030_Ah if available else rated_capacity_Ah * SOC_percent / 100 -if register 0x002F == 2: - time-to-empty = rated_capacity_Ah * SOC_percent / abs(current_A) * 60 +if current_A > 0: + time-to-full = max(rated_capacity_Ah - remaining_Ah, 0) / abs(current_A) * 60 + +if current_A < 0: + time-to-empty = remaining_Ah / abs(current_A) * 60 ``` ## Repository Contents