Entwickler-Ecke
Internet / Netzwerk - Tesla API mit Delphi
Alice - Mo 17.04.23 18:52
Titel: Tesla API mit Delphi
hi leute,
ich versuche via Delphi die Tesla API (
https://tesla-api.timdorr.com/) anzusteuern, es will noch nicht so ganz.
vielleicht hat ja hier einer eine zündende idee:
als erster schritt will ich die api dazu nutzen um die stromstärke beim laden zu setzen/ändern:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| function TForm1.SetChargeLimit(const AccessToken: string; const APIEndpoint: string; const VehicleID: string; ChargeLimit: Integer): Boolean; var URL: string; RequestBody: TJSONObject; Response: string; ResponseJSON: TJSONObject; HTTP: TIdHTTP; begin URL := APIEndpoint + 'api/1/vehicles/' + VehicleID + '/command/set_charge_limit';
RequestBody := TJSONObject.Create; RequestBody.AddPair('charge_limit_soc', TJSONNumber.Create(ChargeLimit));
HTTP := TIdHTTP.Create(nil); HTTP.Request.ContentType := 'application/json'; HTTP.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + AccessToken; HTTP.Request.Accept := 'application/json';
try Response := HTTP.Post(URL, RequestBody.ToString); ResponseJSON := TJSONObject.ParseJSONValue(Response) as TJSONObject; try Result := ResponseJSON.GetValue<TJSONValue>('response').GetValue<TJSONPair>('result').JsonValue.GetValue<Boolean>; if Result then showmessage('Ladeleistung wurde auf ' + IntToStr(ChargeLimit) + 'A erhöht.') else showmessage('Fehler beim Erhöhen der Ladeleistung.'); finally ResponseJSON.Free; end; except on E: Exception do begin showmessage('Fehler: ' + E.Message); Result := False; end; end;
RequestBody.Free; HTTP.Free; end; |
beim ausführen bringt er mir den fehler:
Zitat: |
Fehler Datei C:\Users\Desktop\Neuer Ordner\Win321Debug\{"charge_limit_soc":7} kann nicht geöffnet werden.
Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch. |
wo liegt der fehler ?
Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Mo 17.04.2023 um 22:39
Moderiert von Narses: Delphi-Tags hinzugefügt
jaenicke - Mo 17.04.23 22:58
Schau dir einmal an, was bei einem Post der zweite Parameter macht, wenn er ein String ist. Spoiler: Nein, du übergibst in dem String nicht den Inhalt, der gepostet werden soll... ;-)
Wenn du das möchtest, musst du eine Stringliste oder einen Stringstream verwenden.
Alice - Mo 17.04.23 23:49
jaenicke hat folgendes geschrieben : |
Schau dir einmal an, was bei einem Post der zweite Parameter macht, wenn er ein String ist. Spoiler: Nein, du übergibst in dem String nicht den Inhalt, der gepostet werden soll... ;-)
Wenn du das möchtest, musst du eine Stringliste oder einen Stringstream verwenden. |
hmm, stehe da auf'm schlauch :-(
jaenicke - Di 18.04.23 08:31
Alice hat folgendes geschrieben : |
hmm, stehe da auf'm schlauch :-( |
Naja, was könnte denn ASourceFile bedeuten? Du gibst dort einen
Dateinamen an, in dem die Post-Daten stehen. Du musst daher eine Stringliste oder einen Stringstream verwenden, sprich deinen String dort hineinschreiben und dann die Stringliste oder den Stringstream übergeben.
Alice - Di 18.04.23 09:26
also das hier:
Delphi-Quelltext
1: 2: 3:
| StrList.Clear; StrList.add(RequestBody.AsString); Response := HTTP.Post(URL, StrList); |
ändert nichts am verhalten, falls du das so meinst.
Moderiert von Th69: Delphi-Tags hinzugefügt
Moderiert von Th69: Vollzitat entfernt.
jaenicke - Di 18.04.23 09:43
Alice hat folgendes geschrieben : |
ändert nichts am verhalten, falls du das so meinst. |
Ja, so mache ich das oft. Da kann dann aber nicht die gleiche Fehlermeldung (mit dem Dateinamen) kommen. Ein anderer Fehler ist natürlich möglich.
Alice - Di 18.04.23 11:13
ja, sorry:
nun ist es der fehler "der wert für iohandler ist ungültig".
Moderiert von Th69: Vollzitat entfernt.
Alice - Di 18.04.23 13:05
@jaenicke, danke dir für die Unterstützung! :D
ok, folg. hinzugefügt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); IOHandler.SSLOptions.Method := sslvSSLv3 ; . . HTTP := TIdHTTP.Create(nil); HTTP.IOHandler := IOHandler; |
die beiden dll's (
https://indy.fulgan.com/SSL/openssl-1.0.2u-i386-win32.zip) in den prg. path übernommen.
fehler nun, ich denke du ahnst es schon: socket err 10054.
Moderiert von Th69: Delphi-Tags hinzugefügt
Moderiert von Th69: Vollzitat entfernt.
jaenicke - Di 18.04.23 13:25
Socket Fehler 10054 bedeutet, dass zwar der Socket geöffnet werden konnte, aber auf gesendete Pakete kein ACK kommt, sprich keine Empfangsbestätigung, und auch keine Antwort.
Da ich die API nicht kenne, weiß ich nicht, weshalb das passieren kann. Das Bearer-Token kann vorher erfolgreich abgeholt werden und dabei gibt es auch keine Fehler?
Alice - Di 18.04.23 13:34
gute frage, wie könnte ich das prüfen ?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!