Makita LTX batteries (18 V tool batteries) use a proprietary one-wire digital interface that allows querying battery details, assessing health, and unlocking locked batteries.

Access the interface via the yellow auxiliary connector on the battery.
Overview
Makita LTX batteries feature a proprietary, undocumented digital interface. Official chargers like the DC18RC and diagnostic tools like the BTC04 use this communication channel.[web:1][web:2]

Community reverse-engineering has produced affordable DIY diagnostic tools.
Community Achievements
Reverse-engineering timeline:
-
[2021] Martin Jansson begins protocol analysis
Battery Hacking – Initial reverse-engineering work. -
[2024] Firmware extraction & command discovery
Command Set Analysis – Extracted original firmware, identified key commands. -
[2024] Open Battery Information (OBI)
Arduino dongle + Python tool – Complete communication solution.

-
[2025] DIY Diagnostic Tool Tutorial
Well Done Tips YouTube – Arduino Nano build with 3D-printed case. -
[2025] ESP32 Web Interface
esp32-makita-bms-reader – Standalone web server, no PC required, enhanced data display.
Hardware Interface
The 1-Wire interface uses the yellow 7-pin connector. Source cables from AliExpress.

Required pins (2nd from each side):
| Pin | Function | Pull-up |
|---|---|---|
| Enable | Active high (to activate interface) | 4.7 kΩ |
| 1-Wire | Data communication | 4.7 kΩ |

Key notes:
- Standard connectors have 6 connected pins (1 missing)
- Enable = pin next to missing pin
- 1-Wire = 2nd pin from opposite side
- Voltage: 5 V recommended (3.3 V possible but unstable)
- Remaining pins: unknown function (typically cut)

Complete protocol reference: makita-lxt-protocol
1-Wire Protocol
Standard Dallas 1-Wire (16.3 kbps):
- Open-drain bus with 4.7 kΩ pull-up (3-5 V)
- Master reset: 480 µs low → slaves presence: 60-240 µs low
- Bit timing: 60 µs slots (logic 1 = release, 0 = hold low)
Communication Sequence
- Reset (500 µs low)
- Presence (550-650 µs low from battery)
- Command: cc + command bytes (ex: cc d7 0e 02 = temp)
- Response: data bytes + 0x06 terminator
Source: makita-lxt-protocol repo
Example: cc d7 0e 02 → 9d 0b 06
Battery Commands
Batteries use different BMS generations with varying command sets.
Universal Commands
All types support:
- Battery type
- Capacity
- Failure codes
- Cycle count
Specific Commands
Reading battery information such as cell voltages, temperature, charge level, and battery health indicators requires different commands based on battery type.
Type Detection
Follow [BTC04] probing sequence:
| Type | Test Command | Response Check |
|---|---|---|
| 0 | cc dc 0b |
Ends with 06 |
| 2 | cc dc 0a |
Test mode enabled |
| 3 | cc d4 2c 00 02 |
Supported |
| 5 | ROM ID byte 3 | < 100 |
| 6 | cc aa 00 response byte 17 |
= 30 (decimal) |
Issue Specific Commands
Once you know the battery type, you can use supported commands from the table below.
Notes:
- Types 0,2,3 terminate with
0x06 - All data: little-endian
| Action | Command | Battery Type | Returned Bytes | Data Type |
|---|---|---|---|---|
| Temperature (1/10K) | cc d7 0e 00 02 |
0, 2, 3 | 3 | int16 |
cc 52 |
5 | 2 | int16 | |
cc 10 21, then d4 |
6 | 1 | byte ( t = (-40*x + 9323)/100) |
|
| Voltage (Pack and Cells) |
cc d7 00 00 0c |
0, 2, 3 | 13 | 6x int16 |
31,32,33,34, or 35(cell 1 - 5) |
5 | 2 | int16 | |
cc 10 21, then d4(10-cell battery) |
6 | 20 | 10x int16 | |
| Enter Test Mode | cc d9 96 a5 |
0, 2, 3 | 1 | - |
| Exit Test Mode | cc d9 ff ff |
0, 2, 3 | 1 | - |
| Charge Level | cc d7 19 00 04 |
0 | 5 | int32 |
| Model String | cc dc 0c |
0,2 | 16 | string |
| Overdischarge Counter | cc d4 ba 00 01 |
0 | 2 | byte |
cc d6 8d 05 01 |
2 | 2 | byte | |
cc d6 09 03 01 |
3 | 2 | byte | |
| Overload Counter | cc d4 8d 00 07 |
0 | 8 | Bitmask |
cc d6 5f 05 07 |
0 | 8 | Bitmask | |
cc d6 5b 03 04 |
3 | 6 | Bitmask | |
| Health | cc d4 50 01 02 |
0 | 3 | int16 |
cc d6 04 05 02 |
2 | 3 | int16 | |
cc d6 38 02 02 |
3 | 3 | int16 |
Calculated Values
The official Makita diagnostic tool BTC04 calculates indicators from the raw values:
State-of-Charge
Scale of 0-7:
ratio = charge_level / capacity / 2880
if ratio == 0:
sof = 0
elif ratio < 10:
sof = 1
else:
sof = min(ratio / 10, 7)
Overdischarge percentage
Calculated like this:
if overdischarge_count > 0 and cycle_count > 0:
p = 4 + 100 * overdischarge_count / cycle_count
else:
p = 0
Overload percentage
Calculated as follows:
if sum(counters) > 0 and cycle_count > 0:
p = 4 + 100 * sum(counters) / cycle_count
else:
p = 0
Health
For batteries of type 0, a pre-calculated health value can be queried and is then scaled like this:
ratio = health / capacity
if ratio > 80:
h = 4
else:
h = ratio / 10 - 5
For all other battery types, a health value is calculated like this:
f_ol = max(overload - 29, 0)
f_od = max(35 - overdischarge, 0)
dmg = cycles + cycles * (f_ol + f_od) / 32
scale = 1000 if capacity in (26, 28, 40, 50) else 600
h = 4 - dmg / scale
Slow Website?
This website is very fast, and pages should appear instantly. If this site is slow for you, then your routing may be messed up, and this issue does not only affect done.land, but potentially a few other websites and downloads as well. Here are simple steps to speed up your Internet experience and fix issues with slow websites and downloads..
Comments
Please do leave comments below. I am using utteran.ce, an open-source and ad-free light-weight commenting system.
Here is how your comments are stored
Whenever you leave a comment, a new github issue is created on your behalf.
-
All comments become trackable issues in the Github Issues section, and I (and you) can follow up on them.
-
There is no third-party provider, no disrupting ads, and everything remains transparent inside github.
Github Users Yes, Spammers No
To keep spammers out and comments attributable, all you do is log in using your (free) github account and grant utteranc.es the permission to submit issues on your behalf.
If you don’t have a github account yet, go get yourself one - it’s free and simple.
If for any reason you do not feel comfortable with letting the commenting system submit issues for you, then visit Github Issues directly, i.e. by clicking the red button Submit Issue at the bottom of each page, and submit your issue manually. You control everything.
Discussions
For chit-chat and quick questions, feel free to visit and participate in Discussions. They work much like classic forums or bulletin boards. Just keep in mind: your valued input isn’t equally well trackable there.
(content created Dec 16, 2025)