[Software] TeslaPSTN: API via Telefoneinwahl Festnetz/SIP

Technische Informationen zum Model S...

[Software] TeslaPSTN: API via Telefoneinwahl Festnetz/SIP

von univ » 1. Okt 2019, 20:33

Hallo TFF,

ich präsentiere euch TeslaPSTN: eine "Software", um die Tesla-API mithilfe der kostenlosen Open Source Telefonanlage Asterisk anzusteuern. "Software" in Anführungszeichen weil es sich nur um ein einzelnes Shell-Script (Bash) handelt und ich kein Programmierer bin, höchstens ein Scripter, falls es den Begriff gibt. ;-)

Wozu diese Software?

Ich vermiete ein Tesla Model S über Turo.com, und das seit kurzem im "self-service", d.h. bei Vermietung und Rückgabe bin ich nicht anwesend, sondern der Mieter bekommt die App-Zugangsdaten übermittelt und kann mithilfe der Tesla-App das Auto aufschliessen und zuschliessen. Der Fahrzeugschlüssel befindet sich dann im Handschuhfach.

Als sich herausstellte dass mehr Mieter aus dem Ausland kommen als aus Deutschland, habe ich überlegt, wie man den Entleih-via-App-Prozess optimieren kann. Moegliche Probleme: Was ist, wenn der Mieter gar kein Smartphone hat. Vielleicht kann er nur telefonieren, und hat keinen mobilen Datentarif. Oder er spielt schon am Vortag in der App rum und öffnet den Frunk, und das Auto steht dann die ganze Nacht mit offenem Frunk am Straßenrand. Über die App gibt's quasi nur Vollzugriff: Ganz oder gar nicht.

TeslaPSTN löst diese Probleme, indem der User eine Festnetz-Telefonnummer anwählt, sich per PIN-Code autorisiert, und dann nur die App- bzw. API-Funktionen ausführen kann, die ich eingestellt habe. Z.B. nur Türen aufschliessen, Türen zuschliessen. Quasi ein simples Entleih-System wie z.B. bei Call-A-Bike von der Deutschen Bahn, das ging früher auch per Telefon.

Weitere Möglichkeiten: Wenn man beispielsweise einem Familienmitglied nur Zugriff auf bestimmte Funktionen geben möchte, oder wenn man sich irgendwo aufhält, wo man keinen Internet-Zugang auf dem Handy hat, und trotzdem seinen Tesla abfragen/ansteuern möchte.

Die Asterisk-Telefonanlage lässt sich nicht nur über Festnetz (Wiki: PSTN) ansteuern, sondern über viele verschiedene Kommunikationswege, natürlich auch SIP. Somit könnte man per Voice-over-IP mit seinem Tesla kommunizieren. Wozu das gut sein soll - keine Ahnung - aber vielleicht fällt jemandem ja ein Anwendungsfall ein. :-)

Was braucht man:

- Einen Rechner mit Linux, BSD oder irgendeinem anderen Betriebssystem wo die "Bash" Shell vorhanden ist
- Asterisk
- curl
- jq
... und TeslaPSTN: https://sourceforge.net/projects/TeslaPSTN

Nachfolgend könnt ihr eine Demo testen, bei der ihr den SoC und die typische Reichweite von meinem privaten Tesla abfragen könnt.

Einwahlnummern Deutschland, Österreich und Schweiz (Festnetz):

D: 06083-8734444

A: 0720-022022

CH: 044-5511111


Andere Länder: +49 6083 8734444

PIN-Code: 445566

Und dann die 1 drücken, wenn das System nach einem Kommando fragt.

Gruss
Markus

PS: Stand heute sind nur wenige API-Kommandos implementiert: flash, honk, unlock, lock, getsoc, gettypical. Bitte bei Bedarf melden, dann baue ich die gewünschten Kommandos ein. (Könnt ihr mit ein paar Zeilen einfügen aber auch selbst machen)
Zuletzt geändert von univ am 2. Okt 2019, 01:29, insgesamt 1-mal geändert.
S 85D, Deep Blue, 19"/Pano/AP1/Prem/Air/UHF/Winter seit 08/2015: 465.000 km (univ)
S 85, Dark Blue, 19"/AP1/Tech (CPO EZ 12/2014 103k km) seit 07/2019: 47.000 km (univ's Familie)
smart ED 22kW (CPO EZ 12/2013 49k km) seit 01/2018 (univ's Frau)
Benutzeravatar
Trusted User
Trusted User
 
Beiträge: 2328
Registriert: 19. Mai 2015, 22:00
Wohnort: im tiefsten Taunus
Land: Deutschland

Re: [Software] TeslaPSTN: API via Telefoneinwahl steuern

von Helmilectric » 1. Okt 2019, 20:39

Ich brauch es nicht, aber ich finde die Idee großartig. Tolles Projekt! Glückwunsch!
» Logbuch Elektromobilität: helmilectric.com

Twitter | Instagram | Tesla-Ref
Benutzeravatar
 
Beiträge: 852
Registriert: 19. Mai 2019, 10:25
Wohnort: 86 Raum Augsburg
Land: Deutschland

Re: [Software] TeslaPSTN: API via Telefoneinwahl steuern

von MaxBlue » 1. Okt 2019, 20:56

Das hört sich gerade super interessant an! Ich arbeite beruflich in dem Bereich und komme aus der Nachrichtentechnik. Wir errichten und betreuen Asterisk-basierte PBX-Systeme. Unsere Systeme bieten eine offene Modul-Schnittstelle und lassen sich darüber an viele verschiedene Lösungen anderer Anbieter (z.B. ERP) anbinden. Es existieren bereits eine Vielzahl an Modulen auf dem Markt. Es wäre interessant, ob man mit den Möglichkeiten unserer Module in Verbindung mit deinen Scripten eine Anbindung an das Fahrzeug OOTB umsetzen könnte. So ganz genau weiß ich noch nicht wie man das sinnvoll einsetzen könnte, aber die Ideen entwickeln sich ja häufig während der Umsetzung und einen Spaßfaktor hat es auf jeden Fall.

Ggf. melde ich mich per PN bei dir um hier nicht die Leute mit technischen Details zu langweilen.
Model 3SR+ Pearl White, schwarz, 18" Aero, AP noFSD , VIN: KF37xxxx
Model 3P Midnight Silver, schwarz, 20", AP noFSD, VIN: LF57xxxx

1500km free Supercharging: https://ts.la/martin28485
Benutzeravatar
 
Beiträge: 286
Registriert: 5. Aug 2019, 08:29
Wohnort: Niedersachsen
Land: Deutschland
Fahrzeug: Tesla Model 3

Re: [Software] TeslaPSTN: API via Telefoneinwahl steuern

von cko » 1. Okt 2019, 21:03

Ich werde gern mit technischen Details gelangweilt.
Tesla fahren ist wie schweben auf einem Sonnenstrahl.
Benutzeravatar
Trusted User
Trusted User
 
Beiträge: 2309
Registriert: 10. Nov 2015, 16:34
Wohnort: zwischen HH und HB
Land: Deutschland
Fahrzeug: Tesla Model S

Re: [Software] TeslaPSTN: API via Telefoneinwahl Festnetz/SI

von univ » 2. Okt 2019, 10:47

MaxBlue: Ja klar, kannst mich bei Bedarf ruhig per PN anschreiben.
S 85D, Deep Blue, 19"/Pano/AP1/Prem/Air/UHF/Winter seit 08/2015: 465.000 km (univ)
S 85, Dark Blue, 19"/AP1/Tech (CPO EZ 12/2014 103k km) seit 07/2019: 47.000 km (univ's Familie)
smart ED 22kW (CPO EZ 12/2013 49k km) seit 01/2018 (univ's Frau)
Benutzeravatar
Trusted User
Trusted User
 
Beiträge: 2328
Registriert: 19. Mai 2015, 22:00
Wohnort: im tiefsten Taunus
Land: Deutschland

Re: [Software] TeslaPSTN: API via Telefoneinwahl Festnetz/SI

von univ » 3. Okt 2019, 12:50

Hier ein Asterisk-Dialplan auf Deutsch und Englisch für das Zu- und Aufschliessen. Mit PIN-Code-Abfrage für die Vermietung z.B. via Turo. Die Ansagen werden über die inoffizielle Google Translate-API mit folgendem AGI-Script dynamisch erzeugt: https://zaf.github.io/asterisk-googletts

Eine minimale Änderung ist erforderlich:

Code: Alles auswählen
diff googletts.agi googletts.orig.agi

266c266,268
<               print "SET VARIABLE KEYPRESS ", chr($response[0]), "\n";
---
>               print "SET EXTENSION ", chr($response[0]), "\n";
>               checkresponse();
>               print "SET PRIORITY 1\n";

Dialplan (/etc/asterisk/extensions.conf):

Code: Alles auswählen
exten => _X.,1,Answer
exten => _X.,n(start),NoOp
exten => _X.,n,AGI(googletts.agi,"Welcome to the Tesla rental system. Please press 1 for English or 2 for German.",en,any)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "1"]?english)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "2"]?german)
exten => _X.,n,AGI(googletts.agi,"Willkommen im Tesla Mietsystem. Bitte druecken Sie 1 fuer Englisch oder 2 fuer Deutsch.",de,any)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "1"]?english)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "2"]?german:start)


