Hauptmenü

Regex userReadings

Begonnen von Esjay, 06 Oktober 2017, 19:10:12

Vorheriges Thema - Nächstes Thema

Esjay

Hallo zusammen,
ich weiß es ist der nächste Theard in einer ellenlangen Liste von Theards, aber jedes mal wenn dieses Thema oder andere Themen in diese Richtung bei mir hoch kommt, lese ich erst 2 Stunden, überlege ob ich ein neues Thema aufmache, und entscheide mich dann doch für eine Bastellösung mit nem Doif.

So nun zu meinem eigentlichen Thema/Frage

Es kommt öffter mal vor, das ich gerne einzelne Teile eines Readings haben möchte. Im aktuellen Fall habe ich das reading "msgChat" mit dem Wert "#Home"
ich würde nun gerne soetwas in der Richtung machen


my $var = ReadingsVal("TelegramBot", "msgChatr", "");
my $var1 = ReadingsVal("TelegramBot", "queryData", "");
if (($var1<=0)&&($var eq "#Home")){
fhem "set xyz abc $var";
else{}


Ich würde nun gerne in diesem und auch in weiteren Fällen über ein userReadins in Kombination mit regex gehen.

In dem Fall ist der Regex ja auch relativ Simpel. Nämlich "\w+"

Mein Ansatz wäre jetzt
attr TelegramBot Userreadings Wert {ReadingsVal("TelegramBot","msgChat","")\w+}

Wäre dieser Ansatz richtig, hätte ich diesen Beitrag nicht geschrieben. Daher würde ich darum bitten, dass mich jetzt nochmal jemand auf den Weg bringt.

Ich danke schonmal vielmals.


KölnSolar

#1
Du hast 2 gedankliche Fehler:
Vergleichsoperatoren f. Strings u. Zahlen sind in Perl unterschiedlich  ??? und die Hochkommas fehlen

also

if (($var<=0)&&($var1 eq "#Home")){

bin aber auch kein Perl-Spezie  :'(
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

t0m

Hi,

auch wenn KölnSolar kein 'Perl-Spezie' ist -> die Antwort ist korrekt.  ;)


Grüße
t0m

Esjay

Zitat von: KölnSolar am 06 Oktober 2017, 19:39:42
Du hast 2 gedankliche Fehler:
Vergleichsoperatoren f. Strings u. Zahlen sind in Perl unterschiedlich  ??? und die Hochkommas fehlen

also

if (($var<=0)&&($var1 eq "#Home")){

bin aber auch kein Perl-Spezie  :'(

Ok danke für die Hilfe. Ich habe mich wahrscheinlich so auf das # versteift, dass mir das durchgerutscht ist.

Mich würde trotzdem noch der Ursprüngliche Fall interessieren!

Danke

t0m


Hi Esjay,

bin mir nicht ganz sicher, was der "ursprüngliche Fall" ist. Ich vermute mal der RegEx...

Dazu verstehe ich aber den folgenden Code-Ausschnitt nicht so ganz:

{ReadingsVal("TelegramBot","msgChat","")\w+}


Was soll das tun? Ist das überhaupt korrekter Perl-Code?

Zur Erklärung: Das ist ein Funktionsaufruf an den du einfach einen RegEx-Meta-Character für ein 'word' anhängst...   ??? Was willst du damit erreichen?


Sorry, ich blick's nicht
t0m

KölnSolar

Du ersetzt mit dem regex ja nichts(vermute ich).
attr TelegramBot userReadings Wert {split(/#/,ReadingsVal($name,"msgChat",""))} könnte funktionieren
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

Esjay

Zitat von: t0m am 06 Oktober 2017, 20:40:53
Hi Esjay,

bin mir nicht ganz sicher, was der "ursprüngliche Fall" ist. Ich vermute mal der RegEx...

Dazu verstehe ich aber den folgenden Code-Ausschnitt nicht so ganz:

{ReadingsVal("TelegramBot","msgChat","")\w+}


Was soll das tun? Ist das überhaupt korrekter Perl-Code?

Zur Erklärung: Das ist ein Funktionsaufruf an den du einfach einen RegEx-Meta-Character für ein 'word' anhängst...   ??? Was willst du damit erreichen?


Sorry, ich blick's nicht
t0m

Ok, vll bin ich das Ganze zu kompliziert angegangen und habe es auch komplett falsch erklärt.
ich möchte einfach nur aus einem Reading welches "#Home" beinhaltet "Home" machen. Am Besten mit Hilfe von Regex, damit ich in Zukunft mit Hilfe von https://regexr.com/ selber das passende Reading erstellen kann.

Aufgrund von recherche dachte ich bis eben gerade das mein Ansatz richtig ist. Du vermittelst mir gerade das komplette Gegenteil.

Grüße

Esjay

#7
Zitat von: KölnSolar am 06 Oktober 2017, 21:04:23
Du ersetzt mit dem regex ja nichts(vermute ich).
attr TelegramBot userReadings Wert {split(/#/,ReadingsVal($name,"msgChat",""))} könnte funktionieren

Das ergibt glatt 2

Vll noch zur Erklärung.
ich möchte das Folgendes funktioniert

Hier stand Blödsinn

Roberta ist mein Staubsauger, und ich bin gerade dabei anhand von Telegram mir ein Menü zu bauen.

t0m

#8
Hi Esray,

der split ergibt 2, weil das die Länge des Arrays ist, das der split liefert.  ;)

Aber nochmals zu deiner RegEx. Wenn du da was rausschneiden willst, solltest du mit Gruppen arbeiten:


$var = "#home";
print "$1\n" if $var =~ /#(home)/;
$var = "#other_match";
print "$1\n" if $var =~ /#(other_match)/;
print "$1\n" if $var =~ /#(\w+)/;


Die Gruppen werden mit Klammern in der RegEx angegeben. Und können via $<Nummer> entsprechend ihrer Reihenfolge wieder ausgelesen werden.


Grüße
t0m

Esjay

Zitat von: t0m am 06 Oktober 2017, 21:35:00
Hi Esray,

der split ergibt 2, weil das die Länge des Arrays ist, das der split liefert.  ;)

Aber nochmals zu deiner RegEx. Wenn du da was rausschneiden willst, solltest du mit Gruppen arbeiten:

$var = "#home";
print "$1\n" if $var =~ /#(home)/;
$var = "#other_match";
print "$1\n" if $var =~ /#(other_match)/;


Die Gruppen werden mit Klammern in der RegEx angegeben. Und können via $<Nummer> entsprechend ihrer Reihenfolge wieder ausgelesen werden.


Grüße
t0m

Dank dir für deine Mühe t0m. Ich seh schon, man kommt wohl einfach nicht drum herum sich noch mehr damit zu beschäftigen. Ich werde das mit deinem Vorschlag mal tun, und dann anwenden. Einfach so anwenden ist nicht so meins.

t0m


Hi Esjay,

yup, ich teste meinen Code auch erstmal immer ausserhalb von FHEM. Wenn das dann läuft, dann hat man immer noch genug Probleme innerhalb von FHEM.  ;)

Perl sollte ja auf dem System, auf dem dein FHEM läuft, installiert sein. Ausserdem kannst du kurze Sachen z.B. auf https://www.jdoodle.com/execute-perl-online testen. Da kannst du dir auch mal schnell den split anschauen.


Grüße
t0m