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
Nur das ‚nur eine Instanz‘ und dann mehrere Kategorien aber nicht so sein sollte.
Alle andere Geräte in IPS funktionieren anders
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
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?).
Ok… das ist ja nun die Premium-Lösung mit Datenaustausch , wie geil
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 !
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…
Ich muss so blöd fragen, weil ich die App ja nicht nutze
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.
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
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.