exten => _X.,n(english),NoOp
exten => _X.,n,Set(KEYPRESS=)
exten => _X.,n,AGI(googletts.agi,"Thank you.",en)

exten => _X.,n(englishAgain),NoOp
exten => _X.,n,AGI(googletts.agi,"Please enter your PIN code after the beep.",en)
exten => _X.,n,Read(PIN,/var/lib/asterisk/sounds/en/beep,6,,,8)
exten => _X.,n,GotoIf($["${PIN}" = ""]?englishAgain:englishCheck)

exten => _X.,n(englishCheck),NoOp
exten => _X.,n,AGI(TeslaPSTN/TeslaPSTN.sh,checkpin,${PIN})
exten => _X.,n,GotoIf($["${CHECKPIN}" = "success"]?englishAuthOK:englishAuthIncorrect)

exten => _X.,n(englishAuthIncorrect),NoOp
exten => _X.,n,AGI(googletts.agi,"You entered",en)
exten => _X.,n,SayDigits(${PIN})
exten => _X.,n,AGI(googletts.agi,"That PIN is not valid. Please try again and enter your PIN code after the beep.",en)
exten => _X.,n,Read(PIN,/var/lib/asterisk/sounds/en/beep,6,,,8)
exten => _X.,n,GotoIf($["${PIN}" = ""]?englishAgain:englishCheck)

exten => _X.,n(englishAuthOK),NoOp
exten => _X.,n,AGI(googletts.agi,"Authorization successful.",en)
exten => _X.,n(englishMenu),NoOp
exten => _X.,n,Set(KEYPRESS=)
exten => _X.,n,AGI(googletts.agi,"Please press 1 to unlock the car or 2 to lock the car.",en,any)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "1"]?englishUnlock)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "2"]?englishLock)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "3"]?englishMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "4"]?englishMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "5"]?englishMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "6"]?englishMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "7"]?englishMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "8"]?englishMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "9"]?englishMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "0"]?englishMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "*"]?englishMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "#"]?englishMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = ""]?englishMenu)

exten => _X.,n(englishUnlock),NoOp
exten => _X.,n,AGI(googletts.agi,"Thank you. One moment please. I am trying to unlock the car.",en)

exten => _X.,n(englishRetryUnlock),NoOp
exten => _X.,n,AGI(TeslaPSTN/TeslaPSTN.sh,5YJSA6H17EF111111,unlock)
exten => _X.,n,GotoIf($["${CMD}" = "success"]?englishUnlockSuccess:englishUnlockFailed)

exten => _X.,n(englishUnlockSuccess),NoOp
exten => _X.,n,AGI(googletts.agi,"Unlocking the car was successful. Enjoy your ride. Returning you to the menu now.",en)
exten => _X.,n,Goto(englishMenu)

exten => _X.,n(englishUnlockFailed),NoOp
exten => _X.,n,AGI(googletts.agi,"Please hold on, I am still trying to unlock the car.",en)
exten => _X.,n,Wait(5)
exten => _X.,n,Goto(englishRetryUnlock)

exten => _X.,n(englishLock),NoOp
exten => _X.,n,AGI(googletts.agi,"Thank you. One moment please. I am trying to lock the car.",en)

exten => _X.,n(englishRetryLock),NoOp
exten => _X.,n,AGI(TeslaPSTN/TeslaPSTN.sh,5YJSA6H17EF111111,lock)
exten => _X.,n,GotoIf($["${CMD}" = "success"]?englishLockSuccess:englishLockFailed)

exten => _X.,n(englishLockSuccess),NoOp
exten => _X.,n,AGI(googletts.agi,"Locking the car was successful. I hope you had a good ride. Returning you to the menu now.",en)
exten => _X.,n,Goto(englishMenu)

exten => _X.,n(englishLockFailed),NoOp
exten => _X.,n,AGI(googletts.agi,"Please hold on, I am still trying to lock the car.",en)
exten => _X.,n,Wait(5)
exten => _X.,n,Goto(englishRetryLock)


exten => _X.,n(german),NoOp
exten => _X.,n,Set(KEYPRESS=)
exten => _X.,n,AGI(googletts.agi,"Danke.",de)

exten => _X.,n(germanAgain),NoOp
exten => _X.,n,AGI(googletts.agi,"Bitte geben Sie nach dem Piepton Ihren PIN-Code ein.",de)
exten => _X.,n,Read(PIN,/var/lib/asterisk/sounds/en/beep,6,,,8)
exten => _X.,n,GotoIf($["${PIN}" = ""]?germanAgain:germanCheck)

