Torque Pro / ODB2 Auto logging

Hallo,

ich habe mir testweise ein Modul für die Torque Pro App von Ian Hawkins erstellt (getestet unter Android: https://play.google.com/store/apps/details?id=org.prowl.torque&hl=de mit ELM327 BT Modul).

Repo: https://github.com/virusmoere/IPS_TorquePro

Es muss eine I/O-Instanz vom Typ „TorqueProHook“ erstellt werden, welches einen Hook auf „/hook/torque“ registriert. Die Hook-URL muss in der App unter Webserver URL eingegeben werden (es funktioniert scheinbar nur HTTP bzw. Port 80). Die akzeptierten IDs können in den Einstellungen der Instanz angepasst werden. Die I/O-Instanz leitet die Anfragen an die zuständigen Instanzen weiter.

Für jede neue TorqueID wird automatisch eine „TorqueProApp“ Instanz erstellt. Hier gibt zusätzlich die Möglichkeit alle anfallenden Werte zusätzlich an einen anderen Webserver zu übermitteln (z.B. den offiziellen Logserver).

Beim anlegen der TorqueProApp Instanz wird einmalig eine vordefinierte Liste (Key-Value) in dem Script „Torque Keys“ hinterlegt, die nach Herzenslust bearbeitet werden kann. Es werden nur Werte geloggt, die durch diese Keys bekannt gemacht werden.

Zum loggen von Sessions habe ich zur Zeit noch keine Idee wie ich das mit Bordmitteln (ohne ext. DB) realisieren kann.

Wie immer: Bitte habt Nachsicht bei der Codequalität. Ich bin kein Programmierer :smiley:

Gruß

Bilder:

torquehook_settings.png

Moin… erstmal danke für das Modul. Kurze Frage dazu… welchen ODB Adapter hast du dir zugelegt?

Ich verwende den EXZA® HHOBD mit Bluetooth in einem Ford Fiesta JD3 (2006).

Gruß

Hänge doch an den Hook die InstanzID. Dann kannst du mehrere Instanzen anlegen und die Kategorie entsorgen.
Michael

Jede App hat eine eigene ID, deswegen ist ein Hook eigentlich ausreichend. Diese wird bei jedem Aufruf mit übergeben (als md5 Hash --> Kategorie).

Gibt es eigentlich einen charmanteren Weg Hooks per Modul zu registrieren? Ich habe paresy’s geofency Modul als Referenz benutzt.

Nur das ‚nur eine Instanz‘ und dann mehrere Kategorien aber nicht so sein sollte.
Alle andere Geräte in IPS funktionieren anders :wink:
Und Kategorien kann man noch immer nicht unterhalb Instanzen visualisieren.
Nein aktuell ist das so wie paresy das auch macht der sinnvollste Weg mit den Webhooks.
Irgendwann gibt es da vielleicht mal was anderes…
Michael

Vorschlag:

Es werden Dummy-Instanzen anstelle der Kategorien erstellt. Die Dummy-Instanz wird umbenannt, sobald Torque einmal den profileName übermittelt. Dies ist dann analog zu dem Geofency-Modul mit dem Unterschied, dass mein Modul nicht als Kerninstanz registriert wird (Vor- und Nachteile?).

Gruß

eigentlich hatte ich mich darauf bezogen:

Weil so wäre das eine Lösung für das ‚nur ein Webhook‘ Problem :smiley:

Das eine Dummy-Instanz so überhaupt nichts in einer PHP-Instanz zu suchen hat…ich halt lieber die Klappe :rolleyes:

Michael

So ich hoffe nun passt es, außerdem gleich was dazugelernt :wink: GitHub - virusmoere/IPS_TorquePro: TorquePro Module for IPS

Danke für die konstruktive Kritik!

Ok… das ist ja nun die Premium-Lösung mit Datenaustausch , wie geil :smiley:
Da wäre ich jetzt wirklich mal faul gewesen und hätte einfach jeder Instanz seinen eigenen Hook registrieren lassen.
Aber so ist da ja noch zehnmal besser gelöst, Respekt !

Michael

Nicht kleckern, sondern klotzen :smiley:

Weiß das jemand von euch: Kann ich das auch mit einer iOS-App nutzen? In der iOS Torque Pro sehe ich keine Einstellungen zur Hook-URL.

Ich habe leider nur Android Geräte zur Verfügung. Ob die iOS Apps das gleichermaßen unterstützen kann ich dir nicht beantworten.

Ich habe ein kleines programmiertechnisches Problem…

Manchmal werden die HTTP-Requests nicht in der richtigen Reihenfolge abgearbeitet. Dies hat teilweise gravierende Auswirkungen auf z.B. Zählervariablen (Laufleistung). Der Datenfluss ist ja wie folgt:


HTTP-GET Request --> Hook-Instanz --> new Torque-App-Instanz() [--> Request Forwarding]
                                  └-> new Torque-App-Instanz() [--> Request Forwarding]
                                  └-> ...

Hat jemand eine Idee wie man das synchronisieren könnte (Semaphore?)? Man müsste nur aufpassen, dass nicht zu viele Threads aufgemacht werden (aka Thread-Limit). Das übersteigt leider etwas meine Kenntnisse. Der UNIX-Timestamp des Requests könnte zum sortieren genutzt werden. Auf die schnelle fällt mir nur die Zuhilfenahme einer MySQL-Tabelle ein…

Danke und Gruß

Ich muss so blöd fragen, weil ich die App ja nicht nutze :slight_smile:

Wieso ist denn Zeitproblem?
Wo ist das Problem denn genau?
Gibt es keine Identifizierung der Geräte (Apps / Endgeräte)?
Oder woran machst du aktuell die Zuordnung HTTP-Request -> Gerät fest ?
Michael

Edit: Gerad mal etwas im Code gestöbert… das hier solltest du lassen : ‚// create TorqueProApp Instance for new ID‘ es ist unüblich das IPS-Instanzen automatisch neue Instanzen anlegen ohne das der User darauf Einfluss hat.
Und die $data[‚id‘] solltest du in die Settings der Geräte aufnehmen und nicht als Ident für Instanzen nutzen. So kann ein User nie mal die ID in der Instanz ändern.

Normalerweise kommen in einem konfigurierbaren Intervall (bei mir 1sek, bis zu 1/4sek zyklisch oder direkt bei Anfallen von Sensordaten möglich --> synchron) HTTP-GET Requests von der App an der Hook-Instanz an, die dann an die Child-Instanzen weiterer gereicht werden. Soweit so gut…

Habe ich nun auf meinem Handy für eine Zeit kein Netz (z.B. Tunnelfahrt) cached die App die Anfragen und übermittelt beim wiederherstellen der Verbindung alle in der Zeit angefallenen Requests in einem Rutsch. In diesem Fall wird von jedem Request der weitergeleitet wird eine neue Instanz der Klasse TorqueProApp (aka neuer Thread in IPS) erstellt, welche sich dann um die Abarbeitung kümmert und inkl. cURL (gerade bei SSL…) im besten Fall einige millisekunden braucht um den Request abzuarbeiten. Somit laufen im schlimmsten Fall mehrere Threads parallel und es kommt mit recht hoher Wahrscheinlichkeit zu race conditions. Dies ist gerade bei Zähler Variablen fatal, da mal höhere, mal niedrigere Werte zuerst geschrieben werden können.

Was mir als schnelle Lösung einfallen würde ist die Frequenz der Requests am Hook künstlich auf z.B. 1 Request/s zu drosseln, wobei ich auch hier nicht weiß wie ich das machen soll. Hier wird ja auch bei jedem Request eine neue Instanz der Klasse TorqueProHook erstellt…

Auszug aus dem Log bzgl. „Nachschießen“ der ungesendeten Requests:


12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:20:59 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:21:00 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:21:00 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:21:00 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:21:00 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:21:00 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:21:00 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:21:00 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:21:00 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:21:00 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:21:00 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:21:00 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:21:00 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:21:00 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:21:00 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:21:00 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:21:00 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:21:00 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:21:00 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:21:00 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:21:00 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:21:00 | 00000 | CUSTOM  | TorqueProHook        | Sending data to childs...
12:21:00 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:21:00 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:21:00 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:21:00 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook
12:21:00 | 00000 | CUSTOM  | TorqueProApp 29759   | Processing data from TorqueProHook

Edit: Gerad mal etwas im Code gestöbert… das hier solltest du lassen : ‚// create TorqueProApp Instance for new ID‘ es ist unüblich das IPS-Instanzen automatisch neue Instanzen anlegen ohne das der User darauf Einfluss hat.
Und die $data[‚id‘] solltest du in die Settings der Geräte aufnehmen und nicht als Ident für Instanzen nutzen. So kann ein User nie mal die ID in der Instanz ändern.

Naja das liegt in der Natur der Sache. Die Torque-ID ist statisch und kann vom Benutzer nicht angepasst werden. Die akzeptierten IDs können im Hook konfiguriert werden. Kann ich aber noch konfigurierbar machen, auch wenn es das für den Endbenutzer komplizierter machen würde.

Danke und Gruß

Hm, stell mich wohl zu blöd an. :smiley:

Ich arbeite mit dynamischem DNS, sagen wir „meine.de“. In der Fritzbox leite ich Port 88 auf Port 80 meines IPS-Rechners um. Also trage ich in Torque folgende Adresse ein: http://meine.de:88/hook/torque

Wo liegt der Fehler?

Dank und Grüße
galleto

Hallo,

mit „es funktioniert scheinbar nur HTTP“ meine ich Port 80. Habe es im ersten Post angepasst.

Danke, aber auch mit „http://meine.de/hook/torque“ und einer Fritzbox-Weiterleitung von Port 80 auf den IPS-Server Port 80 klappt es nicht. Fehler „Connection refused“. Firewall ist aus, sonst passiert gar nix und der Test läuft ewig.

Es wäre bei meinen bescheidenen Fähigkeiten gut möglich, dass ich etwas grundlegend falsch mache. Aber was?

In IPS habe ich eine I/O-Instanz TorqueProHook mit einer Hook.php darunter und eine normale Instanz TorqueProApp mit einer „Torque Keys.php“ darunter. Außerdem ist in der Kerninstanz WebHook „hook/torque“ hinterlegt. Geändert hab ich nix.

Grüße
el galleto

Hallo,

bei mir versucht der „Test“ nicht einmal die Webseite zu erreichen. Wirklich testen kann man es mMn nur, wenn man die Aufnahme startet.

Gruß