TESLA API auslesen (SOC, Reichweite, Ladegeschwindigkeit uvm.)

PV Überschussladen mit Wallboxen. (intelligenten Ladestationen) Alles was mit der eingebauten Wallbox-Steuerung zu tun hat.

Moderator: Ulrich

Antworten
thomas1000
Beiträge: 24
Registriert: Fr 19. Mär 2021, 16:26
Hat sich bedankt: 2 Mal

TESLA API auslesen (SOC, Reichweite, Ladegeschwindigkeit uvm.)

Beitrag von thomas1000 »

Hallo Kollegen!

Da ich in meinem Dashboard auch sehen möchte, wie der aktuelle Ladezustand meines Stromers ist, habe ich mich mal etwas mit dem Thema TESLA-API beschäftigt.

Hier meine vorläufigen Erkenntnisse:

Die einzelnen Schritte für den Zugriff lassen sich enorm vereinfachen, wenn man die von Stephan Groen veröffentlichen PHP-Klassen nutzt. Diese einfach in ein Unterverzeichnis von /var/www/html ablegen. Ich habe /var/www/html/tesla verwendet. Erhältlich sind Files hier:

https://github.com/stephangroen/tesla-php-client

Bevor man seinen TESLA auslesen kann, benötigt man erst einmal ein TOKEN für der Zugriff, welches für 90 Tage gilt. Dies ist mit ein paar Zeilen erledigt:

WORK IN PROGRESS - PROOF OF CONCEPT - EXPERIMENTE AUF EIGENE GEFAHR!

Code: Alles auswählen

<?PHP
require_once("tesla/Tesla.php");

$tesla = new Tesla($token);
echo "initiiert...";
$tesla->setClientId('e4a9949fcfa04068f59abb5a658f2bac0a3428e4652315490b659d5ab3f35a9e');
$tesla->setClientSecret('c75f14bbadc8bee3a7594412c31416f8300256d7668ea7e6e7f06727bfb9d220');
$accessToken = $tesla->getAccessToken('<HIER MAILADRESSE VOM TESLA-KONTO>', '<HIER DEIN TESLA-PASSWORT');
echo "Mein Access-Array enthält:";
print_r($accessToken);
echo "Mein Access-Token lautet: >>>" . $accessToken["access_token"] . "<<<\n";
?>
Das damit erzeugte Token kann für das eigentliche Script zur Authentifizierung genutzt werden:

Code: Alles auswählen

<?php
$hmw_db  = "eauto";     // Name der Datenbank in influxdb (ggf. manuell anlegen)!
$hmw_tbl = "tesla";            // Name der Tabelle innerhalb der Datenbank
require_once("tesla/Tesla.php");

$token = "HIER DAS TOKEN AUS DEM OBEREN SCRIPT EINSETZEN";
$tesla = new Tesla($token);
echo "initiiert...";
// Als erstes holen wir uns die Liste der Fahrzeuge aus diesem Konto
$vehicles = $tesla->vehicles();

echo "Ergebnis: ";
echo "<pre>";
print_r( $vehicles );
echo "</pre>";
$vehicle_id = $vehicles['response'][0]['id_s']; // Wir nehmen immer das erste Fahrzeug (wer mehrere hat möge es ggf. entsprechend erweitern)
echo "Fahrzeug-ID: $vehicle_id \n";

$tesla->setVehicleId($vehicle_id);
$id = $vehicle_id;

$chargeState = $tesla->chargeState(); // Wir interessieren uns (erstmal) nur für die Daten zum Ladevorgang
echo "chargeState: \n";
print_r($chargeState);

  $query  = "$hmw_tbl ";        // Das abschließende Leerzeichen ist wichtig!

// Damit die Datenbank nicht zu unübersichtlich wird, stehen in "needed" nur die Werte, die wir auslesen möchten

$needed  = "xxx battery_level,battery_range,charge_energy_added,charge_limit_soc,charge_limit_soc_max,charge_limit_soc_min,charge_miles_added_ideal,charge_miles_added_rated,charge_port_latch,charge_rate,charger_actual_current,charger_phases";
$needed .= "charging_state,est_battery_range,ideal_battery_range,managed_charging_active,minutes_to_full_charge,time_to_full_charge,timestamp,trip_charging,usable_battery_level";

