Onze sponsor:

Guide

24 februari 2025 | Niels Laan | Homey, Homey

Auto slim opladen met Homey Pro: Google Maps API voor optimale actieradius

In deze guide leggen we uit hoe je de Homey Pro kunt gebruiken om, op basis van je Outlook- of Gmail-agenda, automatisch te bepalen of je auto moet worden opgeladen. Dit doen we door de locatie van een afspraak met de Icalcalander APP uit je agenda te halen. De afstand tussen kantoor en de afspraak berekenen we via de Google Maps API, om deze informatie vervolgens te combineren met de actieradius van mijn Renault Scenic EV. Voor deze laatste is ook een APP beschikbaar in de Homey.

Omdat er geen officiële Google Maps-app of een andere APP is om de afstand te berekenen, lossen we dit op met een custom JavaScript-script welke de API aanroept en de afstand berekent. Op basis van deze gegevens kan Homey bepalen of je batterijstatus voldoende is of dat er een oplaadactie nodig is.

Met deze automatisering hoef je niet meer handmatig te controleren of je EV genoeg bereik heeft voor je planning van de dag. Alles gebeurt automatisch, wel zo handig. We gaan nu uitleggen hoe we dit voor elkaar hebben gekregen.

Stap 1 - API-sleutel:

De eerste stap is om te zorgen dat je een API-steutel krijgt bij Google Cloud. Dit is een gratis service tot een x aantal aanvragen. Let dus op dat je hier niet overheen gaat.

Stap 1: Ga naar de Google Cloud Console

  1. Open de Google Cloud Console.
  2. Log in met je Google-account.

Stap 2: Maak een nieuw project aan

  1. Klik linksboven op select project.
  2. Klik op "Nieuw project".
  3. Geef je project een naam (bijv. Homey Google Maps).
  4. Klik op "Aanmaken" en wacht tot je project is aangemaakt.

Stap 3: Schakel de juiste Google Maps API’s in

  1. Je moet nu de Distance Matrix API activeren (voor het berekenen van de afstand en reistijd tussen twee locaties)
  2. Zoek via het balk bovenin vervolgens naar "Distance Matrix API", klik erop en druk op "Inschakelen".
  3. Kopieer de API-sleutel die wordt gegenereerd. Dit heb je later nodig.

Stap 4: Beperk de API-sleutel (Optioneel maar aanbevolen)
Om misbruik te voorkomen, is het slim om je API-sleutel te beperken. 

Stap 2 - Script voor in de Homey:

Zoals al gezegd gaan we een eigen script gebruiken in de Homey. Wij kunnen niet echt programmeren dus hebben we aan ChatGTP gevraagd om een script te maken. Na een paar keer heen en weer pingpongen kwam hij met onderstaand voorbeeld:

------

const apiKey = 'jouw API key!'; // Vervang dit met je Google Maps API-key

async function fetchDistance(origin, destination) {
    const url = `https://maps.googleapis.com/maps/api/distancematrix/json?origins=${encodeURIComponent(origin)}&destinations=${encodeURIComponent(destination)}&units=metric&mode=driving&key=${apiKey}`;

    try {
        const response = await fetch(url);
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        const data = await response.json();

        if (data.status !== 'OK' || data.rows[0].elements[0].status !== 'OK') {
            throw new Error('Geen geldige afstand gevonden');
        }

        let distanceText = data.rows[0].elements[0].distance.text;
        let duration = data.rows[0].elements[0].duration.text;

        // Alleen het numerieke deel van de afstand extraheren (bijv. "0.6" uit "0.6 km")
        let distance = parseFloat(distanceText.replace(',', '.')); // Zorgt ervoor dat een komma ook wordt herkend als decimaal

        return { distance, duration };
    } catch (error) {
        console.error('Fout bij ophalen van afstand:', error);
        return { distance: 'Onbekend', duration: 'Onbekend' };
    }
}

async function main(origin, destination) {
    try {
        const result = await fetchDistance(origin, destination);

        // Homey Flow tags instellen
        await tag('distance', result.distance.toString()); // Zorgt ervoor dat het als string wordt opgeslagen
        await tag('duration', result.duration);

        console.log('Afstand:', result.distance);
        console.log('Duur:', result.duration);

        return result;
    } catch (error) {
        console.error('Fout:', error);

        // Standaardwaarden opslaan in tags bij een fout
        await tag('distance', 'Onbekend');
        await tag('duration', 'Onbekend');

        return { distance: 'Onbekend', duration: 'Onbekend' };
    }
}

// **Argumenten ophalen en splitsen op puntkomma (`;`)**
let origin = 'Amsterdam, NL';
let destination = 'Rotterdam, NL';

if (typeof args !== 'undefined' && args.length > 0) {
    const inputArgs = args[0].split(';').map(arg => arg.trim()); // Splitsen op `;` en spaties verwijderen
    if (inputArgs.length >= 2) {
        origin = inputArgs[0];      // Eerste deel = vertrekpunt
        destination = inputArgs[1]; // Tweede deel = bestemming
    } else {
        console.log("Fout: Onvoldoende argumenten ontvangen. Gebruik standaardwaarden.");
    }
}

