Home Assistant integration for managing EV charging schedules via EVCC API.
- 🚗 Automatic Vehicle Detection: Syncs with selected vehicle in EVCC
- ⚙️ Dynamic Plan Management: Create/update/delete repeating charging schedules
- 🔄 Real-time Updates: WebSocket support with polling fallback
- 🎛️ Switch Entities: Toggle plans directly from Home Assistant UI
- 🌍 Multi-Language: German & English support
- 📱 Custom Card Ready: WebSocket API for advanced UI integration
- 🧪 Experimental Custom Card WS API: Disabled by default, opt-in via config checkbox (untested)
- ✅ HACS Compatible: Install via Home Assistant Community Store
- Open HACS → Integrations
- Click ⋮ → Custom Repositories
- Add:
https://github.com/diestrohs/ha-evcc-scheduler - Select Integration category
- Search "EVCC Scheduler" → Install
- Restart Home Assistant ⭐
- Settings → Devices and Services
- Click + Create Integration
- Search "EVCC Scheduler"
- Enter:
- Host:
192.168.1.100(EVCC IP) - Port:
7070(default) - Token: (if required)
- SSL: Enable for HTTPS
- WebSocket: Enable for real-time updates (default: enabled)
- Polling Interval: seconds (default: 30, only if WebSocket disabled)
- Host:
- Click Submit ✅
- Switch entities appear as
switch.evcc_repeating_plan_01,switch.evcc_repeating_plan_02, etc. (vehicle-agnostic) - Toggle plans directly in Home Assistant UI
- Plan attributes include
vehicle_titleandvehicle_idto verify current vehicle - Use services to create/update/delete plans (toggle via
set_repeating_plan+activefield) - Entity IDs remain stable across vehicle changes - automations don't break!
- 📖 Full Documentation (English)
- 📖 Deutsche Dokumentation
- 🚀 HACS Installation Guide
- 📝 Changelog
- 🤝 Contributing
- Home Assistant 2025.12.0+
- EVCC 0.210.2+
- Python 3.11+
- Network access to EVCC instance
Create or update a repeating charging plan.
Parameters:
vehicle_id(required): Vehicle ID from EVCC (e.g.,db:1)plan_index(optional): Plan number (1-based). Omit to create new plantime(optional): Start time in HH:MM format (24h)weekdays(optional): Weekdays [1=Mon, 2=Tue, ..., 7=Sun]soc(optional): Target state of charge (1-100%)active(optional): Plan is active (true/false, default: true)tz(optional): IANA timezone (defaults to Home Assistant timezone)precondition(optional): Enum — 0=no precondition, 1=PV surplus only, 2=cheap prices only (defaults to 0)
Create new plan:
service: evcc_scheduler.set_repeating_plan
data:
vehicle_id: "db:1"
time: "07:00"
tz: "Europe/Berlin"
weekdays: [1, 2, 3, 4, 5]
soc: 80
precondition: 1
active: trueUpdate existing plan:
service: evcc_scheduler.set_repeating_plan
data:
vehicle_id: "db:1"
plan_index: 1
soc: 90Toggle plan active status:
service: evcc_scheduler.set_repeating_plan
data:
vehicle_id: "db:1"
plan_index: 1
active: falseDelete a repeating charging plan.
Parameters:
vehicle_id(required): Vehicle ID from EVCC (e.g.,db:1)plan_index(required): Plan number to delete (1-based)
service: evcc_scheduler.del_repeating_plan
data:
vehicle_id: "db:1"
plan_index: 1- Time must be
HH:MM(00:00–23:59) - Weekdays must be a non-empty list of integers 1–7
- SOC must be an integer in range 0–100
- Active must be boolean
- Precondition must be 0, 1 or 2 (enum)
config_flow.py ──→ __init__.py ──→ coordinator.py ──→ api.py
↓ ↓
websocket_client.py entity_manager.py ←→ switch.py
↓
websocket_api.py (Custom Card API)
- DataUpdateCoordinator: 30-second polling interval
- WebSocket: Real-time updates with auto-reconnect
- Entity Manager: Automatic creation/deletion based on vehicle
- Entity Registry: Cleanup on restart and unload
# Test EVCC connectivity
curl http://192.168.1.100:7070/api/state | jq '.vehicles'
# Test WebSocket
wscat -c ws://192.168.1.100:7070/wsAdd to configuration.yaml:
logger:
logs:
evcc_scheduler: debug
evcc_scheduler.api: debug
evcc_scheduler.coordinator: debugMIT License - See LICENSE for details
See CHANGELOG.md for version history.
Version: 0.1.4
Home Assistant: 2025.12.0+
EVCC: 0.210.2+
License: MIT
Last Updated: January 24, 2026
Deutsch / German cd /config/custom_components git clone https://github.com/diestrohs/ha-evcc-scheduler.git
## Konfiguration
Nach der Installation:
1. Gehe zu **Einstellungen** → **Geräte und Services** → **Integrationen**
2. Klicke auf **"+ Integration erstellen"**
3. Suche nach **"EVCC Scheduler"**
4. Folge der Konfiguration:
- **Host**: IP oder Hostname von EVCC (z.B. `192.168.1.100`)
- **Port**: EVCC API Port (Default: `7070`)
- **Token**: Optional (falls EVCC Token-Auth hat)
- **SSL**: An/Aus je nach EVCC-Setup
- **Timeout**: HTTP-Timeout in Sekunden (Default: `10`)
## Verwendung
### Services
Die Integration stellt folgende Services zur Verfügung:
#### `evcc_scheduler.set_repeating_plan`
Erstelle oder aktualisiere einen Ladeplan
```yaml
service: evcc_scheduler.set_repeating_plan
data:
vehicle_id: "db:1"
plan_index: 1 # Optional: null = neuer Plan
time: "07:00"
weekdays: [1, 2, 3, 4, 5] # 1=Mo, 7=So
soc: 80
active: true
Lösche einen Ladeplan
service: evcc_scheduler.del_repeating_plan
data:
vehicle_id: "db:1"
plan_index: 1Nutze evcc_scheduler.set_repeating_plan mit dem Feld active:
service: evcc_scheduler.set_repeating_plan
data:
vehicle_id: "db:1"
plan_index: 1
active: truePer charging plan, 4 entities are created:
- Switch:
switch.evcc_elroq_repeating_plan_1_activ- Activate/deactivate plan - Time:
time.evcc_elroq_repeating_plan_1_time- Start time of the plan - Icon:
mdi:clock-digital - Text:
text.evcc_elroq_repeating_plan_1_weekdays- Weekdays (comma-separated: 1,2,3,4,5) - Number:
number.evcc_elroq_repeating_plan_1_soc- Target charge in % (0-100) - Icon:
mdi:battery-charging(UI slider step: 10; services accept any integer 0–100)
Entity Attributes (available in all entities):
vehicle_id: Vehicle ID (e.g.db:1)vehicle_title: Vehicle name (e.g.Elroq)plan_index: Plan number (1-based)time,weekdays,soc,active: Plan details (only in Switch entity)weekdays_list: Weekdays as list (only in Text entity)
Note: Entity IDs remain stable across vehicle changes - automations continue working!
- Entities share a common base:
base_entity.py(BaseEvccPlanEntity) - Provides shared fields (
vehicle_id,vehicle_title,plan_index),update_data(), and unique ID helper - Platform setup is unified via
setup_platform()to reduce boilerplate
Detaillierte Dokumentation:
- DOCUMENTATION.md - Vollständige Technische Dokumentation
- CARD_README.md - Custom Lovelace Card Installation
- Home Assistant 2025.12 oder neuer
- EVCC v0.210.2 oder neuer mit aktivierter REST API
- EVCC und Home Assistant im gleichen Netzwerk (oder erreichbar)
- Python 3.11+
Alle Fahrzeuge, die in EVCC konfiguriert sind:
- Tesla (Model S, 3, X, Y)
- Volkswagen (ID.4, ID.5, ID. Buzz, ID.3, etc.)
- Škoda (Enyaq, Superb iV, Citigo iV, etc.)
- Audi (e-tron, Q4 e-tron, e-tron GT, etc.)
- Cupra (Born, Leon, etc.)
- BMW (i3, i4, iX, etc.)
- Mercedes (EQA, EQC, EQE, EQS, etc.)
- Hyundai (Ioniq, Kona, Tucson, etc.)
- Kia (e-Niro, EV9, EV6, etc.)
- Nissan (Leaf, Ariya, etc.)
- Polestar (1, 2, 3, etc.)
- Porsche (Taycan, etc.)
- Und weitere...
Wenn die Integration nicht funktioniert:
-
Logs prüfen:
logger: logs: evcc_scheduler: debug
-
EVCC-Verbindung testen:
curl http://192.168.1.100:7070/api/state | jq '.vehicles'
-
WebSocket testen:
wscat -c ws://192.168.1.100:7070/ws
MIT License - Siehe LICENSE Datei
Beiträge sind willkommen! Bitte lese CONTRIBUTING.md für Details.
Getestet mit:
- Home Assistant 2025.12 ✅
- EVCC 0.210.2 ✅
- Python 3.12 ✅