Att läsa data från en Tesla
Tesla har många moderna funktioner i sina bilar och en av dessa är att många av bilens funktioner och data finns tillgängliga i en mobilapp. Mobilappen kommunicerar med Teslas servrar via ett REST-API som också går att använda med andra mjukvaror - som Qlik Sense. I det här inlägget ska vi gå igenom hur man kan läsa ut data från en Tesla med hjälp av Qlik Sense.

Detta inlägg blir ganska långt för att beskriva alla detaljer av hur man kan bygga en applikation. Jag har förberett en applikation som du också kan ladda ner här om du inte vill sätta upp allt själv:
Temat till appen:
För Tesla-logotypen använder jag denna extension:
https://github.com/ralfbecher/QlikSense_Extension_Image
Hämta en authorization token
En vanlig teknik med REST-API:r är att först hämta en authorization token som man använder vidare i nya anrop. För att hämta ut Teslas authorization token behöver man fyra olika värden:
Mailadress: Förarens mailadress som Tesla-kontot är kopplat ill
Tesla-konto lösenord: Förarens lösenord till Tesla-kontot
Client id: Ett ID för Teslas app
Client secret: En hemlig del av identifieringen (men som är känd)
Kom ihåg att man med förarens användarnamn och lösenord kan göra i princip allt med bilen (inklusive låsa upp, starta etc) så var försiktig med hur du hanterar dessa uppgifter.
Client id och Client secret kan hittas online. De aktuella uppgifterna finns här och om de slutar gälla kan man följa länken här för att hitta nya.
Authorization token hämtas sedan genom att göra ett POST-anrop till följande adress: https://owner-api.teslamotors.com/oauth/token
Som svar kommer vi att få en token som vi sparar ner för att sedan använda i kommande anrop.
Vi börjar med att sätta upp våra olika parametrar som variabler för att lättare kunna byta ut värdena vid behov.
Let vBaseURL = 'https://owner-api.teslamotors.com';
Let vDriverEmail = 'morgan.kejerhag@drakeanalytics.se';
Let vDriverPassword = 'XXXXXXXXXX'; // Byt till ditt lösenord!
Let vClientId = '81527cff06843c8634fdc09e8ac0abefb46ac849f38fe1e431c2ef2106796384';
Let vClientSecret = 'c7257eb71a564034f9419ee651c7d0e5f7aa6bfbd18bafb5c5c033b093bb2fa3';
Let vToken = '';
Let vVehicleID = '';
Därefter sätter vi upp en data connection av typen REST med följande inställningar:
Method: POST
Authentication Schema: Anonymous
Query parameter "grant_type": password
Query parameter "client_id": Det client id som du tidigare tagit ut
Query parameter "client_secret": Den client secret som du tidigare tagit ut
Query parameter "email": Epostadress till förarens konto
Query parameter "password": Lösenord till förarens konto
Query header "User-Agent": Mozilla/5.0 (Linux; Android 9.0.0; VS985 4G Build/LRX21Y; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36
Query header "X-Tesla-User-Agent": TeslaApp/3.4.4-350/fad4a582e/android/9.0.0
Name: Tesla POST REST
Om du sedan trycker på knappen Test connection ska du få ett svar om att anslutningen har lyckats.
Lägg till läsningen till scriptet och justera så att parametrarna sätts i scriptet istället för i inställningarna:
LIB CONNECT TO 'Tesla POST REST';
Token:
SQL SELECT
"access_token",
"token_type",
"expires_in",
"refresh_token",
"created_at"
FROM JSON (wrap on) "root"
WITH CONNECTION(
Url "https://owner-api.teslamotors.com/oauth/token",
QUERY "grant_type" "password",
QUERY "client_id" "$(vClientId)",
QUERY "client_secret" "$(vClientSecret)",
QUERY "email" "$(vDriverEmail)",
QUERY "password" "$(vDriverPassword)",
HTTPHEADER "User-Agent" "Mozilla/5.0 (Linux; Android 9.0.0; VS985 4G Build/LRX21Y; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36",
HTTPHEADER "X-Tesla-User-Agent" "TeslaApp/3.4.4-350/fad4a582e/android/9.0.0"
);
Let vToken = peek('access_token',0);
drop table Token;
TRACE Token: $(vToken);
Kör en omladdning så ska en token hämtas ut och skrivas ut i loggen. Kopiera denna token så att vi kan använda den när vi sätter upp nästa anslutning för att hämta data.
Hämta Vehicle ID
För att läsa ut data behöver man också veta ett id-nummer för den bil man ska ta data från. Ett Tesla-konto kan ha flera bilar kopplat till sig och då behöver man modifiera scriptet för att hämta antingen en specifik bil eller alla.