// **Voer het script uit met de juiste argumenten**
await main(origin, destination).then(result => {
    console.log('Eindresultaat:', result);
    if (result.distance === 'Onbekend' || result.duration === 'Onbekend') {
        throw new Error('Uitvoering mislukt');
    }
}).catch(error => {
    console.error('Eindfout:', error);
    return false;
});

return true;

-----

Een echte programmeur zal dit vast mooier kunnen maar als het werk werkt het :).

Om dit script werkend te krijgen moeten we even de Homey Scripts APP installeren. Deze kun je hier vinden: https://homey.app/nl-nl/app/com.athom.homeyscript/HomeyScript/. Na de installatie, loggen we in op de WebUI van de Homey en gaan naar het onderdeel Homey Scripts aan de linkerkant in het menu.

We maken vervolgens een nieuw script aan en plakken ons script erin en vullen de API key, welke we van Google hebben, in. Je kunt direct een test draaien om te kijken of het werkt. De standaard locaties zijn namelijk van Amsterdam naar Rotterdam.

Je ziet dat we als bonus ook nog de reistijd mee krijgen (let-op deze is als tekst), bedankt ChatGTP.

Stap 3 - Flow:

Oke, nu hebben we een manier om de afstand te berekenen. Maar wij willen graag als locatie input onze afspraken gebruiken. Zodat we weten of de auto opgeladen moet worden. Dit gaan we doen door gebruik de maken van de iCalCalander APP. Hiermee kun je de Homey koppelen aan je eigen agenda. Zo kun je je afspraken ophalen en natuurlijk ook de locatie van je afspraken.

Dit kun je doen door:

Stap 1 - iCalCalander installatie:

  1. Ga naar: https://homey.app/nl-nl/app/no.runely.calendar/IcalCalendar/ en installeer deze APP
  2. Ga naar de settings van deze APP
  3. En vul hierin jouw ical link in:
    1. Voor Outlook volg je deze stappen:
      1. Ga naar https://outlook.office.com/mail/inbox
      2. klik op settings -> Show all outlook setting
      3. Ga naar Kalender -> Gedeelde kalenders
      4. Deel een kalender, klik op de ics link en selecteer copy
      5. Plak de ical link in de settings van de Homey IcalCalendar app
    2. Voor Gmail:
      1. Ga naar https://calendar.google.com/
      2. Klik op de drie puntjes naar de kalender die je wilt delen. -> Klik op Settings en delen
      3. Scroll helemaal naar onder toe
      4. Kopieer de link van de Secret address in ical formaat
      5. Plak de ical link in de settings van de Homey IcalCalender app

Stap 2 - Flow maken:

Afstand berekenen:

Nu we hebben alle data tot onze beschikking. We willen graag een dag van te voren weten of de auto moet worden opgeladen. Dus we starten de flow met "evenement begint in 1 dag":

Nu moeten we het script gaan aanroepen om te zorgen dat we de afstand weten. Dit doen we met de Homey script kaart en roepen deze aan met de naam (in ons geval) "Afstand". We geven ons kantoor adres op en via een tag de locatie welke uit de afspraak komt.

Je kunt natuurlijk meerdere afspraken hebben op een dag. Deze willen we dus bij elkaar optellen. We gaan er hierbij vanuit van dat we altijd vanuit kantoor vertrekken, anders wordt het een te complex verhaal. We maken eerst een nieuwe variabele aan om dit op te slaan.

Nu kunnen met een logica kaart de afstand berekenen door de afstand, die vanuit het script (distance) komt, op te tellen bij afstand (ReisAfstand) welke we al hebben.

Onderstaande de volledige flow:

 

Genoeg juice?

Nou, na heel wat stappen kunnen we nu gaan kijken of we onze auto moeten gaan opladen. Hiervoor hebben we een koppeling tussen de Homey en de auto nodig. Gelukkig is er een Renault APP waarmee we het bereik kunnen inzien. Deze kunnen we dus gaan matchen met het reisafstand welke ik net berekent heb.

Dit kun je natuurlijk ook weer op verschillende manieren doen, afhankelijk van wat het beste past in jouw situatie. Wij hebben ervoor gekozen dat als we thuis komen hij dan de check uitvoert. Hij mag dit alleen doen als de auto niet al aan het opladen is.

We nemen dus als trigger of we thuis zijn:

Hierna gaan we kijken met het logica kaartje of de reisafstand groter is dan het bereik van de auto en of de auto niet al aan het laden is.

Als dit het geval is sturen we een notificatie met de vraag of wij de auto willen opladen.

De Homey komt dan met een pop-up met een ja/nee vraag. Als we op ja klikken dan starten we het laden.

De hele flow:

Nog meer?

Bovenstaand voorbeeld is gericht op het opladen van je auto maar je kunt dit ook gebruiken als locatie bepaling. Je weet immers waar je bent en of je dus wel of niet thuis bent. Hierdoor kun je bv automatisch de lampen aan- of uitzetten.

Video uitleg:

Dit product is te koop voor:


Homey Pro
€ 399
Kopen
;
;

Auteur:
Niels Laan

Oprichter van dit blog en passievolle domotica nerd. Alle artikelen van Niels