Hook auswerten

Ich bastle gerade an etwas neuem. Ich habe ein ESP32 Projekt gefunden, welches daten über http schickt. In IPS habe ich einen Hook eingerichtet und auch den Sourcode soweit geändert, dass die URL auf IPS angepasst ist. Ursprünglich ist es für ioBroker gemacht worden.

Der Hook wird aufgerufen, soweit funktioniert das.

die URL die der ESP verwendet sieht in etwa so aus

http://192.168.32.35:3777/hook/topolino/0_userdata.0.topolino.LastLogEntry?user=fiat&pass=topolino&value=WIFI%20Connected!%20IP%3A%20192.168.32.110&ack=true

Wie bekomme ich alles hinter /topolino/ bzw den teil zwischen dem letzten / und dem ?. Das ist wichtig. Die andren Paremeter bekomme ich mit $_GET. Aber den vorderen Teil benötige ich, damit ich weiß, welche Daten geschickt worden sind.

Siehe Doku Systemvariablen
image

Michael

Mit

echo $_SERVER[‚REQUEST_URI‘]

bekomme ich das

/hook/topolino/0_userdata.0.topolino.LastLogEntry

Damit könnte ich arbeiten

Andererseits wäre es toll das in etwa so zu haben wie bei MQTT. Dass IPS das alles selber anlegt.

Vom 0_userdata.0.topolino.LastLogEntry gibt es mehrere mit unterschiedlichen Werten.

iobroker object value
0_userdata.0.topolino.12VBatt Voltage of the 12V Battery system
0_userdata.0.topolino.BattA Drive battery currently consumed ampers
0_userdata.0.topolino.BattTemp1 Drive battery temperature sensor 1
0_userdata.0.topolino.BattTemp2 Drive battery temperature sensor 2
0_userdata.0.topolino.BattV Drive battery coltage
0_userdata.0.topolino.Handbreak Manual handbreaks set/ not set
0_userdata.0.topolino.ODB Total driven kilometers
0_userdata.0.topolino.OnBoardChargerRemaining Remaining minutes until charging is finished
0_userdata.0.topolino.Ready drive ready state
0_userdata.0.topolino.RemainingKM propossed kilometers left in drive battery
0_userdata.0.topolino.SoC State of Charge - drive battery in percent
0_userdata.0.topolino.gear selected gear
0_userdata.0.topolino.speed current speed

Gäbe es da eine Automatik?

Mit HOOK bekomme ich /hook/topolino.

Stimmt hast recht, das ist nur der konfigurierte Hook.
Das hier ist korrekt.

Wie… oder eher was anlegt?
Du musst in deinem Skript schon selber alles zu Fuß machen.

$SubUri = substr($_SERVER['REQUEST_URI'], strlen($_SERVER['HOOK']));

Liefert dir dann z.B. /0_userdata.0.topolino.LastLogEntry
Michael

Ich kenn das nur von MQTT. Man hat ein Topic und wenn das ein Json String ist, werden die Variablen automatisch angelegt.

Ähnlich ist es hier, aber halt mit URL’s. Ich glaube nicht, dass ich das ganze auf MQTT umbauen kann. Andererseits funktioniert das mit der URL und Webhook ja theoretisch.

Die URL’s sehen in etwa so aus

 DataURLEncoded += "&0_userdata.0.topolino.charge.dauer=" + String((thisCharge.endTime - thisCharge.startTime) / 1000 / 60);
  DataURLEncoded += "&0_userdata.0.topolino.charge.ladung=" + String((thisCharge.endSoC - thisCharge.startSoC) * 0.06, 1);
  DataURLEncoded += "&0_userdata.0.topolino.charge.startSoC=" + String(thisCharge.startSoC);
  DataURLEncoded += "&0_userdata.0.topolino.charge.endSoC=" + String(thisCharge.endSoC);

oder

  DataURLEncoded += "&0_userdata.0.topolino.trip.consumption=" + String((float)((tripToSend.endSoC - tripToSend.startSoC) * 0.06) * -1, 1);
  DataURLEncoded += "&0_userdata.0.topolino.trip.dauer=" + String((tripToSend.endTime - tripToSend.startTime) / 1000 / 60);
  DataURLEncoded += "&0_userdata.0.topolino.trip.km=" + String((tripToSend.endKM - tripToSend.startKM) / 10, 1);
  DataURLEncoded += "&0_userdata.0.topolino.trip.maxSpeed=" + String(tripToSend.maxSpeed);
  DataURLEncoded += "&0_userdata.0.topolino.trip.SpeedAvg=" + String((drivenKM / drivenMin) * 60, 1);
  DataURLEncoded += "&0_userdata.0.topolino.trip.consumptionAvg=" + String((drivenSoC * 0.06) / drivenKM * 100,1);

