This release is a pre-release and may not be stable for production use.
CarConnectivity Connector for the Volkswagen EU Data Act Portal
A CarConnectivity connector that reads vehicle
data from the VW Group EU Data Act portal (eu-data-act.drivesomethinggreater.com). It supports
every VW Group brand on the portal (Volkswagen, Audi, Škoda, SEAT, Cupra, Bentley) and models pure
EVs, combustion and PHEV drivetrains.
Why this connector exists
Volkswagen has blocked WeConnect API access for all 3rd-party integrations, which breaks the
carconnectivity-connector-volkswagen connector. For personal use, the EU Data Act portal is the
remaining access path. Its data has important limitations:
- Read-only. No commands are possible (lock/unlock, climatization, charge start/stop, etc.).
- ~15-minute cadence. Data is delivered as batch datasets roughly every 15 minutes, not live.
- Partial data. Some WeConnect data points are absent (e.g. GPS location; estimated range is often missing). Only the data points present in a dataset are exposed.
This connector authenticates against the portal (OIDC login, reusing the proven flow from the homeassistant-vw-eu-data-act integration), downloads the newest dataset per vehicle, and maps the available data points onto native CarConnectivity attributes as read-only values.
Prerequisites — enable continuous data on the portal first
Before adding the connector, you must enable a continuous 15-minute data request for your vehicle on the EU Data Act portal. The connector only downloads the datasets the portal generates — it cannot create the data request for you, and without an active request there will be nothing to fetch.
- Open https://eu-data-act.drivesomethinggreater.com/ and log in with your Volkswagen ID (the same email/password you'll use in the connector config).
- Go to Data clusters → Vehicle overview.
- Connect your car to the site if it isn't already listed (follow the on-screen pairing/consent steps for your VIN).
- Click Get customised data for the vehicle and follow the instructions to configure a continuous data request with a 15-minute frequency.
- Wait until the portal starts producing datasets (you'll see ZIP files appear in the vehicle's data delivery list, roughly every 15 minutes). The first file can take a little while to show up.
Once datasets are being generated, continue with the installation below.
The connector polls at most every 15 minutes because that is how often the portal publishes new data — a shorter interval cannot produce fresher values.
Installation
pip install -e .
Requires carconnectivity>=0.11.9.
Configuration
Add a connector of type vw_eu_data_act to your carconnectivity.json:
{
"carConnectivity": {
"connectors": [
{
"type": "vw_eu_data_act",
"config": {
"username": "you@example.com",
"password": "your-portal-password",
"interval": 900,
"country": "si",
"language": "sl",
"brand": "VOLKSWAGEN_PASSENGER_CARS"
}
}
]
}
}
| Key | Default | Description |
|---|---|---|
username / password |
— | VW ID credentials. May instead be provided in .netrc under machine vw_eu_data_act. |
netrc |
~/.netrc |
Path to a netrc file (used when username/password are omitted). |
interval |
900 |
Base poll interval (seconds, min 60). The connector auto-schedules ~15 min after the newest dataset and retries every minute while a delivery is overdue; with nothing dated to schedule from (empty listing), this interval is the fallback. |
country / language / brand |
si / sl / VOLKSWAGEN_PASSENGER_CARS |
OIDC state components. Each brand authenticates with its own OIDC client_id — set brand to match your car (see below). |
vin |
— | Optional. Restrict to a single VIN; otherwise all consented vehicles are used. |
hide_vins |
[] |
VINs to exclude. |
Supported brands
Set brand to the canonical key (or a friendly alias) for your vehicle. Matching is
case-insensitive; an unknown value falls back to Volkswagen Passenger Cars.
brand key |
Aliases | Manufacturer |
|---|---|---|
VOLKSWAGEN_PASSENGER_CARS |
VW, VOLKSWAGEN |
Volkswagen |
VOLKSWAGEN_COMMERCIAL_VEHICLES |
VWN, VW_COMMERCIAL |
Volkswagen Commercial Vehicles |
AUDI |
Audi | |
SKODA |
ŠKODA |
Škoda |
SEAT |
SEAT | |
CUPRA |
Cupra | |
BENTLEY |
Bentley |
Drivetrains (EV / combustion / PHEV)
The connector detects the drivetrain from the data points present (battery vs fuel) and promotes the
vehicle to electric, combustion or hybrid accordingly, following the same conventions as the official
carconnectivity-connector-seatcupra:
- Pure EV — a single
primary(electric) drive. - PHEV — the
primarydrive is the combustion engine and thesecondarydrive is the electric one (so the petrol range is no longer assigned to the electric drive).
Exposed data points (read-only)
Both the dotted (nested) and flat portal field names are accepted. Drive slots follow the drivetrain
(see Drivetrains above): on a PHEV the electric drive is the secondary slot and combustion is
primary; on a pure EV the electric drive is the single primary slot.
A dataset is a merge, not a moment. One portal delivery flattens several vehicle reports, each
captured at its own time, into a single unordered array. The official data dictionary defines a
capture timestamp per report group, but the flat export drops the grouping: nothing ties a field to
the report it came from. Two fields of the same dataset must therefore not be read as simultaneous
(spreads from minutes to several hours between report groups have been observed on real exports).
The failure mode is quiet: a charging state captured before a scheduled charge can sit right next to
a charge power captured during it, and both are correct. The two payload formats age differently:
flat-format vehicles stamp (nearly) every entry with its own timestampUtc ("when the car last
reported this field"), while dotted-format (MEB) exports carry no timestampUtc at all, only
report-level car_captured_time entries that nothing references.
A new delivery is not a new measurement. The vehicle reports on events (ignition, charging
steps, warnings) and goes quiet when parked; the portal publishes on its own cadence regardless, so
a delivery can carry values captured many hours earlier. connector.last_update is the delivery
time and the vehicle's captured_at the newest measurement time of the merged dataset: the delivery
is the postman, captured_at is the date on the letter. Automations acting on momentary values
(such as charging.power) should check captured_at before trusting them.
A repeated capture time is not re-stamped. While the car sleeps, most deliveries carry the
same newest capture time as the previous one (63 of 74 consecutive deliveries on a real flat-format
run). The connector then leaves an unchanged attribute alone rather than writing it again: the core
would otherwise replace the stored measurement time with the wall clock, after which every later real
capture, always older than that clock, is refused as "Value from the past" until the car reports
something newer than the clock itself (#44). A value that does change under an unchanged capture time
is still taken, with its measurement time kept. When a dataset carries no capture time at all, the
delivery's createdOn is used as the measurement time rather than leaving it to the clock.
Vehicle
| EU Data Act field | CarConnectivity attribute | Notes |
|---|---|---|
mileage.value / mileage |
vehicle.odometer |
unit from mileage.unit |
outside_temperature |
vehicle.outside_temperature |
deci-Kelvin → °C |
locked / lock_state |
vehicle.doors.lock_state |
|
open_state_* (per door) |
vehicle.doors[*].open_state |
front/rear L/R, bonnet, tailgate |
locked_state_* (per door) |
vehicle.doors[*].lock_state |
|
position_*_window_lifter (fallback state_*_window_lifter) |
vehicle.windows[*].open_state |
opening % → closed / ajar / open; incl. sunroof |
window_heating_state (+ _front / _rear) |
vehicle.window_heatings (overall + per element) |
|
parking_lights |
vehicle.lights[parking].light_state |
|
parking_brake |
vehicle.parking_brake |
1 → engaged, 0 → released; requires a core with parking_brake, skipped on older cores |
cruising_range_combined |
vehicle.drives.total_range (km) |
Maintenance & climatisation
| EU Data Act field | CarConnectivity attribute | Notes |
|---|---|---|
maintenance_interval__time_until_inspection |
maintenance.inspection_due_at |
signed countdown → due date |
maintenance_interval__time_until_oil_change |
maintenance.oil_service_due_at |
|
maintenance_interval_distance_until_* |
maintenance.*_due_after (km) |
|
remaining_climatisation_time |
climatization.estimated_date_reached |
minutes (flat). The dotted remaining_climate_time is left unmapped: the data dictionary defines it as how long the AC runs once started, not a countdown |
Electric drive (secondary on PHEV, primary on EV)
| EU Data Act field | CarConnectivity attribute | Notes |
|---|---|---|
battery_state_report.soc / state_of_charge / battery_level_HV.value |
drive.level (%) |
battery_level_HV is the fallback when the named SoC fields are absent (reduced MEB deliveries). The charging-job copies of battery_state_report.soc are ignored: the data dictionary defines them as the SoC when charging started, not the current one |
range / cruising_range_secondary_engine |
drive.range (km) |
|
long_term_data_average_electr_engine_consumption |
drive.consumption |
kWh/1000km → kWh/100km |
min_temperature / max_temperature |
battery.temperature_min / temperature_max (°C) |
Combustion drive (primary on PHEV)
| EU Data Act field | CarConnectivity attribute | Notes |
|---|---|---|
fuel_level_current_level / tank_current_level |
drive.level (%) |
|
cruising_range_primary_engine |
drive.range (km) |
|
long_term_data_average_fuel_consumption |
drive.consumption |
L/1000km → L/100km |
scr_range |
drive.adblue_range (km) |
diesel / SCR |
oil_level_actual_level |
drive.oil_level (%) |
requires a carconnectivity core with oil_level; skipped on older cores |
Charging
During a charging session the dotted battery_state_report.* / charging_state_report.* fields
also arrive as copies carried by the charging-job reports, under their own keys and sometimes
contradicting the live reading. The live key is read first; a copy is only used when the live
reading is missing.
| EU Data Act field | CarConnectivity attribute | Notes |
|---|---|---|
battery_state_report.charge_power |
charging.power (kW) |
|
charging_state_report.current_charge_state / charging_state |
charging.state |
|
charging_state_report.charge_type / charging_mode |
charging.type (AC / DC / off) |
|
battery_state_report.charge_rate (+ unit) |
charging.rate (km/h or mph) |
|
…remaining_charging_time_complete / remaining_charging_time |
charging.estimated_date_reached |
|
settings.target_soc |
charging.settings.target_level (%) |
|
plug_state |
charging.connector.connection_state |
|
external_power_supply_state |
charging.connector.external_power |
Not exposed (and why)
These portal fields have no native CarConnectivity model, so they are left as the connector's "unmapped sensor" log entries rather than forced into an ill-fitting attribute:
- Tyre pressures (
tyre_pressure_actual/required/differential_*) — no tyre-pressure model. - Instrument-cluster warnings (
active_warnings_in_instrument_cluster_*) — no warning model; the value is also a latched hex bitmask that does not clear reliably. - Oil level extras (
oil_level_additional_oil_level,oil_level_dipstick_indicator_function,oil_level_total_max) — VW-specific quirks with no native model; the actual oil level (oil_level_actual_level) is mapped todrive.oil_level(see above). - Trip statistics (
short_/long_term_data_*: average speed, trip mileage, travel time, recuperation, aux/gas consumption, zero-emission distance) — no trip-statistics model. - "Safe" / secured states (
safe_state_*),state_spoiler,state_service_hatch,state_of_hood,bem_level,energy_flow— no attribute. - Exact window opening percentage — used to derive the window
open_state(closed / ajar / open), but theWindowmodel has no numeric position attribute, so the percentage itself is not stored. - Raw HV SoC (
hv_soc) — the displayed SoC is already mapped todrive.level. - Diagnostics / triggers (
echo,trueness,charging_state_error_code,window_heating_error_code,charging_reason_trigger,led_state/led_color,cng_gas_level,fuel_level__accuracy, …).
License
MIT
Metadata
Release files for carconnectivity-connector-vw-eu-data-act 0.3.2b2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| carconnectivity_connector_vw_eu_data_act-0.3.2b2.tar.gz | 93.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| carconnectivity_connector_vw_eu_data_act-0.3.2b2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 144.1 kB
Release files / carconnectivity_connector_vw_eu_data_act-0.3.2b2.tar.gz
| Download URL | carconnectivity_connector_vw_eu_data_act-0.3.2b2.tar.gz |
|---|---|
| Size | 93.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
783c39b201566d7c312da4f08ed83703702ebb59237cfcb800702c750cd2dad6
|
|
BLAKE2b-256 checksum How to use checksums |
80edccf24a90679e7f0ba3f715e40119c084886b696d1f97a6c49a99cce113a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logRelease files / carconnectivity_connector_vw_eu_data_act-0.3.2b2-py3-none-any.whl
| Download URL | carconnectivity_connector_vw_eu_data_act-0.3.2b2-py3-none-any.whl |
|---|---|
| Size | 51.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d7f976192d7b03a553e777a7d6b19ae98f3592e4564df96c49bf26a7dfbfea91
|
|
BLAKE2b-256 checksum How to use checksums |
30bb5b4dd294a56aecd9a5b91370e5a3f4cd7d5dee7bd5944a1044a2811b2f49
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency log