FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: StefanD am 30 Dezember 2014, 15:02:53

Titel: gelöst: Teil eines Wertes von STATE eines Dummies mittels Regex extrahieren
Beitrag von: StefanD am 30 Dezember 2014, 15:02:53
Hallo zusammen,

ich stehe seit gut 2 Stunden so was von auf dem Schlauch und finde weder hier im Forum noch über Google was, das mir weiterhilft...  :(

Für eine Dummy zum Vorgeben der Abwesenheitsdauer habe ich über setList die Möglichkeit unterschiedliche Werte zuzuweisen:
define dmy_Abwesenheitsdauer dummy
attr dmy_Abwesenheitsdauer icon control_building_empty
attr dmy_Abwesenheitsdauer room _Test
attr dmy_Abwesenheitsdauer setList state:anwesend,weg,lange_weg,1h,2h,3h,4h,5h,6h,7h,8h,9h,10h,12h,18h,24h,2d,3d,4d,5d,6d,1w
attr dmy_Abwesenheitsdauer webCmd state


Über ein DOIF möchte ich je nach Wert des STATE unterschiedlich agieren. Für die Werte anwesend,weg und lange_weg funktioniert das tadellos, ebenso der Sprung zu den jeweiligen Zeiteinheiten.
Hier z.B. für die Stunden:
DOELSEIF ([dmy_Abwesenheitsdauer]=~m/\d*h/) (...)

Mein aktuell nicht lösbares Problem besteht darin, dass ich bei den Werten, die mit einer Zahl beginnen nur die Zahl mittels einer Regex extrahieren möchte, da ich die zum Weiterrechnen benötige. Alle meine Versuche liefern immer nur den Wert 1 zurück...
Beispiel: Ist der STATE auf den Wert 24h gesetzt,  bekomme ich mit { Value("dmy_Abwesenheitsdauer")=~/\d+/ } immer eine 1 zurück.

Vermutlich nur eine Kleinigkeit, wenn man weiß, wie's geht...  ;)

Viele Grüße
Stefan
Titel: Antw:Teil eines Wertes von STATE eines Dummies mittels Regex extrahieren
Beitrag von: der-Lolo am 30 Dezember 2014, 15:08:21
Hast Du dir mal das Residents Modul angeschaut? Es macht genau was Du möchtest und löst notwendige Events aus...
Titel: Antw:Teil eines Wertes von STATE eines Dummies mittels Regex extrahieren
Beitrag von: StefanD am 30 Dezember 2014, 15:26:18
Danke für den Hinweis. Das Modul habe ich mir schon angesehen, aber das tut es meinem Verständnis nach nicht, denn dort fehlt mir eine Vorgabe für die Dauer der Abwesenheit.

Letztlich ist das aber für mein Problem aber auch unerheblich, da das Extrahieren eines Teilstrings aus dem STATE oder Readings eines Dummies auch in anderen Konstellationen vorkommen kann.

Viele Grüße
Stefan
Titel: Antw:Teil eines Wertes von STATE eines Dummies mittels Regex extrahieren
Beitrag von: TomWest am 30 Dezember 2014, 15:28:02
Ich bin zwar absoluter Perl Neuling, aber macht { Value("dmy_Abwesenheitsdauer")=~/\d+/ } nicht einfach einen logischen Vergleich, ob der Inhalt von dmy_Abwesenheitsdauer zum regex passt und gibt dann 0 - Nein oder 1 - Ja aus?
Kann man nicht mit substr den String reduzieren und dann damit weiterarbeiten, wenn es zum obigen Regex passt?
Titel: Antw:Teil eines Wertes von STATE eines Dummies mittels Regex extrahieren
Beitrag von: Icinger am 30 Dezember 2014, 15:36:40
{ Value("dmy_Abwesenheitsdauer")=~/\d+/ }

Damit bekommst du wirklich nur  das Ergebnis des logischen Vergleichs, wie TomWest schon sagte.

Du kannst es aber so machen:
{ Value("dmy_Abwesenheitsdauer")=~/(\d+)/ ;Log 3,"Wert: $1"}
Damit bildest du eine Gruppe über die Zahlen und hast danach in $1 den richtigen Wert stehn.

Alternativ auch:
{ my $Wert=Value("dmy_Abwesenheitsdauer")=~/\d+/ }

lg, Ici
Titel: Antw:Teil eines Wertes von STATE eines Dummies mittels Regex extrahieren
Beitrag von: StefanD am 30 Dezember 2014, 15:36:56
Das mit dem Vergleich ist mir auch schon in den Sinn gekommen...
Ein
{ Value("dmy_Abwesenheitsdauer")=~s/\D*//g }
zum Ersetzen mit nichts von Nichtzahlen liefert
Can't modify non-lvalue subroutine call in substitution (s///) at (eval 19573) line 1, at EOF
Titel: Antw:Teil eines Wertes von STATE eines Dummies mittels Regex extrahieren
Beitrag von: StefanD am 30 Dezember 2014, 15:56:46
Wenn ich den Code über das Webinterface ausführe:
Zitat von: Icinger am 30 Dezember 2014, 15:36:40
{ Value("dmy_Abwesenheitsdauer")=~/(\d+)/ ;Log 3,"Wert: $1"}
Bekomme ich folgenden Fehler zurück:
Unknown command {, try help.
Unknown command Log, try help.


Zitat von: Icinger am 30 Dezember 2014, 15:36:40Alternativ auch:
{ my $Wert=Value("dmy_Abwesenheitsdauer")=~/\d+/ }

Bedeutet meinem Verständnis nach, dass das, was auf den Vergleich matched, in die Variable $Wert geschrieben wird. Korrekt?

Viele Grüße
Stefan
Titel: Antw:Teil eines Wertes von STATE eines Dummies mittels Regex extrahieren
Beitrag von: Icinger am 30 Dezember 2014, 16:00:43
Stimmt, wird nach $Wert geschrieben.
Auch diese Version funktioniert im Webinterface nicht.
Beide funktionieren aber zB innerhalb einer Sub in der myutils, bzw. auch in Perl-Abfragen zB im DOIF oder sonstigem.

lg, Ici
Titel: gelöst:Teil eines Wertes von STATE eines Dummies mittels Regex extrahieren
Beitrag von: StefanD am 30 Dezember 2014, 16:13:08
Danke, jetzt ist der Groschen gefallen!  :)

Viele Grüße
Stefan