[funktioniert!] Tesla REST API von timdorr

Da habt ihr leider recht und ich unrecht. Sorry für die Missinformation, dachte das ginge! Kommt sicher noch.

Ich frage mich bei meinen Experimenten gerade, wieso die JS-Beispiele bei mir nicht funktionieren.

Beispiel:

[code]





[/code]

Das müsste gemäss Doku docs.timdorr.apiary.io/ das Cookie „_s_portal_session“ setzen - es passiert aber nix.

this.status = 0
Headers = „“
Body =

Sitze wohl grad auf der Leitung. Habe aber leider auch grad den Kopf nicht wirklich dafür frei, also fallt nicht über mich her :slight_smile:

LG
Raphael

Würde sagen dass du erst mal /Login Posten musst.

Die Doku sagt das Gegenteil. Zuerst ein GET darauf, um das o.g. Cookie zu kriegen.

Sehe aber grad, dass ich einen „No ‚Access-Control-Allow-Origin‘ header is present on the requested resource. Origin ‚http://localhost‘ is therefore not allowed access.“ kriege - das kann doch nicht sein?

also bei mir gehts. Bevor ein Kommando wie „vehicles“. gesendet werden kann, müssen dowohl das session-Cookie als auch das usercredentials-Cookie gespeichert sein.

@raffiniert: lass Dir mal die Header ausgeben, vielleicht lehnt er da einen Request-Header von Dir ab.

Nutzt Du auch den JS-Code? Wenn Du meinen o.g. Code ausführst, geht das bei Dir?
Welcher Browser? Localhost oder Server im WWW?

Ich nutze den Code in PHP, den ich eingangs gepostet habe. Vielleicht sendet die PHPCurl-Lib per Default andere Header beim Request mit.

Naja vor allem ist Cross-Domain-Scripting cURL ziemlich egal resp. oft der Hauptzweck davon :wink:
Naja, habe im TMC mal nachgefragt, denn es funktioniert weder gegen den Mock noch den Live-Server - bin aber sicher, dass der Fehler zwischen meinen Ohren liegt :slight_smile:

Allerdings postet ein anderer User gerade den selben Fehler… denn mein Posting wurde noch nicht veröffentlicht.

Bei mir funzt es auch nicht. Wenn ich

