Data Code aus IR Code auslesen

Kann jemand von Euch mal mein Hirn bei einer Lösung unterstützten?

Ich bekomme einen langen Code in IP-Symcon der sich wie folgt zusammensetzt
IR-UDP-AIO-Gateway.png

Hat jemand eine Idee wie ich am besten den Data Teil (Gelb) aus dem Code auslese?

Hallo
Hast du das in einer Variablen?
Normalerweise mit der Funktion PHP
http://php.net/manual/de/function.substr.php

Ja habe ich in einer Variable bzw. kann es in eine schreiben ich bekomme den Wert über einen UDP Socket.

An den data Teil vom payload komme ich auch mit


$json = substr($payload, 8, strlen($payload));
		$payload = json_decode($json);
		
		$type = $payload->type;
		$data = $payload->data;
$irdatacode = strstr($data, '00010');

Das Problem dabei ist das ich kein klares Muster erkenne wie ich den Data Teil (gelb) sauber auslese. Weil die Anzahl der Pulse/Pause Pairs variieren kann.

Daher versuche ich das momentan über


$irdatacode = strstr($data, '00010');

Das liefert mir aber den gesamten hinteren Teil mitsamt allen Teilen Grün, Blau, Gelb. Zum Vergleich würde mir aber der gelbe Teil ausreichen. Mir ist nur nicht endgültig klar wie ich den sauber auslese wenn ich nicht genau weis wie der gelieferte Code aussieht da dieser ja variiert.

Byte 8 enthält doch die Anzahl der Timing Pairs, damit solltest du Anzahl mal Länge von Rechts abschneiden können.

Hast Du einen Code Vorschlag? Ich tue mir da schwer weil ich nicht weis was Reserved vorher genau ist bzw. wie ich wiederum die Number of Time Pairings exakt auslese. Du würdest also Number of Time Pairings x X auschneiden und der Rest ist dann der gelbe Block richtig?

Ließ Stelle 9 und addiere 12 hinzu. Das ist der Start von Data Code.
Der Rest hat laut Tabelle feste Längen und ist damit uninteressant.

EDIT: Das war Müll
Michael

Wenn es immer die letzten 6 Stellen sind reicht ein

$x = substr($data,-6);
$laenge = substr($data,15, 2); 
$irdatacode = substr($data,-$lange*3)

Hast du weitere Beispiele?

Die Aussage 8 + 4 * X ist unlogisch, da Data code nur mir 3 Byte abgeben ist.

Man, ich brauche meinen Kaffee :slight_smile:

Das war natürlich Mist.
Die Tabelle hat ja recht.

Der Start ist immer x * 4 +8
Da die Timing Pairs ja immer 4 Byte sind.

Erschwert wird dies, weil Fonzo das ganze nicht als Byte-Stream sondern als Hex-String hat.
Warum immer alles die Daten in ein lesbaren Format hin und dann zurück wandeln, verstehe ich bis heute nicht :wink:

Wenn es Rohdaten wären, funktioniert dies:

$num_of_timing = substr($data,8, 1); 
$start = $num_of_timing*4+8;
$irdatacode = substr($start);

Da es ja ein Hex-String ist:

$num_of_timing = hexdec(substr($data,16, 2));
$start = $num_of_timing*8+16;
$irdatacode = substr($start);

Der DataCode ist von variabler Länge (Size = y) laut der Tabelle.

Michael

Danke Euch allen erst mal für die rege Beteiligung.

Das geht nicht da der Data Block unterschiedlich lang ist, leider.

Beispiel


{XC_EVT}{"type":"IR","data":"19082600000300220408C90475008001AD00800094008027CD00010102020202020101020102010201020102020201020201020101010201010203"}
{XC_EVT}{"type":"IR","data":"19082600000300220408CE0472008001AD00800093008027C700010102020202020101020102010201020101020201010102020201010202020103"}
{XC_EVT}{"type":"IR","data":"19082600000300220408CE0471007F01AF007F0094007F27C800010102020202020101020102010201020101010201010102020202010202020103"}
{XC_EVT}{"type":"IR","data":"19082600000300220408CB0470008101AB00810093008127CB00010102020202020101020102010201020201020101020201010201020201010203"}
{XC_EVT}{"type":"IR","data":"19082600000300220408D2046B008201AC00820091008227C400010102020202020101020102010201020101010201010102020202010202020103"}
{XC_EVT}{"type":"IR","data":"190826000002003204034C01A90061007000610142006147E30001010201020102010102010102020101010101010101020102010101020201010101010101010101020101010202020103"}
{XC_EVT}{"type":"IR","data":"190826000002003204035601A20062006F00620141006247DA0001010201020102010102010102020101010101010101020102010101020101010201020201020101010102020202020103"}

Da komme ich nicht ganz mit aber ich lerne immer gerne von dir dazu. Was muss ich denn machen um das als Hex zu bekommen?

Das kommt darauf wann die du die Daten bekommst.
Oder sendet das Gateway die Daten schon als Ascii-HexString und nicht die nativen Bytes.
Michael

Ich hab das jetzt mal wie vorgeschlagen mit

mit


$payload = '{XC_EVT}{"type":"IR","data":"19082600000300220408D40464008C01A0008C0088008C27C700010102020202020101020102010201020102020201020201020101010201010203"}';
 $json = substr($payload, 8, strlen($payload));

		$payload = json_decode($json);
		
		$type = $payload->type;
		$data = $payload->data;
$num_of_timing = hexdec(substr($data,16, 2));
				$start = $num_of_timing*8+16;
				$irdatacode = substr($data, $start);  
				var_dump($irdatacode);

probiert.

Kommt das raus


C700010102020202020101020102010201020102020201020201020101010201010203

Ob das jetzt stimmt kann ich nicht ganz beurteilen weil mir bei dem Ding immer noch der Durchblick fehlt.

Das ist eine gute Frage. Ich habe ja die Hex Ansicht und die Text Ansicht im Debug Fenster. Wenn ich Hex Ansicht wegmache kommen die Daten so


{XC_EVT}{"type":"IR","data":"1908260000010001010036753200"}

vom Gateway rein.

Dann bekommst du innerhalb des JSON einem HexString und nicht die eigentlichen Bytes.

Ich habe mich da verzählt
Start ist

                 $start = $num_of_timing*8+17; 

Dann ist es korrekt gem. deiner Tabelle.

Michael

Vielen herzlichen Dank noch mal dann probiere ich das jetzt mal damit aus.