Wallbox Gateway — local BLE → MQTT for Pulsar MAX (no cloud, full HA control)

ESP32-S3 gateway that talks to a Wallbox Pulsar MAX over BLE and publishes everything to MQTT. No cloud, no Wallbox account — fully local on your LAN.

Home Assistant picks it up automatically via MQTT discovery.

HA out of the box (~30 entities):

  • Start / stop charging, lock / unlock
  • Live power, current, voltage, session kWh
  • Lifetime Energy sensor wired for the HA Energy dashboard
  • Schedule editor, Eco Smart mode, Phase Switch, Halo LED, Auto Lock, OCPP

Also a self-hosted web UI on the ESP32 itself — captive-portal first-boot,
weekly heatmap with click-to-drill-down, daily charging totals (groups
solar/eco-smart pause/resume cycles into one plug-in event), CSV export of
session history, and a “Release BLE for app” button so you can pop into
the official Wallbox app without rebooting the gateway.

Hardware: ESP32-S3 with 8 MB+ flash. I’m using an N16R8 with IPEX antenna
— the Pulsar MAX BLE is weak so range matters.

Install: flash via ESP Web Tools in the browser
or OTA, connect to the WallboxGW-Setup AP for first-boot config.

Repo + pre-built binaries: https://github.com/botts7/esp32-wallbox

Pairs nicely with the official HA Wallbox cloud integration if you want
session cost and billing history — this gateway handles the local/fast side,
that one handles the cloud side. Use both.

Feedback and compatibility reports from other Pulsar MAX owners (or
adjacent models — Pulsar Plus, Copper SB) much appreciated.

2 Likes

I just got my first EV and have been looking for chargers that integrate well with home assistant. This looks awesome!

Thank so much for the work and posting!

Thanks @Judman13 let me know how you go if you get the charger

Wow, great project! I will install it and provide you with feedback. I’ve tried multiple ways to manage this wall box, but if this works well, it’s a game changer.

May I ask if this can manage the power charging control, modifying the current in real-time?

Thank you. Please do! There is a slider for the current. Im not sure how the Wallbox handles a max current change when already charging.

You could try modifying current using a HA automation and see if it works, or change current while its charging with the slider. This has not been tested so do so at your own risk! But I believe its a standard Wallbox feature to alow for tarrif changes or solar production changes.




This is an interesting project.. I haven't tried it yet, but I definitely will. Nice work!

Have you considered skipping the whole MQTT in between layer and just making it a custom HA integration? HA supports BLE proxies as far as I know (Bluetooth - Home Assistant), so range shouldn't be a problem.

I guess the local webui would be lost by this approach, so that might be the reason why you choose not to. Just curious to hear your thoughts :slight_smile:

Great question — I did consider it, and there's a real argument for the
HA-native route. Reasons I went with the MQTT bridge:

  1. Standalone operation. The ESP32 has its own web UI and keeps charging
    working even when HA is down (restart, update, migration). Schedules live
    on the ESP32, not in HA's state machine. For something that controls a
    real-world appliance, I wanted decoupling from any single consumer.

  2. A BLE proxy isn't quite the right shape. HA proxies relay raw GATT
    traffic — they're great for stateless devices (BLE thermos, presence
    beacons). Wallbox uses a stateful custom protocol (BAPI framing with
    sequencing + checksums on writes, raw JSON on responses, PIN auth flow).
    A native integration would still need that whole protocol stack
    reimplemented in Python under HA's async loop, with its lifecycle
    quirks. The ESP32 already does this in C++; moving it to HA is a rewrite.

  3. Multi-consumer. MQTT means Node-RED, openHAB, custom scripts, or a
    future second HA instance can all consume it. Pure HA integration locks
    in to HA.

  4. Dedicated radio. Single-purpose ESP32 holds the BLE link 24/7. HA's
    Bluetooth stack shares time with whatever else you've got it doing
    (ESPresense, etc.) and reconnect behavior under load isn't always
    great.

  5. OTA. Firmware updates ship as a .bin you upload to the device. No
    redeploying integration code or bumping HACS versions.

That said — a native integration is absolutely doable. The
right path would be: extract a pybapi Python library, then build the
integration on top with an HA Bluetooth backend. The protocol's already
documented in the repo's include/bapi.h.

For now the architecture is "ESP32 = the protocol; HA = the dashboard",
which I think keeps both ends simple.

1 Like

v2.2.0 just shipped — biggest release since launch:

:electric_plug: WebSocket live dashboard — no more 10-second polling lag. Web UI
tiles update the instant the gateway gets fresh data from BLE.

:money_bag: Cost tracking with time-of-use tariffs — set your $/kWh + custom
peak / off-peak / shoulder periods (any number of tiers, day-of-week + hour
ranges). See $ per session, per day, and Week/Month totals at a glance.
CSV export for spreadsheet nerds.

:sun: Solar savings tracking — if you use Eco Smart mode, the charger
already knows how much of each session came from your solar surplus vs the
grid. This release surfaces that as a real $ figure:

"15 kWh charged from solar this week — $4.50 saved vs grid rates"

Set your feed-in tariff in the cost panel and you can also see what you
chose to self-consume vs export. Pairs with HA's Energy dashboard for the
long-term picture.

:bell: Charger notifications surfaced on the dashboard tile.

:satellite_antenna: BLE health banner with 5 tiers — tells you when to move the ESP32
closer instead of just feeling slow UI.
:bell: Charger notifications surfaced on the dashboard tile.

:satellite_antenna: BLE health banner with 5 tiers — tells you when to move the ESP32
closer instead of just feeling slow UI.

:shield: Settings panels won't overwrite real config — refuse to render if
they couldn't read current state from the charger (was a real bug — fall-
back defaults could silently overwrite eco/lock/OCPP if you opened a panel
during a BLE blip).

Download / changelog → Release v2.2.0 — Cost tracking · WebSocket live dashboard · Panel guards · botts7/esp32-wallbox · GitHub

OTA upgrade from v2.x at http://wallbox-gw.local/ota.

Coming next (~2 weeks): PWA push notifications — "Charging complete"
alert on your phone without HA or cloud, with toggle for HA users who
already get notifs that way.

:folded_hands: Compatibility wanted: anyone running a Pulsar Plus, Copper
SB
, or Commander 2, please open a GitHub issue with the r_dat
output from /info — keen to broaden the supported charger list.