xhr.open(‚GET‘, ‚https://portal.vn.teslamotors.com/login‘);

verwende

Wenn ich aber

xhr.open(‚GET‘, ‚https://private-anon-bd215c432-timdorr.apiary-mock.com/login‘);

Verwende kriege ich zumindest einen responseText

Hi !
Für alle die, die an scheduled charging oder einer PV-Schnittstelle zur Ertragsladung interessiert sind.
Einige am Markt befindliche Ladestationen können das bereits. Ich habe eine crOhm Box - die hat ne PV-Schnittstelle - per S0 am Ertragszähler. Impulse sind bis 2000 imp/kWh einstellbar.
Ganz so einfach ist das nicht, wenn man das sauber machen möchte - das Laden eines E-Autos gehorcht ja Protokollen. Man kann nur in bestimmten Zeitabständen die Ladeströme in erlaubten Werten absenken oder erhöhen.
Ebenfalls möglich ist die Erstellung eines Ladeplans - also wann wird der Wagen geladen. Das ist z.B. gut, wenn man mehrere E-Cars hat und die alle 22kW abkönnen :slight_smile: - man muß ein wenig aufpassen, daß das mit dem heimischen Stromanschluß dann noch klappt.
Mgl. Kombinationen in DE sind z.B. ein Tesla mit Doppellader und ein ZOE und schon hat man Nachts - oder auch tagsüber ein Problem. Leider kann ich noch nicht aus der Praxis berichten. Ladeinfrastruktur ist wie eben beschrieben letzte Woche fertig geworden - der S85D kommt Ende März - sagt Tesla. Technisch ist aber soweit alles implementiert. Es handelt sich um eine EVSE1M40 mit CAN, BT- und PV-Schnittstelle.
Der Vorteil ist die Fahrzeugunabhängigkeit und die Unabhängigkeit von der jeweils eingesetzten Software im Fahrzeug.

Da stimmen die CORS Einstellungen nicht. Der Browser verweigert dann den Request überhaupt abzuschicken. Kannst aber zu Testzwecken den Browser auch ohne CORS Überprüfung starten. Bei Chrome gibt’s dafür irgend ein Commandline flag.

Ja das ist mir klar - aber auf der Basis kann doch keine Applikation entwickelt werden?
„Lustigerweise“ liefert sogar der Mock diesen Response. Das ist ein Witz!

Nur mal so zwischendurch: wenn Ihr diesen Thread in Chinesisch geschrieben hättet, würde ich genau so viel verstehen :laughing:
Aber macht ruhig weiter, Ihr beeindruckt mich!

Ich bin hier leider erstmal wieder raus, denn ich möchte die App aus Privacy-Gründen direkt mit dem Tesla-Server kommunizieren lassen, was aber auf Grund der Security-Policy aller moderner Browser und dem fehlenden CORS auf dem Tesla-Server nicht möglich scheint. Würde ich alles über meinen Server laufen lassen, wäre das zwar kein Problem, aber die Verantwortung, dass über meinen Server duzende / hunderte User/PW-Kombinationen für Teslas laufen würden möchte ich nicht auf mich nehmen.

@LaoKi: Besser so? :smiley:

Hallo,

Ich möchte mich erst mal bei Laoki bedanken, denn mir gings beim Lesen der Zeilen genau so wie Laoki.

Danke auch an Raffiniert für die Erklärung, über was es hier geht.

Gruß

Kurt

Hast du es schon mal mit jsonp probiert. Damit wird ein tag in den DOM geschrieben und per Definition (im Gegensatz zu json) keine CORS Überprüfung durchlaufen.

Nein, daran hatte ich schon gedacht, es aber noch nicht ausprobiert. Bin momentan etwas knapp zeitlich, mal schauen wann’s was wird (oder wer mich überholt :wink:)

Wollte nur eben mal vermelden, dass ich meinen Tesla jetzt über die aktuelle API via cURL innerhalb eines simplen PHP-Scriptes ansprechen kann… hat schon was, den Tesla über die bash-shell hupen zu lassen :wink:

Aktuelle API-Dokumentation:
docs.timdorr.apiary.io/#

Allerdings bin ich nicht in Besitz einer client_id und client_secret, aber es gibt einen Weg: Man besorge sich token und vehicle_id über die APP Remote S und steigt dann gleich mit einem gültigen Token in die Geschichte ein.

(erreichbar über Anklicken des Logos oben in der Mitte)

Mein Code in PHP:

<?php

class SimpleTeslaAPI {

    // Quick&Dirty Tesla API - Implementierung in PHP zum Nachvollziehen und weiterprogrammieren,
    // 9.1.2016 (V1.1)
    // von [email protected]

    var $token;
    var $vehicleID;

    // Implementierung
    function SimpleTeslaAPI() {
        // !!!!!!!!! Hier Token und vehicle_id einsetzen !!!!!!!!!
        $this->token     = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
        $this->vehicleID = "xxxxxxxxxx";
    }

    private function curlexec($command,$mode="GET",$params=array()) {
        $url = 'https://owner-api.teslamotors.com/';

        $ch = curl_init();
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);

        $params['vehicle_id']=$this->vehicleID;

        if ( $mode == "POST" ) {
            if ( $command == "oauth/token" ) {
                curl_setopt($ch,CURLOPT_URL, $url.$command);
            } else {
                if ( $command == "wake_up" ) {
                    curl_setopt($ch,CURLOPT_URL, $url."api/1/vehicles/".$this->vehicleID."/wake_up");
                } else {
                    curl_setopt($ch,CURLOPT_URL, $url."api/1/vehicles/".$this->vehicleID."/command/".$command);
                }
                curl_setopt($ch,CURLOPT_HTTPHEADER, array("Authorization:Bearer ".$this->token) );
            }
            curl_setopt($ch,CURLOPT_POST, 1);
            curl_setopt($ch,CURLOPT_POSTFIELDS, $params);
        } else {
            if ( $command == "vehicles" ) {
                curl_setopt($ch,CURLOPT_URL, $url."api/1/vehicles");
            } else {
                curl_setopt($ch,CURLOPT_URL, $url."api/1/vehicles/".$this->vehicleID."/data_request/".$command."?".join("&",$params));
            }
            curl_setopt($ch,CURLOPT_HTTPHEADER, array("Authorization:Bearer ".$this->token) );
        }
        $result = curl_exec($ch);
        $rc=curl_getinfo($ch,CURLINFO_HTTP_CODE);

        curl_close($ch);

        return json_decode($result);
    }

    //Grundfunktionen
    function vehicles() {
        return $this->curlexec("vehicles","GET");
    }
    function wake_up() {
        return $this->curlexec("wake_up","POST");
    }

    //data-requests
    function charge_state() {
        return $this->curlexec("charge_state","GET");
    }
    function climate_state() {
        return $this->curlexec("climate_state","GET");
    }
    function drive_state() {
        return $this->curlexec("drive_state","GET");
    }
    function gui_settings() {
        return $this->curlexec("gui_settings","GET");
    }
    function vehicle_state() {
        return $this->curlexec("vehicle_state","GET");
    }


    // commands
    function charge_port_door_open() {
        return $this->curlexec("charge_port_door_open","POST");
    }
    function charge_standard() {
        return $this->curlexec("charge_standard","POST");
    }
    function charge_max_range() {
        return $this->curlexec("charge_max_range","POST");
    }
    function set_charge_limit($percent) {
        return $this->curlexec("set_charge_limit","POST",array("percent" => $percent ));
    }
    function charge_start() {
        return $this->curlexec("charge_start","POST");
    }
    function charge_stop() {
        return $this->curlexec("charge_stop","POST");
    }
    function flash_lights() {
        return $this->curlexec("flash_lights","POST");
    }
    function honk_horn() {
        return $this->curlexec("honk_horn","POST");
    }
    function door_unlock() {
        return $this->curlexec("door_unlock","POST");
    }
    function door_lock() {
        return $this->curlexec("door_lock","POST");
    }
    function set_temps($tempDriver, $tempPassenger) {
        return $this->curlexec("set_temps","POST",array("driver_temp" => $tempDriver,"passenger_temp" => $tempPassenger ));
    }
    function auto_conditioning_start() {
        return $this->curlexec("auto_conditioning_start","POST");
    }
    function auto_conditioning_stop() {
        return $this->curlexec("auto_conditioning_stop","POST");
    }
    function sun_roof_control_state($state) {
        return $this->curlexec("sun_roof_control","POST",array("state" => $state ));
    }
    function sun_roof_control_percent($percent) {
        return $this->curlexec("sun_roof_control","POST",array("state" => "move", "percent" => $percent ));
    }
    function remote_start_drive($password) {
        return $this->curlexec("remote_start_drive","POST",array("password" => $password ));
    }

    // deprecated
    function trunk_open() {
        return $this->curlexec("trunk_open","POST",array("which_trunk" => "rear" ));
    }
}


// Main

$tesla = new SimpleTeslaAPI();

//wenns hupt, hat es funktioniert ;)
print_r($tesla->honk_horn());
// Beispiel Innenraumtemperatur
print_r($tesla->set_temps(22,22));

Wenn die App Summon kann, ist es auch in der API freigeschaltet…

Ihr wisst ja, was das heißt - besonders in puncto „Button dauernd drücken…“ :wink: !!!

Ich bleib dran! :wink:

vehicle_state() sagt:

[code]stdClass Object
(
[response] => stdClass Object
(
[api_version] => 3
[autopark_state] => unavailable
[autopark_state_v2] => standby
[autopark_style] => dead_man

[…]

    )

)[/code]

Hallo,

interessiert noch jemand ein TESLA < KNX > TESLA gateway. Ich bin gerade dabei dies zu programmieren und als Modul für den Gira Homeserver zu basteln. :mrgreen: