Reading Splitten - wie funktioniert das denn genau?

Begonnen von grafix77, 07 September 2019, 03:13:00

Vorheriges Thema - Nächstes Thema

grafix77

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

Byte09

#1
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

Otto123

#2
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

grafix77

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

Otto123

#4
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

grafix77

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

Byte09

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