Hallo zusammen,
ich verbringe schon den ganzen Abend mit dem Versuch dieses Reading zu splitten:
{"RfReceived":{"Data":"154551","Bits":24,"Protocol":1}}
und komme einfach auf keinen grünen Zweig.
Was will ich haben ?
Es soll nur der Code 154551 im Reading erscheinen.
Da ich den split Befehl einfach nicht verstehe möchte ich um Hilfe bitten.
Kann mir jemand erklären was split genau aussagt und wie es aufgebaut ist?
Ich komme nicht weiter!
Gruß Björn
Zitat von: Björn am 07 September 2019, 03:13:00
Hallo zusammen,
ich verbringe schon den ganzen Abend mit dem Versuch dieses Reading zu splitten:
{"RfReceived":{"Data":"154551","Bits":24,"Protocol":1}}
und komme einfach auf keinen grünen Zweig.
Was will ich haben ?
Es soll nur der Code 154551 im Reading erscheinen.
Da ich den split Befehl einfach nicht verstehe möchte ich um Hilfe bitten.
Kann mir jemand erklären was split genau aussagt und wie es aufgebaut ist?
Ich komme nicht weiter!
Gruß Björn
da führen 100 wege ans ziel, einer davon ist:
my $string = "{\"RfReceived\":{\"Data\":\"254561\",\"Bits\":24,\"Protocol\":1}}";
$string =~ m/"Data":"([\d]{4,})"/;
my $newreading = $1;
in diesem Fall über "regex" , nicht über "split" und die Zahl muss mindestens 4stellig sein... ansonsten kannst du es in [/d+] ändern, dann wird jede Zahl 'gefunden'
... ungetestet, sollte aber gehen .
gruss Byte09
Hi,
ZitatKann mir jemand erklären was split genau aussagt und wie es aufgebaut ist?
Code zum Test in der FHEM Kommandozeile
{my @a = split('"','{"RfReceived":{"Data":"154551","Bits":24,"Protocol":1}}');;return $a[5]}
Was passiert? my @array=split(delimiter,string)
split teilt den
string am
delimiter in einzelnen Elemente auf und schreibt sie in das
array. Der Index beginnt bei 0!
Bei deinem String enthält das 6te Element (Index 5) im Array den Code.
Ich erklär mal noch was Byte09 mit dem regEx "macht". (Ich mach das mehr für mich weil ich damit etwas rumprobiert und gelernt habe) ;)
Wieder für die Kommandozeile zum schnellen Test:
{'{"RfReceived":{"Data":"154551","Bits":24,"Protocol":1}}' =~ m/"Data":"([\d]{4,})"/;;return $1}
Was passiert? {string=~regEx;;return $1}
Das
regEx matched den
string auf die Zeichenfolge
"Data":"(
irgendeine Ziffernfolge mit mehr als 4 Ziffern)
"Dabei ensteht ein "Groupmatch" (der Teil in der runden Klammer) die in der Variable $1 steht.
string könnte z.B. direkt durch ReadingsVal() variabel ersetzt werden.
Gruß Otto
Hallo byte09, Hallo Otto,
Danke euch beiden. Das hat mich jetzt mal einen Schritt voran gebracht.
Nun habe ich eine Ausgabe: 154551.
Jetzt stellt sich noch das Problem
Die 154551 ist dynamisch und ändert sich je nachdem was vom Sensor ankommt.
{"RfReceived":{"Data":" ->statisches Element
9CC641 -> dynamisches Element
","Bits":24,"Protocol":1}} -> statisches Element
Das Reading soll immer den Wert annehmen welcher im Moment aktuell ist.
Gruß Björn
Hallo Björn;
nimmst Du ein userReadings. Beispiel:
device ee -> dein Sensor
Reading wert -> da steht dein String
im Reading code landet immer der aktuelle Code
attr ee userReadings code {ReadingsVal($name,'wert','') =~ m/"Data":"([\d]{4,})"/;;return $1}
Bzw. weil dein Code HEX ist, doch die Array Variante.
attr ee userReadings code {my @a = split('"',ReadingsVal($name,'wert',''));;return $a[5]}
Aber man kann auch das regEx ändern :)
"Data":"([\d,A-F]{4,})"
Gruß Otto
Hallo Otto,
danke, funtioniert.
Nachdem ich meinen letzten Thread geschrieben habe ist es mir auch aufgefallen, dass ich hierbei Variablen verwenden muss.
Ein statischer Text bleibt einfach statisch. :o
Besten Dank!
Gruß Björn
Zitat von: Otto123 am 07 September 2019, 11:12:42
Hi,
Code zum Test in der FHEM Kommandozeile
{my @a = split('"','{"RfReceived":{"Data":"154551","Bits":24,"Protocol":1}}');;return $a[5]}
Was passiert? my @array=split(delimiter,string)
split teilt den string am delimiter in einzelnen Elemente auf und schreibt sie in das array. Der Index beginnt bei 0!
Bei deinem String enthält das 6te Element (Index 5) im Array den Code.
Ich erklär mal noch was Byte09 mit dem regEx "macht". (Ich mach das mehr für mich weil ich damit etwas rumprobiert und gelernt habe) ;)
Wieder für die Kommandozeile zum schnellen Test:
{'{"RfReceived":{"Data":"154551","Bits":24,"Protocol":1}}' =~ m/"Data":"([\d]{4,})"/;;return $1}
Was passiert? {string=~regEx;;return $1}
Das regEx matched den string auf die Zeichenfolge "Data":"(irgendeine Ziffernfolge mit mehr als 4 Ziffern)"
Dabei ensteht ein "Groupmatch" (der Teil in der runden Klammer) die in der Variable $1 steht.
string könnte z.B. direkt durch ReadingsVal() variabel ersetzt werden.
Gruß Otto
Dank dir für das nachreichen der Erklärung bzgl. regex.
mir ist heute morgen leider die Zeit davongelaufen.[emoji57]
gruss Byte09
Gesendet von meinem ELE-L29 mit Tapatalk