foreach($chargeState as $key => $value) {
  echo "Key: $key  . Value: $value\n";
  if (strpos($needed,$key) > 0):
    if($value=="") $value=0;
    if (is_numeric($value)):
      $query .= "$key=$value,";
    else:
      $query .= "$key=\"$value\",";
    endif;
  endif;
}
  $query = substr($query,0,-1); // Das letzte Komma wieder enfernen
  $query .= "  ".time();        // Aktuellen Timestamp anfügen
  $query .= "\n";

echo "Query: $query";

// jetzt schreiben wir die Daten mit ihrem Tesla-Namen in die influxdb:

  $ch = curl_init("http://localhost/write?db=$hmw_db&precision=s");
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
  curl_setopt($ch, CURLOPT_TIMEOUT, 9);
  curl_setopt($ch, CURLOPT_PORT, "8086");
  curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $result = curl_exec($ch);
    $rc_info = curl_getinfo($ch);
    $Ausgabe = json_decode($result,true);
    if (curl_errno($ch)) {
      $Meldung = "Curl Fehler! Daten nicht zur InfluxDB gesendet! Curl ErrNo. ".curl_errno($ch);
    }
    elseif ($rc_info["http_code"] == 200 or $rc_info["http_code"] == 204) {
      $Meldung = "OK. Daten zur InfluxDB  gesendet.";
    }
    else {
      $Meldung = "!!! Daten nicht zur InfluxDB gesendet! info: ".print_r($rc_info,1);
    }
  echo "Meldung: $Meldung \n";
  curl_close($ch);
  unset($ch);
?>
Wenn die verwendete Datenbank existiert, dann schreibt dieses Script die Daten fleissig in die Datenbank, was dann mit Grafana entsprechend visualisiert werden kann. Ein zyklischer Start ist durch einen Eintrag in der CRONTAB oder indem man in der (1.)user.config.php die Zeile

require("tesla.php");

einfügt, möglich - vorausgesetzt natürlich man hat das Script auch als "tesla.php" abgespeichert...

WORK IN PROGRESS - PROOF OF CONCEPT - EXPERIMENTE AUF EIGENE GEFAHR!

Das ganze muss noch etwas verfeinert werden - z.B. durch automatische Erneuerung des Token und elegantere Einbindung in die Solaranzeige-Welt...

Bin gespannt auf Euer Feedback (und ob es hier weitere Tesla-Solar-Lader gibt...)

1000(s) Grüße

Thomas
Tesla_Grafana.PNG

Jagman
Beiträge: 9
Registriert: Fr 15. Jan 2021, 15:04
Danksagung erhalten: 1 Mal

Re: TESLA API auslesen (SOC, Reichweite, Ladegeschwindigkeit uvm.)

Beitrag von Jagman »

Hallo Thomas,

fast das gleiche Spiel geht auch mit der Renault ZOE.

Ein entsprechendes PHP script funktioniert prima ...
<TR><TD>Kilometerstand:</TD><TD>480 km</TD></TR>
<TR><TD>Angeschlossen:</TD><TD>Nein</TD></TR>
<TR><TD>Wird geladen:</TD><TD>Nein</TD></TR>
<TR><TD>Akkustand:</TD><TD>84 %</TD></TR>

Folgende Erweiterung der Solaranzeige wäre cool:

- eine DB Erweiterung mit einer Tabelle Auto in der die meisten Spalten die man für ein e-Auto braucht vorhanden sind. Das könnten folgende Felder sein:
* VIN / Car is charging / Charging status / Cable Status / Battery level / Battery temperature / Battery capacity / Range in km / Charging time / GPS longitude / GPS Latitude / Chargemode / Kilometers car / Charge limit min / Charge Limit max / last update
- Erweiterung der phpinc/funktionen.inc.php um die Daten einfach schreiben zu können
- ein generischer Regler in der es eine xyz-math.php gibt in der man den zum Auto passenden Code einfügen kann und einfach die DB befüllen kann .

Grüße

Jens

Antworten