Skip to content

Commit 910423b

Browse files
committed
fix(eu-data-act): demote optional-source logs + survive classic-login failure
EU Data Act is now an optional additional source for type=id, not a required one. Two changes: 1) When the classic VW login fails but EU Data Act came up, don't schedule the 30-min restart loop — that would also kill the working EU Data Act poller. Log a single warn explaining what's degraded (no remote climatisation / force refresh) and keep running. Self- heals on next adapter restart. 2) Tone down all EU-Data-Act-related main.js logs so the user doesn't read them as errors when the portal side just isn't set up: - 'Login in with id (EU Data Act portal)' -> 'Trying EU Data Act portal (optional 15-min data source)' - failure-in-runEuDataAct prints info-level instructions for enabling the portal instead of warn-level 'continuing with legacy login only'. Updated the README accordingly: section title is now 'Optional: EU Data Act portal as additional data source', the prerequisite section makes clear that skipping it leaves the adapter fully functional, and troubleshooting bullets explicitly say these symptoms 'never block the classic flow'.
1 parent 022d033 commit 910423b

2 files changed

Lines changed: 51 additions & 37 deletions

File tree

README.md

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,20 @@
1313

1414
## vw-connect adapter for ioBroker
1515

16-
Adapter for VW We Connect, We Connect ID (now via the EU Data Act portal), We Charge, myAudi, Skoda Connect, Seat Connect and We Connect Go
16+
Adapter for VW We Connect, We Connect ID, We Charge, myAudi, Skoda Connect, Seat Connect and We Connect Go
1717

1818
Please update your system on Node 10.
1919
<https://forum.iobroker.net/topic/22867/how-to-node-js-f%C3%BCr-iobroker-richtig-updaten>
2020

21-
## VW ID via EU Data Act portal (since v0.9.0)
21+
## Optional: EU Data Act portal as additional data source (since v0.9.0)
2222

23-
Volkswagen retired the WeConnect/MBB API for ID-series vehicles. The adapter now consumes the **continuous 15-minute datasets** that VW publishes via the EU Data Act portal at <https://eu-data-act.drivesomethinggreater.com>. Your data shows up under `<vin>.statuseudata.*` (snake_case dotted names like `battery_state_report.soc`, `mileage.value`, `parking_brake`, `charging_state_report.current_charge_state` and friends).
23+
For ID-series vehicles the adapter can **additionally** consume the continuous 15-minute datasets that VW publishes via the EU Data Act portal at <https://eu-data-act.drivesomethinggreater.com>. This is **optional** — the classic VW login is the primary source and works on its own. The EU Data Act path adds a few hundred extra data points per dataset (mostly diagnostics, configuration and report fields) under `<vin>.statuseudata.*` (snake_case dotted names like `battery_state_report.soc`, `mileage.value`, `parking_brake`, `charging_state_report.current_charge_state`).
2424

25-
### Prerequisite — enable a continuous data request once
25+
To enable it you have to set up a continuous data request **once in a browser**; the adapter only downloads what the portal produces, it can't create the request for you. If you skip this step the adapter still works fine, the EU Data Act side just stays silent in the log.
2626

27-
The adapter only **downloads** datasets the portal generates; it cannot create the data request for you. You have to do that **once in a browser** before adding the adapter:
27+
### Setup the data request (one-time, in a browser)
2828

29-
1. Open <https://eu-data-act.drivesomethinggreater.com/> and **log in with your Volkswagen ID** (same email/password you use in the Volkswagen App).
29+
1. Open <https://eu-data-act.drivesomethinggreater.com/> and **log in with your Volkswagen ID** (same email/password as in the Volkswagen App and the adapter settings).
3030
2. Go to **Data clusters → Vehicle overview**.
3131
3. Click **Connect your car** if your VIN isn't already listed and follow the on-screen pairing/consent steps.
3232
4. Klicke **Benutzerdefinierte Daten anfragen** ("Get customised data"). Hinweis vom Portal: es kann immer nur eine benutzerdefinierte Datenanfrage gleichzeitig aktiv sein.
@@ -35,17 +35,17 @@ The adapter only **downloads** datasets the portal generates; it cannot create t
3535
7. **Name des Datenpakets** vergeben (frei wählbar, z.B. "ioBroker"). Erscheint später als `_dataset_name`-Prefix in den Filenames.
3636
8. **Frequenz wählen**: **Alle 15 Minuten**. Andere Optionen (täglich) liefern nicht genug Auflösung für Live-Werte.
3737
9. **Dauer**: **Kein Enddatum** (fortlaufend ohne Enddatum).
38-
10. Anfrage absenden. Wait for datasets to start appearing in the portal's data delivery list — typically **15 minutes to a few hours**. The first batch may show up as `*_no_content_found.zip` until your car wakes up. Force-syncing the car via the Volkswagen app or driving once kicks the producer side awake.
38+
10. Anfrage absenden. Datasets typically start appearing **15 minutes to a few hours** later. The first batch may show up as `*_no_content_found.zip` until your car wakes up. Force-syncing via the Volkswagen app or driving once kicks the producer side awake.
3939

