Automation

Best EV Chargers for Home Assistant: evcc, OCPP and Solar Charging

This post contains affiliate links. If you buy through them, we may earn a small commission at no extra cost to you. Learn more.

Your solar inverter knows how many watts the house is pushing back to the grid, and your EV charger can draw anything from 6 to 48 amps. Nothing connects the two unless a controller reads the export every few seconds and sets the charger’s current to match. The best EV charger for Home Assistant is therefore the one that lets that controller set the amps over your own network, with no vendor cloud between the meter and the car.

Original content from computingforgeeks.com - post 178408

We ranked the chargers by the path the current limit takes: a native local API, OCPP pointed at a server you run, or a cloud account. The controller in every case is evcc, the open source charge manager, with Home Assistant on top for dashboards and overrides. No charger was wired to a breaker for this guide, so hardware specs come from the makers’ datasheets and live Amazon listings, and the control loop ran against a simulated OCPP wallbox. We confirmed the setup working on evcc 0.318.1 and Home Assistant 2026.10.4 in October 2026, with real logs showing every amp change evcc sent.

Pick an EV charger for Home Assistant

Three chargers pass the test of local current control today. Each has its own section below with the trade-off that would make you skip it, and prices are bands from today’s listings, so check the live price before you buy:

  • Best fully local charger: OpenEVSE Advanced Series 48A (about $660 direct). evcc drives it through its own HTTP API with no sponsor token, and Home Assistant has a core integration for it.
  • Best value OCPP charger: Autel MaxiCharger Home 50A (about $430 to $500 hardwired). The Autel Charge app takes a custom OCPP server URL, so evcc or Home Assistant becomes its only boss.
  • Best charger with a polished app: Wallbox Pulsar Plus 48A (about $700 hardwired, or $600 for the 40A NACS plug-in). Its own Home Assistant integration is cloud-only, but OCPP gives you a local path.

Grizzl-E, Tesla, Emporia, ChargePoint and Enphase all came up while we researched this guide, and none of them made the cut. The reasons are specific (a paid OCPP licence, a read-only API, cloud-only control) and they are listed near the end, because they are exactly the traps a “works with Home Assistant” badge hides.

Let evcc set the amps

Solar-excess charging is a control loop, and the piece that ties it together is evcc. It reads your grid and PV meters, works out how much power is spare, converts that to amps, and tells the charger the new limit. On our lab VM the loop ran every 10 seconds, and the charger got its new limit within one or two cycles of the surplus changing. Home Assistant talks to evcc, not to the charger, which keeps the logic in one place and the automations simple. Home Assistant flips evcc between Off, Smart and Fast, and evcc does the arithmetic.

Diagram of grid and PV meters feeding evcc, which sets charger current over OCPP or the OpenEVSE API while Home Assistant controls evcc
The meters feed evcc, evcc sets the amps, and Home Assistant switches evcc’s mode. Nothing in the loop needs the internet.

The charger side of that diagram has two doors. OpenEVSE exposes a native HTTP API that evcc controls directly. Everything else on this list speaks OCPP 1.6J, the protocol commercial chargers use to report to a central system: you point the charger’s OCPP setting at ws://<evcc-host>:8887/, and evcc acts as that central system. In our capture, every current change arrived as an OCPP SetChargingProfile call with the limit in amps, so any charger that honours that message can be steered.

There is a cost to the OCPP door that most “best charger” lists skip. evcc’s OCPP templates (the generic one, Autel, Wallbox and Grizzl-E) all require a sponsor token, which costs $4 a month or $150 once for a lifetime token through GitHub Sponsors. Open-hardware chargers such as OpenEVSE need none. If you would rather not pay, the free OCPP integration for Home Assistant (HACS, port 9000) can be the central system instead, but then the solar arithmetic is yours to write as automations. We would pay the token: the hysteresis timers alone are worth it, as the lab section shows.

Compare the chargers side by side

The column that decides this category is the control path. Amps and cable length matter for the install, but only the path tells you whether solar charging keeps working when the vendor’s cloud has a bad afternoon:

ChargerMax currentLocal control pathHome Assistantevcc tokenPrice band
OpenEVSE Advanced 48A48 A (6 A to 48 A in 1 A steps)Native HTTP API, MQTT or OCPP 1.6JCore integration, local pushNot neededAbout $660 direct
Autel MaxiCharger Home 50A50 A hardwiredOCPP 1.6J to a custom URLHACS OCPP, localNeededAbout $430 to $500
Wallbox Pulsar Plus48 A hardwired, 40 A plug-inOCPP 1.6J to a custom URLCore integration is cloud; HACS OCPP for localNeededAbout $600 to $700

Read the table right to left if you are on a budget. Autel is the cheapest box with a working local path. The evcc token pushes its real cost toward OpenEVSE’s, and OpenEVSE then wins on every column except price. Wallbox is the one to pick when somebody else in the house wants the compact box and a familiar brand, as long as you accept that its built-in solar feature is off the table once OCPP is on.

Run evcc with OpenEVSE

OpenEVSE is the only charger here that was built to be controlled by your own software, and it shows in how little wiring it takes.

OpenEVSE Advanced Series 48A EV charger with local Home Assistant and evcc control
OpenEVSE Advanced Series 48A: 6 A to 48 A in 1 A steps, local API, OCPP and MQTT. Image: OpenEVSE.

Verdict: the pick if local control is the point. The Wi-Fi module serves an HTTP API on your LAN, and evcc’s openevse template drives it through the charger’s claims API with no sponsor token. Home Assistant’s core OpenEVSE integration is local push, so state changes land in Home Assistant without polling. It adjusts from 6 A to 48 A in 1 A steps, which matters for solar: at 240 V each amp is about 240 W, so the charger can follow a passing cloud closely instead of jumping in big steps.

Who it’s for: anyone running evcc or Home Assistant who wants the charger to keep working the same way in five years, whatever the vendor’s business model does. Skip it if you want a sealed retail product with a big-brand warranty desk behind it. OpenEVSE sells direct, Amazon US had no OpenEVSE listing when we checked, and the store’s product page is where its weather claims (IP68, -40 to 60 C) come from, so we could not corroborate them anywhere else.

Two details catch owners. A manual On or Off set on the charger’s own dashboard overrides evcc until you tap Auto again, so a family member’s button press can quietly stop solar charging. And the input cord sets your ceiling: the NEMA 14-50 cord limits it to 40 A, so you need the 14-60 cord for the full 48 A. The 48 A J1772 version with a 25 ft cable was about $660 on the OpenEVSE store; check the live price.

Point an Autel MaxiCharger at evcc

The Autel is the cheapest mainstream charger we found whose app lets you type in your own OCPP server, which is all evcc needs.

Autel MaxiCharger Home 50A EV charger for Home Assistant and evcc over OCPP
Autel MaxiCharger Home 50A: hardwired, Wi-Fi and Bluetooth, NEMA 4, UL and CSA listed. Image: Autel.

Verdict: the best value if you are happy to configure OCPP once and forget the app. In the Autel Charge app, open OCPP Server, choose Custom, and enter ws://<evcc-host>:8887/. The authorisation key stays empty. evcc’s ocpp-autel template documents the minimum firmware (Charge Control V1.51.00, Power Control V1.19.00), so check both before you blame the network. An owner of this exact listing reported in the Home Assistant OCPP issue tracker that on/off and current control kept working with the charger blocked from the internet, which is the test that matters here.

Buy it for a hardwired install on a circuit sized for 50 A, run by somebody who’ll spend ten minutes in the app once. Pass on it if you need a plug-in unit (this listing is hardwired) or you will not pay for an evcc token. In that case the free HACS OCPP integration can be the server, and its docs note that a station-wide current cap on Autel needs the “absolute schedule” option. Autel rates it NEMA 4, lists UL and CSA certification and ENERGY STAR, and gives a 3-year warranty with a 25 ft cable. The app adjusts from 16 A to 50 A. Autel runs two 50 A hardwired listings at about $430 and $500; check the live price before you pick one.