noch ein Beispiel

  if (canValues.SoCUp) {DataURLEncoded += "&0_userdata.0.topolino.SoC=" + String(canValues.SoC); }
  if (canValues.BatteryUp) {DataURLEncoded += "&0_userdata.0.topolino.12VBatt=" + String(canValues.Battery); }
  if (canValues.CurrentUp) { DataURLEncoded += "&0_userdata.0.topolino.BattA=" + String(canValues.Current); }
  if (canValues.Temp1Up) { DataURLEncoded += "&0_userdata.0.topolino.BattTemp1=" + String(canValues.Temp1); }
  if (canValues.Temp2Up) { DataURLEncoded += "&0_userdata.0.topolino.BattTemp2=" + String(canValues.Temp2); }
  if (canValues.VoltUp) { DataURLEncoded += "&0_userdata.0.topolino.BattV=" + String(canValues.Volt); }
  if (canValues.HandbrakeUp) { DataURLEncoded += "&0_userdata.0.topolino.Handbreake=" + String(canValues.Handbrake); }
  if (canValues.ODOUp) { DataURLEncoded += "&0_userdata.0.topolino.ODO=" + String(canValues.ODO / 10); }
  if (canValues.OBCRemainingMinutesUp) { DataURLEncoded += "&0_userdata.0.topolino.OnBoardChargerRemaining=" + String(canValues.OBCRemainingMinutes); }
  if (canValues.ReadyUp) { DataURLEncoded += "&0_userdata.0.topolino.Ready=" + String(canValues.Ready); }
  if (canValues.RemainingDistanceUp) { DataURLEncoded += "&0_userdata.0.topolino.RemainingKM=" + String(canValues.SoC * 0.75); }
  if (canValues.GearUp) { DataURLEncoded += "&0_userdata.0.topolino.gear=" + String(canValues.Gear); }
  if (canValues.SpeedUp) { DataURLEncoded += "&0_userdata.0.topolino.speed=" + String(canValues.Speed); }

Mein Wunsch wäre jetzt, wenn über diesen einen Hook was reinkommt, dass eine Instant mit “0.userdata…” angelegt wird und darunter dann die Variablen wenn es mehrere wie in meinem Beispiel gibt oder eben eine Variable mit dem Wert und Namen “0.userdata…” (siehe letzes Beispiel).

So wie ich das sehe, ist das was in ioBroker passiert dem MQTT sehr ähnlich, zumindest vom Aufbau her.

Ich glaube ich kann das erst wirklich sagen, wie das alles genau aussieht, wenn ich das ganze am Laufen hab.

Oder es geht gar nicht.

Ich denke da kommen auch Daten im HTTP-Header. Mal schauen. Wenn ich wieder Credits bei ChatGPT hab, lass ich das eventuell auf MQTT umbauen.

Ich hatte gerade ein kleines Projekt mit einem ESP826, einem RFID Leser und einer kleinen LED.
Dort führte mich der Weg zu ESPHome.
Mir etwas KI war es ein Kunderspiel, die Werte über MQTT nach Symcon zu bringen.
Vielleicht wäre das bei dir auch eine Alternative.

Ich glaube es geht auch so. Nur dürfte der Webhook bzw. das $_GET Probleme mit solchen Parametern haben “0_userdata.0.topolino.trip.consumption”. Die URL’s sind tatsächlich sehr einfach aufgebaut. Eine Aneinanderreihung der Werte. Wenn die Namen der Parameter ein Problem darstellen, dann ändere ich die einfach im Sourcecode.

Offenbar dürfen bei Parametern bei einem Webhook keine Punkte und Unterstriche enthalten sein.

Wie meinst du das?
Der Sinn von dem Satz erschließt sich mir gerade nicht.

Ok.

Bei dieser URL

192.168.32.35:3777/hook/topolino/setBulk?user=test&pass=test&0_userdata.0.topolino.trip.consumption=20&ack=true

kann mit $GET[‘0_userdata.0.topolino.trip.consumption’"] nicht abgefragt werden. Da kommt die Warnung, dass das nicht gesetzt ist. Entferne ich alle “.” und “_”, dann passt es.
Ich hab die Parameter im Sourcecode schon geändert. Ich hab die Hardwar bestellt. Ob das alles so funktioniert, weiß ich noch nicht. Compiliert kann es werden. Habs auch schon auf einen ESP gespielt, nur ohne CAN Anbindung funktioniert halt nicht.

Versuch mal alles in $_GET auszugeben. Da siehst du, dass die Punkte zu Unterstrichen konvertiert werden:

header('Content-Type: text/plain');
var_dump($_GET);
var_dump($_GET['0_userdata_0_topolino_trip_consumption']);
return;

Im Browser kommt dann:

array(4) {
  ["user"]=>
  string(4) "test"
  ["pass"]=>
  string(4) "test"
  ["0_userdata_0_topolino_trip_consumption"]=>
  string(2) "20"
  ["ack"]=>
  string(4) "true"
}
string(2) "20"

Auf jeden Fall hat mich das auf die Idee gebracht mein alten IPSNetwork Modul mal zu reaktivieren und etwas zu pimpen.
Das hat ja schon einen ReversHookProxy. Also warum nicht einen WebHookDecoder bauen :slight_smile:

Ah, OK. Das habe ich so nicht probiert. Ich bin den einfachen Weg gegangen und habe die Namen im Code geändert. Sollte auch funktionieren.

Ja nach dem, ob es so wird, wie ich mir das vorstelle, werde ich es hier vorstellen. Im Forum. Wird vielleicht niemand brauchen, nur zum Lob einheimsen. :winking_face_with_tongue:

Es ist das in diesem Beitrag verlinkte Projekt.

https://community.symcon.de/t/fiat-topolino/