A minimal, Home Assistant-native Lovelace card to set an EVCC departure charge plan (departure time + target state of charge). Designed as a lightweight companion to the marq24/ha-evcc integration — without the complexity of a full EVCC dashboard card.
Built to feel like a native Home Assistant tile card: same typography, control styling, hover states, and theme-aware colors. Works great inside a browser_mod popup, on desktop, iPhone, and iPad.
- 📅 Day stepper — quickly pick today, tomorrow, or up to 6 days ahead
- 🕐 Native time picker — 15-minute steps (configurable)
- 🔋 Charge target pills — one-tap SoC selection (50–100%, configurable)
- 🟡 Plan status header — shows the active plan (time → SoC) and highlights the icon, just like a tile card
- 💾 Save / Cancel / Delete — writes the plan via
evcc_intg.set_vehicle_plan, deletes viaevcc_intg.del_vehicle_plan - 🪟 Popup-aware — Save/Cancel/Delete automatically close a browser_mod popup
- 🌐 English + Dutch — auto-detected from your Home Assistant language, or forced via config
- 🎨 Theme-aware — all colors derive from your active theme; no hardcoded styling
- ha-evcc (
evcc_intg) — the EVCC integration that provides the entities and theset_vehicle_plan/del_vehicle_planservices - A vehicle configured in EVCC that supports SoC-based plans
- Optional: browser_mod if you want to open the card as a popup
- In HACS, click the three-dot menu → Custom repositories
- Add
https://github.com/tieskuh/evcc-plan-cardwith category Dashboard - Search for EVCC Plan Card and install it
- Reload your browser (HACS registers the resource automatically)
- Download
evcc-plan-card.jsfrom the latest release - Copy it to
config/www/evcc-plan-card.js - Add it as a dashboard resource: Settings → Dashboards → ⋮ → Resources →
/local/evcc-plan-card.js(JavaScript module)
type: custom:evcc-plan-card
loadpoint: carportThe loadpoint is the slug of your EVCC loadpoint as it appears in your evcc_intg entity IDs (e.g. select.evcc_carport_vehicle_name → loadpoint is carport). All entity IDs are derived from it automatically.
Open the card from any button, for example from a tile card feature:
tap_action:
action: fire-dom-event
browser_mod:
service: browser_mod.popup
data:
dismissable: true
style: |
--popup-min-width: 420px;
--popup-max-width: 460px;
ha-dialog {
--dialog-surface-margin-top: auto;
--ha-dialog-scrim-backdrop-filter: blur(8px);
--mdc-dialog-scrim-color: rgba(0,0,0,0.4);
--ha-dialog-border-radius: 18px;
}
content:
type: custom:evcc-plan-card
loadpoint: carportThe Save, Cancel, and Delete buttons close the popup automatically.
| Option | Type | Default | Description |
|---|---|---|---|
loadpoint |
string | carport |
EVCC loadpoint slug; used to derive all entity IDs below |
vehicle_select |
entity | select.evcc_<loadpoint>_vehicle_name |
The ha-evcc vehicle select; the vehicle ID for the plan service is read from its attributes |
plan_active |
entity | binary_sensor.evcc_<loadpoint>_plan_active |
Binary sensor indicating an active plan |
plan_time |
entity | sensor.evcc_<loadpoint>_effective_plan_time |
Timestamp sensor with the plan departure time |
plan_soc |
entity | sensor.evcc_<loadpoint>_effective_plan_soc |
Sensor with the plan target SoC |
soc_options |
list | [50, 60, 70, 80, 90, 100] |
Charge target percentages shown as pills |
minute_step |
number | 15 |
Time picker granularity in minutes |
default_day_offset |
number | 1 |
Default day when no plan is active (0 = today, 1 = tomorrow) |
default_hour |
number | 8 |
Default hour when no plan is active |
default_soc |
number | 80 |
Default charge target when no plan is active |
max_days |
number | 6 |
How many days ahead can be selected |
language |
string | auto | Force a language (en or nl); defaults to your HA language |
title |
string | auto | Override the card title |
When a plan is active, the card pre-fills with the plan's day, time, and target instead of the defaults, and shows a Delete plan button.
The card calls the evcc_intg services directly — no helpers, scripts, or automations needed:
- Save →
evcc_intg.set_vehicle_planwithvehicle,soc, andstartdate - Delete →
evcc_intg.del_vehicle_planwithvehicle
The vehicle ID is resolved live from the loadpoint's vehicle select entity, so it follows whatever vehicle is currently assigned to the loadpoint.
- marq24/ha-evcc for the excellent EVCC integration
- evcc for the EV charging brains