Switch a Wallbox Pulsar Plus to OCPP

Wallbox makes the nicest-looking box here and the most confusing integration story, so it is worth being clear about which path you’re buying.

Wallbox Pulsar Plus EV charger switched to OCPP for local Home Assistant control
Wallbox Pulsar Plus: 48 A hardwired or 40 A plug-in, OCPP 1.6J. Image: Wallbox.

Verdict: a good charger once you stop using Wallbox’s own smart features. Home Assistant’s core Wallbox integration talks to the MyWallbox cloud, so it stops when the cloud does. The local route is OCPP: in the myWallbox app you turn on Enable OCPP, set the URL to ws://<evcc-host>:8887/ with an empty password, and turn on “Improved charger control” under the experimental functions, which evcc’s ocpp-wallbox template asks for. Wallbox’s own Solar Charging feature is not compatible with OCPP, so evcc has to do the solar logic, and that is the setup we would run anyway.

It fits a shared garage where somebody wants the compact box and a plug-in NACS or J1772 option. Look elsewhere if you want the OCPP link to be boring. evcc lists two caveats for this template: meter values can be missing, and the connection can need an evcc restart to recover. Wallbox sells it at 40 A (9.6 kW at 240 V) on a NEMA 14-50 plug or hardwired, and at 48 A (11.5 kW) as a hardwired unit. The 48 A hardwired J1772 listing was about $700 and showed limited stock, and the 40 A NACS plug-in about $600; check the live price.

Wire the solar loop and watch it react

We built the whole chain on an Ubuntu 26.04 VM: evcc from its APT repository, a Mosquitto broker standing in for the grid and PV meters, and a small Python OCPP 1.6J charge point standing in for the wallbox. The simulator connected to evcc exactly as an Autel or Wallbox would, logged every call evcc made, and reported back the current it was told to draw. That let us change the solar surplus on demand and time evcc’s response.

evcc publishes an APT repository for Debian and Ubuntu. Add it with the setup script, then install the package.

curl -1sLf 'https://dl.evcc.io/public/evcc/stable/setup.deb.sh' | sudo -E bash
sudo apt-get install -y evcc

Confirm the binary and the repo it came from.

evcc --version
apt-cache policy evcc | head -4

The installed and candidate versions should match.

evcc version 0.318.1
evcc:
  Installed: 0.318.1
  Candidate: 0.318.1
  Version table:

The configuration lives in /etc/evcc.yaml, so open it in an editor.

sudo vim /etc/evcc.yaml

This is the file we ran, with the LAN address changed to an example and the token replaced by a placeholder. The two meters read watts from MQTT topics; on a real system you’d swap them for your inverter or meter template. The charger is the generic OCPP template, and stationid must match the charge point identity you type into the charger’s app. We capped the loadpoint at 16 A for the simulator, so set maxcurrent to what your circuit and charger allow. On a real Autel or Wallbox, use the brand template (ocpp-autel or ocpp-wallbox) instead of the generic ocpp, because each adds options its charger needs. Replace the demo vehicle block with your car’s template or delete it, and start with the free trial token from evcc’s sponsorship page until you have bought one:

network:
  schema: http
  host: 10.0.1.50
  port: 7070

interval: 10s

meters:
  - name: grid
    type: custom
    power:
      source: mqtt
      topic: lab/grid/power
      timeout: 120s
  - name: pv
    type: custom
    power:
      source: mqtt
      topic: lab/pv/power
      timeout: 120s

mqtt:
  broker: 127.0.0.1:1883

chargers:
  - name: wallbox
    type: template
    template: ocpp
    stationid: SIM-WB-001
    connector: 1

vehicles:
  - name: demo_car
    type: custom
    title: Demo EV
    capacity: 60
    soc:
      source: const
      value: 40

