Neues Car-Net - Version 4

AntwortenAntworten Options Options Arrow

Re: Neues Car-Net - Version 4

DidiOnTour
  • Beiträge: 66
  • Registriert: So 16. Apr 2017, 15:00
read
hab heute eine Info gelesen, dass die App von Mercedes jetzt auch eine Integration in Alexa hat, d.h. man kann vom Wohnzimmer aus per Sprachbefehl gewisse Aktionen der App (z.b. die Vorklimatisierung) steuern. Vielleicht wäre das auch eine guter Hinweis für die Entwickler von VW :-) - fänd ich super!
LG
Didi
GTE blackrubin 09/2017
Anzeige

Re: Neues Car-Net - Version 4

rehlus
  • Beiträge: 42
  • Registriert: Fr 3. Feb 2017, 15:30
  • Danke erhalten: 18 Mal
read
RedRaz hat geschrieben:Hallo!

Ich suche auch den "alternativen" Zugriff auf die Car- Net Funktionen (ohne APP) um in meine Haussteurungerung leicht auf Funktionen des Fahrzeugs zugreifen zu können bzw. diese zu steuern.
Die Wallbox (KEBA P30c) habe ich von Ip-Symcon aus bereits im Netzwerk und im Zugriff (zur Zeit nur Werte auslesen), möchte aber mit IPS bzw IPSview von den Pads im Haus auf das Fahrzeug zugrifen und nicht immer mühsam das Handy nehmen. Ein Ziel wird sein die Überschussleistung der PV Anlage gesteuert ins Auto zu bringen. Ebenso möchte ich pr Tip aus den Screen das Auto z.B. vorheizen.
Hat jemand was mit Car-net und IPSymcon im Rahmen seiner Haussteuerung gemacht? (PHP)
Funktioniert der Login wie weiter oben noch?

LG
RedRaz

Jup, hab ich mittlerweile.
Vom User SL4E habe ich mal ein Python-Script bekommen, welches ich jetzt in PHP übersetzt habe. Bisher können nur Daten ausgelesen werden, die nächsten Tage erweitere ich es noch um Steuerungs-Funktionen (Starten/beenden und einstellen von Ladevorgang, Klima etc.)

Aber hier schon mal die bisherige Version davon.

Code: Alles auswählen

