A local, no-cloud Home Assistant integration for the ISDT PB40 power
bank, also sold as the LIMETA EB40 (companion app LiMeta,
com.limeta.limeta). It talks to the pack directly over Bluetooth Low
Energy — no account, no internet, no vendor cloud.
Several power banks are supported at once: each is auto-discovered and added as its own device.
Looking for the protocol rather than the integration?
docs/PROTOCOL.mddocuments the PB40's BLE advertisement format and its connected GATT protocol in full — byte offsets, command map and status codes — reverse-engineered from the LiMeta Android app and verified against real hardware. It stands on its own if you are writing a client in another language.
Battery level and status come from the advertisement, which the pack broadcasts continuously and cannot be turned off. No connection is opened, so these keep working at the edge of radio range.
| Entity | Notes |
|---|---|
| State of charge | % |
| Status | standby / charging / discharging / full / error / offline |
| Port 1, Port 2 | idle / input / output |
Live power, energy and the device settings are not broadcast. Those use a short-lived GATT connection, polled on an interval you control.
| Entity | Notes |
|---|---|
| Power | total, W |
| Port 1/2 power | W |
| Port 1/2 voltage, current | V / A — disabled by default, enable if wanted |
| Total energy | lifetime Wh |
| Charge cycles | count |
| Find button | makes the pack beep so you can locate it |
| Battery care, Alarm tone, Auto-off light, Long press | switches |
The two halves are independent by design: if the connection fails — likely, at this device's signal strength — only the connected entities go unavailable. State of charge and status carry on regardless.
- HACS → ⋮ → Custom repositories
- Add
https://github.com/PetePeter/pb40-bluetooth, category Integration - Install, then restart Home Assistant
Copy custom_components/pb40_ble into your Home Assistant
config/custom_components/ directory and restart.
Either way, power banks in range are then discovered automatically under Settings → Devices & Services. Home Assistant needs a Bluetooth adapter or an ESPHome Bluetooth proxy within range.
Settings → Devices & Services → PB40 → Configure
| Option | Default | Notes |
|---|---|---|
| Poll over a connection | on | Turn off for advertisement-only operation |
| Polling interval | 5 min | 1–120. Each poll costs one connection |
Naming a pack in the LiMeta app is worthwhile: the name rides in the advertisement and Home Assistant adopts it as the device name.
- The pack's signal is weak (-70 to -93 dBm observed). Advertisements survive this comfortably; connections are less reliable, which is why polling is conservative and connections are not held open.
- Every connection occupies a slot on your Bluetooth proxy, so a short interval across several packs is not free.
- Settings behaviour varies by firmware: version 1.4.1.46 and later answer a single parameters block, earlier firmware answers individual reads. Both are handled, and only the settings your pack actually reports become switches.
python -m pytest tests/ -qparser.py (advertisement) and protocol.py (connected protocol) are pure and
dependency-free — no Bluetooth hardware is needed to run the tests. They are
checked against bytes captured from real devices and against the field layouts
in the vendor app.
Protocol work is original reverse-engineering for interoperability, documented
in docs/PROTOCOL.md and
docs/GATT_RECON.md.
Not affiliated with, endorsed by, or supported by ISDT or LIMETA. Product names are trademarks of their respective owners.
Released under the MIT Licence.