40-
### Configure the adapter
40+
The adapter picks up the request automatically — no extra setting in ioBroker. As long as `type` is `VW ID / Volkswagen App` and your credentials match the portal, it polls the listing every minute and downloads only when a new ZIP appears.
4141

42-
In the adapter settings select **VW ID / Volkswagen App (EU Data Act portal)** as type, enter the same email/password you used on the portal, save. Polling defaults are sane — the adapter checks the listing every minute and only downloads when a new ZIP appears (so 14 of 15 cycles short-circuit on the filename cache).
42+
Object tree per VIN once the EU Data Act side is active:
4343

44-
Object tree per VIN:
45-
46-
```
44+
```text
4745
<vin>.general.vin
4846
<vin>.general.nickname
47+
<vin>.general.licensePlate
48+
<vin>.general.imageLocation
4949
<vin>.statuseudata.battery_state_report.soc (= 58 %)
5050
<vin>.statuseudata.battery_state_report.charge_power (= 0.0 kW)
5151
<vin>.statuseudata.charging_state_report.current_charge_state
@@ -54,15 +54,16 @@ Object tree per VIN:
5454
<vin>.statuseudata.locked
5555
<vin>.statuseudata._dataset_name
5656
<vin>.statuseudata._dataset_created_on
57-
... and many more (which exact fields depend on the Data Clusters you ticked on the portal)
57+
... and many more (depending on the Data Clusters you ticked on the portal)
5858
```
5959

60-
### Troubleshooting
60+
### Troubleshooting (EU Data Act only — these never block the classic flow)
6161

62-
- **No vehicles found** in the adapter logs: you skipped the portal-side setup. Open <https://eu-data-act.drivesomethinggreater.com/>, log in, and connect your car (steps above).
63-
- **HTTP 400 from the data delivery endpoint**: the portal hasn't finished provisioning your continuous data request yet — can take a couple of hours after activation. Adapter retries automatically.
64-
- **`<vin>.statuseudata` channel is missing**: the portal has no content datasets yet. Force-sync the car via the VW app, or just drive once.
65-
- **Stale values**: the portal merges several report snapshots into one flat array per dataset. Where the same field appears multiple times with different values, the adapter deterministically picks the entry with the smallest UUID (stable across refreshes — same approach as the home-assistant integration).
62+
- **`EU Data Act ... no data request configured`**: you haven't done the portal-side setup above. The classic login keeps working in the meantime.
63+
- **`portal has N dataset(s) but all are '_no_content_found'`**: car was asleep at every sampling slot. Force-sync the car via the VW app, or just drive once.
64+
- **`<vin>.statuseudata` channel is missing**: the portal has no content datasets yet — same fix as above.
65+
- **HTTP 400 right after activation**: the portal is still provisioning your data request. Self-heals after a few hours.
66+
- **Stale values**: the portal merges several report snapshots into one flat array per dataset. Where the same field appears multiple times with different values, the adapter deterministically picks the entry with the smallest UUID (stable across refreshes — same approach as the Home Assistant integration).
6667
- **Reference implementation** (Home Assistant, Python): <https://github.com/mikrohard/hass-vw-eu-data-act>
6768

6869
## Usage
@@ -86,9 +87,10 @@ You can set climatisaton temperature in
8687
```
8788
8889
```
89-
### 0.9.0 (2026-05-30)
90+
### **WORK IN PROGRESS**
9091

91-
- VW ID flow migrated to the EU Data Act portal (`eu-data-act.drivesomethinggreater.com`). Status data is now under `<vin>.statuseudata.*`. Requires a continuous 15-min data request set up once on the portal — see "VW ID via EU Data Act portal" above.
92+
- fix normal login for VW and Audi
93+
- add optional EU Data Act portal data flow
9294

9395
### 0.8.8 (2026-05-28)
9496

main.js

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -306,24 +306,25 @@ class VwWeconnect extends utils.Adapter {
306306
this.tripTypes.push("cyclic");
307307
}
308308

309-
// VW ID accounts: run the EU Data Act portal pipeline ZUSÄTZLICH zum
310-
// klassischen Login. Der EU Data Act Pfad liefert die offiziellen
311-
// 15-min-Datasets, der klassische Login (jetzt via OIDC Hybrid Flow) liefert
312-
// die Live-API über emea.bff.cariad.digital — die meisten User wollen beides.
309+
// VW ID accounts: run the EU Data Act portal pipeline as an OPTIONAL
310+
// additional data source alongside the legacy WeConnect login. The EU
311+
// Data Act path requires the user to have set up a continuous data
312+
// request on the portal first (https://eu-data-act.drivesomethinggreater.com/);
313+
// if they haven't, that is fine — the legacy login below covers the
314+
// primary data needs and the EU Data Act side just stays silent.
313315
if (this.config.type === "id") {
314316
this.runEuDataAct().catch((err) => {
315317
const msg = (err && err.message) || String(err);
316-
this.log.warn("EU Data Act flow failed: " + msg);
317-
// Credential / account problems don't self-heal on a restart — just
318-
// log once and continue with the legacy login below.
319-
if (/login failed|password_invalid|email_invalid|account.*(locked|disabled)|not entitled/i.test(msg)) {
320-
this.log.warn(
321-
"EU Data Act unavailable, continuing with legacy login only. " +
322-
"If neither works, update user/password in the adapter settings.",
323-
);
324-
return;
325-
}
326-
this.log.warn("EU Data Act will retry on next adapter restart");
318+
// Everything EU-Data-Act-related stays at info level: the portal is
319+
// a bonus source, not the primary one. We don't want the log to
320+
// look alarming when the user simply hasn't activated it.
321+
this.log.info("EU Data Act (optional source) not available: " + msg);
322+
this.log.info(
323+
"EU Data Act is an optional 15-min portal data source. To enable it, " +
324+
"log in once at https://eu-data-act.drivesomethinggreater.com/, link " +
325+
"your vehicle and configure a continuous 15-minute data request. " +
326+
"The classic VW login below covers the primary data either way.",
327+
);
327328
});
328329
// Fällt durch zu this.login() unten — der Hybrid Flow läuft parallel.
329330
}
@@ -452,6 +453,17 @@ class VwWeconnect extends utils.Adapter {
452453
});
453454
})
454455
.catch(() => {
456+
// For type=id we treat the classic flow as best-effort: if EU Data
457+
// Act came up successfully we already have data flowing under
458+
// <vin>.statuseudata, so a 30-min restart loop would only kill that.
459+
if (this.config.type === "id" && this.euDataAct && this.euDataAct._loggedIn) {
460+
this.log.warn(
461+
"Classic VW login failed, but EU Data Act portal is connected — " +
462+
"continuing with EU Data Act as the only data source. Live API features " +
463+
"(remote climatisation, force refresh) won't work until the classic login recovers.",
464+
);
465+
return;
466+
}
455467
this.log.error("Login Failed");
456468
this.log.error("Restart Adapter in 30min");
457469
setTimeout(() => {
@@ -6907,7 +6919,7 @@ class VwWeconnect extends utils.Adapter {
69076919
* initial status fetch and arms the periodic refresh.
69086920
*/
69096921
async runEuDataAct() {
6910-
this.log.info("Login in with id (EU Data Act portal)");
6922+
this.log.info("Trying EU Data Act portal (optional 15-min data source)");
69116923
// Load json2iob enrichment maps once. Both files are derived from the
69126924
// EU Data Act PDF data dictionary; descriptions are friendly names per
69136925
// dataFieldName leaf, states are rawValue->label maps for enum fields.
@@ -6925,7 +6937,7 @@ class VwWeconnect extends utils.Adapter {
69256937
log: this.log,
69266938
});
69276939
await this.euDataAct.login();
6928-
this.log.info("Login successful (EU Data Act)");
6940+
this.log.info("EU Data Act portal connected");
69296941
this.setState("info.connection", true, true);
69306942
this.extendObject("refresh", {
69316943
type: "state",

0 commit comments

Comments
 (0)