Tesla Model S und X per PowerShell fernsteuern, mithilfe der Restful WebAPI von TESLA
Ich liebe meinen Tesla Model S und ich liebe PowerShell. Na dann bringe ich doch mal beides zusammen. 😀
Für die Anmeldung beim Tesla Restful Webservice müssen Sie dieselben Anmeldeinformationen (Benutzername und Kennwort), wie auf mytesla (https://my.teslamotors.com/de_DE/user/login) angeben. Also zunächst mal zur Authentifizierung:
# Fenster für Anmeldeinfos anzeigen
$Credential=Get-Credential
# Kennwort für die SSL-gesicherte Übergabe „vorbereiten“
$ptr=[Runtime.InteropServices.Marshal]::SecureStringToBSTR($Credential.Password)
$pwd=[Runtime.InteropServices.Marshal]::PtrToStringAuto($Ptr)
# Notwendige Anmeldeinformationen zusammensetzen
$LoginInfo=@{
‚grant_type‘ = ‚password‘
‚client_id‘ = „e4a9949fcfa04068f59abb5a658f2bac0a3428e4652315490b659d5ab3f35a9e“
‚client_secret‘ = „c75f14bbadc8bee3a7594412c31416f8300256d7668ea7e6e7f06727bfb9d220“
‚email‘ = $Credential.UserName
‚password‘ = $pwd
}
Dann können Sie die Verbindung unter Angabe der Anmeldeinfos herstellen:
$Connect = Invoke-RestMethod -Uri „https://owner-api.teslamotors.com/oauth/token“ -Method Post -Body $LoginInfo
Als Rückgabewert erhalten Sie dann einen Zugriffsschlüssel (Token) mit dem alle weiteren Aktionen durchgeführt werden können:
$Token=$Connect.access_token
Hier noch ein paar allgemeine, notwendige http Header Informationen zusammen schrauben:
$Header=@{
„Authorization“=“Bearer $Token“
„Accept-Encoding“=“gzip,deflate“
}
Gehen wir mal davon aus, Sie haben nur einen Tesla, dann finden Sie mit dem nachfolgenden Kommando in $car allgemeine Informationen zu Ihrem Fahrzeug wie Farbe, Name u.v.a.m.
$car = (Invoke-RestMethod -Uri „https://owner-api.teslamotors.com/api/1/vehicles“ -Method Get -Headers $Header).response
Falls Ihr Dornröschen noch schläft, müssen Sie es erst mal wach küssen:
if ($car.state -ne „online“) {Invoke-RestMethod -Uri „https://owner-api.teslamotors.com/api/1/vehicles/$($car.id)/wake_up“ -Method Post -Headers $Header}
Jetzt können Sie Ihren Liebling mal etwas genauer untersuchen, wie z.B. die eingestellten Einheiten (gui_settings) abfragen:
(Invoke-RestMethod -Uri „https://owner-api.teslamotors.com/api/1/vehicles/$($car.id)/data_request/gui_settings“ -Method Get -Headers $Header).response
Den Teil gui_settings können Sie gegen die folgenden Begriffe austauschen:
charge_state = Zeigt den Akkustatus an
climate_state = Klima Anlage
drive_state = GPS Infos
vehicle_state = Zustandsinformationen: km-Stand, Schiebedach auf? etc…
Sie dürfen natürlich auch gerne Einstellungen vornehmen (z.B. hupen):
Invoke-RestMethod -Uri „https://owner-api.teslamotors.com/api/1/vehicles/$($car.id)/command/honk_horn“ -Method Post -Headers $Header
Auch hier gibt’s wieder einen ganzen Sack voll weiterer Begriffe, die Sie gegen honk_horn austauschen können:
flash_lights = Lichthupe
charge_port_door_open = Ladeanschluß öffnen
charge_standard = Ladelimit auf Standard setzen
charge_max_range = Ladelimit auf max. Reichweite (100%) setzen
set_charge_limit?percent=75 = Ladelimit beliebig einstellen
charge_start und charge_stop = Ladevorgang starten bzw. beenden
door_lock und door_unlock = Türen auf bzw. zu
set_temps?driver_temp=23.7&passenger_temp=18.1 = wie warm soll’s darf’s denn sein?
auto_conditioning_start und auto_conditioning_stop = Klima an bzw. aus
sun_roof_control?state=open&percent=50 = Schiebedach steuern
remote_start_drive?password=StrengGeheim = Kennwort für den Start ohne Schlüssel im Fahrzeug festlegen. Verfällt nach 2 Minuten, wenn das Fahrzeug nicht bis dahin gestartet wird.
In PowerShell Remote-Session auf UNC Netzwerkpfade zugreifen
Hat man Windows Remoting konfiguriert und Enter-PSSession als auch Invoke-Command klappen problemlos, fängt man an diese tollen Möglichkeiten rege zu nutzen. Ab und an will man dann aber vielleicht auch einmal aus so einer Remote-Session heraus auf einen Netzwerkpfad in Form von \\Servername\Freigabename zugreifen und man bekommt immer so nette Fehlermeldungen wie:
Get-ChildItem : Cannot find path ‚\\Servername\Freigabename‘ because it does not exist.
+ CategoryInfo : ObjectNotFound: (\\Servername\Freigabename:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
Doch der Server ist online und wenn Sie am entfernten Computer lokal angemeldet versuchen darauf zuzugreifen ist alles fein. Was läuft hier schief? Das ist wieder einmal so ein „Sicherheitsfeature“.
Der Quick and Dirty Way ist einfach mit:
net use n: \\Servername\Freigabename
eine Netzlaufwerksverbindung herzustellen (tolle Sicherheit). New-PSDrive und andere Experimente können Sie sich sparen…habe ich alles schon ausprobiert. N: können Sie dann ganz normal ansprechen. Nun der offizielle Weg:
Mittels Gruppenrichtlinien müssen Sie unter Computer Configuration\Policies\Administrative Templates\Windows Components\Windows Remote Management (WINRM) bei den Unterpunkten WINRM Client als auch WINRM Service „Allow CredSSP authentication“ aktivieren. Des Weiteren müssen Sie unter Computer Configuration\Policies\Administrative Templates\System\Credentials Delegation die beiden Einträge Allow Delegating Fresh Credentials und noch einmal der Eintrag mit Allow Delegating Fresh Credentials with NTLM-only Server Authentication mit so einem Eintrag schmücken:
wsman/NameDesRechnersAufDenSieSichRemoteDraufSchaltenMöchten
Diese Policy muss an eine OU gehängt werden welche die Computer enthalten von denen aus Sie Enter-PSSession bzw. Invoke-Command ausführen möchten.
Haben Sie keine GPOs (z.B. weil kein AD) dann geht es auch in der PowerShell auf den einzelnen Systemen (aber nicht remote 😉 ) mit:
Enable-WSManCredSSP –Role Server
und
Enable-WSManCredSSP –Role Client -DelegateComputer NameDesServers
Um sich dann mit dem Server zu verbinden, müssen Sie die zusätzlichen Schalter -cred und -auth mit angeben. Zuvor sollten Sie sich allerdings die Anmeldeinformationen in einer Variablen hinterlegen, z.B. so:
$cred=get-credential
Dann können Sie Ihr eigentliches Enter-PSSession in dieser Form ausführen:
Enter-PSSession Remoteserver -cred $cred -auth credssp
Verrückte Welt! Ich nehme net use 😉
mRemote – Plattformunabhängiger Open Source Client für Remotezugriff
mRemote ist eine OpenSource Client für Plattform unabhängigen Remotezugriff. Er unterstützt folgende Protokolle und hat viele Konfigurationsmöglichkeiten:
- RDP (Remote Desktop)
- VNC (Virtual Network Computing)
- ICA (Independent Computing Architecture)
- SSH (Secure Shell)
- Telnet (TELecommunication NETwork)
- HTTP/S (Hypertext Transfer Protocol)
- Rlogin (Rlogin)
- RAW
Für Fernhilfe eigent sich nach wie vor TeamViewer, aber auch AnyDesk ist sehr empfehlenswert.
Teamviewer
Teamviewer ermöglicht das Fernsteuern von PCs auch plattformunabhängig über NAT-Grenzen hinweg.