loadpoints:
  - title: Garage
    charger: wallbox
    vehicle: demo_car
    mode: off
    phases: 1
    mincurrent: 6
    maxcurrent: 16

site:
  title: Lab home
  meters:
    grid: grid
    pv:
      - pv
log: debug
sponsortoken: your-sponsor-token

Set phases: 1 on a US split-phase supply. Without it, and without the charger reporting per-phase current, evcc assumed three phases in our first run and offered only 6 A for a 4,800 W surplus that should have bought 16 A. The service runs as the evcc user, so give it read access before you validate. The --database flag points the check at the service’s own database:

sudo chown root:evcc /etc/evcc.yaml
sudo chmod 640 /etc/evcc.yaml
sudo evcc --database /var/lib/evcc/evcc.db checkconfig

A clean file prints one line after the config path.

[main  ] INFO 2026/10/27 10:15:57 using config file: /etc/evcc.yaml
config valid

Restart evcc, point the charger at ws://10.0.1.50:8887/, and switch the loadpoint to solar charging. If a firewall runs on the evcc host, the charger needs port 8887 and Home Assistant needs port 7070. The pv mode name still works on the API and maps to Smart with “Always charge” off:

sudo systemctl restart evcc
curl -s -X POST http://127.0.0.1:7070/api/loadpoints/1/mode/pv

Once the charger connects, evcc runs through a handshake (ChangeAvailability, GetConfiguration, a series of ChangeConfiguration calls and a TriggerMessage), then sets the current with a charging profile. This is the call our simulator logged, and it is the kind of message your real charger has to accept. The Wallbox template sends a relative profile instead.

09:32:31.617 IN  SetChargingProfile {"connector_id": 1, "cs_charging_profiles": {"charging_profile_id": 10, "stack_level": 10, "charging_profile_purpose": "TxDefaultProfile", "charging_profile_kind": "Absolute", "charging_schedule": {"start_schedule": "2026-10-27T09:31:31Z", "charging_rate_unit": "A", "charging_schedule_period": [{"start_period": 0, "limit": 6}]}}}

Then we stepped the surplus down and watched the limits evcc sent. Each row below comes from the simulator log and evcc’s API in the same run, so the times are real:

What we changedWhat evcc sentHow long it took
4,800 W export, mode Smart16 A (the loadpoint maximum)About 3 s after the mode change
Surplus stepped down to 2,500 W13.4 A, 7.5 A, 6 A, then back up to 9 A as the export settledOne new limit per 10 s cycle
Surplus below the 6 A floor6 A held, then 0 A (charging stopped)180 s disable timer
4,800 W export restored16 A20 to 35 s after the restore across three runs (60 s enable delay configured)
Mode Fast (API name now)16 A regardless of solarAbout 4 s
Mode Off0 AWithin a second

Two things in that table decide how solar charging feels in practice. evcc sends fractional amps (12.3, 8.6, 7.5 in our logs), so a charger that only accepts whole amps has to round them. Of the three picks, only evcc’s Autel template declares milliamp control; OpenEVSE works in 1 A steps, which is still fine, because at 240 V one amp is about 240 W. And the timers keep a cloud from stopping the session: below the floor, evcc held 6 A for the full three minute disable delay before it gave up. The enable delay is 60 s by default, though our runs restarted 30 to 50 s after the enable timer started because the simulator kept reporting itself as enabled at 0 A, which evcc flagged with an out-of-sync warning and acted on early. The floor itself is 6 A, which evcc computes at 230 V (its log showed an enable threshold of -1380 W), so a 240 V US supply needs roughly 1.4 kW of genuine export before a car charges on sun alone.

The evcc web UI shows the same session from the house’s point of view, with 5.3 kW of solar split into 4.3 kW used at home (3.8 kW of it by the car) and 1.0 kW still going to the grid:

evcc web UI showing the Garage loadpoint charging at 3.8 kW in Smart mode from solar surplus
evcc’s Garage loadpoint charging at 3.8 kW in Smart mode, fed by the simulated OCPP wallbox.

Home Assistant joins through the HACS integration ha-evcc, since there is no core evcc integration. We unzipped its release into custom_components/evcc_intg on a Home Assistant Container (HACS installs the same files; our guide to installing Home Assistant on Ubuntu 26.04 covers that route), pointed it at http://10.0.1.50:7070 with the evcc admin password, and it created 98 entities for the site and our one loadpoint. These are the ones you will build on.

binary_sensor.evcc_garage_charging                         on
binary_sensor.evcc_garage_connected                        on
number.evcc_garage_disable_delay                           180                    s
number.evcc_garage_enable_delay                            60                     s
number.evcc_garage_solar_share                             100                    %
select.evcc_garage_max_current                             16                     A
select.evcc_garage_min_current                             6                      A
select.evcc_garage_mode                                    smart

The mode select is the useful one. Setting select.evcc_garage_mode to off from Home Assistant reached the charger as a 0 A limit in the same second. Setting it back to smart was accepted at once, with the charge current still at 0 A when we read it back. That is the round trip end to end: a Home Assistant service call goes to evcc, evcc sends an OCPP profile, and the charger obeys, all without leaving the LAN. If you already run Home Assistant on a small box, our mini PC picks for Home Assistant have room for evcc alongside it.

Check these limits before you buy

The spec sheets bury the facts that decide whether solar charging works in your garage. We would check them in this order, because each one can rule a charger out before price comes into it:

  1. Confirm the charger lets you enter your own OCPP server URL, not just pick from a list of networks. Grizzl-E sells that as a paid licence, and plenty of chargers advertise OCPP that only reaches commercial back ends.
  2. Check the minimum current and step size. A 6 A floor with 1 A steps tracks the sun closely; a 16 A minimum in the app is fine as long as the OCPP side accepts lower limits.
  3. Check your solar system exports. evcc’s docs are clear that surplus charging does not work on zero-export systems, because there is no export reading to follow.
  4. Note the firmware minimums the evcc template lists, and update the charger before you commission it.
  5. Test Wi-Fi at the mounting spot. Every pick here is Wi-Fi, and a garage wall is where a 2.4 GHz signal goes to die.

Weak Wi-Fi is the item most people find out about too late. It is also why the radios in the rest of the house matter. A Z-Wave mesh reaches a garage more easily than Wi-Fi, which is where a Z-Wave 800 stick for Home Assistant earns its place, while a Zigbee coordinator covers the cheap door and temperature sensors you’ll want out there anyway. The US federal 30C home-charger credit ended for property placed in service after June 30, 2026, so do not count it in the budget.

Keep these off the shortlist

Each of these sells well and shows up in “works with Home Assistant” lists. None of them gives evcc or Home Assistant a free, local way to set the current today:

  • Grizzl-E Classic Connect and Ultimate: third-party OCPP access is a premium feature, a one-time licence per charger listed at 600 CAD on the Canadian store. That’s more than the Classic Connect’s US price of about $350, and evcc’s Grizzl-E template only covers the Mini Connect.
  • Tesla Wall Connector: the core Home Assistant integration is local but read-only, and evcc says the charger can’t be controlled directly; control goes through the car.
  • Emporia EV Charger: no OCPP on the spec sheet, no evcc template, and the community Home Assistant integration is cloud polling.
  • ChargePoint Home Flex: only an unofficial cloud integration, no evcc support, and no owner-configurable OCPP route we could confirm.
  • Enphase IQ EV Charger 2: a cloud HACS integration and no evcc or OCPP route we could confirm.

If you already own one of these, you may not be stuck. evcc has a Home Assistant charger template that drives a charger through four Home Assistant entities: a status sensor, an enabled sensor, an on/off switch and a current number in amps. A cloud integration that exposes all four can still follow the sun, with the vendor cloud’s delay and outages left in the loop. The Tesla Wall Connector integration is sensors only, so it can’t take that route. Tesla owners who mostly want monitoring will find the Wall Connector’s local sensors more than enough. It is the same local-versus-cloud split we drew for thermostats in Home Assistant, and it decides the same thing: whether the house keeps working when the vendor’s servers do not.

Every error below came up while we wired evcc to the OCPP charge point, in roughly the order a new install hits them. The first two stop the service from starting, and the third stops a config check.

“cannot create charger type ‘ocpp’: sponsorship required”

evcc refuses to load any OCPP charger template without a sponsor token, and the loadpoint then reports a missing charger. The journal shows it plainly.

Oct 27 09:09:52 evcc01 evcc[29995]: [main  ] FATAL 2026/10/27 09:09:52 charger [wallbox] cannot create charger 'wallbox': cannot create charger type 'template:ocpp': cannot create charger type 'ocpp': sponsorship required, see https://docs.evcc.io/docs/sponsorship
Oct 27 09:09:52 evcc01 evcc[29995]: loadpoint [lp-1] missing charger instance
Oct 27 09:09:52 evcc01 evcc[29995]: [main  ] FATAL 2026/10/27 09:09:52 will attempt restart in: 15m0s

Add sponsortoken: to the YAML, or enter it in the web UI under Configuration and Sponsorship (a token in the YAML locks the UI field). evcc publishes a regularly renewed trial token, so you can prove your charger works before you pay. Note the 15 minute retry: after fixing the file, restart the service instead of waiting.

“open /etc/evcc.yaml: permission denied”

The package runs evcc as the evcc user, and a file you copied in with sudo cp is readable by root only. Fix the group and mode with sudo chown root:evcc /etc/evcc.yaml and sudo chmod 640 /etc/evcc.yaml, which also keeps the sponsor token out of reach of other local users.

“evcc has been invoked with no explicit database path”

Running sudo evcc checkconfig on a box where the service already exists stops with this FATAL, because evcc will not silently create a second database next to the service’s. Pass --database /var/lib/evcc/evcc.db as shown in the lab section and the check runs against the real one.

“set charging profile: ocpp message: InternalError”

This means the charger received the profile and failed to handle it. Ours was a simulator bug on fractional amps, but a real charger with old firmware fails the same way, and evcc logs it on every cycle (the line below is trimmed to the loadpoint tag).

-1  ] ERROR 2026/10/27 09:22:21 set charge current limit 12.3A: set charging profile: ocpp message (1878507341): InternalError - An unexpected error occurred.

Update the charger to the firmware the evcc template names first. If it persists, check whether the charger only accepts whole amps, and look at the evcc template’s own options before you open an issue.

“charger out of sync: expected disabled, got enabled”

evcc logged this while its enable timer still had about 10 seconds to run, and in the same second it enabled charging and sent 16 A. It compares the state it expects with what the charger reports, and our simulator reported itself as enabled while drawing 0 A, so evcc resynced and cut the timer short. On a real charger it means the charger’s state and evcc’s disagree, either because the charger reports a different state than it was told or because the vendor app or a second central system is also giving orders. Make sure only one server holds the OCPP connection, and if the warning repeats, check what status the charger sends after a 0 A limit.

Keep reading

OpenCode CLI Cheat Sheet: Commands, Sessions and Fixes (PDF) AI OpenCode CLI Cheat Sheet: Commands, Sessions and Fixes (PDF) Best Mini PC for Home Assistant: 4 Picks for HAOS and Proxmox Automation Best Mini PC for Home Assistant: 4 Picks for HAOS and Proxmox Ansible + Proxmox: Automated VM Management Ansible Ansible + Proxmox: Automated VM Management Best Weather Stations for Home Assistant: Ecowitt, Tempest, Davis Automation Best Weather Stations for Home Assistant: Ecowitt, Tempest, Davis Best Water Leak Sensors and Auto Shutoff Valves for Home Assistant Automation Best Water Leak Sensors and Auto Shutoff Valves for Home Assistant How To Deploy Matrix Server using Ansible and Docker Automation How To Deploy Matrix Server using Ansible and Docker

Leave a Comment

Press ESC to close