exten => _X.,n(germanCheck),NoOp
exten => _X.,n,AGI(TeslaPSTN/TeslaPSTN.sh,checkpin,${PIN})
exten => _X.,n,GotoIf($["${CHECKPIN}" = "success"]?germanAuthOK:germanAuthIncorrect)

exten => _X.,n(germanAuthIncorrect),NoOp
exten => _X.,n,AGI(googletts.agi,"Sie haben den folgenden PIN-Code eingegeben",de)
exten => _X.,n,Set(CHANNEL(language)=de)
exten => _X.,n,SayDigits(${PIN})
exten => _X.,n,AGI(googletts.agi,"Dieser PIN-Code ist ungueltig. Bitte versuchen Sie es nach dem Piepton erneut.",de)
exten => _X.,n,Read(PIN,/var/lib/asterisk/sounds/en/beep,6,,,8)
exten => _X.,n,GotoIf($["${PIN}" = ""]?germanAgain:germanCheck)

exten => _X.,n(germanAuthOK),NoOp
exten => _X.,n,AGI(googletts.agi,"Autorisierung erfolgreich.",de)
exten => _X.,n(germanMenu),NoOp
exten => _X.,n,Set(KEYPRESS=)
exten => _X.,n,AGI(googletts.agi,"Druecken Sie die 1 um das Auto aufzuschliessen oder die 2 um das Auto abzuschliessen.",de,any)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "1"]?germanUnlock)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "2"]?germanLock)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "3"]?germanMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "4"]?germanMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "5"]?germanMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "6"]?germanMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "7"]?germanMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "8"]?germanMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "9"]?germanMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "0"]?germanMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "*"]?germanMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = "#"]?germanMenu)
exten => _X.,n,GotoIf($["${KEYPRESS}" = ""]?germanMenu)

exten => _X.,n(germanUnlock),NoOp
exten => _X.,n,AGI(googletts.agi,"Danke. Einen Moment bitte. Ich versuche das Auto aufzuschliessen.",de)

exten => _X.,n(germanRetryUnlock),NoOp
exten => _X.,n,AGI(TeslaPSTN/TeslaPSTN.sh,5YJSA6H17EF111111,unlock)
exten => _X.,n,GotoIf($["${CMD}" = "success"]?germanUnlockSuccess:germanUnlockFailed)

exten => _X.,n(germanUnlockSuccess),NoOp
exten => _X.,n,AGI(googletts.agi,"Ich konnte das Auto erfolgreich aufschliessen. Ich wuensche Ihnen eine gute Fahrt. Ich bringe Sie zurueck ins Hauptmenue.",de)
exten => _X.,n,Goto(germanMenu)

exten => _X.,n(germanUnlockFailed),NoOp
exten => _X.,n,AGI(googletts.agi,"Bitte noch einen Moment Geduld, ich versuche immer noch das Auto aufzuschliessen.",de)
exten => _X.,n,Wait(5)
exten => _X.,n,Goto(germanRetryUnlock)

exten => _X.,n(germanLock),NoOp
exten => _X.,n,AGI(googletts.agi,"Danke. Einen Moment bitte. Ich versuche das Auto abzuschliessen.",de)

exten => _X.,n(germanRetryLock),NoOp
exten => _X.,n,AGI(TeslaPSTN/TeslaPSTN.sh,5YJSA6H17EF111111,lock)
exten => _X.,n,GotoIf($["${CMD}" = "success"]?germanLockSuccess:germanLockFailed)

exten => _X.,n(germanLockSuccess),NoOp
exten => _X.,n,AGI(googletts.agi,"Ich konnte das Auto erfolgreich abschliessen. Ich hoffe Sie hatten eine gute Fahrt. Ich bringe Sie zurueck ins Hauptmenue.",de)
exten => _X.,n,Goto(germanMenu)

exten => _X.,n(germanLockFailed),NoOp
exten => _X.,n,AGI(googletts.agi,"Bitte noch einen Moment Geduld, ich versuche immer noch das Auto abzuschliessen.",de)
exten => _X.,n,Wait(5)
exten => _X.,n,Goto(germanRetryLock)
S 85D, Deep Blue, 19"/Pano/AP1/Prem/Air/UHF/Winter seit 08/2015: 465.000 km (univ)
S 85, Dark Blue, 19"/AP1/Tech (CPO EZ 12/2014 103k km) seit 07/2019: 47.000 km (univ's Familie)
smart ED 22kW (CPO EZ 12/2013 49k km) seit 01/2018 (univ's Frau)
Benutzeravatar
Trusted User
Trusted User
 
Beiträge: 2328
Registriert: 19. Mai 2015, 22:00
Wohnort: im tiefsten Taunus
Land: Deutschland


Wer ist online?
Mitglieder in diesem Forum: damanu, Kuba, lero, sbob2000, schueppi und 6 Gäste