# \[APP\]\[Pro\] Volkswagen - Your car, your smart home, perfectly connected

**URL:** <https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155>\
**Category:** Apps\
**Tags:** app, homey-pro\
**Created:** [November 9, 2025, 10:24pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155 "2025-11-09T22:24:35Z")\
**Posts on this page:** 20\
**Page:** 6

<div class="post-metadata">

**Author:** ![Bloemendaal](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/bloemendaal/32/143733_2.png) [@Bloemendaal](https://community.homey.app/u/Bloemendaal)\
**Post date:** [June 2, 2026, 9:40pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/101 "2026-06-02T21:40:06Z")

</div>

Well, as predicted, they closed the loophole so the app is broken again… As mentioned earlier, as soon as someone finds a solution, it’ll be fixed within a few days. I’ll keep monitoring GitHub for possible solutions, but I’m not actively going to research for another fix, because this loophole was such a stupid security failure on their side, a clear result of the migration to their new system.

---

<div class="post-metadata">

**Author:** ![Rene\_Nielsen1](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/rene_nielsen1/32/78925_2.png) [@Rene\_Nielsen1](https://community.homey.app/u/Rene_Nielsen1)\
**Post date:** [June 4, 2026, 2:50am UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/102 "2026-06-04T02:50:41Z")

</div>

Hi

This is for information purposes only.

It is possible to retrieve the data listed below via Enode if you have an ABRP Premium subscription and their API key (ABRP API Documentation), along with the user\_token, which can be found in the ABRP mobile app.

I have implemented this myself using HomeyScript and a scheduled job that runs every 10 minutes.

id5\_soc  
id5\_range  
id5\_charging  
id5\_dcfc  
id5\_power  
id5\_charge\_target  
id5\_speed  
id5\_odometer  
id5\_heading  
id5\_lat  
id5\_lon  
id5\_elevation  
id5\_connected  
id5\_ext\_temp  
id5\_last\_updated  
id5\_data\_age\_min

The values provide information about the vehicle’s state of charge, range, charging status, charging power, driving data, GPS position, external temperature, and data freshness.

---

<div class="post-metadata">

**Author:** ![0x6170](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/0x6170/32/167936_2.png) [@0x6170](https://community.homey.app/u/0x6170)\
**Post date:** [June 4, 2026, 4:35am UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/103 "2026-06-04T04:35:19Z")

</div>

> [@Rene\_Nielsen1](#):
>
> ABRP API Documentation

Would you be willing to share an example of your script?

---

<div class="post-metadata">

**Author:** ![Rene\_Nielsen1](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/rene_nielsen1/32/78925_2.png) [@Rene\_Nielsen1](https://community.homey.app/u/Rene_Nielsen1)\
**Post date:** [June 4, 2026, 6:11am UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/104 "2026-06-04T06:11:50Z")

</div>

## script that set all Homey Logic variables

// =============================================================================  
// ABRP Setup - HomeyScript - Run ONCE  
// Creates all Homey Logic variables for the ABRP ID.5 script.  
// =============================================================================

const variables = [  
// Batteri  
{ name: “id5\_soc”, type: “number”, value: 0 },  
{ name: “id5\_range”, type: “number”, value: 0 },  
// Opladning  
{ name: “id5\_charging”, type: “boolean”, value: false },  
{ name: “id5\_dcfc”, type: “boolean”, value: false },  
{ name: “id5\_power”, type: “number”, value: 0 },  
{ name: “id5\_charge\_target”, type: “number”, value: 0 },  
// Koersel  
{ name: “id5\_speed”, type: “number”, value: 0 },  
{ name: “id5\_odometer”, type: “number”, value: 0 },  
{ name: “id5\_heading”, type: “number”, value: 0 },  
// Position  
{ name: “id5\_lat”, type: “number”, value: 0 },  
{ name: “id5\_lon”, type: “number”, value: 0 },  
{ name: “id5\_elevation”, type: “number”, value: 0 },  
// Tilstand  
{ name: “id5\_connected”, type: “boolean”, value: false },  
{ name: “id5\_ext\_temp”, type: “number”, value: 0 },  
// Meta  
{ name: “id5\_last\_updated”, type: “string”, value: “” },  
{ name: “id5\_data\_age\_min”, type: “number”, value: 0 },  
// Aktiv ruteplaner  
{ name: “id5\_plan\_dest”, type: “string”, value: “” },  
{ name: “id5\_plan\_km”, type: “number”, value: 0 },  
{ name: “id5\_plan\_min”, type: “number”, value: 0 },  
{ name: “id5\_plan\_arr\_soc”, type: “number”, value: 0 },  
];

async function main() {  
console.log(“=== ABRP Setup ===”);  
console.log(“Opretter " + variables.length + " variabler…\n”);

const existingObj = await Homey.logic.getVariables();  
const existing = Object.values(existingObj);  
const existingNames = existing.map(v =\> v.name);

let created = 0;  
let skipped = 0;

for (const v of variables) {  
if (existingNames.includes(v.name)) {  
console.log("Findes allerede: " + v.name);  
skipped++;  
} else {  
await Homey.logic.createVariable({  
variable: {  
name: v.name,  
type: v.type,  
value: v.value  
}  
});  
console.log(“Oprettet: " + v.name + " (” + v.type + “)”);  
created++;  
}  
}

console.log(“\n=== Faerdig ===”);  
console.log(“Oprettet: " + created + " | Fandtes i forvejen: " + skipped);  
console.log(”\nKor nu abrp\_id5 scriptet!");  
}

return main();

* * *

* * *

script that get ABRP ID.5 Telemetri

// =============================================================================  
// ABRP ID.5 Telemetry - HomeyScript  
// Retrieves live data from ABRP and updates Homey Logic variables  
// René R. Nielsen - 2026  
//  
// Run abrp\_setup.js ONCE first to create the variables  
// Run this script every 10 minutes using a Homey Flow  
// =============================================================================

const API\_KEY = “Get it from [ABRP - A Better Routeplanner](https://abetterrouteplanner.com/home/app/api-keys/telemetry)”;  
const USER\_TOKEN = “Get from you phone under developer”;  
const BASE = “[https://api.iternio.com/1/tlm](https://api.iternio.com/1/tlm)”;

// =============================================================================

function ts() {  
const n = new Date();  
const p = x =\> String(x).padStart(2, “0”);  
return p(n.getDate())+“-”+p(n.getMonth()+1)+“-”+n.getFullYear()  
+" “+p(n.getHours())+”:“+p(n.getMinutes())+”:"+p(n.getSeconds());  
}

async function setVar(vars, name, value) {  
const v = \_.find(vars, o =\> o.name === name);  
if (!v) { console.log("MANGLER: " + name); return; }  
await Homey.logic.updateVariable({ id: v.id, variable: { value } });  
}

async function apiGet(endpoint) {  
const url = BASE + “/” + endpoint

- “?token=” + USER\_TOKEN
- “&api\_key=” + API\_KEY;  
const r = await fetch(url);  
const txt = await r.text();  
if (!r.ok) throw new Error(endpoint + " HTTP " + r.status + ": " + txt);  
const d = JSON.parse(txt);  
if (d.status !== “ok”) throw new Error(endpoint + " status: " + d.status);  
return d.result;  
}

// =============================================================================

async function main() {  
console.log(“=== ABRP ID.5 " + ts() + " ===”);

// Hent variabler  
const varsObj = await Homey.logic.getVariables();  
const vars = Object.values(varsObj);

// ---- 1. Telemetri ----  
const res = await apiGet(“get\_telemetry”);  
const t = res.telemetry || {};

console.log("Koeretoej: " + (res.name || res.typecode));  
console.log("Forbundet: " + res.is\_connected);

// Dataalder  
let dataAgeMin = 0;  
if (t.utc) {  
dataAgeMin = Math.round((Date.now()/1000 - t.utc) / 60);  
console.log(“Dataalder: " + dataAgeMin + " min”);  
}

// Beregn raekkevid. fra SOC + kalibreret forbrug  
let range = 0;  
if (t.soc != null && t.calib\_ref\_cons != null && t.calib\_ref\_cons \> 0) {  
const usableKwh = 77 \* (t.soc / 100) \* 0.93;  
range = Math.round((usableKwh \* 1000) / t.calib\_ref\_cons);  
}

console.log(“\nOpdaterer variabler:”);

// Forbindelse  
await setVar(vars, “id5\_connected”, res.is\_connected === true);  
await setVar(vars, “id5\_data\_age\_min”, dataAgeMin);

// Batteri  
if (t.soc != null) await setVar(vars, “id5\_soc”, Math.round(t.soc));  
if (range \> 0) await setVar(vars, “id5\_range”, range);

// Opladning  
if (t.is\_charging != null) await setVar(vars, “id5\_charging”, t.is\_charging === true);  
if (t.is\_dcfc != null) await setVar(vars, “id5\_dcfc”, t.is\_dcfc === true);  
if (t.power != null) await setVar(vars, “id5\_power”, Math.round(t.power \* 10) / 10);

// Koersel  
if (t.speed != null) await setVar(vars, “id5\_speed”, Math.round(t.speed));  
if (t.odometer != null) await setVar(vars, “id5\_odometer”, Math.round(t.odometer));  
if (t.heading != null) await setVar(vars, “id5\_heading”, Math.round(t.heading));

// Position  
if (t.lat != null) await setVar(vars, “id5\_lat”, t.lat);  
if (t.lon != null) await setVar(vars, “id5\_lon”, t.lon);  
if (t.elevation != null) await setVar(vars, “id5\_elevation”, Math.round(t.elevation));

// Temperatur  
if (t.ext\_temp != null) await setVar(vars, “id5\_ext\_temp”, Math.round(t.ext\_temp \* 10) / 10);

// ---- 2. Naeste opladningsmal ----  
try {  
const charge = await apiGet(“get\_next\_charge”);  
if (charge && charge.next\_charge\_to\_perc != null) {  
await setVar(vars, “id5\_charge\_target”, Math.round(charge.next\_charge\_to\_perc));  
console.log(“Opladningsmal: " + charge.next\_charge\_to\_perc + " %”);  
}  
} catch (e) {  
console.log("Ingen opladningsmal: " + e.message);  
}

// ---- 3. Aktiv ruteplaner ----  
try {  
const plan = await apiGet(“get\_latest\_plan”);  
if (plan) {  
const dest = plan.destination || plan.to || “”;  
const km = plan.distance ? Math.round(plan.distance / 1000) : 0;  
const min = plan.duration ? Math.round(plan.duration / 60) : 0;  
const arrSoc = plan.arrival\_soc != null ? Math.round(plan.arrival\_soc) : 0;

```auto
  await setVar(vars, "id5_plan_dest", dest);
  await setVar(vars, "id5_plan_km", km);
  await setVar(vars, "id5_plan_min", min);
  await setVar(vars, "id5_plan_arr_soc", arrSoc);

  if (dest) {
    console.log("Rute: " + dest + " (" + km + " km, " + min + " min, ank. " + arrSoc + "%)");
  } else {
    console.log("Ingen aktiv rute");
  }
}

```

} catch (e) {  
console.log("Ingen ruteplaner: " + e.message);  
}

// Tidsstempel  
await setVar(vars, “id5\_last\_updated”, ts());

// ---- Resume ----  
console.log(“\n— Resume —”);  
console.log(“SOC: " + t.soc + " % (raekkevid. ~” + range + " km)“);  
console.log(“Oplader: " + t.is\_charging + (t.is\_dcfc ? " [DC]” : " [AC]”));  
console.log(“Effekt: " + t.power + " kW”);  
console.log(“Km-tal: " + t.odometer + " km”);  
console.log(“Hastighed: " + (t.speed || 0) + " km/h”);  
console.log(“Udetem.: " + (t.ext\_temp || “?”) + " C”);  
console.log(“Ref.forbr.: " + Math.round(t.calib\_ref\_cons || 0) + " Wh/km”);  
console.log(“=== Faerdig " + ts() + " ===”);  
}

return main();

* * *

---

<div class="post-metadata">

**Author:** ![Matthew\_Collins](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/matthew_collins/32/114686_2.png) [@Matthew\_Collins](https://community.homey.app/u/Matthew_Collins)\
**Post date:** [June 4, 2026, 2:34pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/105 "2026-06-04T14:34:56Z")

</div>

Thanks for this. So a premium ABRP account is required for this to work. Also it looks like you aren’t able to start and stop charging which was the main benefit of the original app for me.

---

<div class="post-metadata">

**Author:** ![0x6170](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/0x6170/32/167936_2.png) [@0x6170](https://community.homey.app/u/0x6170)\
**Post date:** [June 4, 2026, 2:49pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/106 "2026-06-04T14:49:46Z")

</div>

Looking at Enode documentation it seems to depend on a specific car model which capabilities are available:

> **[Enode Developers](https://developers.enode.com/brands/learn/VOLKSWAGEN)**

For my ID.3 starting/stopping charge is available, but of course, I need to try the script to confirm it as working:

 ![image](https://us1.discourse-cdn.com/flex025/uploads/athom/original/3X/5/e/5e1b027863356eb0bd3ac13f5f0b95f5200fa5c5.png)

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/raymond/32/10027_2.png) [@Raymond](https://community.homey.app/u/Raymond)\
**Post date:** [June 9, 2026, 11:01am UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/107 "2026-06-09T11:01:53Z")

</div>

I tried to add my car (VW ID.4) by ABRP, but that generates a connection error (verbindingsfout, invalid oauth scope). Any idea what went wrong? I do have a premium account.

---

<div class="post-metadata">

**Author:** ![sverrelp](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/sverrelp/32/168183_2.png) [@sverrelp](https://community.homey.app/u/sverrelp)\
**Post date:** [June 9, 2026, 6:06pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/108 "2026-06-09T18:06:51Z")

</div>

Its a bit confusing for users to understend Renes HomeyScript for all.

You need to add to HomeyScript files (codes)

1. abrp\_setup.js
2. abrp\_telemetri.js

Add this: (abrp\_setup.js)

```auto
// =============================================================================
// ABRP Setup - HomeyScript - Run ONCE
// Creates all Homey Logic variables for the ABRP ID.5 script.
// =============================================================================
const variables = [
  // Batteri
  { name: "id5_soc", type: "number", value: 0 },
  { name: "id5_range", type: "number", value: 0 },
  // Opladning
  { name: "id5_charging", type: "boolean", value: false },
  { name: "id5_dcfc", type: "boolean", value: false },
  { name: "id5_power", type: "number", value: 0 },
  { name: "id5_charge_target", type: "number", value: 0 },
  // Koersel
  { name: "id5_speed", type: "number", value: 0 },
  { name: "id5_odometer", type: "number", value: 0 },
  { name: "id5_heading", type: "number", value: 0 },
  // Position
  { name: "id5_lat", type: "number", value: 0 },
  { name: "id5_lon", type: "number", value: 0 },
  { name: "id5_elevation", type: "number", value: 0 },
  // Tilstand
  { name: "id5_connected", type: "boolean", value: false },
  { name: "id5_ext_temp", type: "number", value: 0 },
  // Meta
  { name: "id5_last_updated", type: "string", value: "" },
  { name: "id5_data_age_min", type: "number", value: 0 },
  // Aktiv ruteplaner
  { name: "id5_plan_dest", type: "string", value: "" },
  { name: "id5_plan_km", type: "number", value: 0 },
  { name: "id5_plan_min", type: "number", value: 0 },
  { name: "id5_plan_arr_soc", type: "number", value: 0 },
];

async function main() {
  console.log("=== ABRP Setup ===");
  console.log("Opretter " + variables.length + " variabler...\n");
  
  const existingObj = await Homey.logic.getVariables();
  const existing = Object.values(existingObj);
  const existingNames = existing.map(v => v.name);
  
  let created = 0;
  let skipped = 0;
  
  for (const v of variables) {
    if (existingNames.includes(v.name)) {
      console.log("Findes allerede: " + v.name);
      skipped++;
    } else {
      await Homey.logic.createVariable({
        variable: {
          name: v.name,
          type: v.type,
          value: v.value
        }
      });
      console.log("Oprettet: " + v.name + " (" + v.type + ")");
      created++;
    }
  }
  
  console.log("\n=== Faerdig ===");
  console.log("Oprettet: " + created + " | Fandtes i forvejen: " + skipped);
  console.log("\nKor nu abrp_id5 scriptet!");
}

return main();

```

1. Add this (abrp\_telemetri.js)

```auto
// =============================================================================
// ABRP ID.5 Telemetry - HomeyScript
// Retrieves live data from ABRP and updates Homey Logic variables
// =============================================================================
const API_KEY = "Fyll inn din API-nøkkel her";
const USER_TOKEN = "Fyll inn din User Token her";
const BASE = "https://api.iternio.com/1/tlm";

// =============================================================================
function ts() {
  const n = new Date();
  const p = x => String(x).padStart(2, "0");
  return p(n.getDate()) + "-" + p(n.getMonth() + 1) + "-" + n.getFullYear() +
    " " + p(n.getHours()) + ":" + p(n.getMinutes()) + ":" + p(n.getSeconds());
}

async function setVar(vars, name, value) {
  const v = vars.find(o => o.name === name);
  if (!v) { 
    console.log("MANGLER: " + name); 
    return; 
  }
  await Homey.logic.updateVariable({ id: v.id, variable: { value } });
}

async function apiGet(endpoint) {
  const url = BASE + "/" + endpoint +
              "?token=" + USER_TOKEN +
              "&api_key=" + API_KEY;
  const r = await fetch(url);
  const txt = await r.text();
  if (!r.ok) throw new Error(endpoint + " HTTP " + r.status + ": " + txt);
  
  const d = JSON.parse(txt);
  if (d.status !== "ok") throw new Error(endpoint + " status: " + d.status);
  return d.result;
}

// =============================================================================
async function main() {
  console.log("=== ABRP ID.5 " + ts() + " ===");
  
  // Hent variabler
  const varsObj = await Homey.logic.getVariables();
  const vars = Object.values(varsObj);
  
  // ---- 1. Telemetri ----
  const res = await apiGet("get_telemetry");
  const t = res.telemetry || {};
  
  console.log("Koeretoej: " + (res.name || res.typecode));
  console.log("Forbundet: " + res.is_connected);
  
  // Dataalder
  let dataAgeMin = 0;
  if (t.utc) {
    dataAgeMin = Math.round((Date.now() / 1000 - t.utc) / 60);
    console.log("Dataalder: " + dataAgeMin + " min");
  }
  
  // Beregn raekkevid. fra SOC + kalibreret forbrug
  let range = 0;
  if (t.soc != null && t.calib_ref_cons != null && t.calib_ref_cons > 0) {
    const usableKwh = 77 * (t.soc / 100) * 0.93;
    range = Math.round((usableKwh * 1000) / t.calib_ref_cons);
  }
  
  console.log("\nOpdaterer variabler:");
  
  // Forbindelse
  await setVar(vars, "id5_connected", res.is_connected === true);
  await setVar(vars, "id5_data_age_min", dataAgeMin);
  
  // Batteri
  if (t.soc != null) await setVar(vars, "id5_soc", Math.round(t.soc));
  if (range > 0) await setVar(vars, "id5_range", range);
  
  // Opladning
  if (t.is_charging != null) await setVar(vars, "id5_charging", t.is_charging === true);
  if (t.is_dcfc != null) await setVar(vars, "id5_dcfc", t.is_dcfc === true);
  if (t.power != null) await setVar(vars, "id5_power", Math.round(t.power * 10) / 10);
  
  // Koersel
  if (t.speed != null) await setVar(vars, "id5_speed", Math.round(t.speed));
  if (t.odometer != null) await setVar(vars, "id5_odometer", Math.round(t.odometer));
  if (t.heading != null) await setVar(vars, "id5_heading", Math.round(t.heading));
  
  // Position
  if (t.lat != null) await setVar(vars, "id5_lat", t.lat);
  if (t.lon != null) await setVar(vars, "id5_lon", t.lon);
  if (t.elevation != null) await setVar(vars, "id5_elevation", Math.round(t.elevation));
  
  // Temperatur
  if (t.ext_temp != null) await setVar(vars, "id5_ext_temp", Math.round(t.ext_temp * 10) / 10);
  
  // ---- 2. Naeste opladningsmal ----
  try {
    const charge = await apiGet("get_next_charge");
    if (charge && charge.next_charge_to_perc != null) {
      await setVar(vars, "id5_charge_target", Math.round(charge.next_charge_to_perc));
      console.log("Opladningsmal: " + charge.next_charge_to_perc + " %");
    }
  } catch (e) {
    console.log("Ingen opladningsmal: " + e.message);
  }
  
  // ---- 3. Aktiv ruteplaner ----
  try {
    const plan = await apiGet("get_latest_plan");
    if (plan) {
      const dest = plan.destination || plan.to || "";
      const km = plan.distance ? Math.round(plan.distance / 1000) : 0;
      const min = plan.duration ? Math.round(plan.duration / 60) : 0;
      const arrSoc = plan.arrival_soc != null ? Math.round(plan.arrival_soc) : 0;
      
      await setVar(vars, "id5_plan_dest", dest);
      await setVar(vars, "id5_plan_km", km);
      await setVar(vars, "id5_plan_min", min);
      await setVar(vars, "id5_plan_arr_soc", arrSoc);
      
      if (dest) {
        console.log("Rute: " + dest + " (" + km + " km, " + min + " min, ank. " + arrSoc + "%)");
      } else {
        console.log("Ingen aktiv rute");
      }
    }
  } catch (e) {
    console.log("Ingen ruteplaner: " + e.message);
  }
  
  // Tidsstempel
  await setVar(vars, "id5_last_updated", ts());
  
  // ---- Resume ----
  console.log("\n--- Resume ---");
  console.log("SOC: " + t.soc + " % (raekkevid. ~" + range + " km)");
  console.log("Oplader: " + t.is_charging + (t.is_dcfc ? " [DC]" : " [AC]"));
  console.log("Effekt: " + t.power + " kW");
  console.log("Km-tal: " + t.odometer + " km");
  console.log("Hastighed: " + (t.speed || 0) + " km/h");
  console.log("Udetem.: " + (t.ext_temp || "?") + " C");
  console.log("Ref.forbr.: " + Math.round(t.calib_ref_cons || 0) + " Wh/km");
  console.log("=== Faerdig " + ts() + " ===");
}

return main();

```

Create API: [Go into this link](https://abetterrouteplanner.com/home/app/api-keys/telemetry)

User token you will find:

1. Open the ABRP App on your phone ( **!! This does not work on the Web** )
2. Log in if you haven’t already
3. Navigate to your car settings
4. Click **“Edit Car Connection Details”**
5. Under **“Generic”** as the car connection type, click **“Link”**
6. This will create and display your User Token
7. Copy the User Token for use in Homey

You need to run your first HomeyScript ONCE

A BONUS for estimate GOM:

```auto
// =============================================================================
// Estimated max range at 100% (Based on ABRP variables)
// =============================================================================

async function main() {
    // Fetch all logic variables from Homey
    const varsObj = await Homey.logic.getVariables();
    const vars = Object.values(varsObj);

    // Find the specific variables updated by the ABRP script
    const socVar = vars.find(v => v.name === "id5_soc");
    const rangeVar = vars.find(v => v.name === "id5_range");

    // Check that the variables actually exist in the system
    if (!socVar || !rangeVar) {
        console.error("Cannot find the variables 'id5_soc' or 'id5_range'. Make sure abrp_setup.js has been run.");
        return false;
    }

    // Extract the current values
    const currentSoc = socVar.value;
    const currentRange = rangeVar.value;

    if (currentSoc == null || currentRange == null) {
        console.error("Missing values for either battery or range. Check that the telemetry script is fetching data.");
        return false;
    }

    if (currentSoc <= 0) {
        console.error("Battery percentage is 0. Cannot divide by zero.");
        return 0;
    }

    // Perform the calculation and round to the nearest whole kilometer
    const estimatedMaxRange = Math.round((currentRange / currentSoc) * 100);

    // Log to the console for troubleshooting
    console.log(`Current battery: ${currentSoc}%`);
    console.log(`Current range: ${currentRange} km`);
    console.log(`Estimated range at 100%: ${estimatedMaxRange} km`);

    // Return the value so it becomes available as a Tag/Token in Flows
    return estimatedMaxRange;
}

return main();

```

---

<div class="post-metadata">

**Author:** ![Rene\_Nielsen1](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/rene_nielsen1/32/78925_2.png) [@Rene\_Nielsen1](https://community.homey.app/u/Rene_Nielsen1)\
**Post date:** [June 10, 2026, 9:42am UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/109 "2026-06-10T09:42:49Z")

</div>

Hello

I know it can be confusing for users to understand my script. I’m good at creating solutions and writing code, but I’m not as strong when it comes to presenting things for end users. Sorry about that, but nobody can be good at everything.

Below you can see the extended version of the script.

id5\_soc  
id5\_range  
id5\_kwh\_left  
id5\_charging  
id5\_dcfc  
id5\_power  
id5\_charge\_target  
id5\_speed  
id5\_odometer  
id5\_heading  
id5\_lat  
id5\_lon  
id5\_elevation  
id5\_is\_home  
id5\_distance\_home  
id5\_connected  
id5\_ext\_temp  
id5\_km\_driven  
id5\_kwh\_used  
id5\_charge\_kwh  
id5\_charge\_kwh\_grid  
id5\_charge\_session\_dc  
id5\_charge\_start\_soc  
id5\_charge\_dur\_min  
id5\_eff\_score  
id5\_eff\_score\_today  
id5\_soh\_est  
id5\_capacity\_est  
id5\_km\_month  
id5\_charge\_kwh\_month  
id5\_charge\_kwh\_month\_ac  
id5\_charge\_kwh\_month\_dc  
id5\_charge\_kwh\_month\_home  
id5\_charge\_kwh\_month\_out  
id5\_charge\_session\_home  
id5\_km\_today  
id5\_kwh\_today  
id5\_charge\_kwh\_today  
id5\_last\_updated  
id5\_data\_age\_min

note:

id5\_speed Speed (km/h)

id5\_odometer Total mileage (km)

id5\_heading Heading in degrees 0–360 (0 = North)

id5\_km\_driven Calculated: current\_odometer - previous\_odometer

id5\_kwh\_used Calculated: km\_driven × calib\_ref\_cons / 1000

id5\_km\_month Kilometers driven this month

id5\_charge\_kwh\_month Total energy charged (all charging types)

id5\_charge\_kwh\_month\_ac Total AC charging (home + away)

id5\_charge\_kwh\_month\_dc Total DC fast charging

id5\_charge\_kwh\_month\_home AC charging at home (within 200 m)

id5\_charge\_kwh\_month\_out AC charging away from home (work/hotel/public charger)

id5\_lat GPS latitude

id5\_lon GPS longitude

id5\_elevation ABRP map data - elevation above sea level (meters)

id5\_is\_home True if the distance from home is less than 200 meters

id5\_distance\_home Distance from home (meters)

id5\_charging Vehicle is currently charging

id5\_dcfc True = DC fast charging

id5\_power Charging power (kW) - unreliable while vehicle is in standby

id5\_charge\_target ABRP get\_next\_charge - target SOC (%) from the route planner

id5\_charge\_kwh Calculated: (current\_soc - start\_soc) / 100 × 77

id5\_charge\_kwh\_grid Calculated: charge\_kwh / 0.91 (AC) or / 0.94 (DC)

id5\_charge\_start\_soc Stored at session start - SOC (%) when charging began

id5\_charge\_dur\_min Counter - adds 10 minutes per script execution

id5\_charge\_session\_dc Stored at session start - whether the charging session is DC

id5\_charge\_session\_home Stored at session start - whether the vehicle was at home when charging started

id5\_soc Battery state of charge (%) 0-100

id5\_kwh\_left Calculated: soc / 100 × 77

id5\_range Calculated: kwh\_left × 1000 / calib\_ref\_cons

---

<div class="post-metadata">

**Author:** ![sverrelp](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/sverrelp/32/168183_2.png) [@sverrelp](https://community.homey.app/u/sverrelp)\
**Post date:** [June 10, 2026, 2:10pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/110 "2026-06-10T14:10:22Z")

</div>

It wasn’t a criticism, just to help 🙂

---

<div class="post-metadata">

**Author:** ![Henrik\_Jorgensen](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/henrik_jorgensen/32/121415_2.png) [@Henrik\_Jorgensen](https://community.homey.app/u/Henrik_Jorgensen)\
**Post date:** [June 10, 2026, 7:34pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/111 "2026-06-10T19:34:17Z")

</div>

Hi,

I’m using the Volkswagen Homey app (v1.1.32) with a VW ID.4.

I’ve noticed that vehicle data can sometimes be more than 10 hours old in Homey, even though the polling interval is set to 10 minutes.

If I use “Wake vehicle and update data” in the official Volkswagen app, the data is refreshed almost immediately and Homey also gets updated data afterwards.

Has anyone found a way to:

- Force a vehicle refresh from Homey?
- Wake the vehicle through a Flow card or HomeyScript?
- Improve plug-in and charging detection when the vehicle is sleeping?

I can see Flow triggers such as:

- Plug connected/disconnected
- Charging started/stopped
- Timestamp updated

but I cannot find any action card for refreshing vehicle data.

Any ideas?

Thanks!

---

<div class="post-metadata">

**Author:** ![Rene\_Nielsen1](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/rene_nielsen1/32/78925_2.png) [@Rene\_Nielsen1](https://community.homey.app/u/Rene_Nielsen1)\
**Post date:** [June 11, 2026, 5:52am UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/112 "2026-06-11T05:52:08Z")

</div>

the app don’t work any more

---

<div class="post-metadata">

**Author:** ![Chris\_Lock](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/chris_lock/32/71713_2.png) [@Chris\_Lock](https://community.homey.app/u/Chris_Lock)\
**Post date:** [June 12, 2026, 2:35pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/113 "2026-06-12T14:35:24Z")

</div>

Ik asked Volkswagen why they stopped granting access to third party software like the Homey App and they answered:

 ![image](https://us1.discourse-cdn.com/flex025/uploads/athom/original/3X/5/e/5ecd5ae11d8088e4bb4068aaf9679d36429d990a.png)

So there must be a documented and standardized interface.  
I just can’t find it…

---

<div class="post-metadata">

**Author:** ![Doekse](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/doekse/32/109415_2.png) [@Doekse](https://community.homey.app/u/Doekse)\
**Post date:** [June 12, 2026, 8:41pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/114 "2026-06-12T20:41:09Z")

</div>

I know where to find it: behind a _very_ high paywall at Cariad 😉

I’ve had multiple conversations with Cariad, the company behind the IT infrastructure for the VAG brands, and they’re willing to provide API access… as long as someone is willing to pay for it.

I’ve said it before and I’ll say it again: at Homey, we don’t pay for API access. Our partnerships are built around mutual benefit for both parties, and that’s how we prefer to work.

I can’t share exact numbers, but let’s just say the pricing is measured in multiple euros per vehicle, per month. Excluding set-up and maintenance fees. That adds up very quickly when you’re talking about a smart home integration with thousands of users.

---

<div class="post-metadata">

**Author:** ![0x6170](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/0x6170/32/167936_2.png) [@0x6170](https://community.homey.app/u/0x6170)\
**Post date:** [June 13, 2026, 12:15pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/115 "2026-06-13T12:15:05Z")

</div>

Everything is a business I guess..

It is just sad that those of us who pay for VW online services to use their App need somehow to pay again for the same data to be available in a different platform. Somehow something feels incorrect here.

@Doekse have you maybe tried talking to VW directly if they would be willing to make an official Homey App for this integration?

---

<div class="post-metadata">

**Author:** ![smarthomesven](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/smarthomesven/32/79712_2.png) [@smarthomesven](https://community.homey.app/u/smarthomesven)\
**Post date:** [June 13, 2026, 12:34pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/116 "2026-06-13T12:34:21Z")

</div>

Does the mobile app use some kind of CAPTCHA? There are captcha solver services which only cost a few euros for 1000 solves (usually you only need to solve the captcha once, since the official mobile app usually also only logs in once). However, bypassing a CAPTCHA like this is usually against the company’s (Volkswagen) ToS though.

---

<div class="post-metadata">

**Author:** ![Swe](https://avatars.discourse-cdn.com/v4/letter/s/96bed5/32.png) [@Swe](https://community.homey.app/u/Swe)\
**Post date:** [June 13, 2026, 12:35pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/117 "2026-06-13T12:35:27Z")

</div>

@Doekse Wouldn’t it be possible to claim that in order for VW to follow the EU Data Act we should be able to get this integration without extra cost, since we are already paying for the online services for the vehicle?

---

<div class="post-metadata">

**Author:** ![smarthomesven](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/smarthomesven/32/79712_2.png) [@smarthomesven](https://community.homey.app/u/smarthomesven)\
**Post date:** [June 13, 2026, 12:39pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/118 "2026-06-13T12:39:28Z")

</div>

AFAIK the EU laws (GDPR) only require companies to provide an export of all data on request by the user, and to provide an option for the user to request deletion of their data, but a (free) API is not required as far as I know.

---

<div class="post-metadata">

**Author:** ![Doekse](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/doekse/32/109415_2.png) [@Doekse](https://community.homey.app/u/Doekse)\
**Post date:** [June 13, 2026, 2:48pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/119 "2026-06-13T14:48:50Z")

</div>

You can, they will give you a zip file with your data AFAIK

---

<div class="post-metadata">

**Author:** ![TKroon](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/tkroon/32/9504_2.png) [@TKroon](https://community.homey.app/u/TKroon)\
**Post date:** [June 13, 2026, 3:51pm UTC](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155/120 "2026-06-13T15:51:08Z")

</div>

Could we automate that 🤣 ?

[Previous page](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155.md?page=5)

[Next page](https://community.homey.app/t/app-pro-volkswagen-your-car-your-smart-home-perfectly-connected/145155.md?page=7)
