FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Esjay am 06 Oktober 2017, 19:10:12

Titel: Regex userReadings
Beitrag von: Esjay am 06 Oktober 2017, 19:10:12
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.

Titel: Antw:Regex userReadings
Beitrag 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  :'(
Titel: Antw:Regex userReadings
Beitrag von: t0m am 06 Oktober 2017, 19:50:10
Hi,

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


Grüße
t0m
Titel: Antw:Regex userReadings
Beitrag von: Esjay am 06 Oktober 2017, 19:53:30
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
Titel: Antw:Regex userReadings
Beitrag 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
Titel: Antw:Regex userReadings
Beitrag 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
Titel: Antw:Regex userReadings
Beitrag von: Esjay am 06 Oktober 2017, 21:05:32
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
Titel: Antw:Regex userReadings
Beitrag von: Esjay am 06 Oktober 2017, 21:08:21
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.
Titel: Antw:Regex userReadings
Beitrag 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)/;
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
Titel: Antw:Regex userReadings
Beitrag von: Esjay am 06 Oktober 2017, 21:44:15
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.
Titel: Antw:Regex userReadings
Beitrag von: t0m am 06 Oktober 2017, 21:59:10

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