<?php 

	$sUser = 'deine@mail.de';
	$sPass = 'Passwort';

	$sBaseURL = 'https://www.volkswagen-car-net.com/portal';
	$sLoginURL = $sBaseURL.'/en_GB/web/guest/login';
	$sApp = '17_WAR_cored5portlet';

	$sAuthToken = base64_encode($sUser);
	$aCookies = array('CARNET_AUTH' => $sAuthToken);
	$aParams = array('cookies' => $aCookies);
	
	
	$oRequest = curl_init();
	curl_setopt($oRequest, CURLOPT_URL, $sLoginURL);
	curl_setopt($oRequest, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($oRequest, CURLOPT_COOKIE, "CARNET_AUTH=".$sAuthToken);
	curl_setopt($oRequest, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($oRequest, CURLOPT_COOKIESESSION, true);
	curl_setopt($oRequest, CURLOPT_COOKIEJAR, 'carnet-cookie-'.$sAuthToken);
	curl_setopt($oRequest, CURLOPT_SSL_VERIFYPEER, false);
	$sReturn = curl_exec($oRequest);
	preg_match('<meta name="_csrf" content="([^"]*)"/>', $sReturn, $aCsrfToken);

	$sCsrfToken = $aCsrfToken[1];
	$aParams = array('_'.$sApp.'_login' => $sUser, '_'.$sApp.'_password' => $sPass);
	$sLoginURL = $sBaseURL.'/de_DE/web/guest/login?p_auth='.$sCsrfToken.'&p_p_id='.$sApp.'&p_p_lifecycle=1&p_p_state=normal&_'.$sApp.'_javax.portlet.action=login';
	curl_setopt($oRequest, CURLOPT_URL, $sLoginURL);
	curl_setopt($oRequest, CURLOPT_POST, true);
	curl_setopt($oRequest, CURLOPT_COOKIEJAR, 'carnet-cookie-'.$sAuthToken);
	curl_setopt($oRequest, CURLOPT_COOKIE, "CARNET_AUTH=".$sAuthToken);
	curl_setopt($oRequest, CURLOPT_HTTPHEADER, array('Connection: keep-alive'));
	curl_setopt($oRequest, CURLOPT_POSTFIELDS, $aParams);
	
	$sReturn = curl_exec($oRequest); 
	$sSessionURL = curl_getinfo($oRequest, CURLINFO_EFFECTIVE_URL);
	
	//Debug-Ausgabe
	//$aReturn = array($sSessionURL, $sCsrfToken, $oRequest);
	
	//Einen der folgenden Variablen für den Aufruf verwenden.. Je nach Funktion
	
	//Zeigt Fahrzeugdetails
	$sActionURL = '/-/vehicle-info/get-vehicle-details';
	
	//Auch irgendwelche Fahrzeugdaten
	$sActionURL = '/-/vsr/get-vsr';
	
	//Zeigt die Tripstatistiken an
	$sActionURL = '/-/rts/get-latest-trip-statistics';
	
	//Zeigt Batteriedaten
	$sActionURL = '/-/emanager/get-emanager';
	

	$sURL = $sSessionURL.$sActionURL;
	curl_setopt($oRequest, CURLOPT_URL, $sURL);
	curl_setopt($oRequest, CURLOPT_HTTPHEADER, array('Origin: https://www.volkswagen-car-net.com', 'Host: www.volkswagen-car-net.com', 'Referer: '.$sSessionURL, 'Expect: ', 'Content-Type: application/json;charset=utf-8 */*', 'X-CSRF-Token: '.$sCsrfToken));
	curl_setopt($oRequest, CURLOPT_FOLLOWLOCATION, true);

	$sReturn = curl_exec($oRequest); 
	$aRequestInfo = curl_getinfo($oRequest);		
	
	print_r(json_decode($sReturn));
?>
Sobald ich Zeit für die Steuerungsfunktionen habe, werde ich sie auch hier teilen.

Keine Haftung für Schäden und/oder Probleme und unter der Creative Common Lizenz BY-NC-SA 4.0 für euch von mir bereitgestellt. Also Weiterverteilung nur unter gleichen Voraussetzungen, nicht für kommerzielle Nutzung und Quellangabe.
Lizenzinfos: https://creativecommons.org/licenses/by-nc-sa/4.0/


Weiteres zu dem Thema:
Ich hätte als Idee, ein Webportal aufzuziehen, bei dem ihr eure Car-Net Verbrauchs-/Fahrdaten mit o.g. Interface synchronisieren könnt und euch mit den anderen Nutzern der Seite messen könnt. So mit Top-Charts für effizienteste Fahrweise etc. Wer würde sowas interessant finden oder ist es die Arbeit nicht wert?
Bild

Re: Neues Car-Net - Version 4

C.Becker
  • Beiträge: 44
  • Registriert: Do 3. Aug 2017, 14:27
  • Wohnort: wolfsburg
  • Danke erhalten: 1 Mal
read
Also ich würde so etwas interessant finden.
ein Jahr e-golf in 2017, id.3 ab 2020, id.4 ab 02/2021

Re: Neues Car-Net - Version 4

RedRaz
  • Beiträge: 7
  • Registriert: Sa 8. Apr 2017, 18:45
  • Danke erhalten: 1 Mal
read
Hello rehlus!

Super dass Du den PHP Code hier bereitgestellt hast - freue mich schon auf das Ausprobieren und auf die Erweiterungen zur Steuerung. Vielen Dank für Deinen Einsatz! Wäre toll wenn es eine Aulistung der möglichen "Kommandos" gäbe, bzw eine Doku. Gibt es da etwas "Offizielles" von VW?

Bei mir stockt es weil ich noch immer auf das Fahrzeug warte - soll noch 14 Tage dauern, dann kann ich auch endlich weiter an Themen Ladesteuerung und Carnetfunktionen weiterarbeiten. Werde berichten wenn es endlich soweit ist.

LG
RedRaz

Re: Neues Car-Net - Version 4

rehlus
  • Beiträge: 42
  • Registriert: Fr 3. Feb 2017, 15:30
  • Danke erhalten: 18 Mal
read
Hi,

also von VW gibt es nichts offizielles. Im Grunde baut man den kompletten Aufruf inkl. Login / Aufbau der Session / Abruf der Daten / Auslösen einer Aktion nach, so wie es normal der Browser macht. Gelingt ganz gut mit dem Entwickler-Plugin von Google Chrome (F12). Am anfang bin ich noch ziemlich angestanden, weil mir nicht bekannt war, welche Cookies, XSS Tokens etc. VW bei der Anmeldung voraussetzt.. Hier im Thread wurde dann mal ein Python Script gepostet.

Für das Python Script das ich erweitert habe, habe ich die entsprechenden Funktionen schon gebaut, bei PHP schauts leider noch nicht ganz so gut aus, weil dort die HTTP POST Requests mit CURL gemacht werden und die etwas anders funktionieren als bei Python Request.

Lange Rede kurzer Sinn, das Python Script von SL4E findest du auf Seite 2, hier ist mal unkommentiert meine Version, bei der es auch Steuerungsmöglichkeit besteht.

Code: Alles auswählen

#!/usr/bin/python

import re
import requests
import base64
import sys
import json
import os
import datetime


email='xx@yyy.de'
password='*******'
funct=sys.argv[1]


def apicall(email, password, function):

    csfr_re = re.compile('<meta name="_csrf" content="([^"]*)"/>')
    base = "https://www.volkswagen-car-net.com/portal"

    def b64(text):
        return requests.utils.quote(base64.b64encode(text.encode('utf-8')))

    def extract_csfr(r):
        return csfr_re.search(r.text).group(1)

    def headers(csfr):
        return {'X-CSRF-Token': csfr}

    # headers = {}
    s = requests.Session()
    s.cookies.set('CARNET_AUTH', b64(email))

    # Request login form and get CSFR:
    r = s.get(base + '/en_GB/web/guest/login', verify=False)
    csfr = extract_csfr(r)

    # Login:
    app = '17_WAR_cored5portlet'
    url = base + (
        "/en_GB/web/guest/login?"
        "p_auth=" + csfr + "&"
        "p_p_id=" + app + "&"
        "p_p_lifecycle=1&"
       "p_p_state=normal&"
        "_" + app + "_javax.portlet.action=login"
        )
    post_data = {
        '_' + app + '_login': email,
        '_' + app + '_password': password,
    }
    r = s.post(url, data=post_data)
    if 'guest/login' in r.url:
        raise Exception('Unable to login :(')

    logged_url = r.url
    csfr = extract_csfr(r)
    payload={}

    if function == 'car.status':
      urlsuffix="/-/vsr/get-vsr"
    elif function == 'car.lasttrip':
      urlsuffix="/-/rts/get-latest-trip-statistics"
    elif function == 'charge.detailstatus':
      urlsuffix="/-/emanager/get-emanager"
    elif function == 'charge.status':
      urlsuffix="/-/emanager/get-emanager"
    elif function == 'car.details':
      urlsuffix="/-/vehicle-info/get-vehicle-details"
    elif function == 'trip.details':
      urlsuffix="/-/rts/get-latest-trip-statistics"
    elif function == 'charge.start':
      urlsuffix="/-/emanager/charge-battery"
      payload={'triggerAction':'true'}
    elif function == 'charge.stop':
      urlsuffix="/-/emanager/charge-battery"
      payload={'triggerAction':'false'}
    elif function == 'climate.start':
      urlsuffix="/-/emanager/trigger-climatisation"
      payload={"triggerAction":"true"}
    elif function == 'climate.stop':
      urlsuffix="/-/emanager/trigger-climatisation"
      payload={"triggerAction":"false"}
    elif function == 'heating.start':
      urlsuffix="/-/emanager/trigger-windowheating"
      payload={"triggerAction":"true"}
    elif function == 'heating.stop':
      urlsuffix="/-/emanager/trigger-windowheating"
      payload={"triggerAction":"false"}
    elif function == 'charge.limit.70':
      urlsuffix="/-/emanager/set-rdt-settings"
      payload={"rdt":{"settings":{"minChargeLimit":"70"}}}
    elif function == 'charge.limit.75':
      urlsuffix="/-/emanager/set-rdt-settings"
      payload={"rdt":{"settings":{"minChargeLimit":"75"}}}
    elif function == 'charge.limit.80':
      urlsuffix="/-/emanager/set-rdt-settings"
      payload={"rdt":{"settings":{"minChargeLimit":"80"}}}
    elif function == 'charge.limit.85':
      urlsuffix="/-/emanager/set-rdt-settings"
      payload={"rdt":{"settings":{"minChargeLimit":"85"}}}
    elif function == 'charge.limit.90':
      urlsuffix="/-/emanager/set-rdt-settings"
      payload={"rdt":{"settings":{"minChargeLimit":"90"}}}
    else:
      urlsuffix="/-/vsr/get-vsr"

    if payload == '':
      q = s.post(logged_url + urlsuffix,{}, headers=headers(csfr),)
    else:
      q = s.post(logged_url + urlsuffix, data=json.dumps(payload), headers=headers(csfr),)

    print(q.text)

apicall(email, password, funct)
Im Prinzip müssen bei allen aktiven Steuerungsbefehlen POST Requests mit einem JSON Body (siehe triggerAction) versendet werden. Da es in PHP (cURL) etwas anders implementiert ist (Versuche gerade herauszufinden wie), wirft die VW API einen ErrorCode 2 zurück, weil die Anfrage nicht verarbeitet werden kann.

Derweil sollte aber die Python Version ausreichend sein.
Bild

Re: Neues Car-Net - Version 4

USER_AVATAR
read
Hi, coole Sache das.
Welche python hast du benutzt?
bei mir spuckt er in python 2 einen Fehler wegen der ersten Fuktionsdeklaration aus und in 3 wegen der Klammernbei Textausgabe.
Ich kann es zwar nicht nutzen weil meine Autos in der Stahlbetongarage ohne Empfang parken...
Aber ich habe die Grippe und langeweile ;-/
Freund der Gleichstromladung :twisted:

Re: Neues Car-Net - Version 4

SL4E
  • Beiträge: 2238
  • Registriert: Do 3. Mär 2016, 12:51
  • Danke erhalten: 1 Mal
read
Python 3.4.6 und Python 3.2.3 auf dem Raspberry gehen beide.
Ich habe das Forum verlassen

Re: Neues Car-Net - Version 4

USER_AVATAR
  • Fraenkl
  • Beiträge: 328
  • Registriert: Mi 23. Aug 2017, 10:57
  • Wohnort: 68259 Mannheim
  • Hat sich bedankt: 6 Mal
  • Danke erhalten: 178 Mal
read
Hallo,

da ich meinen Wagen noch nicht habe, spiele ich gerade ein bisschen in der Carnet iOS App im Demo Modus.

Kann mir mal einer den Unterschied der beiden Gesten zum aktualisieren der Fahrzeugdaten erklären?

Wenn ich das Fahrzeugsymbol runter ziehe erscheint das Cloud Symbol und die Daten werden aktualisiert.

Wenn ich nun noch weiter herunter ziehe erscheint zusätzlich ein Fahrzeug Icon und nach drei Sekunden wird auch was synchronisiert.

Aber wo ist der unterschied? Die Hilfe Funktion der App ist ihren Namen nicht wert.

Gruß Fränkl


Gesendet von iPhone mit Tapatalk
e-Golf 300 seit 12/2017, ID.3 First MAX seit 10/2020

Re: Neues Car-Net - Version 4

rolfrenz
  • Beiträge: 962
  • Registriert: So 9. Mär 2014, 19:53
  • Hat sich bedankt: 7 Mal
  • Danke erhalten: 69 Mal
read
Meiner Meinung und Beobachtung nach:

Kurz ziehen = Sync der App mit dem Server
Lamg ziehen und 3 Sekunden halten = OCU im Fahrzeug wird „geweckt“ und schickt aktualisierte Daten an den Server, dann Sync der App
1.500 km Gratis Tesla Supercharging > https://ts.la/florian59849
10% auf Tesla Maßgepäck für Frunk&Trunk > https://oscarandhamish.refr.cc/floriane

VW e-Up! seit 17.4.2014
TESLA Model 3 seit 27.2.2019
SONO SION reserviert am 2.8.2016

Re: Neues Car-Net - Version 4

USER_AVATAR
read
Cloud Symbol = Abrufen der zuletzt vom Fahrzeug an den Server gesendeten Daten, Abgleich mit App
Fahrzeug-Symbol = Steuergerät 75 aufwecken und neue Daten an den Server schicken, Abgleich mit App

Ich finde das Abrufen der (veralteten) Daten vom Server recht sinnfrei, da viele Inhalte nicht aktuell sind. Daher wecke ich jedes Mal das Fahrzeug auf, wenn ich eine Info über den momentanen Zustand haben möchte. Von mir aus können die sich das Cloud Symbol sparen.

Warum das Auto nicht serienmäßig bei Abruf der Daten angesprochen wird, sondern über diesen Umweg, weiß ich nicht. Es ist aber schon deutlich besser gelöst als bei Car-Net Version 3, wo man nie so richtig wusste, ob der gerade angeforderte Status tatsächlich in Echtzeit vom Auto kommt.
2012-2015: Think PIV4 || 2016-2018: VW e-up!
2018-2020: Mietfahrzeuge || 2021-2023: Renault Twingo Electric
Und nun Deutschlandticket Nutzer ohne Auto.
Anzeige
AntwortenAntworten

Zurück zu „e-Golf - Infotainment“

Gehe zu Profile
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag